前段時間寫過一篇文章Xin He:kubernetes的clusterip機制調研及macvlan網路下的clusterip坑解決方案[1],提到過對於k8s多網卡方案multus-cni[2]插件的吐槽,認為其缺少創新性,沒有把自己定位成Pod網路與Node節點的一個解耦層,表示遺憾。但是經過這幾天深入研究,發現通過某種配置實踐方式,multus-cni是能夠實現Pod網路與Node節點的網路配置完全解耦的,換句話說,我們可以通過multus-cni提供的能力,實現創建Pod的時候,任意指定其網路類型(這個任意,幾乎可以做到完全任意,不受約束,不過個人表示很可惜,multus-cni能夠實現這個能力,但是在他的README.md[3]說明上,並沒有重點強調這一點,如果不是筆者深入使用,可能也不會發現這個內在的能力)

這裡通過multus-cni的v3.2[4]版本,來說明如何實現這個能力。PS:對於multus-cni的原理,這裡不做重點介紹,大家可以自己去了解,簡單說,顧名思義,multus-cni就是多個cni插件可以同時被使用的意思,相當於在多個cni插件上面又配置了一層cni插件,通過配置這層插件,來實現多個底層cni插件的選擇和執行,從名字上來看,大家更多理解使用它來做多網卡Pod,但其實也可以實現任意選擇CNI網路的能力(單網卡的更換選擇,也可以,後面說)。

回主題,重點講multus-cni如何實現靈活指定Pod網路:

本文以具備Calico+macvlan網路能力的cluster環境為例,實現Pod的三種網路類型:1、單獨Calico網路;2、單獨macvlan網路;3、Calico+macvlan雙網路,同時macvlan網路是默認網路(即默認路由走macvlan網卡)。

先說1、單獨Calico網路:

首先需要部署Calico,這裡筆者部署的是Calico v3.8[5][6]版本,部署方式[7]如下:

1.Download the Calico networking manifest for the Kubernetes API datastore.

curl https://docs.projectcalico.org/v3.8/manifests/calico.yaml -O

2.If you are using pod CIDR 192.168.0.0/16, skip to the next step. If you are using a different pod CIDR, use the following commands to set an environment variable called POD_CIDR containing your pod CIDR and replace 192.168.0.0/16 in the manifest with your pod CIDR.

POD_CIDR="<your-pod-cidr>"
sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico.yaml

3.Apply the manifest using the following command.

kubectl apply -f calico.yaml

# NOTE:對於多網卡的node,注意修改calico.yaml,在
- name: IP
value: "autodetect"
後面加入
- name: IP_AUTODETECTION_METHOD
value: "can-reach=114.114.114.114"
找到默認網卡。

安裝calicoctl(非必要,略過),安裝過程可以參考附註[8]

然後部署multus-cni,基於v3.2[4]版本,部署方式[9]如下:

git clone https://github.com/intel/multus-cni.git && cd multus-cni
git checkout -b branch_v3.2 v3.2
cat ./images/multus-daemonset.yml | kubectl apply -f -

修改multus-cni的配置文件/etc/cni/net.d/00-multus.conf:

{
"name": "multus-cni-network",
"type": "multus",
"confDir": "/etc/cni/multus/net.d",
"cniDir": "/var/lib/cni/multus",
"binDir": "/opt/cni/bin",
"logFile": "/var/log/multus.log",
"logLevel": "info",
"capabilities": {
"portMappings": true
},
"clusterNetwork": "net-calico",
"defaultNetworks": [],
"delegates": [],
"kubeconfig": "/etc/cni/net.d/multus.d/multus.kubeconfig"
}

這裡參考官方配置文檔[10],不做贅述。重點提示下,net-calico這個網路,在後面的提到的配置文件中,必須正確配置,否則會報無法找到網路,但是因為multus的報錯缺少細節,所以之前排查原因,還花了一段時間,剛開始以為是上面這個配置文件的格式不對,確認了multus-cni源碼,配置格式沒問題,後來仔細看net-calico的配置,才知道是net-calico自身的配置錯誤造成。

對於net-calico這個網路,筆者採用的是NetworkAttachmentDefinition[11]的方式配置,同時沒有指定具體的配置內容,而是通過每台Node節點上的/etc/cni/multus/net.d/下的同name配置文件來配置,這樣做可以基於Node定製配置(因為採用了host-local的IPAM,所以必須這樣),具體看配置:

# Execute following command at Kubernetes master
# 這裡強調一下,配置到00-multus.conf配置文件中的NetworkAttachmentDefinition的namespace
# 必須與multus-cni daemonset的namespace相同.
# 參見https://github.com/intel/multus-cni/issues/302#issuecomment-484407240
# https://github.com/intel/multus-cni/blob/v3.2/doc/configuration.md#network-selection-flow-of-clusternetworkdefaultnetworks

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: net-calico
namespace: kube-system
EOF

# Execute following commands at all Kubernetes nodes (i.e. master and minions)
#根據實際情況修改ip地址域
#/etc/cni/multus/net.d/這個目錄需要提前創建一下
mkdir -p /etc/cni/multus/net.d/
cat > /etc/cni/multus/net.d/calico.conf <<EOF
{
"name": "net-calico",
"cniVersion": "0.3.0",
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "node-001",
"mtu": 1440,
"ipam": {
"type": "host-local",
"ranges": [
[
{ "subnet": "192.168.0.0/16",
"rangeStart": "192.168.0.1",
"rangeEnd": "192.168.0.100" }
]
],
"routes": [
{ "dst": "0.0.0.0/0"},
{ "dst": "192.168.0.0/16" },
{ "dst": "10.96.0.0/12" },
{ "dst": "100.73.3.0/24" }
]
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}
}
EOF

#筆者測試環境有3台機器,所以分別在三台機器上創建了對應的配置文件,修改內容如下:
#"nodename"修改成所在Node的hostname
#"ranges"修改成所在Node的pod ip範圍
#自定義routes,單網卡其實只需要{ "dst": "0.0.0.0/0"}即可。

NOTE:特別注意,/etc/cni/multus/net.d/下的配置文件,是不支持CNI的級聯CNI多插件配置,所以類似Calico原生的與portmap插件級聯的plugins配置[12][13],是不可用的【如下這種配置,會報錯無法找到plugin type,上文筆者提到的不準確報錯,就是因為這個,後來查了很久,才找到原因,這裡不贅述了】:

# 錯誤配置!!!
{
"name": "net-calico",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "node-001",
"mtu": 1440,
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}
},
{
"type": "portmap",
"snat": true,
"capabilities": {"portMappings": true}
}
]
}

OK,按照如上配置,創建Pod:

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: samplepod-calico
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
EOF

#查看一下Pod信息
kubectl describe pods samplepod-calico
--------------可以看到正確獲取了calico ip------------------------
Node: node-003/100.73.3.3
Start Time: Wed, 17 Jul 2019 18:59:31 +0800
Labels: <none>
Annotations: cni.projectcalico.org/podIP: 192.168.0.211/32
k8s.v1.cni.cncf.io/networks-status:
[{
"name": "net-calico",
"ips": [
"192.168.0.211"
],
"default": true,
"dns": {}
}]
Status: Running
IP: 192.168.0.211
-------------

2、單獨macvlan網路:

需要在/etc/cni/multus/net.d/下添加macvlan網路的配置文件(參考[11]),內容如下:

# Execute following command at Kubernetes master

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: net-macvlan
EOF

cat > /etc/cni/multus/net.d/macvlan.conf <<EOF
{
"cniVersion": "0.3.0",
"type": "macvlan",
"name": "net-macvlan",
"master": "bond0.2734",
"mode": "bridge",
"isDefaultGateway": true,
"ipam": {
"expiredPeriod": 10,
"type": "host-local",
"subnet": "100.73.34.0/24",
"rangeStart": "100.73.34.20",
"rangeEnd": "100.73.34.49",
"gateway": "100.73.34.254",
"routes": [
{ "dst": "0.0.0.0/0", "gw": "100.73.34.254" }
]
}
}
EOF

#筆者測試環境有3台機器,所以分別在三台機器上創建了對應的配置文件,修改內容如下:
#"ranges"修改成所在Node的pod ip範圍
#自定義routes,單網卡只需要{ "dst": "0.0.0.0/0"}即可。

創建Pod,這裡因為需要修改Pod的默認網卡,所以需要加入annotation[14],如下:

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: samplepod-macvlan
annotations:
v1.multus-cni.io/default-network: default/net-macvlan
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
EOF

NOTE:v1.multus-cni.io/defaul這個annotation默認的namespace是kube-system,所以net-macvlan需要表示成default/net-macvlan,否則創建Pod時會報錯,無法找到網路,參考[15]

#查看一下Pod信息
kubectl describe pods samplepod-macvlan
--------------可以看到正確獲取了macvlan ip------------------------
Node: node-003/100.73.3.3
Start Time: Thu, 18 Jul 2019 09:42:07 +0800
Labels: <none>
Annotations: k8s.v1.cni.cncf.io/networks-status:
[{
"name": "net-macvlan",
"interface": "eth0",
"ips": [
"100.73.34.81"
],
"mac": "76:b6:6c:d6:aa:fb",
"default": true,
"dns": {}
}]
v1.multus-cni.io/default-network: default/net-macvlan
Status: Running
IP: 100.73.34.81
-------------

NOTE:multus-cni的官方文檔裡面一直在強調Pod的默認網路應該是cluster network(例如flannel、Calico),但其實使用macvlan這種網路也可以。

3、Calico+macvlan雙網路,同時macvlan網路是默認網路(即默認路由走macvlan網卡)

也許大家認為可以用下面的方式,創建這個網路,但其實不可以,會報錯,因為涉及一個默認路由衝突的問題。

# 錯誤的創建方式!!!
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: samplepod-macvlan-calico-error
annotations:
v1.multus-cni.io/default-network: default/net-macvlan
k8s.v1.cni.cncf.io/networks: kube-system/net-calico
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
EOF

#執行後,Pod無法創建成功,describe報錯如下:
Failed create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container
"5dcf6fbc2bdafbf806dc00ba0c272af0924a859aee5918629bb61c1cac5df1e0" network for pod
"samplepod-macvlan-calico-error": NetworkPlugin cni failed to set up pod "samplepod-macvlan-calico-error_default"
network: Multus: Err adding pod to network "net-calico": Multus: error in invoke Delegate add - "calico":
failed to add IPv4 route for 0.0.0.0/0 via 169.254.1.1: file exists

怎麼辦?現在來看,只能重新再創建一個不包含默認路由的calico網路,專門用來作macvlan的輔助網路。

# Execute following command at Kubernetes master

cat <<EOF | kubectl create -f -
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: net-calico-2
EOF

# Execute following commands at all Kubernetes nodes (i.e. master and minions)
#根據實際情況修改ip地址域
cat > /etc/cni/multus/net.d/calico2.conf <<EOF
{
"name": "net-calico-2",
"cniVersion": "0.3.0",
"type": "calico",
"log_level": "info",
"datastore_type": "kubernetes",
"nodename": "node-001",
"mtu": 1440,
"ipam": {
"type": "host-local",
"ranges": [
[
{ "subnet": "192.168.0.0/16",
"rangeStart": "192.168.1.1",
"rangeEnd": "192.168.1.100" }
]
],
"routes": [
{ "dst": "192.168.0.0/16" },
{ "dst": "10.96.0.0/12" },
{ "dst": "100.73.3.0/24" }
]
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
}
}
EOF

#筆者測試環境有3台機器,所以分別在三台機器上創建了對應的配置文件,修改內容如下:
#"nodename"修改成所在Node的hostname
#"ranges"修改成所在Node的pod ip範圍
#自定義routes,因為多網卡,需要加入如上配置路由。

對於上面的路由配置,因為calico輔助網路主要是用於Pod之間、Pod與clusterip之間、Pod與Node之間的訪問,所以加入了三個固定的路由,目標地址域分別為Pod地址域、clusterip地址域、Node地址域。(特別說明:這些路由會帶來的附加影響,就是從這些目標地址域不能訪問Pod的macvlan ip)

然後這裡還有一個坑,就是不能指定默認網路v1.multus-cni.io/defaul為net-macvlan,輔助網路k8s.v1.cni.cncf.io/netw為net-calico-2,會造成Pod創建成功,但是calico網路其實不通【具體原因現在仍待查,懷疑是這種情況下calico網路作為輔助網路,會被少下發一些配置,造成無法正常使用】,錯誤的創建方式如下:

# 錯誤的創建方式!!!
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: samplepod-macvlan-calico-wrong
annotations:
v1.multus-cni.io/default-network: default/net-macvlan
k8s.v1.cni.cncf.io/networks: net-calico-2
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
EOF

所以可用的創建方式,現在來看,只能是把默認網路v1.multus-cni.io/defaul配置成net-calico-2,然後把輔助網路k8s.v1.cni.cncf.io/netw配置成net-macvlan,具體如下:

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: samplepod-macvlan-calico
annotations:
v1.multus-cni.io/default-network: default/net-calico-2
k8s.v1.cni.cncf.io/networks: net-macvlan
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
EOF

# 查看一下Pod信息
--------------可以看到正確獲取了macvlan和calico網卡的ip------------------------
Node: node-003/100.73.3.3
Start Time: Thu, 18 Jul 2019 15:39:29 +0800
Labels: <none>
Annotations: cni.projectcalico.org/podIP: 192.168.1.242/32
k8s.v1.cni.cncf.io/networks: net-macvlan
k8s.v1.cni.cncf.io/networks-status:
[{
"name": "net-calico-2",
"ips": [
"192.168.1.242"
],
"default": true,
"dns": {}
},{
"name": "net-macvlan",
"interface": "net1",
"ips": [
"100.73.34.107"
],
"mac": "5e:8c:13:a9:23:0d",
"dns": {}
}]
v1.multus-cni.io/default-network: default/net-calico-2
Status: Running
IP: 192.168.1.242
-------------------------
查看ip和路由信息,並驗證通信,現在從任意外部網路,都可以ping通macvlan的100.73.34.107地址,用於外部網路訪問。
# kubectl exec -it samplepod-macvlan-calico -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if862: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP
link/ether 12:d8:97:ab:6b:15 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.242/32 scope global eth0
valid_lft forever preferred_lft forever
5: net1@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 5e:8c:13:a9:23:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 100.73.34.107/24 scope global net1
valid_lft forever preferred_lft forever

# kubectl exec -it samplepod-macvlan-calico -- route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 100.73.34.254 0.0.0.0 UG 0 0 0 net1
10.96.0.0 169.254.1.1 255.240.0.0 UG 0 0 0 eth0
100.73.3.0 169.254.1.1 255.255.255.0 UG 0 0 0 eth0
100.73.34.0 0.0.0.0 255.255.255.0 U 0 0 0 net1
169.254.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
192.168.0.0 169.254.1.1 255.255.0.0 UG 0 0 0 eth0

可以看到,上面這麼做,有一個問題,就是calico的網卡會默認被命名成eth0,macvlan的網卡會被命名成net1,但其實這是可以改的,如果想讓macvlan的網卡是eth0(因為是默認路由網卡),calico網卡是eth1,可以按如下配置創建[16],【但是這裡要很遺憾的說,如果按照如下配置創建Pod,把net-macvlan網卡名字指定成eth0,這個Pod會跟上面把v1.multus-cni.io/defaul指定為net-macvlan的情形一樣,calico網路會不通,看來calico的某種配置,跟eth0這個名字有某種微妙的關係(只要不把calico的網卡設置成eth0,要麼calico網路不通,要麼容器頻繁重啟),還有待研究】:

# 不可行的創建方式!!!
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: samplepod-macvlan-calico
annotations:
v1.multus-cni.io/default-network: default/net-calico-2@eth1
k8s.v1.cni.cncf.io/networks: net-macvlan@eth0
spec:
containers:
- name: samplepod
command: ["/bin/bash", "-c", "sleep 2000000000000"]
image: dougbtv/centos-network
EOF

#查看一下Pod信息
# kubectl exec -it samplepod-macvlan-calico -- ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
4: eth1@if863: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1440 qdisc noqueue state UP
link/ether d6:60:42:a0:64:63 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.1.243/32 scope global eth1
valid_lft forever preferred_lft forever
5: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 9e:fd:eb:47:35:e2 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 100.73.34.108/24 scope global eth0
valid_lft forever preferred_lft forever

終上,三種網路類型的創建方法已經說明完,總結一下,在一定程度上,multus-cni還是實現了在創建Pod的時候指定Pod網路類型的能力的,不要小看這個能力,個人覺得,docker的CNM網路模型,通過創建容器時的--network參數指定容器網路,還是很不錯的,雖然k8s沒有採用這種方式,而是把Pod的網路與Node節點做了緊耦合,或者說是與cluster集群做了緊耦合,這樣做的初衷應該是希望一個cluster就是一個整體的網路,一切不需要再配置,自動化簡潔化很好,但是這樣做,確實沒有考慮用戶在某種特殊情況下的定製化網路需求(例如故障調試、測試應用等),google的深度自動化思維,可以理解,但是深度自動化不代表排斥定製化能力,這兩個應該不是互斥的關係,所以,如果能夠通過加入一層CNI插件,進行解耦,實現類似docker在創建容器時指定網路的能力,也是很不錯的。

當然,對於這個定製能力,multus-cni做的顯然還不夠盡善盡美,希望看過這篇文章的朋友,可以思考這個問題,找出更好的解決方案,或者乾脆全新開發一套為定製Pod網路而生的插件出來,相信一定會有人關注。

文末註:

另一個華為開發的多網路CNI插件:Huawei-PaaS/CNI-Genie[17]k8s多網卡規範:K8sNetworkPlumbingWG/multi-net-spec[18]關於Pod多網卡(定製網卡)的網路文章引用:多網路。 也許是 K8S 的「單 Pod 單 IP」的網路模型過於深入人心了,以至於在實現過程中都謹遵這一「金科玉律」。但我們知道,網路的世界紛繁複雜,一塊網卡怎麼可能 cover 所有場景呢?據最簡單的例子,一般我們會為一個 IO 密集型的作業配兩塊網路,一塊網卡作為數據信道,另一塊網卡則作為控制信道。從單網路到多網路的遷移,道路並不平坦,甚至是處處荊棘和沼澤,且不說網路插件,Service,DNS,Ingress 等實現要大改,光 API 兼容性就讓你頭疼。好消息是經過整整兩年的拉鋸,社區 Network Plumbing WG終於取得了階段性成果,如不出意外的話,應該是 CRD + 多網路插件的形式支持K8S的多網路,保持 K8S 原生 API 的穩定。支持多網路的 CNI 插件有幾個,但真真落到生產的沒幾個,CNI-genie 是其中一個有眾多粉絲基礎和經過生產環境檢驗的 K8S 多網路插件,了解一下?引自:Kubernetes網路一年發展動態與未來趨勢(下) - 掘金[19]pod多網路在HPC場景下,pod之間除了高性能網路之外,也可以有額外的網路,由此引入pod多網卡訴求,intel提供了一種解決方案multus(https://github.com/intel/multus-cni),該插件主要通過代理其它cni插件以實現,遵循k8s多網卡規範(https://github.com/K8sNetworkPlumbingWG/multi-net-spec)。利用multus插件,結合常規cni插件與SR-IOV cni插件,即可實現下圖所示的pod網路

引自:Kubernetes與HPC:(1)RDMA網路[20]

參考

  1. ^https://zhuanlan.zhihu.com/p/67384482
  2. ^https://github.com/intel/multus-cni
  3. ^https://github.com/intel/multus-cni/blob/v3.2/README.md
  4. ^abhttps://github.com/intel/multus-cni/tree/v3.2
  5. ^https://docs.projectcalico.org/v3.8/introduction/
  6. ^https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
  7. ^https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/calico#installing-with-the-kubernetes-api-datastore50-nodes-or-less
  8. ^https://docs.projectcalico.org/v3.8/getting-started/calicoctl/install
  9. ^https://github.com/intel/multus-cni/blob/e723aabca8792ddd181167660e252a127a81b073/doc/quickstart.md#installation
  10. ^https://github.com/intel/multus-cni/blob/v3.2/doc/configuration.md
  11. ^abhttps://github.com/intel/multus-cni/blob/v3.2/doc/how-to-use.md#networkattachmentdefinition-with-cni-config-file
  12. ^https://docs.projectcalico.org/v3.8/reference/cni-plugin/configuration#cni-network-configuration-lists
  13. ^https://github.com/containernetworking/cni/blob/spec-v0.3.0/SPEC.md#network-configuration-lists
  14. ^https://github.com/intel/multus-cni/blob/v3.2/doc/configuration.md#specify-default-cluster-network-in-pod-annotations
  15. ^https://github.com/intel/multus-cni/blob/v3.2/doc/how-to-use.md#lauch-pod-with-text-annotation-for-networkattachmentdefinition-in-different-namespace
  16. ^https://github.com/intel/multus-cni/blob/v3.2/doc/how-to-use.md#lauch-pod-with-text-annotation-with-interface-name
  17. ^https://github.com/Huawei-PaaS/CNI-Genie
  18. ^https://github.com/K8sNetworkPlumbingWG/multi-net-spec
  19. ^https://juejin.im/post/5bd1bffd5188255ac26297b9
  20. ^https://www.meiwen.com.cn/subject/ckndaqtx.html

推薦閱讀:

相关文章