在 kubernetes 的網絡模型中,基於官方默認的 CNI 網絡插件 Flannel,這種 Overlay Network(覆蓋網絡)可以輕松的實現 pod 間網絡的互通。當我們把基於 spring cloud 的微服務遷移到 k8s 中后,無須任何改動,微服務 pod 可以通過 Eureka 注冊后可以互相輕松訪問。
但是實際使用中,我們出現了以下需求:
- 1.辦公室網絡 和 k8s pod 網絡不通。開發在電腦完成某個微服務模塊開發后,希望本地啟動后,能注冊到 k8s 中開發環境的服務中心進行調試,而不是本地起一堆依賴的服務。
- 2.辦公室網絡 和 k8s svc 網絡不通。在 k8s 中運行的 mysql、redis 等,無法通過 ingress 7層暴露,電腦無法通過客戶端工具直接訪問;如果我們通過 service 的 NodePort 模式,會導致維護量工作量巨大。
網絡互通配置
k8s 集群中新加一台配置不高(2核3G)的 node 節點(node-3)專門做路由轉發,連接辦公室網絡和 k8s 集群 pod、svc
- node-3 IP 地址 10.129.83.159
- 內網DNS IP 地址 10.129.83.159
- pod網段 172.20.0.0/16,svc網段 10.68.0.0/16
- 辦公網段 10.129.0.0/24
給 node-3節點打上污點標簽(taints),不讓 k8s 調度 pod 來占用資源:
kubectl taint nodes node-3 forward=node-3:NoSchedule
node-3節點,做snat:
# 開啟轉發 # vim /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 # sysctl -p # 來自辦公室訪問pod、service snat iptables -t nat -A POSTROUTING -s 10.129.0.0/24 -d 172.20.0.0/16 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.129.0.0/24 -d 10.68.0.0/16 -j MASQUERADE
在辦公室的出口路由器上,設置靜態路由,將 k8s pod 和 service 的網段,路由到 node-3節點上
ip route 172.20.0.0 255.255.0.0 10.129.83.159
ip route 10.68.0.0 255.255.0.0 10.129.83.159
DNS 解析配置
以上步驟操作后,我們就可以在本地電腦通過訪問 pod ip 和 service ip 去訪問服務。但是在 k8s 中,由於 pod ip 隨時都可能在變化,service ip 也不是開發、測試能輕松獲取到的。我們希望內網 DNS 在解析 *.cluster.local
,去coreDNS
尋找解析結果。
這里也可以測試一下,podip是可以通的,但是svc不行,因為svc的ip是虛擬ip。
例如,我們約定將(項目A 、開發環境一 、數據庫mysql)部署到 ProjectA-dev1 這個 namespace 下,由於本地到 k8s 集群 service 網絡已經打通,我們在本地電腦使用 mysql 客戶端連接時,只需要填寫mysql.ProjectA-dev1.svc.cluster.local
即可,DNS 查詢請求到了內網DNS后,走向 CoreDNS,從而解析出 service ip。
由於內網 DNS 在解析 *.cluster.local
,需要訪問 CoreDNS 尋找解析結果。這就需要保證網絡可達
最簡單的做法,我們把內網DNS部署在node-3這台節點上,那么他肯定訪問到kube-dns 10.68.0.2
# kubectl get svc -n kube-system |grep kube-dns
kube-dns ClusterIP 10.68.0.2 <none> 53/UDP,53/TCP,9153/TCP 7h1m
因為當前環境中內網dns就部署在node-3這台機器上,所以直接配置即可。
首先部署內網dns(有dns的略過)
本環境以centos7為例,安裝輕量級的dns服務dnsmasq
#yum install -y dnsmasq
#vim /etc/resolv.conf #這個DNS指定本地服務器ip
# Generated by NetworkManager
nameserver 10.129.83.159
#vim /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf #上游DNS路徑,這里面配置電信、谷歌等公有dns。
strict-order #取消strict-order注釋
addn-hosts=/etc/dnsmasq.hosts #可以配置所有服務器的主機地址和對應的主機名
listen-address=127.0.0.1,10.129.83.159 #監聽地址,改成自己服務器IP
server=/cluster.local/10.68.0.2 #指定以cluster.local為后綴的域名,使用coredns的地址解析。
#systemctl start dnsmasq #啟動服務
可以看到已經啟動成功。
#systemctl enable dnsmasq #開機自動啟動
注意:其他服務器或者本地windows要使用這個dns,就把dns配置為此服務器的地址。
測試