k8s与云服务器之间服务互访之节点网络打通
一、概述
k8s暴露服務(wù)的方式有很多使用ingress、nodeport等,這類(lèi)比較適用于無(wú)狀態(tài)的服務(wù),對(duì)于statefulset部署的有狀態(tài)的服務(wù),(關(guān)于statefulset的介紹參考kubernetes的官網(wǎng)或參考我的https://www.cnblogs.com/cuishuai/p/10243291.html),由于statefulset使用的是headless service。是固定網(wǎng)絡(luò)標(biāo)示的,也就是服務(wù)的完整域名是不會(huì)改變的。但是有兩個(gè)問(wèn)題:
1、物理機(jī)在k8s集群的外面沒(méi)辦法解析k8s集群內(nèi)部的域名
2、解析域名后網(wǎng)絡(luò)不能通信
二、物理網(wǎng)絡(luò)與k8s集群打通
有了上面提出的兩個(gè)問(wèn)題,我們先來(lái)簡(jiǎn)單分析一下k8s的網(wǎng)絡(luò),我們使用的是calico-bgp+ipvs,所以這里就以calico為例,calico為k8s提供了一個(gè)網(wǎng)絡(luò)空間,提供的地址池和k8s初始化時(shí)指定的pod-cidr是相同的。部署服務(wù)的時(shí)候會(huì)在地址池里面為pod分配地址,比如設(shè)置的是192.168.0.0/16,首先是分配node節(jié)點(diǎn),一般情況下calico會(huì)先給node節(jié)點(diǎn)隨機(jī)分配一個(gè)網(wǎng)段,例如有個(gè)節(jié)點(diǎn)是node1 ,calico會(huì)分配一個(gè)192.168.19.0網(wǎng)段,具體的子網(wǎng)掩碼(netmask)要看路由表在任意節(jié)點(diǎn)上執(zhí)行(route -n)查看。
查看具體的分配,部署calico的時(shí)候選擇的是將數(shù)據(jù)存儲(chǔ)到etcd集群,所以也可以去etcd里面產(chǎn)看:
# etcdctl get --prefix "/calico" --keys-only | grep "ipam/v2/host"
/calico/ipam/v2/host/ku13-1/ipv4/block/192.244.190.128-26 /calico/ipam/v2/host/ku13-1/ipv4/block/192.244.190.192-26 /calico/ipam/v2/host/ku13-2/ipv4/block/192.244.32.0-26 /calico/ipam/v2/host/ku13-2/ipv4/block/192.244.32.64-26 /calico/ipam/v2/host/ku13-3/ipv4/block/192.244.6.192-26 /calico/ipam/v2/host/ku13-3/ipv4/block/192.244.7.0-26 /calico/ipam/v2/host/ku13-3/ipv4/block/192.244.7.64-26 /calico/ipam/v2/host/ku13-4/ipv4/block/192.244.70.0-26
還有一個(gè)服務(wù)kube-proxy,這個(gè)服務(wù)負(fù)責(zé)node之間的網(wǎng)絡(luò)通信,刷新ipvs列表。具體的calico和kube-proxy工作詳情這里不做詳解。
我們了解到要想解決我們上面提出的兩個(gè)問(wèn)題,我們需要將kubernets里面的coredns服務(wù)拿出來(lái),為物理機(jī)提供dns解析、然后需要將物理機(jī)與k8s集群網(wǎng)絡(luò)打通。接下來(lái)我們解決這兩個(gè)問(wèn)題:
解決第一個(gè)問(wèn)題也需要以第二個(gè)問(wèn)題為前提,所以我們只需要解決了第二個(gè)問(wèn)題,第一個(gè)問(wèn)題只需要在物理機(jī)上面的/etc/resolv.conf添加一條nameserver記錄。
解決第二個(gè)問(wèn)題:網(wǎng)絡(luò)打通
打通網(wǎng)絡(luò)我們需要兩個(gè)工具:calico、kube-proxy
我們之前的集群都是使用kubeadm部署的,所以我們可以很簡(jiǎn)單實(shí)現(xiàn)這兩個(gè)服務(wù)的部署,如果不是使用kubeadm部署的集群可以參考網(wǎng)上這個(gè)服務(wù)的部署,本文不做介紹。主要介紹kubeadm部署的實(shí)現(xiàn)。
我們準(zhǔn)備一個(gè)服務(wù)器,上面需要部署kubeadm、docker具體的準(zhǔn)備參考之前的集群初始化,我們將新服務(wù)器以node節(jié)點(diǎn)的形式加入到集群里面,使用kubeadm join很方便的將服務(wù)器加入到現(xiàn)有的k8s集群里面,這個(gè)服務(wù)器只需要分配很小的資源,因?yàn)檫@個(gè)上面不會(huì)部署任何服務(wù),只有kubeadm join時(shí)部署的calico-node、kube-proxy。
添加節(jié)點(diǎn)參考:https://www.cnblogs.com/cuishuai/p/9897006.html
節(jié)點(diǎn)成功加入集群后還要執(zhí)行一個(gè)操作,就是設(shè)置節(jié)點(diǎn)不能被調(diào)度:
kubctl drain [node-name] --ignore-daemonsets
這樣我們新加入的這個(gè)節(jié)點(diǎn)上面只部署了calico-node、kube-proxy,并且該服務(wù)器節(jié)點(diǎn)是能和k8s集群通信的,我們把該節(jié)點(diǎn)作為k8s網(wǎng)絡(luò)與物理網(wǎng)絡(luò)的gateway,所有物理服務(wù)器進(jìn)入k8s集群網(wǎng)絡(luò)的路由都經(jīng)過(guò)這個(gè)gateway。這樣就實(shí)現(xiàn)了通訊。
2、生成路由規(guī)則
在上面新部署的服務(wù)器上面有到k8s集群的所有路由,我們將這些路由進(jìn)行提取生成一個(gè)路由表給物理機(jī)使用,將所有路由設(shè)置成默認(rèn)路由,都經(jīng)過(guò)上面新加服務(wù)器的ip。
為了方便使用我寫(xiě)了一個(gè)生成腳本,此腳本在gateway節(jié)點(diǎn)即上面新加的節(jié)點(diǎn)上面執(zhí)行:
#cat generate-rule
#!/bin/bash
route -n | grep UG | grep -v ^0 | awk '{print $1,$3}' >a.txt
ip=`ip a | grep eth0 | grep inet |awk -F '/' '{print $1}'|awk '{print $2}'`
service_net="192.96.0.0"
service_mask="255.255.0.0"
#判斷route.rule文件是否存在
if [ -f route.rule ];then
>route.rule
fi
#生成route.rule文件
#添加coredns的路由
echo "route add -net $service_net netmask $service_mask gw $ip" >route.rule
while read NT MK do echo "route add -net $NT netmask $MK gw $ip " >>route.rule done < a.txt #刪除臨時(shí)文件 rm -rf a.txt
service_net是k8s service的網(wǎng)段,即coredns的service ip所在的網(wǎng)段,service_mask是k8s service的子網(wǎng)掩碼,這個(gè)在使用kubeadm初始化的時(shí)候就指定了,我們使用的是:
https://www.cnblogs.com/cuishuai/p/9897006.html
podSubnet: 192.244.0.0/16 serviceSubnet: 192.96.0.0/16
將service_net、service_mask換成自己的。
然后將生成的文件copy到物理機(jī)上,然后執(zhí)行:
sh route.rule
在物理機(jī)上面在/etc/resolv.conf里面添加coredns的service的ip,service名稱(chēng)是kube-dns,在任意master節(jié)點(diǎn)上查看:
kubectl get svc -n kube-system | grep kube-dns
kube-dns ClusterIP 192.96.0.10 <none> 53/UDP,53/TCP 7d8h
將找到的ip地址添加到/etc/resolv.conf:
nameserver 192.96.0.10
在物理機(jī)上面測(cè)試連通性:
總結(jié)
以上是生活随笔為你收集整理的k8s与云服务器之间服务互访之节点网络打通的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用XFire+Spring构建Web
- 下一篇: 自定义注解使用SPEL表达式记录日志