網絡棧
一個進程發起和響應網絡環境(網絡棧)
網卡
回環設備
路由表
iptables規則
kubernetes-cni包
在宿主機上安裝CNI插件所需要的基礎可執行文件(/opt/cni/bin)
flannel項目對應的cni插件已經被內置了 無需單獨安裝
weave calico等安裝插件的時候必須把對應的CNI插件的可執行文件拷貝到/opt/cni/bin下
k8s的cni(flannel)插件的安裝
網絡方案的本身
創建和配置網絡設備 如網橋等
配置宿主機路由表
配置ARP表和FDB表
網絡對應的CNI插件
配置Infra容器的網絡棧 並把容器連接到CNI網橋上
CNI插件的工作原理
kubelet創建Pod的時候,第一個創建的一定是Infra容器 創建並啟動容器后就會
為CNI插件准備參數,然后調用CNI插件(/opt/cin/bin下的可執行文件)配置容器網絡棧
CNI插件參數的組成
1.設置CNI的環境變量CNI_COMMAND 只有ADD和DEL
ADD的含義是把容器添加到CNI網絡里
DEL的含義是把容器從CNI網絡里移除
2.設置CNI的環境變量CNI_ARGS
通過這個參數以key-value的格式傳遞自定義信息給網絡插件是用戶實現自定義CNI協議的重要方法
3.從CNI配置文件中加載自己的默認插件的配置信息

第二步: CNI bridge 插件會通過Infra容器的 Network Namespace 文件,進入到這個Network Namespace 里面,然后創建一對 Veth Pair 設備.
緊接着,它會把這個 Veth Pair 的其中一端,“移動”到宿主機上 等於在容器中執行
第三步: CNI bridge 插件就可以把 vethb4963f3 設備連接在 CNI 網橋上
在將 vethb4963f3 設備連接在 CNI 網橋之后,CNI bridge 插件還會為它設置 Hairpin Mode(發夾模式)這是因為,在默認情況下,網橋設備是不允許一個數據包從一個端口進來后,再從這個端口發出去的.但是,它允許你為這個端口開啟 Hairpin Mode,從而取消這個限制
Flannel 插件要在 CNI 配置文件里聲明 hairpinMode=true 這樣,將來這個集群里的 Pod 才可以通過它自己的 Service 訪問到自己
第四步:CNI bridge 插件會調用 CNI ipam 插件,從 ipam.subnet 字段規定的網段里為容器分配一個可用的 IP 地址.然后,CNI bridge 插件就會把這個 IP 地址添加在容器的eth0網卡上,同時為容器設置默認路由
第五步: CNI bridge 插件會為CNI 網橋添加IP地址.這相當於在宿主機上執行
最后一步: CNI 插件會把容器的IP地址等信息返回給 dockershim,然后被 kubelet 添加到 Pod 的 Status 字段
kubernetes網絡隔離機制
Pod默認都是“允許所有”(Accept All)的,即:Pod可以接收來自任何發送方的請求;或者,向任何接收方發送請求
一旦Pod被NetworkPolicy 選中,那么這個Pod就會進入“拒絕所有”(Deny All)的狀態,即:這個Pod既不允許被外界訪問,也不允許對外界發起訪問
而NetworkPolicy定義的規則,其實就是“白名單”.例如,在我們上面這個例子里,我在 policyTypes 字段,定義了這個NetworkPolicy的類型是ingress和 egress,即:它既會影響流入(ingress)請求,也會影響流出(egress)請求
凡是支持NetworkPolicy的CNI網絡插件,都維護着一個NetworkPolicy Controller,通過控制循環的方式對NetworkPolicy 對象的增刪改查做出響應,然后在宿主機上完成iptables規則的配置工作
iptables規則

當一個 IP 包通過網卡進入主機之后,它就進入了Netfilter 定義的流入路徑(Input Path)里 在路由之前,Netfilter設置了一個叫PREROUTING的檢查點
