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

導(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ò)的實現(xiàn)方法。

鳥瞰

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


類似的圖大家可能在很多文章中都看過,但因為其中相關(guān)配置過于復(fù)雜,比較難理解。這里我們可以看下這些配置背后的邏輯。
基本上我們可以把這些配置分三種情況來理解:集群配置,節(jié)點配置以及 Pod 配置。與這三種情況對應(yīng)的,其實是對集群網(wǎng)絡(luò) IP 段的三次劃分:首先是集群 CIDR,接著是為每個節(jié)點分配 podCIDR(即集群 CIDR 的子網(wǎng)段),最后在 podCIDR 里為每個 Pod 分配自己的 IP。


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

初始階段

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


集群階段

在以上出初始資源的基礎(chǔ)上,我們利用集群創(chuàng)建控制臺得到集群 CIDR。這個值會以參數(shù)的形式傳給集群節(jié)點 provision 腳本,并被腳本傳給集群節(jié)點配置工具 kubeadm。kubeadm 最后把這個參數(shù)寫入集群控制器靜態(tài) Pod 的 yaml 文件 kube-controller-manager.yaml。


集群控制器有了這個參數(shù),在節(jié)點 kubelet 注冊節(jié)點到集群的時候,集群控制器會為每個注冊節(jié)點,劃分一個子網(wǎng)出來,即為每個節(jié)點分配 podCIDR。如上圖,Node B 的子網(wǎng)是 172.16.8.1/25,而 Node A 的子網(wǎng)是 172.16.0.128/25。這個配置會記錄到集群 node 的 podCIDR 數(shù)據(jù)項里。

節(jié)點階段

經(jīng)過以上集群階段,K8S 有了集群 CIDR,以及為每個節(jié)點劃分的 podCIDR。在此基礎(chǔ)上,集群會下發(fā) flanneld 到每個階段上,進(jìn)一步搭建節(jié)點上,可以給 Pod 使用的網(wǎng)絡(luò)框架。這里主要有兩個操作:
  • 第一個是集群通過 Cloud Controller Manager 給 VPC 配置路由表項。路由表項對每個節(jié)點有一條,每一條的意思是,如果 VPC 路由收到的目的地址是某一個節(jié)點 podCIDR 的 IP 地址,那么路由會把這個網(wǎng)絡(luò)包轉(zhuǎn)發(fā)到對應(yīng)的 ECS 上;
  • 第二個是創(chuàng)建虛擬網(wǎng)橋 cni0 以及與 cni0 相關(guān)的路由。這些配置的作用是,從階段外部進(jìn)來的網(wǎng)絡(luò)包,如果目的 IP 是 podCIDR,則會被節(jié)點轉(zhuǎn)發(fā)到 cni0 虛擬局域網(wǎng)里。
注意:實際實現(xiàn)上,cni0 的創(chuàng)建,是在第一個使用 Pod 網(wǎng)絡(luò)的 Pod 被調(diào)度到節(jié)點上的時候,由下一節(jié)中 flannal cni 創(chuàng)建的,但是從邏輯上來說,cni0 屬于節(jié)點網(wǎng)絡(luò),不屬于 Pod 網(wǎng)絡(luò),所以在此描述。


Pod 階段

在前邊的三個階段,集群實際上已經(jīng)為 Pod 之間搭建了網(wǎng)絡(luò)通信的干道。這個時候,如果集群把一個 Pod 調(diào)度到節(jié)點上,kubelet 會通過 flannel cni 為這個 Pod 本身創(chuàng)建網(wǎng)絡(luò)命名空間和 veth 設(shè)備,然后,把其中一個 veth 設(shè)備加入到 cni0 虛擬網(wǎng)橋里,并為 Pod 內(nèi)的 veth 設(shè)備配置 IP 地址。這樣 Pod 就和網(wǎng)絡(luò)通信的干道連接在了一起。 這里需要強(qiáng)調(diào)的是,前一節(jié)的 flanneld 和這一節(jié)的 flannel cni 完全是兩個組件。flanneld 是一個 daemonset 下發(fā)到每個節(jié)點的 pod,它的作用是搭建網(wǎng)絡(luò)(干道),而 flannel cni 是節(jié)點創(chuàng)建的時候,通過 kubernetes-cni 這個 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 提供輸入的一個環(huán)境變量文件;又比如 /etc/cni/net.d/10-flannel.conf,也是 flanneld pod(準(zhǔn)確的說,是 pod 里的腳本 install-cni)從 pod 里拷貝到節(jié)點目錄,給 flannel cni 使用的子網(wǎng)配置文件。


通信

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


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

總結(jié)

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

網(wǎng)頁標(biāo)題:K8s從懵圈到熟練–集群網(wǎng)絡(luò)詳解
瀏覽路徑:http://muchs.cn/article44/ipijee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、關(guān)鍵詞優(yōu)化服務(wù)器托管、App設(shè)計、域名注冊、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)