k8s集群外的主機訪問pod的解決方案


背景

目前公司想做服務的注冊與發現,但是在推進過程中,存在一個問題,目前我們的服務是混合部署的,即一部分部署在虛機,一部分部署在容器,所以就會面臨這樣一個問題,當容器里的服務和虛機里的服務都去注冊中心進行注冊時,虛機是無法訪問容器的地址的,不過令人欣慰的是,虛機和容器是同屬一局域網,所以要實現服務的注冊與發現,首先需要解決這一問題。

解決過程

首先就是一頓分析了,下面是我的分析過程

  • 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段都添加上,就能實現了。


 

喜歡的朋友可以關注下我的個人公眾號哦


免責聲明!

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



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