kubernetes service訪問原理

k8s集羣中有三類IP:nginx

1:宿主機的物理網卡IP,好比192.168.255.*服務器

2:cni建立的網卡的IP,好比172.16.*.*tcp

3:虛擬的IP(即ClusterIP ,沒法ping通,經過代理鏈接),172.19.*.*代理

 

若是在任何一臺機器上查看網卡name能看到那麼多網卡。以下圖。blog

eth0是真實的網卡:IP段192.168.255.*ip

cni是k8s爲了扁平化管理pod而建立的網卡,這裏是172.16.1.1 那麼其餘節點可能就是172.16.2.1,172.16.3.1table

其餘看到不少veth的網卡其實是跟cni網卡相連的。一個veth就表明一個pod,因此這個節點的pod ip就是172.16.1.*集羣

不一樣節點的pod好比172.16.2.5->172.16.1.3是直接能夠訪問,底層實現的方式(隧道技術)能夠不用太關注。配置

 

pod自己是沒有狀態的。也就是pod重啓以後他的ip就發生了變化,因此這裏引入了一個service做爲服務訪問的目標,service ip也是虛擬出的一個東西,好比起了一個nginx的pod,它關聯了一個叫my-nginx的服務,那麼如下是訪問的一個流程。service

 

 1:任何一個pod訪問my-nginx

2:從/etc/resolv.conf中配置的DNS服務器獲取cluster ip地址。能夠看到172.19.0.10這個做爲DNS服務器,在集羣安裝的時候已經固定好了,在建立應用的時候會自動寫入service 和cluster ip這樣一個映射關係,那麼pod就得到了my-nginx的cluster ip

3:k8s會在每一個節點建立一個proxy的服務,由proxy建立iptable規則,固然在nginx建立的時候規則以及建立好了,當pod鏈接culster ip的時候就會被轉發到nginx pod的ip,因此你經過service +port的形式鏈接有效,可是直接ping service是沒法ping通的,iptable只實現的tcp/udp的轉發

相關文章
相關標籤/搜索