日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Kubernetes 【网络组件】CNI网络概念

發布時間:2023/12/20 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes 【网络组件】CNI网络概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. Docker網絡模式
      • 1.2 bridge網絡
    • 2. CNI介 紹
    • 3. 如何使用 CNI
    • 4. 哪個 CNI 插件適合我
    • 5. 如何理解集群網絡
      • 5.1 初始階段
      • 5.2 集群階段
      • 5.3 節點階段
      • 5.4 Pod 階段
    • 6. 如何理解集群網絡通信類型
      • 6.1 pod內部通信
      • 6.2 不同Pod中容器之間通信
      • 6.3 跨節點通信
    • 7. 術 語


本文將在介紹技術原理和相應術語的基礎上,再集中探索與詳細對比目前最流行的CNI插件:Flannel、Calico、Weave和Canal,對比介紹它們的原理、使用方法、適用場景和優缺點等。

1. Docker網絡模式

容器網絡是容器選擇連接到其他容器、主機和外部網絡(如Internet)的機制。容器的runtime提供了各種網絡模式,每種模式都會產生不同的體驗。例如,Docker采用插件化的網絡模式,默認提供bridge、host、none、overlay、maclan和Network plugins這幾種網絡模式,運行容器時可以通過–network參數設置具體使用那一種模式:

  • bridge:這是Docker默認的網絡驅動,此模式會為每一個容器分配Network Namespace和設置IP等,并將容器連接到一個虛擬網橋上,每個容器可以通過IP地址相互連接。如果未指定網絡驅動,這默認使用此驅動。
  • host:此網絡驅動直接使用宿主機的網絡,沒有隔離。
  • none:此驅動不構造網絡環境。采用了none網絡驅動,那么就只能使用loopback網絡設備,容器只能使用127.0.0.1的本機網絡。
  • overlay:此網絡驅動可以使多個Docker daemons連接在一起,并能夠使用swarm服務之間進行通訊。也可以使用overlay網絡進行swarm服務和容器之間、容器之間進行通訊,
  • macvlan:此網絡允許為容器指定一個MAC地址,允許容器作為網絡中的物理設備,這樣Docker
    daemon就可以通過MAC地址進行訪問的路由。對于希望直接連接網絡網絡的遺留應用,這種網絡驅動有時可能是最好的選擇。
  • Network plugins:可以安裝和使用第三方的網絡插件??梢栽贒ocker Store或第三方供應商處獲取這些插件:flannel等。
  • 在默認情況,Docker使用bridge網絡模式,bridge網絡驅動的示意圖如下,我們先以bridge模式對Docker的網絡進行說明。

    自定義網橋:用戶定義的網橋,具有更多的靈活性、隔離性和其他便利功能。
    Docker還可以讓用戶通過其他驅動程序和插件,來配置更高級的網絡(包括多主機覆蓋網絡)。

    1.2 bridge網絡

  • 安裝Docker時,創建一個名為docke0的虛擬網橋,虛擬網橋使用“10.0.0.0 -10.255.255.255
    “、”172.16.0.0-172.31.255.255″和“192.168.0.0——192.168.255.255”這三個私有網絡的地址范圍。
  • 通過 ifconfig 命令可以查看docker0網橋的信息;
  • 通過 docker network inspect bridge 可以查看網橋的子網網絡范圍和網關;
  • 運行容器時,在宿主機上創建虛擬網卡veth pair設備,veth pair設備是成對出現的,從而組成一個數據通道,數據從一個設備進入,就會從另一個設備出來。將veth pair設備的一端放在新創建的容器中,命名為eth0;另一端放在宿主機的docker0中,以veth為前綴的名字命名。通過 brctl show 命令查看放在docker0中的veth pair設備;
  • bridge的docker0是虛擬出來的網橋,因此無法被外部的網絡訪問。因此需要在運行容器時通過-p和-P參數對將容器的端口映射到宿主機的端口。實際上Docker是采用 NAT的 方式,將容器內部的服務監聽端口與宿主機的某一個端口port 進行綁定,使得宿主機外部可以將網絡報文發送至容器
  • 通過-P參數,將容器的端口映射到宿主機的隨機端口: $ docker run -P {images} 通過-p參數,將容器的端口映射到宿主機的制定端口: $ docker run -p {hostPort}:{containerPort}

    可以修改docker的默認網段:

    第一步 刪除原有配置 sudo service docker stop sudo ip link set dev docker0 down sudo brctl delbr docker0 sudo iptables -t nat -F POSTROUTING第二步 創建新的網橋 sudo brctl addbr docker0 sudo ip addr add 172.17.10.1/24 dev docker0 sudo ip link set dev docker0 up第三步 配置Docker的文件 注意: 這里是 增加下面的配置 vi /etc/docker/daemon.json ##追加的即可 cat /etc/docker/daemon.json {"registry-mirrors": ["http://224ac393.m.daocloud.io"],"bip": "172.17.10.1/24" } $ systemctl restart docker

    2. CNI介 紹

    首先我們介紹一下什么是 CNI,它的全稱是 Container Network Interface,即容器網絡的 API 接口,它是一種標準的設計,為了讓用戶在容器創建或銷毀時都能夠更容易地配置容器網絡。在本文中,我們將集中探索與對比目前最流行的CNI插件:Flannel、Calico、Weave和Canal(技術上是多個插件的組合)。這些插件既可以確保滿足Kubernetes的網絡要求,又能為Kubernetes集群管理員提供他們所需的某些特定的網絡功能。

    CNI的初衷是創建一個框架,用于在配置或銷毀容器時動態配置適當的網絡配置和資源。下面鏈接中的CNI規范概括了用于配制網絡的插件接口,這個接口可以讓容器運行時與插件進行協調:

    https://github.com/containern…

    插件負責為接口配置和管理IP地址,并且通常提供與IP管理、每個容器的IP分配、以及多主機連接相關的功能。容器運行時會調用網絡插件,從而在容器啟動時分配IP地址并配置網絡,并在刪除容器時再次調用它以清理這些資源。

    運行時或協調器決定了容器應該加入哪個網絡以及它需要調用哪個插件。然后,插件會將接口添加到容器網絡命名空間中,作為一個veth對的一側。接著,它會在主機上進行更改,包括將veth的其他部分連接到網橋。再之后,它會通過調用單獨的IPAM(IP地址管理)插件來分配IP地址并設置路由。

    3. 如何使用 CNI

    在Kubernetes中,kubelet可以在適當的時間調用它找到的插件,來為通過kubelet啟動的pod進行自動的網絡配置。
    基本的使用方法為:

  • 首先在每個結點上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf是某一個網絡配置文件的名稱;
  • 安裝 CNI 配置文件中所對應的二進制插件;
  • 在這個節點上創建 Pod 之后,Kubelet 就會根據 CNI 配置文件執行前兩步所安裝的 CNI 插件;上步執行完之后,Pod 的網絡就配置完成了。

  • 在集群里面創建一個 Pod 的時候,首先會通過 apiserver 將 Pod 的配置寫入。apiserver 的一些管控組件(比如 Scheduler)會調度到某個具體的節點上去。Kubelet 監聽到這個 Pod 的創建之后,會在本地進行一些創建的操作。當執行到創建網絡這一步驟時,它首先會讀取剛才我們所說的配置目錄中的配置文件,配置文件里面會聲明所使用的是哪一個插件,然后去執行具體的 CNI 插件的二進制文件,再由 CNI 插件進入 Pod 的網絡空間去配置 Pod 的網絡。配置完成之后,Kuberlet 也就完成了整個 Pod 的創建過程,這個 Pod 就在線了。

    4. 哪個 CNI 插件適合我

    這就要從 CNI 的幾種實現模式說起。我們需要根據不同的場景選擇不同的實現模式,再去選擇對應的具體某一個插件。
    通常來說,CNI 插件可以分為三種:Overlay、路由及 Underlay。

  • Overlay 模式的典型特征是容器獨立于主機的 IP 段,這個 IP段進行跨主機網絡通信時是通過在主機之間創建隧道的方式,將整個容器網段的包全都封裝成底層的物理網絡中主機之間的包。該方式的好處在于它不依賴于底層網絡;
  • 路由模式中主機和容器也分屬不同的網段,它與 Overlay模式的主要區別在于它的跨主機通信是通過路由打通,無需在不同主機之間做一個隧道封包。但路由打通就需要部分依賴于底層網絡,比如說要求底層網絡有二層可達的一個能力;
  • Underlay模式中容器和宿主機位于同一層網絡,兩者擁有相同的地位。容器之間網絡的打通主要依靠于底層網絡。因此該模式是強依賴于底層能力的。
  • 其他相關選擇CNI因素

    5. 如何理解集群網絡

    CIDR:無類別域間路由(Classless Inter-Domain Routing、CIDR)是一個用于給用戶分配IP地址以及在互聯網上有效地路由IP數據包的對IP地址進行歸類的方法

    以 flannel 為例,深入分析阿里云 Kubernetes 集群網絡的實現方法,一個是網絡的搭建過程,另外一個是基于網絡的通信。

    分三種情況來理解:集群配置,節點配置以及 Pod 配置。與這三種情況對應的,其實是對集群網絡 IP 段的三次劃分:首先是集群 CIDR,接著為每個節點分配 podCIDR(即集群 CIDR 的子網段),最后在 podCIDR 里為每個 Pod 分配自己的 IP。

    5.1 初始階段

    集群的創建,基于云資源 VPC 和 ECS,在創建完 VPC 和 ECS 之后,我們基本上可以得到如下圖的資源配置。我們得到一個 VPC,這個 VPC 的網段是 192.168.0.0/16,我們得到若干 ECS,他們從 VPC 網段里分配到 IP 地址。

    5.2 集群階段

    在以上出初始資源的基礎上,我們利用集群創建控制臺得到集群 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 數據項里。

    5.3 節點階段

    經過以上集群階段,Kubernetes 有了集群 CIDR,以及為每個節點劃分的 podCIDR。在此基礎上,集群會下發 flanneld 到每個階段上,進一步搭建節點上,可以給 Pod 使用的網絡框架。這里主要有兩個操作,

    • 第一個是集群通過 Cloud Controller Manager 給 VPC配置路由表項。路由表項對每個節點有一條。每一條的意思是,如果 VPC 路由收到目的地址是某一個節點 podCIDR 的 IP地址,那么路由會把這個網絡包轉發到對應的 ECS 上。
    • 第二個是創建虛擬網橋 cni0,以及與 cni0 相關的路由。這些配置的作用是,從階段外部進來的網絡包,如果目的 IP 是podCIDR,則會被節點轉發到 cni0 虛擬局域網里。

    注意:實際實現上,cni0 的創建,是在第一個使用 Pod 網絡的 Pod 被調度到節點上的時候,由下一節中 flannal cni 創建的,但是從邏輯上來說,cni0 屬于節點網絡,不屬于 Pod 網絡,所以在此描述。

    5.4 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 使用的子網配置文件。

    6. 如何理解集群網絡通信類型

    以上完成 Pod 網絡環境搭建?;谝陨系木W絡環境,Pod 可以完成四種通信:本地通信,同節點 Pod 通信,跨節點 Pod 通信,以及 Pod 和 Pod 網絡之外的實體通信。

    6.1 pod內部通信

    Kubernetes創建Pod時,首先會創建一個pause容器,為Pod指派一個唯一的IP地址。然后,以pause的網絡命名空間為基礎,創建同一個Pod內的其它容器(–net=container:xxx)。因此,同一個Pod內的所有容器就會共享同一個網絡命名空間,在同一個Pod之間的容器可以直接使用localhost即loopback 設備進行通信。

    6.2 不同Pod中容器之間通信

    是 cni0 虛擬網橋內部的通信,這相當于一個二層局域網內部設備通信。

    6.3 跨節點通信

    發送端數據包,通過 cni0 網橋的網關,流轉到節點上,然后經過節點 eth0 發送給 VPC 路由。這里不會經過任何封包操作。當 VPC 路由收到數據包時,它通過查詢路由表,確認數據包目的地,并把數據包發送給對應的 ECS 節點。而進去節點之后,因為 flanneld 在節點上創建了真的 cni0 的路由,所以數據包會被發送到目的地的 cni0 局域網,再到目的地 Pod。

    flannel的支持多種網絡模式,常用用都是vxlan、UDP、hostgw、ipip以及gce和阿里云等。

    vxlan和UDP的區別是vxlan是內核封包,而UDP是flanneld用戶態程序封包,所以UDP的方式性能會稍差;

    hostgw模式是一種主機網關模式,容器到另外一個主機上容器的網關設置成所在主機的網卡地址,這個和calico非常相似,只不過calico是通過BGP聲明,而hostgw是通過中心的etcd分發,所以hostgw是直連模式,不需要通過overlay封包和拆包,性能比較高,但hostgw模式最大的缺點是必須是在一個二層網絡中,畢竟下一跳的路由需要在鄰居表中,否則無法通行。

    7. 術 語

    在對CNI插件們進行比較之前,我們可以先對網絡中會見到的相關術語做一個整體的了解。不論是閱讀本文,還是今后接觸到其他和CNI有關的內容,了解一些常見術語總是非常有用的。

    一些最常見的術語包括:

    • 第2層網絡: OSI(Open Systems Interconnections,開放系統互連)網絡模型的“數據鏈路”層。第2層網絡會處理網絡上兩個相鄰節點之間的幀傳遞。第2層網絡的一個值得注意的示例是以太網,其中MAC表示為子層。
    • 第3層網絡: OSI網絡模型的“網絡”層。第3層網絡的主要關注點,是在第2層連接之上的主機之間路由數據包。IPv4、IPv6和ICMP是第3層網絡協議的示例。
    • VXLAN:代表“虛擬可擴展LAN”。首先,VXLAN用于通過在UDP數據報中封裝第2層以太網幀來幫助實現大型云部署。VXLAN虛擬化與VLAN類似,但提供更大的靈活性和功能(VLAN僅限于4096個網絡ID)。VXLAN是一種封裝和覆蓋協議,可在現有網絡上運行。
    • Overlay網絡:Overlay網絡是建立在現有網絡之上的虛擬邏輯網絡。Overlay網絡通常用于在現有網絡之上提供有用的抽象,并分離和保護不同的邏輯網絡。
    • 封裝:封裝是指在附加層中封裝網絡數據包以提供其他上下文和信息的過程。在overlay網絡中,封裝被用于從虛擬網絡轉換到底層地址空間,從而能路由到不同的位置(數據包可以被解封裝,并繼續到其目的地)。
    • 網狀網絡:網狀網絡(Mesh network)是指每個節點連接到許多其他節點以協作路由、并實現更大連接的網絡。網狀網絡允許通過多個路徑進行路由,從而提供更可靠的網絡。網狀網格的缺點是每個附加節點都會增加大量開銷。
    • BGP:代表“邊界網關協議”,用于管理邊緣路由器之間數據包的路由方式。BGP通過考慮可用路徑,路由規則和特定網絡策略,幫助弄清楚如何將數據包從一個網絡發送到另一個網絡。BGP有時被用作CNI插件中的路由機制,而不是封裝的覆蓋網絡。

    參考連接:
    https://www.infoq.cn/article/6mdfWWGHzAdihiq9lDST?utm_source=related_read&utm_medium=article
    https://blog.csdn.net/hguisu/article/details/92637760

    總結

    以上是生活随笔為你收集整理的Kubernetes 【网络组件】CNI网络概念的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。