當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]CNI簡(jiǎn)介容器網(wǎng)絡(luò)的配置是一個(gè)復(fù)雜的過程,為了應(yīng)對(duì)各式各樣的需求,容器網(wǎng)絡(luò)的解決方案也多種多樣,例如有Flannel,Calico,Kube-OVN,Weave等。同時(shí),容器平臺(tái)/運(yùn)行時(shí)也是多樣的,例如有Kubernetes,OpenShift,rkt等。如果每種容器平臺(tái)都要跟每...

深入理解CNI(容器網(wǎng)絡(luò)接口)



CNI簡(jiǎn)介深入理解CNI(容器網(wǎng)絡(luò)接口)



容器網(wǎng)絡(luò)的配置是一個(gè)復(fù)雜的過程,為了應(yīng)對(duì)各式各樣的需求,容器網(wǎng)絡(luò)的解決方案也多種多樣,例如有Flannel,Calico,Kube-OVN,Weave等。同時(shí),容器平臺(tái)/運(yùn)行時(shí)也是多樣的,例如有Kubernetes,OpenShift,rkt等。如果每種容器平臺(tái)都要跟每種網(wǎng)絡(luò)解決方案一一對(duì)接適配,這將是一項(xiàng)巨大且重復(fù)的工程。當(dāng)然,聰明的程序員們肯定不會(huì)允許這樣的事情發(fā)生。想要解決這個(gè)問題,我們需要一個(gè)抽象的接口層,將容器網(wǎng)絡(luò)配置方案與容器平臺(tái)方案解耦。
CNI(Container Network Interface)就是這樣的一個(gè)接口層,它定義了一套接口標(biāo)準(zhǔn),提供了規(guī)范文檔以及一些標(biāo)準(zhǔn)實(shí)現(xiàn)。采用CNI規(guī)范來設(shè)置容器網(wǎng)絡(luò)的容器平臺(tái)不需要關(guān)注網(wǎng)絡(luò)的設(shè)置的細(xì)節(jié),只需要按CNI規(guī)范來調(diào)用CNI接口即可實(shí)現(xiàn)網(wǎng)絡(luò)的設(shè)置。
CNI最初是由CoreOS為rkt容器引擎創(chuàng)建的,隨著不斷發(fā)展,已經(jīng)成為事實(shí)標(biāo)準(zhǔn)。目前絕大部分的容器平臺(tái)都采用CNI標(biāo)準(zhǔn)(rkt,Kubernetes,OpenShift等)。本篇內(nèi)容基于CNI最新的發(fā)布版本v0.4.0。值得注意的是,Docker并沒有采用CNI標(biāo)準(zhǔn),而是在CNI創(chuàng)建之初同步開發(fā)了CNM(Container Networking Model)標(biāo)準(zhǔn)。但由于技術(shù)和非技術(shù)原因,CNM模型并沒有得到廣泛的應(yīng)用。CNI是怎么工作的深入理解CNI(容器網(wǎng)絡(luò)接口)



CNI的接口并不是指HTTP,gRPC接口,CNI接口是指對(duì)可執(zhí)行程序的調(diào)用(exec)。這些可執(zhí)行程序稱之為CNI插件,以Kubernetes為例,Kubernetes節(jié)點(diǎn)默認(rèn)的CNI插件路徑為/opt/cni/bin,在Kubernetes節(jié)點(diǎn)上查看該目錄,可以看到可供使用的CNI插件:$ ls /opt/cni/bin/
bandwidth  bridge  dhcp  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan


CNI的工作過程大致如下圖所示:
深入理解CNI(容器網(wǎng)絡(luò)接口)



CNI通過JSON格式的配置文件來描述網(wǎng)絡(luò)配置,當(dāng)需要設(shè)置容器網(wǎng)絡(luò)時(shí),由容器運(yùn)行時(shí)負(fù)責(zé)執(zhí)行CNI插件,并通過CNI插件的標(biāo)準(zhǔn)輸入(stdin)來傳遞配置文件信息,通過標(biāo)準(zhǔn)輸出(stdout)接收插件的執(zhí)行結(jié)果。圖中的 libcni 是CNI提供的一個(gè)go package,封裝了一些符合CNI規(guī)范的標(biāo)準(zhǔn)操作,便于容器運(yùn)行時(shí)和網(wǎng)絡(luò)插件對(duì)接CNI標(biāo)準(zhǔn)。
舉一個(gè)直觀的例子,假如我們要調(diào)用bridge插件將容器接入到主機(jī)網(wǎng)橋,則調(diào)用的命令看起來長(zhǎng)這樣:# CNI_COMMAND=ADD 顧名思義表示創(chuàng)建。
# XXX=XXX 其他參數(shù)定義見下文。
# < config.json 表示從標(biāo)準(zhǔn)輸入傳遞配置文件
CNI_COMMAND=ADD XXX=XXX ./bridge < config.json



插件入?yún)?/strong>
容器運(yùn)行時(shí)通過設(shè)置環(huán)境變量以及從標(biāo)準(zhǔn)輸入傳入的配置文件來向插件傳遞參數(shù)。
環(huán)境變量
  • CNI_COMMAND:定義期望的操作,可以是ADD,DEL,CHECK或VERSION。


  • CNI_CONTAINERID:容器ID,由容器運(yùn)行時(shí)管理的容器唯一標(biāo)識(shí)符。


  • CNI_NETNS:容器網(wǎng)絡(luò)命名空間的路徑。(形如 /run/netns/[nsname])。


  • CNI_IFNAME:需要被創(chuàng)建的網(wǎng)絡(luò)接口名稱,例如eth0。


  • CNI_ARGS:運(yùn)行時(shí)調(diào)用時(shí)傳入的額外參數(shù),格式為分號(hào)分隔的key-value對(duì),例如FOO=BAR;ABC=123


  • CNI_PATH:CNI插件可執(zhí)行文件的路徑,例如/opt/cni/bin。



配置文件
文件示例:{
"cniVersion": "0.4.0", // 表示希望插件遵循的CNI標(biāo)準(zhǔn)的版本。
"name": "dbnet",  // 表示網(wǎng)絡(luò)名稱。這個(gè)名稱并非指網(wǎng)絡(luò)接口名稱,是便于CNI管理的一個(gè)表示。應(yīng)當(dāng)在當(dāng)前主機(jī)(或其他管理域)上全局唯一。
"type": "bridge", // 插件類型
"bridge": "cni0", // Bridge插件的參數(shù),指定網(wǎng)橋名稱。
"ipam": { // IP Allocation Management,管理IP地址分配。
"type": "host-local", // IPAM插件的類型。
// IPAM定義的參數(shù)
"subnet": "10.1.0.0/16",
"gateway": "10.1.0.1"
}
} 公共定義部分:
配置文件分為公共部分和插件定義部分。公共部分在CNI項(xiàng)目中使用結(jié)構(gòu)體NetworkConfig定義:type NetworkConfig struct {
Network *types.NetConf
Bytes   []byte
}
...
// NetConf describes a network.
type NetConf struct {
CNIVersion string `json:"cniVersion,omitempty"`

Name         string          `json:"name,omitempty"`
Type         string          `json:"type,omitempty"`
Capabilities map[string]bool `json:"capabilities,omitempty"`
IPAM         IPAM            `json:"ipam,omitempty"`
DNS          DNS             `json:"dns"`

RawPrevResult map[string]interface{} `json:"prevResult,omitempty"`
PrevResult    Result                 `json:"-"`
}



  • cniVersion:表示希望插件遵循的CNI標(biāo)準(zhǔn)的版本。


  • name:表示網(wǎng)絡(luò)名稱。這個(gè)名稱并非指網(wǎng)絡(luò)接口名稱,是便于CNI管理的一個(gè)表示。應(yīng)當(dāng)在當(dāng)前主機(jī)(或其他管理域)上全局唯一。


  • type:表示插件的名稱,也就是插件對(duì)應(yīng)的可執(zhí)行文件的名稱。


  • Bridge:該參數(shù)屬于bridge插件的參數(shù),指定主機(jī)網(wǎng)橋的名稱。


  • IPAM:表示IP地址分配插件的配置,ipam.type則表示IPAM的插件類型。



更詳細(xì)的信息,可以參考官方文檔:https://github.com/containernetworking/cni/blob/spec-v0.4.0/SPEC.md#network-configuration
插件定義部分:
上文提到,配置文件最終是傳遞給具體的CNI插件的,因此插件定義部分才是配置文件的“完全體”。公共部分定義只是為了方便各插件將其嵌入到自身的配置文件定義結(jié)構(gòu)體中,舉Bridge插件為例:type NetConf struct {
types.NetConf // <-- 嵌入公共部分
// 底下的都是插件定義部分
BrName       string `json:"bridge"`
IsGW         bool   `json:"isGateway"`
IsDefaultGW  bool   `json:"isDefaultGateway"`
ForceAddress bool   `json:"forceAddress"`
IPMasq       bool   `json:"ipMasq"`
MTU          int    `json:"mtu"`
HairpinMode  bool   `json:"hairpinMode"`
PromiscMode  bool   `json:"promiscMode"`
Vlan         int    `json:"vlan"`

Args struct {
Cni BridgeArgs `json:"cni,omitempty"`
} `json:"args,omitempty"`
RuntimeConfig struct {
Mac string `json:"mac,omitempty"`
} `json:"runtimeConfig,omitempty"`

mac string
}


各插件的配置文件文檔可參考官方文檔:https://www.cni.dev/plugins/current/
插件操作類型
CNI插件的操作類型只有四種:ADD,DEL,CHECK和VERSION。插件調(diào)用者通過環(huán)境變量CNI_COMMAND來指定需要執(zhí)行的操作。
ADD
ADD操作負(fù)責(zé)將容器添加到網(wǎng)絡(luò),或?qū)ΜF(xiàn)有的網(wǎng)絡(luò)設(shè)置做更改。具體地說,ADD操作要么:
  • 為容器所在的網(wǎng)絡(luò)命名空間創(chuàng)建一個(gè)網(wǎng)絡(luò)接口,或者


  • 修改容器所在網(wǎng)絡(luò)命名空間中的指定網(wǎng)絡(luò)接口



例如通過ADD將容器網(wǎng)絡(luò)接口接入到主機(jī)的網(wǎng)橋中。
其中網(wǎng)絡(luò)接口名稱由CNI_IFNAME指定,網(wǎng)絡(luò)命名空間由CNI_NETNS指定。
DEL
DEL操作負(fù)責(zé)從網(wǎng)絡(luò)中刪除容器,或取消對(duì)應(yīng)的修改,可以理解為是ADD的逆操作。具體地說,DEL操作要么:
  • 為容器所在的網(wǎng)絡(luò)命名空間刪除一個(gè)網(wǎng)絡(luò)接口,或者


  • 撤銷ADD操作的修改



例如通過DEL將容器網(wǎng)絡(luò)接口從主機(jī)網(wǎng)橋中刪除。
其中網(wǎng)絡(luò)接口名稱由CNI_IFNAME指定,網(wǎng)絡(luò)命名空間由CNI_NETNS指定。
CHECK
CHECK操作是v0.4.0加入的類型,用于檢查網(wǎng)絡(luò)設(shè)置是否符合預(yù)期。容器運(yùn)行時(shí)可以通過CHECK來檢查網(wǎng)絡(luò)設(shè)置是否出現(xiàn)錯(cuò)誤,當(dāng)CHECK返回錯(cuò)誤時(shí)(返回了一個(gè)非0狀態(tài)碼),容器運(yùn)行時(shí)可以選擇Kill掉容器,通過重新啟動(dòng)來重新獲得一個(gè)正確的網(wǎng)絡(luò)配置。
VERSION
VERSION操作用于查看插件支持的版本信息。$ CNI_COMMAND=VERSION /opt/cni/bin/bridge
{"cniVersion":"0.4.0","supportedVersions":["0.1.0","0.2.0","0.3.0","0.3.1","0.4.0"]}



鏈?zhǔn)秸{(diào)用
單個(gè)CNI插件的職責(zé)是單一的,比如Bridge插件負(fù)責(zé)網(wǎng)橋的相關(guān)配置, Firewall插件負(fù)責(zé)防火墻相關(guān)配置, Portmap插件負(fù)責(zé)端口映射相關(guān)配置。因此,當(dāng)網(wǎng)絡(luò)設(shè)置比較復(fù)雜時(shí),通常需要調(diào)用多個(gè)插件來完成。CNI支持插件的鏈?zhǔn)秸{(diào)用,可以將多個(gè)插件組合起來,按順序調(diào)用。例如先調(diào)用Bridge插件設(shè)置容器IP,將容器網(wǎng)卡與主機(jī)網(wǎng)橋連通,再調(diào)用Portmap插件做容器端口映射。容器運(yùn)行時(shí)可以通過在配置文件設(shè)置Plugins數(shù)組達(dá)到鏈?zhǔn)秸{(diào)用的目的:{
"cniVersion": "0.4.0",
"name": "dbnet",
"plugins": [
{
"type": "bridge",
// type (plugin) specific
"bridge": "cni0"
},
"ipam": {
"type": "host-local",
// ipam specific
"subnet": "10.1.0.0/16",
"gateway": "10.1.0.1"
}
},
{
"type": "tuning",
"sysctl": {
"net.core.somaxconn": "500"
}
}
]
}


細(xì)心的讀者會(huì)發(fā)現(xiàn),Plugins這個(gè)字段并沒有出現(xiàn)在上文描述的配置文件結(jié)構(gòu)體中。的確,CNI使用了另一個(gè)結(jié)構(gòu)體——NetworkConfigList來保存鏈?zhǔn)秸{(diào)用的配置:type NetworkConfigList struct {
Name         string
CNIVersion   string
DisableCheck bool
Plugins      []*NetworkConfig
Bytes        []byte
}


但CNI插件是不認(rèn)識(shí)這個(gè)配置類型的。實(shí)際上,在調(diào)用CNI插件時(shí),需要將NetworkConfigList轉(zhuǎn)換成對(duì)應(yīng)插件的配置文件格式,再通過標(biāo)準(zhǔn)輸入(stdin)傳遞給CNI插件。例如在上面的示例中,實(shí)際上會(huì)先使用下面的配置文件調(diào)用Bridge插件:{
"cniVersion": "0.4.0",
"name": "dbnet",
"type": "bridge",
"bridge": "cni0",
"ipam": {
"type": "host-local",
"subnet": "10.1.0.0/16",
"gateway": "10.1.0.1"
}
}


再使用下面的配置文件調(diào)用tuning插件:{
"cniVersion": "0.4.0",
"name": "dbnet",
"type": "tuning",
"sysctl": {
"net.core.somaxconn": "500"
},
"prevResult": { // 調(diào)用Bridge插件的返回結(jié)果
...
}
}


需要注意的是,當(dāng)插件進(jìn)行鏈?zhǔn)秸{(diào)用的時(shí)候,不僅需要對(duì)NetworkConfigList做格式轉(zhuǎn)換,而且需要將前一次插件的返回結(jié)果添加到配置文件中(通過prevResult字段),不得不說是一項(xiàng)繁瑣而重復(fù)的工作。不過幸好libcni已經(jīng)為我們封裝好了,容器運(yùn)行時(shí)不需要關(guān)心如何轉(zhuǎn)換配置文件,如何填入上一次插件的返回結(jié)果,只需要調(diào)用libcni的相關(guān)方法即可。


示例深入理解CNI(容器網(wǎng)絡(luò)接口)



接下來將演示如何使用CNI插件來為Docker容器設(shè)置網(wǎng)絡(luò)。
下載CNI插件
為方便起見,我們直接下載可執(zhí)行文件:wget https://github.com/containernetworking/plugins/releases/download/v0.9.1/cni-plugins-linux-amd64-v0.9.1.tgz
mkdir -p  ~/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.9.1.tgz -C ./cni/bin
chmod  x ~/cni/bin/*
ls ~/cni/bin/
bandwidth  bridge  dhcp  firewall  flannel  host-device  host-local  ipvlan  loopback  macvlan  portmap  ptp  sbr  static  tuning  vlan  vrfz


如果你是在Kubernetes節(jié)點(diǎn)上實(shí)驗(yàn),通常節(jié)點(diǎn)上已經(jīng)有CNI插件了,不需要再下載,但要注意將后續(xù)的CNI_PATH修改成/opt/cni/bin。
示例1——調(diào)用單個(gè)插件
在示例1中,我們會(huì)直接調(diào)用CNI插件,為容器設(shè)置eth0接口,為其分配IP地址,并接入主機(jī)網(wǎng)橋mynet0。跟Docker默認(rèn)使用的使用網(wǎng)絡(luò)模式一樣,只不過我們將docker0換成了mynet0。啟動(dòng)容器
雖然Docker不使用CNI規(guī)范,但可以通過指定--net=none的方式讓Docker不設(shè)置容器網(wǎng)絡(luò)。以Nginx鏡像為例:contid=$(docker run -d --net=none --name nginx nginx) # 容器ID
pid=$(docker inspect -f '{{ .State.Pid }}' $contid) # 容器進(jìn)程ID
netnspath=/proc/$pid/ns/net # 命名空間路徑


啟動(dòng)容器的同時(shí),我們需要記錄一下容器ID,命名空間路徑,方便后續(xù)傳遞給CNI插件。容器啟動(dòng)后,可以看到除了lo網(wǎng)卡,容器沒有其他的網(wǎng)絡(luò)設(shè)置:nsenter -t $pid -n ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever


nsenter是namespace enter的簡(jiǎn)寫,顧名思義,這是一個(gè)在某命名空間下執(zhí)行命令的工具。-t表示進(jìn)程ID,-n表示進(jìn)入對(duì)應(yīng)進(jìn)程的網(wǎng)絡(luò)命名空間。添加容器網(wǎng)絡(luò)接口并連接主機(jī)網(wǎng)橋
接下來我們使用Bridge插件為容器創(chuàng)建網(wǎng)絡(luò)接口,并連接到主機(jī)網(wǎng)橋。創(chuàng)建bridge.json配置文件,內(nèi)容如下:{
"cniVersion": "0.4.0",
"name": "mynet",
"type": "bridge",
"bridge": "mynet0",
"isDefaultGateway": true,
"forceAddress": false,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.10.0.0/16"
}
}


調(diào)用Bridge插件ADD操作:CNI_COMMAND=ADD CNI_CONTAINERID=$contid CNI_NETNS=$netnspath CNI_IFNAME=eth0 CNI_PATH=~/cni/bin ~/cni/bin/bridge < bridge.json


調(diào)用成功的話,會(huì)輸出類似的返回值:{
"cniVersion": "0.4.0",
"interfaces": [
....
],
"ips": [
{
"version": "4",
"interface": 2,
"address": "10.10.0.2/16", //給容器分配的IP地址
"gateway": "10.10.0.1"
}
],
"routes": [
.....
],
"dns": {}
}


再次查看容器網(wǎng)絡(luò)設(shè)置:nsenter -t $pid -n ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
5: eth0@if40:  mtu 1500 qdisc noqueue state UP group default
link/ether c2:8f:ea:1b:7f:85 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.10.0.2/16 brd 10.10.255.255 scope global eth0
valid_lft forever preferred_lft forever


可以看到容器中已經(jīng)新增了eth0網(wǎng)絡(luò)接口,并在IPAM插件設(shè)定的子網(wǎng)下為其分配了IP地址。host-local類型的IPAM插件會(huì)將已分配的IP信息保存到文件,避免IP沖突,默認(rèn)的保存路徑為/var/lib/cni/network/$NETWORK_NAME:ls /var/lib/cni/networks/mynet/
10.10.0.2  last_reserved_ip.0  lock
從主機(jī)訪問驗(yàn)證
由于mynet0是我們添加的網(wǎng)橋,還未設(shè)置路由,因此驗(yàn)證前我們需要先為容器所在的網(wǎng)段添加路由:ip route add 10.10.0.0/16 dev mynet0 src 10.10.0.1 # 添加路由
curl -I 10.10.0.2 # IP換成實(shí)際分配給容器的IP地址
HTTP/1.1 200 OK
....



刪除容器網(wǎng)絡(luò)接口
刪除的調(diào)用入?yún)⒏砑拥娜雲(yún)⑹且粯拥?,除了CNI_COMMAND要替換成DEL:CNI_COMMAND=DEL CNI_CONTAINERID=$contid CNI_NETNS=$netnspath CNI_IFNAME=eth0 CNI_PATH=~/cni/bin ~/cni/bin/bridge < bridge.json


注意,上述的刪除命令并未清理主機(jī)的mynet0網(wǎng)橋。如果你希望刪除主機(jī)網(wǎng)橋,可以執(zhí)行ip link delete mynet0 type bridge命令刪除。示例2——鏈?zhǔn)秸{(diào)用
在示例2中,我們將在示例1的基礎(chǔ)上,使用Portmap插件為容器添加端口映射。
使用cnitool工具
前面的介紹中,我們知道在鏈?zhǔn)秸{(diào)用過程中,調(diào)用方需要轉(zhuǎn)換配置文件,并需要將上一次插件的返回結(jié)果插入到本次插件的配置文件中。這是一項(xiàng)繁瑣的工作,而libcni已經(jīng)將這些過程封裝好了,在示例2中,我們將使用基于 libcni的命令行工具cnitool來簡(jiǎn)化這些操作。
示例2將復(fù)用示例1中的容器,因此在開始示例2時(shí),請(qǐng)確保已刪除示例1中的網(wǎng)絡(luò)接口。
通過源碼編譯或go install來安裝cnitool:go install github.com/containernetworking/cni/cnitool@latest
配置文件
libcni會(huì)讀取.conflist后綴的配置文件,我們?cè)诋?dāng)前目錄創(chuàng)建portmap.conflist:{
"cniVersion": "0.4.0",
"name": "portmap",
"plugins": [
{
"type": "bridge",
"bridge": "mynet0",
"isDefaultGateway": true,
"forceAddress": false,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"subnet": "10.10.0.0/16",
"gateway": "10.10.0.1"
}
},
{
"type": "portmap",
"runtimeConfig": {
"portMappings": [
{"hostPort": 8080, "containerPort": 80, "protocol": "tcp"}
]
}
}
]
}


從上述的配置文件定義了兩個(gè)CNI插件,Bridge和Portmap。根據(jù)上述的配置文件,cnitool會(huì)先為容器添加網(wǎng)絡(luò)接口并連接到主機(jī)mynet0網(wǎng)橋上(就跟示例1一樣),然后再調(diào)用Portmap插件,將容器的80端口映射到主機(jī)的8080端口,就跟docker run -p 8080:80 xxx一樣。
設(shè)置容器網(wǎng)絡(luò)
使用cnitool我們還需要設(shè)置兩個(gè)環(huán)境變量:
  • NETCONFPATH:指定配置文件(*.conflist)的所在路徑,默認(rèn)路徑為/etc/cni/net.d


  • CNI_PATH:指定CNI插件的存放路徑。



使用cnitool add命令為容器設(shè)置網(wǎng)絡(luò):CNI_PATH=~/cni/bin NETCONFPATH=.  cnitool add portmap $netnspath


設(shè)置成功后,訪問宿主機(jī)8080端口即可訪問到容器的Nginx服務(wù)。
刪除網(wǎng)絡(luò)配置
使用cnitool del命令刪除容器網(wǎng)絡(luò):CNI_PATH=~/cni/bin NETCONFPATH=.  cnitool del portmap $netnspath


注意,上述的刪除命令并未清理主機(jī)的mynet0網(wǎng)橋。如果你希望刪除主機(jī)網(wǎng)橋,可以執(zhí)行ip link delete mynet0 type bridge命令刪除。總結(jié)深入理解CNI(容器網(wǎng)絡(luò)接口)



至此,CNI的工作原理我們已基本清楚。CNI的工作原理大致可以歸納為:
  • 通過JSON配置文件定義網(wǎng)絡(luò)配置;


  • 通過調(diào)用可執(zhí)行程序(CNI插件)來對(duì)容器網(wǎng)絡(luò)執(zhí)行配置;


  • 通過鏈?zhǔn)秸{(diào)用的方式來支持多插件的組合使用。



CNI不僅定義了接口規(guī)范,同時(shí)也提供了一些內(nèi)置的標(biāo)準(zhǔn)實(shí)現(xiàn),以及l(fā)ibcni這樣的“膠水層”,大大降低了容器運(yùn)行時(shí)與網(wǎng)絡(luò)插件的接入門檻。


本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉