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