溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

K8s 從懵圈到熟練 – 集群網(wǎng)絡(luò)詳解

發(fā)布時(shí)間:2020-08-07 06:27:37 來(lái)源:ITPUB博客 閱讀:137 作者:大濤學(xué)長(zhǎng) 欄目:關(guān)系型數(shù)據(jù)庫(kù)
導(dǎo)讀:阿里云 K8S 集群網(wǎng)絡(luò)目前有兩種方案:一種是 flannel 方案;另外一種是基于 calico 和彈性網(wǎng)卡 eni 的 terway 方案。Terway 和 flannel 類似,不同的地方在于 terway 支持 Pod 彈性網(wǎng)卡,以及 NetworkPolicy 功能。本文中,作者基于當(dāng)前的 1.12.6 版本,以 flannel 為例,深入分析阿里云 K8S 集群網(wǎng)絡(luò)的實(shí)現(xiàn)方法。

鳥瞰

總體上來(lái)說(shuō),阿里云 K8S 集群網(wǎng)絡(luò)配置完成之后,如下圖所示:包括集群 CIDR、VPC 路由表、節(jié)點(diǎn)網(wǎng)絡(luò)、節(jié)點(diǎn)的 podCIDR、節(jié)點(diǎn)上的虛擬網(wǎng)橋 cni0、連接 Pod 和網(wǎng)橋的 veth 等部分。


類似的圖大家可能在很多文章中都看過(guò),但因?yàn)槠渲邢嚓P(guān)配置過(guò)于復(fù)雜,比較難理解。這里我們可以看下這些配置背后的邏輯。
基本上我們可以把這些配置分三種情況來(lái)理解:集群配置,節(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。


集群網(wǎng)絡(luò)搭建

初始階段

集群的創(chuàng)建,基于云資源 VPC 和 ECS,在創(chuàng)建完 VPC 和 ECS 之后,我們基本上可以得到如下圖的資源配置。我們得到一個(gè) VPC,這個(gè) VPC 的網(wǎng)段是 192.168.0.0/16,我們得到若干 ECS,他們從 VPC 網(wǎng)段里分配到 IP 地址。


集群階段

在以上出初始資源的基礎(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)出來(lái),即為每個(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)里。

節(jié)點(diǎn)階段

經(jīng)過(guò)以上集群階段,K8S 有了集群 CIDR,以及為每個(gè)節(jié)點(diǎn)劃分的 podCIDR。在此基礎(chǔ)上,集群會(huì)下發(fā) flanneld 到每個(gè)階段上,進(jìn)一步搭建節(jié)點(diǎn)上,可以給 Pod 使用的網(wǎng)絡(luò)框架。這里主要有兩個(gè)操作:
  • 第一個(gè)是集群通過(guò) 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)來(lái)的網(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)建的,但是從邏輯上來(lái)說(shuō),cni0 屬于節(jié)點(diǎn)網(wǎng)絡(luò),不屬于 Pod 網(wǎng)絡(luò),所以在此描述。


Pod 階段

在前邊的三個(gè)階段,集群實(shí)際上已經(jīng)為 Pod 之間搭建了網(wǎng)絡(luò)通信的干道。這個(gè)時(shí)候,如果集群把一個(gè) Pod 調(diào)度到節(jié)點(diǎn)上,kubelet 會(huì)通過(guò) 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)的是,前一節(jié)的 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í)候,通過(guò) kubernetes-cni 這個(gè) rpm 包安裝的 cni 插件,其被 kubelet 調(diào)用,用來(lái)為具體的 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)確的說(shuō),是 pod 里的腳本 install-cni)從 pod 里拷貝到節(jié)點(diǎn)目錄,給 flannel cni 使用的子網(wǎng)配置文件。


通信

以上完成 Pod 網(wǎng)絡(luò)環(huán)境搭建?;谝陨系木W(wǎng)絡(luò)環(huán)境,Pod 可以完成四種通信:本地通信;同節(jié)點(diǎn) Pod 通信;跨節(jié)點(diǎn) Pod 通信;以及 Pod 和 Pod 網(wǎng)絡(luò)之外的實(shí)體通信。


其中本地通信,說(shuō)的是 Pod 內(nèi)部,不同容器之間的通信。因?yàn)?Pod 內(nèi)網(wǎng)容器之間共享一個(gè)網(wǎng)絡(luò)協(xié)議棧,所以他們之間的通信,可以通過(guò) loopback 設(shè)備完成。
同節(jié)點(diǎn) Pod 之間的通信,是 cni0 虛擬網(wǎng)橋內(nèi)部的通信,這相當(dāng)于一個(gè)二層局域網(wǎng)內(nèi)部設(shè)備通信。
跨節(jié)點(diǎn) Pod 通信略微復(fù)雜一點(diǎn),但也很直觀,發(fā)送端數(shù)據(jù)包,通過(guò) cni0 網(wǎng)橋的網(wǎng)關(guān),流轉(zhuǎn)到節(jié)點(diǎn)上,然后經(jīng)過(guò)節(jié)點(diǎn) eth0 發(fā)送給 VPC 路由。這里不會(huì)經(jīng)過(guò)任何封包操作。當(dāng) VPC 路由收到數(shù)據(jù)包時(shí),它通過(guò)查詢路由表,確認(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。
最后一種情況,Pod 與非 Pod 網(wǎng)絡(luò)的實(shí)體通信,需要經(jīng)過(guò)節(jié)點(diǎn)上 iptables 規(guī)則做 SNAT,而此規(guī)則就是 flanneld 依據(jù)命令行 --ip-masq 選項(xiàng)做的配置。

總結(jié)

以上是阿里云 K8S 集群網(wǎng)絡(luò)的搭建和通信原理。我們主要通過(guò)網(wǎng)絡(luò)搭建和通信兩個(gè)角度去分析 K8S 集群網(wǎng)絡(luò)。其中網(wǎng)絡(luò)搭建包括初始階段、集群階段、節(jié)點(diǎn)階段以及 Pod 階段,這么分類有助于我們理解這些復(fù)雜的配置。而理解了各個(gè)配置,集群通信原理就比較容易理解了。
本文作者:聲東 阿里云售后技術(shù)專家
原文鏈接
本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI