上一篇的"CNI理解-1"講到一些CNI的概念還有長什麼樣子,其實就是用一個設定檔來定義Kubernetes Pod的網路,也就是網路虛擬化的方式之一,這裡會提到一些Kubernetes的零件以及連線的方式內容,K8S零件部分後面會再說明
目前在Kubernetes上較常用常看到的CNI外掛套件程式分別有Flannel、Calico、Weave、Canal,目前自已看過的網路的文章,以及問過會這部分的朋友,比較常用的是Flannel跟Calico兩種CNI外掛,因為目前還在理解中,有些安裝過程及使用上較不熟悉,先從Flannel這個CNI外掛切入Kubernetes的網路來,而Flannel在安裝設定上較為容易上手。
Flannel的安裝在Kubernetes上也是透過yaml定義檔,透過K8S的"deployment"(這是K8S的resource後面會再說明)佈署成flanneld的服務(當然佈署的過程中會包含一些K8S的resource功能例如Configmap、ClusterRole、ClusterRoleBinding之類的內容,操作過後才會比較了解這些resource在幹麼不在這說明)Flannel的架構及連線過程如下圖
透過上圖就可以得知如果K8S在執行Container的時候(請把圖中的docker0改成flannel0這個Bridge)是如何從單一Node主機轉變成為多Nodes主機的架構,每台主機透過Master Node中的etcd加上flanneld的控制讓2台以上的Node可以達到溝通的效果,也就是說如果你要在2台Node上產生10個Pod,這時候Kubernetes就會用Flannel這個CNI外掛產生10個IP(就是上圖中的veth0的IP,想像一下2台主機一共有10個Pod跟10個IP),當然這個vetn0就是透過Network Namespace產生的結果全部都由各自主機的flannel0這個Bridge類型的網路來管理Pod,當連線進入時會透過Routing Table加上Pod標籤的方式找到特定的Pod。
回過頭來說那Flannel是怎麼去分配各個Node的IP呢?簡單點說就是在利用kubeadm工具安裝K8S時,就要定義--pod-network-cidr=X.X.X.X/X然後K8S就會在各個Node上定義Pod可以用的網路,這些定義檔在
/run/flannel/subnet.env
各個節點執行Pod時會根據上述檔案的定義分配該網路的IP讓Pod得到上網的能力!後面講到安裝的時候會再說明一次
kubeadmin在執行時則是利用kube-controller-manager這個程式控制cidr-network,因為執行的參數很多,重點就是下面3個參數
--cluster-cidr=10.244.0.0/16 -->定義Pod network
--allocate-node-cidrs=true
--node-cidr-mask-size=24 -->定義Pod network的網段
參考資料 >
https://github.com/flannel-io/flannel
https://jimmysong.io/kubernetes-handbook/
https://www.hwchiu.com/cni-flannel-ii.html

沒有留言:
張貼留言