Kubernetes 【网络组件】CNI网络概念
文章目錄
- 1. Docker網絡模式
- 1.2 bridge網絡
- 2. CNI介 紹
- 3. 如何使用 CNI
- 4. 哪個 CNI 插件適合我
- 5. 如何理解集群網絡
- 5.1 初始階段
- 5.2 集群階段
- 5.3 節點階段
- 5.4 Pod 階段
- 6. 如何理解集群網絡通信類型
- 6.1 pod內部通信
- 6.2 不同Pod中容器之間通信
- 6.3 跨節點通信
- 7. 術 語
本文將在介紹技術原理和相應術語的基礎上,再集中探索與詳細對比目前最流行的CNI插件:Flannel、Calico、Weave和Canal,對比介紹它們的原理、使用方法、適用場景和優缺點等。
1. Docker網絡模式
容器網絡是容器選擇連接到其他容器、主機和外部網絡(如Internet)的機制。容器的runtime提供了各種網絡模式,每種模式都會產生不同的體驗。例如,Docker采用插件化的網絡模式,默認提供bridge、host、none、overlay、maclan和Network plugins這幾種網絡模式,運行容器時可以通過–network參數設置具體使用那一種模式:
daemon就可以通過MAC地址進行訪問的路由。對于希望直接連接網絡網絡的遺留應用,這種網絡驅動有時可能是最好的選擇。
在默認情況,Docker使用bridge網絡模式,bridge網絡驅動的示意圖如下,我們先以bridge模式對Docker的網絡進行說明。
自定義網橋:用戶定義的網橋,具有更多的靈活性、隔離性和其他便利功能。
Docker還可以讓用戶通過其他驅動程序和插件,來配置更高級的網絡(包括多主機覆蓋網絡)。
1.2 bridge網絡
“、”172.16.0.0-172.31.255.255″和“192.168.0.0——192.168.255.255”這三個私有網絡的地址范圍。
可以修改docker的默認網段:
第一步 刪除原有配置 sudo service docker stop sudo ip link set dev docker0 down sudo brctl delbr docker0 sudo iptables -t nat -F POSTROUTING第二步 創建新的網橋 sudo brctl addbr docker0 sudo ip addr add 172.17.10.1/24 dev docker0 sudo ip link set dev docker0 up第三步 配置Docker的文件 注意: 這里是 增加下面的配置 vi /etc/docker/daemon.json ##追加的即可 cat /etc/docker/daemon.json {"registry-mirrors": ["http://224ac393.m.daocloud.io"],"bip": "172.17.10.1/24" } $ systemctl restart docker2. CNI介 紹
首先我們介紹一下什么是 CNI,它的全稱是 Container Network Interface,即容器網絡的 API 接口,它是一種標準的設計,為了讓用戶在容器創建或銷毀時都能夠更容易地配置容器網絡。在本文中,我們將集中探索與對比目前最流行的CNI插件:Flannel、Calico、Weave和Canal(技術上是多個插件的組合)。這些插件既可以確保滿足Kubernetes的網絡要求,又能為Kubernetes集群管理員提供他們所需的某些特定的網絡功能。
CNI的初衷是創建一個框架,用于在配置或銷毀容器時動態配置適當的網絡配置和資源。下面鏈接中的CNI規范概括了用于配制網絡的插件接口,這個接口可以讓容器運行時與插件進行協調:
https://github.com/containern…
插件負責為接口配置和管理IP地址,并且通常提供與IP管理、每個容器的IP分配、以及多主機連接相關的功能。容器運行時會調用網絡插件,從而在容器啟動時分配IP地址并配置網絡,并在刪除容器時再次調用它以清理這些資源。
運行時或協調器決定了容器應該加入哪個網絡以及它需要調用哪個插件。然后,插件會將接口添加到容器網絡命名空間中,作為一個veth對的一側。接著,它會在主機上進行更改,包括將veth的其他部分連接到網橋。再之后,它會通過調用單獨的IPAM(IP地址管理)插件來分配IP地址并設置路由。
3. 如何使用 CNI
在Kubernetes中,kubelet可以在適當的時間調用它找到的插件,來為通過kubelet啟動的pod進行自動的網絡配置。
基本的使用方法為:
在集群里面創建一個 Pod 的時候,首先會通過 apiserver 將 Pod 的配置寫入。apiserver 的一些管控組件(比如 Scheduler)會調度到某個具體的節點上去。Kubelet 監聽到這個 Pod 的創建之后,會在本地進行一些創建的操作。當執行到創建網絡這一步驟時,它首先會讀取剛才我們所說的配置目錄中的配置文件,配置文件里面會聲明所使用的是哪一個插件,然后去執行具體的 CNI 插件的二進制文件,再由 CNI 插件進入 Pod 的網絡空間去配置 Pod 的網絡。配置完成之后,Kuberlet 也就完成了整個 Pod 的創建過程,這個 Pod 就在線了。
4. 哪個 CNI 插件適合我
這就要從 CNI 的幾種實現模式說起。我們需要根據不同的場景選擇不同的實現模式,再去選擇對應的具體某一個插件。
通常來說,CNI 插件可以分為三種:Overlay、路由及 Underlay。
其他相關選擇CNI因素
5. 如何理解集群網絡
CIDR:無類別域間路由(Classless Inter-Domain Routing、CIDR)是一個用于給用戶分配IP地址以及在互聯網上有效地路由IP數據包的對IP地址進行歸類的方法
以 flannel 為例,深入分析阿里云 Kubernetes 集群網絡的實現方法,一個是網絡的搭建過程,另外一個是基于網絡的通信。
分三種情況來理解:集群配置,節點配置以及 Pod 配置。與這三種情況對應的,其實是對集群網絡 IP 段的三次劃分:首先是集群 CIDR,接著為每個節點分配 podCIDR(即集群 CIDR 的子網段),最后在 podCIDR 里為每個 Pod 分配自己的 IP。
5.1 初始階段
集群的創建,基于云資源 VPC 和 ECS,在創建完 VPC 和 ECS 之后,我們基本上可以得到如下圖的資源配置。我們得到一個 VPC,這個 VPC 的網段是 192.168.0.0/16,我們得到若干 ECS,他們從 VPC 網段里分配到 IP 地址。
5.2 集群階段
在以上出初始資源的基礎上,我們利用集群創建控制臺得到集群 CIDR。這個值會以參數的形式傳給集群節點 provision 腳本,并被腳本傳給集群節點配置工具 kubeadm。kubeadm 最后把這個參數寫入集群控制器靜態 Pod 的 yaml 文件 kube-controller-manager.yaml。
集群控制器有了這個參數,在節點 kubelet 注冊節點到集群的時候,集群控制器會為每個注冊節點,劃分一個子網出來,即為每個節點分配 podCIDR。如上圖,Node B 的子網是 172.16.8.1/25,而 Node A 的子網是 172.16.0.128/25。這個配置會記錄到集群 node 的 podCIDR 數據項里。
5.3 節點階段
經過以上集群階段,Kubernetes 有了集群 CIDR,以及為每個節點劃分的 podCIDR。在此基礎上,集群會下發 flanneld 到每個階段上,進一步搭建節點上,可以給 Pod 使用的網絡框架。這里主要有兩個操作,
- 第一個是集群通過 Cloud Controller Manager 給 VPC配置路由表項。路由表項對每個節點有一條。每一條的意思是,如果 VPC 路由收到目的地址是某一個節點 podCIDR 的 IP地址,那么路由會把這個網絡包轉發到對應的 ECS 上。
- 第二個是創建虛擬網橋 cni0,以及與 cni0 相關的路由。這些配置的作用是,從階段外部進來的網絡包,如果目的 IP 是podCIDR,則會被節點轉發到 cni0 虛擬局域網里。
注意:實際實現上,cni0 的創建,是在第一個使用 Pod 網絡的 Pod 被調度到節點上的時候,由下一節中 flannal cni 創建的,但是從邏輯上來說,cni0 屬于節點網絡,不屬于 Pod 網絡,所以在此描述。
5.4 Pod 階段
在前邊的三個階段,集群實際上已經為 Pod 之間搭建了網絡通信的干道。這個時候,如果集群把一個 Pod 調度到節點上,kubelet 會通過 flannel cni 為這個 Pod 本身創建網絡命名空間和 veth 設備,然后,把其中一個 veth 設備加入到 cni0 虛擬網橋里,并為 Pod 內的 veth 設備配置 ip 地址。這樣 Pod 就和網絡通信的干道連接在了一起。這里需要強調的是, flanneld 和這一節的 flannel cni 完全是兩個組件。flanneld 是一個 daemonset 下發到每個節點的 pod,它的作用是搭建網絡(干道),而 flannel cni 是節點創建的時候,通過 kubernetes-cni 這個 rpm 包安裝的 cni 插件,其被 kubelet 調用,用來為具體的 pod 創建網絡(分枝)。
理解這兩者的區別,有助于我們理解 flanneld 和 flannel cni 相關的配置文件的用途。比如/run/flannel/subnet.env,是 flanneld 創建的,為 flannel cni 提供輸入的一個環境變量文件;又比如/etc/cni/net.d/10-flannel.conf,也是 flanneld pod(準確的說,是 pod 里的腳本 install-cni)從 pod 里拷貝到節點目錄,給 flannel cni 使用的子網配置文件。
6. 如何理解集群網絡通信類型
以上完成 Pod 網絡環境搭建?;谝陨系木W絡環境,Pod 可以完成四種通信:本地通信,同節點 Pod 通信,跨節點 Pod 通信,以及 Pod 和 Pod 網絡之外的實體通信。
6.1 pod內部通信
Kubernetes創建Pod時,首先會創建一個pause容器,為Pod指派一個唯一的IP地址。然后,以pause的網絡命名空間為基礎,創建同一個Pod內的其它容器(–net=container:xxx)。因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost即loopback 設備進行通信。
6.2 不同Pod中容器之間通信
是 cni0 虛擬網橋內部的通信,這相當于一個二層局域網內部設備通信。
6.3 跨節點通信
發送端數據包,通過 cni0 網橋的網關,流轉到節點上,然后經過節點 eth0 發送給 VPC 路由。這里不會經過任何封包操作。當 VPC 路由收到數據包時,它通過查詢路由表,確認數據包目的地,并把數據包發送給對應的 ECS 節點。而進去節點之后,因為 flanneld 在節點上創建了真的 cni0 的路由,所以數據包會被發送到目的地的 cni0 局域網,再到目的地 Pod。
flannel的支持多種網絡模式,常用用都是vxlan、UDP、hostgw、ipip以及gce和阿里云等。
vxlan和UDP的區別是vxlan是內核封包,而UDP是flanneld用戶態程序封包,所以UDP的方式性能會稍差;
hostgw模式是一種主機網關模式,容器到另外一個主機上容器的網關設置成所在主機的網卡地址,這個和calico非常相似,只不過calico是通過BGP聲明,而hostgw是通過中心的etcd分發,所以hostgw是直連模式,不需要通過overlay封包和拆包,性能比較高,但hostgw模式最大的缺點是必須是在一個二層網絡中,畢竟下一跳的路由需要在鄰居表中,否則無法通行。
7. 術 語
在對CNI插件們進行比較之前,我們可以先對網絡中會見到的相關術語做一個整體的了解。不論是閱讀本文,還是今后接觸到其他和CNI有關的內容,了解一些常見術語總是非常有用的。
一些最常見的術語包括:
- 第2層網絡: OSI(Open Systems Interconnections,開放系統互連)網絡模型的“數據鏈路”層。第2層網絡會處理網絡上兩個相鄰節點之間的幀傳遞。第2層網絡的一個值得注意的示例是以太網,其中MAC表示為子層。
- 第3層網絡: OSI網絡模型的“網絡”層。第3層網絡的主要關注點,是在第2層連接之上的主機之間路由數據包。IPv4、IPv6和ICMP是第3層網絡協議的示例。
- VXLAN:代表“虛擬可擴展LAN”。首先,VXLAN用于通過在UDP數據報中封裝第2層以太網幀來幫助實現大型云部署。VXLAN虛擬化與VLAN類似,但提供更大的靈活性和功能(VLAN僅限于4096個網絡ID)。VXLAN是一種封裝和覆蓋協議,可在現有網絡上運行。
- Overlay網絡:Overlay網絡是建立在現有網絡之上的虛擬邏輯網絡。Overlay網絡通常用于在現有網絡之上提供有用的抽象,并分離和保護不同的邏輯網絡。
- 封裝:封裝是指在附加層中封裝網絡數據包以提供其他上下文和信息的過程。在overlay網絡中,封裝被用于從虛擬網絡轉換到底層地址空間,從而能路由到不同的位置(數據包可以被解封裝,并繼續到其目的地)。
- 網狀網絡:網狀網絡(Mesh network)是指每個節點連接到許多其他節點以協作路由、并實現更大連接的網絡。網狀網絡允許通過多個路徑進行路由,從而提供更可靠的網絡。網狀網格的缺點是每個附加節點都會增加大量開銷。
- BGP:代表“邊界網關協議”,用于管理邊緣路由器之間數據包的路由方式。BGP通過考慮可用路徑,路由規則和特定網絡策略,幫助弄清楚如何將數據包從一個網絡發送到另一個網絡。BGP有時被用作CNI插件中的路由機制,而不是封裝的覆蓋網絡。
參考連接:
https://www.infoq.cn/article/6mdfWWGHzAdihiq9lDST?utm_source=related_read&utm_medium=article
https://blog.csdn.net/hguisu/article/details/92637760
總結
以上是生活随笔為你收集整理的Kubernetes 【网络组件】CNI网络概念的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Django静态文件配置pychar
- 下一篇: HA机制的大数据集群的搭建过程