在前邊的三個階段,集群實際上已經為 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 使用的子網配置文件。