背景
目前公司想做服務的注冊與發現,但是在推進過程中,存在一個問題,目前我們的服務是混合部署的,即一部分部署在虛機,一部分部署在容器,所以就會面臨這樣一個問題,當容器里的服務和虛機里的服務都去注冊中心進行注冊時,虛機是無法訪問容器的地址的,不過令人欣慰的是,虛機和容器是同屬一局域網,所以要實現服務的注冊與發現,首先需要解決這一問題。
解決過程
首先就是一頓分析了,下面是我的分析過程
- k8s集群和集群外的虛機屬於同一局域網,網絡互聯互通,即容器能訪問集群外的虛機
- 集群外的虛機無法訪問pod里的服務
- 只需要在集群外的虛機上做調整
- 是不是可以通過添加靜態路由的方式呢?
知道了這些,我大概就想到了是不是可以通過添加一條靜態路由呢?但是在添加靜態路由之前,得需要了解從pod里訪問集群外虛機時的出口IP地址是什么?這個可以通過使用tcpdump來解決
1)現在一個Pod中去telnet虛機的地址,然后在虛機上進行抓包
#進入Pod中 kubectl exec -it user-api-764d68b678-54kt2 bash #執行telnet,這里隨意指定一個端口,只要沒有被占用就好,目的是防止抓包時被其他信息干擾 telnet 192.168.0.130 12345
虛機上抓包
#虛機上抓包,指定12345端口即可 tcpdump -nni any port 12345
Telnet的結果
# telnet 192.168.0.130 12345 Trying 192.168.0.130... telnet: connect to address 192.168.0.130: Connection refused
tcpdump抓包結果
# tcpdump -nni any port 12345 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:52:28.644112 IP 192.168.0.198.35066 > 192.168.0.130.12345: Flags [S], seq 3592146803, win 28000, options [mss 1400,sackOK,TS val 780676435 ecr 0,nop,wscale 7], length 0 10:52:28.644169 IP 192.168.0.130.12345 > 192.168.0.198.35066: Flags [R.], seq 0, ack 3592146804, win 0, length 0
可以看到在Pod里進行Telnet時,訪問虛機的源地址為node節點的IP地址,到這里基本上問題就解決了。
2)虛機上添加靜態路由
#查看Pod的IP是什么? kubectl get pod -o wide | grep user-api user-api-764d68b678-54kt2 1/1 Running 0 3d17h 10.200.0.90 alpha-node-01 <none> <none> 可以看到IP地址為10.200.0.90
拿到Pod的IP地址后,就可以去虛機上添加路由了
route add -host 10.200.0.90 gw 192.168.0.198
驗證下
#ping下是否能通 # ping 10.200.0.90 PING 10.200.0.90 (10.200.0.90) 56(84) bytes of data. 64 bytes from 10.200.0.90: icmp_seq=1 ttl=63 time=0.296 ms 64 bytes from 10.200.0.90: icmp_seq=2 ttl=63 time=0.258 ms #再訪問下服務是否可以通 # curl 10.200.0.90:8088/api/healthy/check {"code":0,"message":"success"}
可以的,所以通過添加一條靜態路由就可以解決同一局域網的虛機和pod的通信問題,但是這只是一個Pod的IP,實際上每一個node上都會起幾十上百個這樣的pod,那該如何添加呢?
我們的集群使用的網絡插件是calico,而每一台節點分配的子網都是不同的,比如node1的IP段為10.200.0.0/24 , node2的IP段為10.200.38.0/24 所以我們可以添加整個IP段到虛機的路由表中
route add -net 10.200.0.0/24 gw 192.168.0.198 route add -net 10.200.38.0/24 gw 192.168.0.168
在每一台需要訪問pod的虛機上,把集群內的IP段都添加上,就能實現了。
喜歡的朋友可以關注下我的個人公眾號哦