關註我們獲得更多精彩內容
導語:Kubernetes 目前看來已經成為了docker的應用最多的編排工具,所以學習使用docker容器的話,就免不了使用 Kubernetes,但是其網路原理還是比較晦澀難懂,所以還是有必要專門解析關於 Kubernetes 的網路原理。
Kubernetes 的網路模型組成
-
Pod 內部 docke r容器之間網路通訊[基礎 docker 網路理論]
-
Pod 所在的網路之間通訊[基礎 docker 網路理論]
-
Pod 和 Service 之間網路通訊[ Kubernetes 網路理論]
-
外界與Service之間網路通訊[ Kubernetes 網路理論]
Pod 內部 docker 容器之間網路通訊
Kubernetes 使用了一種 “IP-per-pod” 網路模型:為每一個 Pod 分配了一個IP地址,Pod 內部的 docker 容器共享Pod的網路空間,即它們共享 Pod 的網絡卡和 IP。其原理是根據 docker 的“container 網路”模型而來。
Pod 所在的網路之間通訊
Kubernetes 把各 node 主機上的 docker的 bridge 網路“外包”給了 flannel,然後透過 etcd 將各 node 主機上的 bridge 網路資訊收集起來,因此每個 node 之間的網路使用的是同網路的不同 IP,保證了網路通訊的可靠性。其原理是根據 docker 的“bridge 網路”模型而來。
Pod 和 Service 之間網路通訊
在 Kubernetes 體系中Pod是不穩定的,Pod 的 IP 地址會發生變化,所以 Kubernetes 引進了 Service 的概念。Service 是一個抽象的物體,Kubernetes 在建立 Service 物體時,為其分配了一個虛擬的 IP,當外界需要訪問 Pod 裡的容器提供的功能時,不直接使用 Pod 的 IP 地址和埠,而是訪問 Service 的這個虛擬 IP 和埠,由 Service 把請求轉發給它背後的 Pod。
Kubernetes 在建立 Service 時,根據 Service 的標簽選擇器(Label
Selector)來查詢 Pod,據此建立與 Service 同名的 EndPoints 物件。當Pod的地址發生變化時,EndPoints 也隨之變化。Service 接受到請求時,就能透過 EndPoints 找到對應的 Pod。再深入探究,Service 只是一個虛擬的概念,真正完成請求轉發的是執行在 node 節點上的 kube-proxy。Service的虛擬IP就是由kube-proxy實現的。
kube-proxy 有兩種請求轉發樣式:userspace 樣式和 iptables 樣式。在 Kubernetes
v1.1版本之前預設是userspace 樣式,v1.2 版本後預設是 iptables 樣式。
補充說明 iptables 樣式:
當建立 Service 時,所有 node 節點上的 kube-proxy 都會建立兩級 iptables 規則,一級為 Service 建立,目的是將的流量轉給後端,另一級為 EndPoints 建立,目的是用於選擇 Pod。當 service.spec.sessionAffinity 值為 ”ClientIP” 時,iptables樣式選擇 Pod 的演演算法和 userspace 樣式相同(選擇與請求來源IP更接近的 Pod)。當 service.spec.sessionAffinity 值為”None”時,隨機選擇Pod,所以如果被選擇的 Pod 沒有響應,不會嘗試選擇另一個 Pod。
外界與Service之間網路通訊
①ClusterIP 型別,這種型別的 Service 只會得到虛擬的 IP 和埠,只能在 Kubernetes 叢集內部被訪問,此模型是為預設型別。
②NodePort 型別,這種型別的 Service 除了會得到虛擬的IP和埠,Kubernetes 還會在所有 node 節點上為其分配埠。分配的埠的值可以透過 spec.ports[*].nodePort 指定,或由 Kubernetes 在配置好的區間裡分配(預設為 30000-32767)。這種 Service 即可以從 Kubernetes 叢集透過虛擬 IP:埠訪問,也可以從叢集外部透過Node節點的 IP:nodePort 訪問。
③LoadBalancer 型別,這種型別的 Service 除了會得到虛擬的 IP 和埠,Kubernetes 還會在所有 Node節點上為其分配埠,然後為其開通負載均衡。這種 Service 即可以從 Kubernetes 叢集透過虛擬IP:埠訪問,也可以從叢集外部透過 node 節點的 IP:nodePort訪問,還可以透過負載均衡的 IP 訪問。
總結
Kubernetes 網路模型的理解會對使用第三方產商提供的服務有更深刻的體會,比如阿裡雲,華為雲都已經全面支援 Kubernetes 的編排。其中涉及了很多 Kubernetes 的基本原理,回過頭來仔細想想,也無非是萬變不離其宗。