概述
首先k8s裡面容器是存在於pod裡面的,所以容器之間通訊,一般分為三種型別:
1. pod內部容器之間
2. pod 與 pod 容器之間
3. pod 訪問service服務
pod內部容器之間
這種情況下容器通訊比較簡單,因為k8s pod內部容器是共享網路空間的,所以容器直接可以使用localhost訪問其他容器。
k8s在啟動容器的時候會先啟動乙個pause容器,這個容器就是實現這個功能的。
pod 與 pod 容器之間
這種型別又可以分為兩種情況:
1. 兩個pod在一台主機上面
2. 兩個pod分布在不同主機之上
針對第一種情況,就比較簡單了,就是docker預設的docker網橋互連容器。
docker --daemon --bip=172.17.18.1/24
注意其中的「--bip=172.17.18.1/24」這個引數,它限制了所在節點容器獲得的ip範圍。
跨節點通訊時,傳送端資料會從docker0路由到flannel0虛擬網絡卡,接收端資料會從flannel0路由到docker0,這是因為flannel會新增乙個路由
傳送端:
route -n
172.17.0.0 0.0.0.0 255.255.0.0 u 0 0 0 flannel0
172.17.13.0 0.0.0.0 255.255.255.0 u 0 0 0 docker0
接收端:
172.18.0.0 0.0.0.0 255.255.0.0 u 0 0 0 flannel0
172.17.12.0 0.0.0.0 255.255.255.0 u 0 0 0 docker0
例如現在有乙個資料報要從ip為172.17.13.2的容器發到ip為172.17.12.2的容器。根據資料傳送節點的路由表,它只與172.17.0.0/16匹配這條記錄匹配,因此資料從docker0出來以後就被投遞到了flannel0。同理在目標節點,由於投遞的位址是乙個容器,因此目的位址一定會落在docker0對於的172.17.12.0/24這個記錄上,自然的被投遞到了docker0網絡卡。
flannel的原理是將網路包封裝在udp裡面,所以傳送端和接收端需要裝包和解包,對效能有一定的影響。
k8s也支援其他的網路模型,比較有名的還有calico,不過我並沒有使用過。
pod 訪問service服務
這裡涉及到k8s裡面乙個重要的概念service。它是乙個服務的抽象,通過label(k8s會根據service和pod直接的關係建立endpoint,可以通過kubectl get ep檢視)關聯到後端的pod容器。
service分配的ip叫cluster ip是乙個虛擬ip(相對固定,除非刪除service),這個ip只能在k8s集群內部使用,如果service需要對外提供,只能使用nodeport方式對映到主機上,使用主機的ip和埠對外提供服務。(另外還可以使用loadbalance方式,但這種方式是在gce這樣的雲環境裡面使用的 )。
節點上面有個kube-proxy程序,這個程序從master apiserver獲取資訊,感知service和endpoint的建立,然後做兩個事:
1. 為每個service 在集群中每個節點上面建立乙個隨機埠,任何該埠上面的連線會**到相應的pod
kube-portals-container 從容器中通過service cluster ip和埠訪問service的請求
kube-portals-host 從主機中通過service cluster ip和埠訪問service的請求
kube-nodeport-container 從容器中通過service nodeport埠訪問service的請求
kube-nodeport-host 從主機中通過service nodeport埠訪問service的請求。
見下面測試環境的內容:
-a kube-nodeport-container -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 50171 -j redirect --to-ports 52244
-a kube-nodeport-host -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 50171 -j dnat --to-destination 10.45.25.227:52244
-a kube-portals-container -d 10.254.120.169/32 -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 1521 -j redirect --to-ports 52244
-a kube-portals-host -d 10.254.120.169/32 -p tcp -m comment --comment "smart/ccdb:port1521" -m tcp --dport 1521 -j dnat --to-destination 10.45.25.227:52244
52244就是kube-proxy針對service 「"smart/ccdb:port1521"」 在節點上面監聽的埠。
參考:2. 《kubernetes權威指南》
k8s 容器鉤子
有兩個鉤子暴露在容器中 poststart 這個鉤子在建立容器之後立即執行。但是,不能保證鉤子會在容器入口點之前執行。沒有引數傳遞給處理程式。kind deployment metadata name testlifecycle labels spec replicas 1 selector mat...
容器編排工具k8s
如何實踐 1 搜尋kubunetes online kubernetes playground katacoda pod k8s最小排程單位 docker pause 二個容器 deployments 維持pod一定數量 service 解決deploytemnets內部之間的乙個負載均衡 dns解...
k8s的 容器映象
my registry.example.com 5000 example web example v1.0.1 2.綠色部分 registry 埠 3.紫色部分 repository 名字 4.紅色部分 image 名字 5.棕色部分 image 標籤 更新映象 如果您期望每次啟動 pod 時,都強...