成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

認識一下容器網絡接口 CNI

開發 前端
這篇學習了 CNI 規范的內容、網絡插件的執行流程,對 CNI 抽象的網絡管理接口有了大致的了解。

在最前,周末寫到這篇的時候我就發現可能是給自己挖了很大的坑,整個 Kubernetes 網關相關的內容會非常復雜且龐大。

深入探索 Kubernetes 網絡模型和網絡通信

認識一下容器網絡接口 CNI(本篇)

源碼分析:從 kubelet、容器運行時看 CNI 的使用

從 Flannel 學習 Kubernetes VXLAN 網絡

Cilium CNI 與 eBPF

...

看自己能學到哪一步~


在 《深入探索 Kubernetes 網絡模型和網絡通信》 文章中,我們介紹了網絡命名空間(network namespace) 如何在 Kubernetes 網絡模型中工作,通過示例分析 pod 間的流量傳輸路徑。整個傳輸過程需要各種不同組件的參與才完成,而這些組件與 pod 相同的生命周期,跟隨 pod 的創建和銷毀。容器的維護由 kubelet 委托給容器運行時(container runtime)來完成,而容器的網絡命名空間則是由容器運行時委托網絡插件完成。

創建 pod(容器)的網絡命名空間

創建接口

創建 veth 對

設置命名空間網絡

設置靜態路由

配置以太網橋接器

分配 IP 地址

創建 NAT 規則

...

上篇我們也提到不同網絡插件對 Kubernetes 網絡模型有不同的實現,主要集中在跨節點的 pod 間通信的實現上。用戶可以根據需要選擇合適的網絡插件,這其中離不開 CNI(container network interface)。這些網絡插件都實現了 CNI 標準,可以與容器編排系統和運行時良好的集成。

圖片runtime-with-cni

CNI 是什么

CNI 是 CNCF 下的一個項目,除了提供了最重要的 規范[1] 、用來 CNI 與應用集成的 庫[2]、實行 CNI 插件的 CLI `cnitool`[3],以及 可引用的插件[4]。本文發布時,最新版本為 v1.1.2。

CNI 只關注容器的網絡連接以及在容器銷毀時清理/釋放分配的資源,也正因為這個,即使容器發展迅速,CNI 也依然能保證簡單并被 廣泛支持[5]。

CNI 規范

CNI 的規范涵蓋了以下幾部分:

網絡配置文件格式

容器運行時與網絡插件交互的協議

插件的執行流程

將委托其他插件的執行流程

返回給運行時的執行結果數據類型

1. 網絡配置格式

這里貼出規范中的配置示例,規范[6] 中定義了網絡配置的格式,包括必須字段、可選字段以及各個字段的功能。示例使用定義了名為 dbnet? 的網絡,配置了插件 bridge? 和 tuning,這兩個插件。

CNI 的插件一般分為兩種:

接口插件(interface plugin):用來創建網絡接口,比如示例中的bridge。

鏈式插件(chained):用來調整已創建好的網絡接口,比如示例中的tuning。

{
"cniVersion": "1.0.0",
"name": "dbnet",
"plugins": [
{
"type": "bridge",
// plugin specific parameters
"bridge": "cni0",
"keyA": ["some more", "plugin specific", "configuration"],

"ipam": {
"type": "host-local",
// ipam specific
"subnet": "10.1.0.0/16",
"gateway": "10.1.0.1",
"routes": [
{"dst": "0.0.0.0/0"}
]
},
"dns": {
"nameservers": [ "10.1.0.1" ]
}
},
{
"type": "tuning",
"capabilities": {
"mac": true
},
"sysctl": {
"net.core.somaxconn": "500"
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true}
}
]
}

2. 容器運行時與網絡插件交互的協議

CNI 為容器運行時提供 四個不同的操作[7]:

ADD - 將容器添加到網絡,或修改配置

DEL - 從網絡中刪除容器,或取消修改

CHECK - 檢查容器網絡是否正常,如果容器的網絡出現問題,則返回錯誤

VERSION - 顯示插件的版本

規范對操作的輸入和輸出內容進行了定義。主要幾個核心的字段有:

CNI_COMMAND:上面的四個操作之一

CNI_CONTAINERID:容器 ID

CNI_NETNS:容器的隔離域,如果用的網絡命名空間,這里的值是網絡命名空間的地址

CNI_IFNAME?:要在容器中創建的接口名,比如 eth0

CNI_ARGS:執行參數時傳遞的參數

CNI_PATH:插件可執行文件的朝招路徑

3. 插件的執行流程

CNI 將容器上網絡配置的 ADD、DELETE? 和 CHECK 操作,成為附加(attachment)。

容器網絡配置的操作,需要一個或多個插件的共同操作來完成,因此插件有一定的執行順序。比如前面的示例配置中,要先創建接口,才能對接口進行調優。

拿 ADD? 操作為例,首先執行的一般是 interface plugin?,然后在執行 chained plugin?。以前一個插件的 輸出 PrevResult? 與下一個插件的配置會共同作為下一個插件的 輸入。 如果是第一個插件,會將網絡配置作為輸入的一部分。插件可以將前一個插件的 PrevResult? 最為自己的輸出,也可以結合自身的操作對 PrevResult? 進行更新。最后一個插件的輸出 PrevResult 作為 CNI 的執行結果返回給容器運行時,容器運行時會保存改結果并將其作為其他操作的輸入。

DELETE? 的執行與 ADD? 的順序正好相反,要先移除接口上的配置或者釋放已經分配的 IP,最后才能刪除容器網絡接口。DELETE? 操作的輸入就是容器運行時保存的 ADD 操作的結果。

圖片cni-plugin-execution-flow

除了定義單次操作中插件的執行順序,CNI 還對操作的并行操作、重復操作等進行了說明[8]。

4. 插件委托

有一些操作,無論出于何種原因,都不能合理地作為一個松散的鏈接插件來實現。相反,CNI 插件可能希望將某些功能委托給另一個插件。一個常見的例子是 IP 地址管理(IP Adress Management,簡稱 IPAM),主要是為容器接口分配/回收 IP 地址、管理路由等。

CNI 定義了第三種插件 -- IPAM 插件。CNI 插件可以在恰當的時機調用 IPAM 插件,IPAM 插件會將執行的結果返回給委托方。IPAM 插件會根據指定的協議(如 dhcp)、本地文件中的數據、或者網絡配置文件中 ipam 字段的信息來完成操作:分配 IP、設置網關、路由等等。

"ipam": {
"type": "host-local",
// ipam specific
"subnet": "10.1.0.0/16",
"gateway": "10.1.0.1",
"routes": [
{"dst": "0.0.0.0/0"}
]
}

5. 執行結果

插件可以返回一下三種結果之一,規范對 結果的格式[9] 進行了定義。

Success:同時會包含PrevResult? 信息,比如 ADD? 操作后的 PrevResult 返回給容器運行時。

Error:包含必要的錯誤提示信息。

Version:這個是VERSION 操作的返回結果。

CNI 的庫是指 `libcni`[10],用于 CNI 和應用程序集成,定義了 CNI 相關的接口和配置。

type CNI interface {  
AddNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
CheckNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error
DelNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error
GetNetworkListCachedResult(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
GetNetworkListCachedConfig(net *NetworkConfigList, rt *RuntimeConf) ([]byte, *RuntimeConf, error)

AddNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
CheckNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error
DelNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error
GetNetworkCachedResult(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
GetNetworkCachedConfig(net *NetworkConfig, rt *RuntimeConf) ([]byte, *RuntimeConf, error)

ValidateNetworkList(ctx context.Context, net *NetworkConfigList) ([]string, error)
ValidateNetwork(ctx context.Context, net *NetworkConfig) ([]string, error)
}

以添加網絡的部分代碼為例:

func (c *CNIConfig) addNetwork(ctx context.Context, name, cniVersion string, net *NetworkConfig, prevResult types.Result, rt *RuntimeConf) (types.Result, error) {  
...
return invoke.ExecPluginWithResult(ctx, pluginPath, newConf.Bytes, c.args("ADD", rt), c.exec)
}

執行的邏輯簡單來說就是:

查找可執行文件

加載網絡配置

執行ADD 操作

結果處理

總結

這篇學習了 CNI 規范的內容、網絡插件的執行流程,對 CNI 抽象的網絡管理接口有了大致的了解。

下一篇將結合源碼的分析,了解 kubelet、容器運行時、CNI 網絡插件之間如何進行交互。

參考

https://www.tigera.io/learn/guides/kubernetes-networking/kubernetes-cni/

https://github.com/containernetworking/cni

https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/

參考資料

[1] 

規范: https://github.com/containernetworking/cni/blob/main/SPEC.md

[2] 

庫: https://github.com/containernetworking/cni/blob/main/libcni

[3] 

cnitool?: https://github.com/containernetworking/cni/blob/main/cnitool

[4] 

可引用的插件: https://github.com/containernetworking/plugins

[5] 

廣泛支持: https://github.com/containernetworking/cni/blob/main/README.md#who-is-using-cni

[6] 

規范: https://github.com/containernetworking/cni/blob/main/SPEC.md#section-1-network-configuration-format

[7] 

四個不同的操作: https://github.com/containernetworking/cni/blob/master/SPEC.md#cni-operations

[8] 

CNI 還對操作的并行操作、重復操作等進行了說明: https://github.com/containernetworking/cni/blob/main/SPEC.md#lifecycle--ordering

[9] 

結果的格式: https://github.com/containernetworking/cni/blob/main/SPEC.md#section-5-result-types

[10] 

libcni?: https://github.com/containernetworking/cni/tree/main/libcni

責任編輯:武曉燕 來源: 云原生指北
相關推薦

2022-09-08 13:58:39

Spring高并發異步

2019-11-28 10:40:45

Kafka架構KafkaConsum

2023-05-03 09:09:28

Golang數組

2024-05-27 00:00:00

AmpPHP非阻塞

2013-04-17 11:21:59

Windows PhoWindows Pho

2018-12-24 09:51:22

CPU天梯圖Inter

2023-05-29 08:32:40

JAVA重寫重載

2018-04-02 09:07:36

CIO

2020-10-15 07:13:53

算法監控數據

2020-09-25 19:53:39

數據

2021-12-27 10:25:55

CNI插件Linux

2020-04-26 09:59:00

黑客機器學習網絡安全

2023-06-30 08:27:20

2021-04-21 14:19:52

javaignalHandle接口

2019-06-24 09:57:39

網絡工具調試

2009-11-17 11:14:25

Oracle擴展

2021-12-27 18:00:30

對象數組Java

2025-01-10 11:07:28

2020-12-10 08:44:35

WebSocket輪詢Comet

2022-03-24 13:36:18

Java悲觀鎖樂觀鎖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人1区2区 | 久久久久久久久久久爱 | 成人视屏在线观看 | 国产精品视频一二三区 | 亚洲三区在线观看 | av片在线观看网站 | 丁香婷婷综合激情五月色 | 欧洲色综合 | 亚洲一区不卡在线 | 91视频a | 欧美在线一区二区三区 | 成人精品一区二区三区 | 99成人在线视频 | 91日b| 一区二区国产精品 | www.日日操 | 国产乱一区二区三区视频 | 欧美 日韩 在线播放 | 欧美黄在线观看 | 手机在线不卡av | 一区二区三区av | 精品国产欧美一区二区三区不卡 | eeuss国产一区二区三区四区 | 中文字幕视频一区二区 | 在线视频国产一区 | 九九导航 | 99久久中文字幕三级久久日本 | 成人字幕网zmw | 日韩精品一区二区三区四区 | 伊人色综合久久天天五月婷 | 毛片免费看 | 午夜成人免费视频 | 欧美日韩国产三级 | 91精品亚洲 | 日本免费网 | 欧美一区二区三区精品 | 欧美a在线 | 99精品久久99久久久久 | 国产精品久久久久久久久久久久午夜片 | 亚洲久在线 | 国产激情免费视频 |