040.Kubernetes集群網絡-CNI網絡模型


一 CNM網絡模型

1.1 網絡模型

生產環境中,跨主機容器間的網絡互通已經成為基本要求,更高的要求包括容器固定IP地址、一個容器多個IP地址、多個子網隔離、ACL控制策略、與SDN集成等。目前主流的容器網絡模型主要有Docker公司提出的Container Network Model(CNM)模型和CoreOS公司提出的Container Network Interface(CNI)模型。

1.2 CNM模型

CNM模型是由Docker公司提出的容器網絡模型,現在已經被Cisco Contiv、Kuryr、Open Virtual Networking(OVN)、Project Calico、VMware、Weave和Plumgrid等項目所采納。同時,Weave、Project Calico、Kuryr和Plumgrid等項目也為CNM提供了網絡插件的具體實現。
CNM模型主要通過Network Sandbox、Endpoint和Network這3個組件進行實現,如下圖所示:
clipboard
Network Sandbox:容器內部的網絡棧,包括網絡接口、路由表、DNS等配置的管理。Sandbox可用Linux網絡命名空間、FreeBSD Jail等機制進行實現。一個Sandbox可以包含多個Endpoint。
Endpoint:用於將容器內的Sandbox與外部網絡相連的網絡接口。可以使用veth對、OpenvSwitch的內部port等技術進行實現。一個Endpoint僅能夠加入一個Network。
Network:可以直接互連的Endpoint的集合。可以通過Linux網橋、VLAN等技術進行實現。一個Network包含多個Endpoint。

二 CNI模型

2.1 CNI模型

CNI是由CoreOS公司提出的另一種容器網絡規范,現在已經被Kubernetes、rkt、ApacheMesos、CloudFoundry和Kurma等項目采納。另外,Contiv Networking,Project Calico、Weave、SR-IOV、Cilium、Infoblox、Multus、Romana、Plumgrid和Midokura等項目也為CNI提供網絡插件的具體實現。
clipboard
如上所示,容器運行環境與各種網絡插件通過CNI進行連接的模型。
CNI定義的是容器運行環境與網絡插件之間的簡單接口規范,通過一個JSON Schema定義CNI插件提供的輸入和輸出參數。一個容器可以通過綁定多個網絡插件加入多個網絡中。本節將對Kubernetes如何實現CNI模型進行詳細說明。

2.2 CNI規范概述

CNI提供了一種應用容器的插件化網絡解決方案,定義對容器網絡進行操作和配置的規范,通過插件的形式對CNI接口進行實現。CNI是由rkt Networking Proposal發展而來的,試圖提供一種普適的容器網絡解決方案。
CNI僅關注在創建容器時分配網絡資源,和在銷毀容器時刪除網絡資源,這使得CNI規范非常輕巧、易於實現,得到了廣泛的支持。在CNI模型中只涉及兩個概念:容器和網絡。
容器(Container):是擁有獨立Linux網絡命名空間的環境,例如使用Docker或rkt創建的容器。容器需要擁有自己的Linux網絡命名空間,這是加入網絡的必要條件。
網絡(Network):表示可以互連的一組實體,這些實體擁有各自獨立、唯一的IP地址,可以是容器、物理機或者其他網絡設備(比如路由器)等。
對容器網絡的設置和操作都通過插件(Plugin)進行具體實現,CNI插件包括兩種類型:CNI Plugin和IPAM(IP Address Management)Plugin。CNI Plugin負責為容器配置網絡資源,IPAM Plugin負責對容器的IP地址進行分配和管理。IPAM Plugin作為CNI Plugin的一部分,與CNIPlugin協同工作。

2.3 CNI Plugin插件詳解

CNI Plugin包括3個基本接口的定義:添加(ADD)、刪除(DELETE)、檢查(CHECK)和版本查詢(VERSION)。這些接口的具體實現要求插件提供一個可執行的程序,在容器網絡添加或刪除時進行調用,以完成具體的操作。
添加:將容器添加到某個網絡。主要過程為在Container Runtime創建容器時,先創建好容器內的網絡命名空間(Network Namespace),然后調用CNI插件為該netns進行網絡配置,最后啟動容器內的進程。添加接口的參數如下:
    • Version:CNI版本號。
    • ContainerID:容器ID。
    • Network Namespace path:容器的網絡命名空間路徑,例如/proc/[pid]/ns/net。
    • Network configuration:網絡配置JSON文檔,用於描述容器待加入的網絡。
    • Extra arguments:其他參數,提供基於容器的CNI插件簡單配置機制。
    • Name of the interface inside the container:容器內的網卡名,返回的信息如下:
      • Interfaces list:網卡列表,根據Plugin的實現,可能包括Sandbox Interface名稱、主機Interface名稱、每個Interface的地址等信息。
      • IPs assigned to the interface:IPv4或者IPv6地址、網關地址、路由信息等。
      • DNS information:DNS相關的信息。
刪除:容器銷毀時將容器從某個網絡中刪除。刪除接口的參數如下:
    • Version:CNI版本號。
    • ContainerID:容器ID。
    • Network Namespace path:容器的網絡命名空間路徑,例如/proc/[pid]/ns/net。
    • Network configuration:網絡配置JSON文檔,用於描述容器待加入的網絡。
    • Extra arguments:其他參數,提供基於容器的CNI插件簡單配置機制。
    • Name of the interface inside the container:容器內的網卡名。
檢查:檢查容器網絡是否正確設置。檢查接口的參數如下:
    • Version:CNI版本號。
    • ContainerID:容器ID。
    • Network Namespace path:容器的網絡命名空間路徑,例如/proc/[pid]/ns/net。
    • Network configuration:網絡配置JSON文檔,用於描述容器待加入的網絡。
    • Extra arguments:其他參數,提供基於容器的CNI插件簡單配置機制。
    • Name of the interface inside the container:容器內的網卡名
版本查詢:查詢網絡插件支持的CNI規范版本號。無參數,返回值為網絡插件支持的CNI規范版本號。

2.4 IPAM Plugin插件詳解

為了減輕CNI Plugin對IP地址管理的負擔,在CNI規范中設置了一個新的插件專門用於管理容器的IP地址(還包括網關、路由等信息),被稱為IPAM Plugin。通常由CNI Plugin在運行時自動調用IPAM Plugin完成容器IP地址的分配。
IPAM Plugin負責為容器分配IP地址、網關、路由和DNS,典型的實現包括host-local和dhcp。與CNI Plugin類似,IPAM插件也通過可執行程序完成IP地址分配的具體操作。IPAM可執行程序也處理傳遞給CNI插件的環境變量和通過標准輸入(stdin)傳入的網絡配置參數。
如果成功完成了容器IP地址的分配,則IPAM插件應該通過標准輸出(stdout)返回以下JSON報文:
  1  2     "cniVersion": "0.4.0",
  3     "ips":[
  4           {
  5 
  6                    "version": "<4-or-6>",
  7                     "address": "<ip-and-prefix-in-CIDR>",
  8                     "gateway": "<ip-address-of-the-gateway>" (optional)
  9            },
 10            ..........
 11       ],
 12       "routes":[
 13        {
 14           "dst": "<ip-and-prefix-in-cidr>",
 15            "gw": "<ip-of-next-hop>"
 16         },
 17        ........
 18       ]
 19 
 20       "dns":{
 21        "nameservers": <list-of-nameservers> (optional)
 22        "domain": <name-of-local-domain>  (optional)
 23        "search": <list-of-options>  (optional)
 24      }
 25
其中包括ips、routes和dns三段內容:
  • ips段:分配給容器的IP地址(也可能包括網關)。
  • routes段:路由規則記錄。
  • dns段:DNS相關的信息。

2.5 多網絡插件

多網絡插件參考:https://blog.csdn.net/qq_31136839/article/details/99852616

三 Kubernetes網絡插件

3.1 Kubernetes網絡插件

Kubernetes目前支持兩種網絡插件的實現。
CNI插件:根據CNI規范實現其接口,以與插件提供者進行對接。
kubenet插件:使用bridge和host-local CNI插件實現一個基本的cbr0。
為了在Kubernetes集群中使用網絡插件,需要在kubelet服務的啟動參數上設置下面兩個參數:
  • --network-plugin-dir:kubelet啟動時掃描網絡插件的目錄。
  • --network-plugin:網絡插件名稱,對於CNI插件,設置為cni即可,無須關注--network-plugin-dir的路徑。對於kubenet插件,設置為kubenet,目前僅實現了一個簡單的cbr0 Linux網橋。
在設置--network-plugin="cni"時,kubelet還需設置下面兩個參數。
    • --cni-conf-dir:CNI插件的配置文件目錄,默認為/etc/cni/net.d。該目錄下配置文件的內容需要符合CNI規范。
    • --cni-bin-dir:CNI插件的可執行文件目錄,默認為/opt/cni/bin。
目前已有多個開源項目支持以CNI網絡插件的形式部署到Kubernetes集群中,進行Pod的網絡設置和網絡策略的設置,包括Calico、Canal、Cilium、Contiv、Flannel、Romana、WeaveNet等。


免責聲明!

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



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