k8s的網絡模型和CNI插件


網絡棧   

   一個進程發起和響應網絡環境(網絡棧)
   網卡
   回環設備
   路由表
   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 插件就可以“代表”Flannel,進行“將容器加入到 CNI 網絡里”這一步操作了.而這一部分內容,與容器 Network Namespace密切相關 
    第一步:CNI bridge插件檢查宿主機上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規則

      iptables 只是一個操作 Linux 內核 Netfilter 子系統的“界面”.顧名思義,Netfilter 子系統的作用,就是 Linux 內核里擋在“網卡”和“用戶態進程”之間的一道“防火牆"
      

 

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

       iptables 表的作用,就是在某個具體的“檢查點”(比如 Output)上,按順序執行幾個不同的檢查動作(比如,先執行 nat,再執行 filter) 
       PREROUTING INPUT FORWARD OUTPUT POSTROUTING 是鏈(檢查點)
       nat filter 是表
       一個IP包的流動過程:
         1.經過PREROUTING的檢查點
         2.根據路由表進行判斷
         兩種情況:
            1.經過INPUT檢查點把IP包通過傳輸層進入到用戶空間,交給用戶進程處理用戶進程通過本機發出返回的IP包經過路由表然后再經過OUTPUT檢查點
            2.IP 包不會進入傳輸層,而是會繼續在網絡層流動,從而進入到轉發路徑Forward Path.在轉發路徑中,Netfilter會設置一個名叫FORWARD檢查點
              而在 FORWARD“檢查點”完成后,IP 包就會來到流出路徑.而轉發的 IP 包由於目的地已經確定,它就不會再經過路由,也自然不會經過 OUTPUT,而是會直接來到 POSTROUTING“檢查點”
         以上兩條路徑的IP最終都要經過POSTROUTING檢查點才能到達網卡向外發送出去
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM