辦公環境下k8s網絡互通方案


在 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配置為此服務器的地址。

測試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM