K8s 從懵圈到熟練 – 集羣網絡詳解

做者 | 聲東 阿里雲售後技術專家node

導讀:阿里雲 K8S 集羣網絡目前有兩種方案:一種是 flannel 方案;另一種是基於 calico 和彈性網卡 eni 的 terway 方案。Terway 和 flannel 相似,不一樣的地方在於 terway 支持 Pod 彈性網卡,以及 NetworkPolicy 功能。本文中,做者基於當前的 1.12.6 版本,以 flannel 爲例,深刻分析阿里雲 K8S 集羣網絡的實現方法。微信

鳥瞰

整體上來講,阿里雲 K8S 集羣網絡配置完成以後,以下圖所示:包括集羣 CIDR、VPC 路由表、節點網絡、節點的 podCIDR、節點上的虛擬網橋 cni0、鏈接 Pod 和網橋的 veth 等部分。網絡

1

相似的圖你們可能在不少文章中都看過,但由於其中相關配置過於複雜,比較難理解。這裏咱們能夠看下這些配置背後的邏輯。框架

基本上咱們能夠把這些配置分三種狀況來理解:集羣配置,節點配置以及 Pod 配置。與這三種狀況對應的,實際上是對集羣網絡 IP 段的三次劃分:首先是集羣 CIDR,接着是爲每一個節點分配 podCIDR(即集羣 CIDR 的子網段),最後在 podCIDR 裏爲每一個 Pod 分配本身的 IP。less

2

集羣網絡搭建

初始階段

集羣的建立,基於雲資源 VPC 和 ECS,在建立完 VPC 和 ECS 以後,咱們基本上能夠獲得以下圖的資源配置。咱們獲得一個 VPC,這個 VPC 的網段是 192.168.0.0/16,咱們獲得若干 ECS,他們從 VPC 網段裏分配到 IP 地址。微服務

3

集羣階段

在以上出初始資源的基礎上,咱們利用集羣建立控制檯獲得集羣 CIDR。這個值會以參數的形式傳給集羣節點 provision 腳本,並被腳本傳給集羣節點配置工具 kubeadm。kubeadm 最後把這個參數寫入集羣控制器靜態 Pod 的 yaml 文件 kube-controller-manager.yaml。工具

4

集羣控制器有了這個參數,在節點 kubelet 註冊節點到集羣的時候,集羣控制器會爲每一個註冊節點,劃分一個子網出來,即爲每一個節點分配 podCIDR。如上圖,Node B 的子網是 172.16.8.1/25,而 Node A 的子網是 172.16.0.128/25。這個配置會記錄到集羣 node 的 podCIDR 數據項裏。oop

節點階段

通過以上集羣階段,K8S 有了集羣 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

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 網絡環境搭建。基於以上的網絡環境,Pod 能夠完成四種通訊:本地通訊;同節點 Pod 通訊;跨節點 Pod 通訊;以及 Pod 和 Pod 網絡以外的實體通訊。

7

其中本地通訊,說的是 Pod 內部,不一樣容器之間的通訊。由於 Pod 內網容器之間共享一個網絡協議棧,因此他們之間的通訊,能夠經過 loopback 設備完成。

同節點 Pod 之間的通訊,是 cni0 虛擬網橋內部的通訊,這至關於一個二層局域網內部設備通訊。

跨節點 Pod 通訊略微複雜一點,但也很直觀,發送端數據包,經過 cni0 網橋的網關,流轉到節點上,而後通過節點 eth0 發送給 VPC 路由。這裏不會通過任何封包操做。當 VPC 路由收到數據包時,它經過查詢路由表,確認數據包目的地,並把數據包發送給對應的 ECS 節點。而進去節點以後,由於 flanneld 在節點上建立了 cni0 的路由,因此數據包會被髮送到目的地的 cni0 局域網,再到目的地 Pod。

最後一種狀況,Pod 與非 Pod 網絡的實體通訊,須要通過節點上 iptables 規則作 SNAT,而此規則就是 flanneld 依據命令行 --ip-masq 選項作的配置。

總結

以上是阿里雲 K8S 集羣網絡的搭建和通訊原理。咱們主要經過網絡搭建和通訊兩個角度去分析 K8S 集羣網絡。其中網絡搭建包括初始階段、集羣階段、節點階段以及 Pod 階段,這麼分類有助於咱們理解這些複雜的配置。而理解了各個配置,集羣通訊原理就比較容易理解了。

「 阿里巴巴雲原生微信公衆號(ID:Alicloudnative)關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,作最懂雲原生開發者的技術公衆號。」

相關文章
相關標籤/搜索