K8s 從懵圈到熟練 集群網路詳解

2022-06-07 23:45:21 字數 2756 閱讀 9720

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

總體上來說,阿里雲 k8s 集群網路配置完成之後,如下圖所示:包括集群 cidr、vpc 路由表、節點網路、節點的 podcidr、節點上的虛擬網橋 cni0、連線 pod 和網橋的 veth 等部分。

基本上我們可以把這些配置分三種情況來理解:集群配置,節點配置以及 pod 配置。與這三種情況對應的,其實是對集群網路 ip 段的三次劃分:首先是集群 cidr,接著是為每個節點分配 podcidr(即集群 cidr 的子網段),最後在 podcidr 裡為每個 pod 分配自己的 ip。

集群的建立,基於雲資源 vpc 和 ecs,在建立完 vpc 和 ecs 之後,我們基本上可以得到如下圖的資源配置。我們得到乙個 vpc,這個 vpc 的網段是 192.168.0.0/16,我們得到若干 ecs,他們從 vpc 網段裡分配到 ip 位址。

在以上出初始資源的基礎上,我們利用集群建立控制台得到集群 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 資料項裡。

經過以上集群階段,k8s 有了集群 cidr,以及為每個節點劃分的 podcidr。在此基礎上,集群會下發 flanneld 到每個階段上,進一步搭建節點上,可以給 pod 使用的網路框架。這裡主要有兩個操作:

注意:實際實現上,cni0 的建立,是在第乙個使用 pod 網路的 pod 被排程到節點上的時候,由下一節中 flannal cni 建立的,但是從邏輯上來說,cni0 屬於節點網路,不屬於 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 使用的子網配置檔案。

以上完成 pod 網路環境搭建。基於以上的網路環境,pod 可以完成四種通訊:本地通訊;同節點 pod 通訊;跨節點 pod 通訊;以及 pod 和 pod 網路之外的實體通訊。

其中本地通訊,說的是 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 階段,這麼分類有助於我們理解這些複雜的配置。而理解了各個配置,集群通訊原理就比較容易理解了。

K8s 從懵圈到熟練 映象拉取這件小事

順序上來說,私有映象自動拉取會首先通過阿里雲 acr credential helper 元件,再經過 k8s 集群的 api server 和 kubelet 元件,最後到 docker 容器執行時。但是我的敘述,會從後往前,從最基本的 docker 映象拉取說起。映象拉取這件小事 為了討論方便,...

K8S從入門到放棄

blog 個人 目錄docker 是乙個開源的應用容器引擎,基於go 語言並遵從 apache2.0 協議開源。docker 可以讓開發者打包他們的應用以及依賴包到乙個輕量級 可移植的容器中,然後發布到任何流行的 linux 機器上,也可以實現虛擬化。docker 從 17.03 版本之後分為 ce...

k8s系列分享 從入門到精進 待整理

公司讓本人去系統了解k8s的機制,實現docker容器排程。結合本人從零學習經歷,並給組內隊員分享,同步部落格,以此為記。1.k8s簡介 2.集群搭建 1.yaml 檔案 2.kubectl 3.pod 4.label 5.controller 6.volume 7.pvc 和 pv 8.secre...