Multus CNI 是適用於 Kubernetes 的容器網路介面 (CNI) 外掛程式,可讓您將多個網路介面連結到單一網繭,而且各與不同的位址範圍相關聯。
本主題說明如何將 Multus 套件安裝到由獨立管理叢集部署的工作負載叢集,以及用來建立具有多個網路介面的網繭。例如,Antrea 或 Calico 作為主要 CNI,以及次要介面 (例如 macvlan、ipvlan、SR-IOV 或 DPDK 裝置) 作為硬體或加速介面。
macvlan 和 ipvlan 的二進位檔已安裝在工作負載叢集節點範本中。
附註由 vSphere with Tanzu 主管部署的工作負載叢集不支援 Multus CNI。
kubectl
,如安裝 Tanzu CLI 和 Kubernetes CLI 以與獨立管理叢集配合使用中所述。large
或 extra-large
的工作負載叢集工作節點,如預定義的節點大小中所述。附註Multus CNI 安裝在叢集後,就不應該刪除。請參閱下面的不支援刪除 Multus。
若要在工作負載叢集上安裝 Multus CNI 套件,並將叢集設定為使用該套件,請執行下列動作:
如果叢集無已安裝 Multus CNI 套件的套件存放庫 (例如 tanzu-standard
存放庫),請安裝一個:
tanzu package repository add PACKAGE-REPO-NAME --url PACKAGE-REPO-ENDPOINT --namespace tkg-system
其中:
PACKAGE-REPO-NAME
是軟體套件存放庫的名稱,例如 tanzu-standard
或使用 ADDITIONAL_IMAGE_REGISTRY
變數設定的私人映像登錄名稱。PACKAGE-REPO-ENDPOINT
是套件存放庫的 URL。
tanzu-standard
URL 為 projects.registry.vmware.com/tkg/packages/standard/repo:v2023.10.16
。若要從 Tanzu CLI 取得此值,請參閱列出套件存放庫,或在 Tanzu Mission Control 中查看叢集 (Cluster) 窗格中的附加元件 (Addons) > 存放庫 (Repositories) 清單。(選用) 若要設定 Multus,請執行下列動作:
建立組態檔來擷取 Multus 參數,並部署為 DaemonSet。
tanzu package available get multus-cni.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
其中,PACKAGE-VERSION
是您要安裝的 Multus 套件版本,FILE-PATH
是用來儲存組態檔的位置,例如,multus-data-values.yaml
。
有關組態檔設定的資訊,請參閱 Multus CNI 存放庫中的 entrypoint.sh
參數。
執行 tanzu package available list
命令以列出可用的 Multus 套件版本,例如:
tanzu package available list multus-cni.tanzu.vmware.com -A
NAME VERSION RELEASED-AT NAMESPACE
multus-cni.tanzu.vmware.com 4.0.1+vmware.1-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
multus-cni.tanzu.vmware.com 3.8.0+vmware.1-tkg.1 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
multus-cni.tanzu.vmware.com 3.7.1+vmware.2-tkg.2 2021-06-04 18:00:00 +0000 UTC tanzu-package-repo-global
附註如果在網路受限環境中操作,請確保可以存取自訂映像登錄。
執行 tanzu package available get
命令搭配 --values-schema
,以查看可設定哪些欄位值:
tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
其中:- VERSION
是 tanzu package available list
輸出中列出的版本 - FORMAT
為 yaml
或 json
在 multus-data-values.yaml
組態檔中填入所需的欄位值。
從 multus-data-values.yaml
檔案中移除所有註解:
yq -i eval '... comments=""' multus-data-values.yaml
執行 tanzu package install
以安裝套件。
tanzu package install multus-cni --package multus-cni.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file multus-data-values.yaml --namespace TARGET-NAMESPACE
其中:
TARGET-NAMESPACE
是要在其中安裝 Multus 套件的命名空間。例如,my-packages
或 tanzu-cli-managed-packages
命名空間。
--namespace
旗標,則 Tanzu CLI 會在 default
命名空間中安裝套件。kubectl create namespace my-packages
。AVAILABLE-PACKAGE-VERSION
是您在上方所擷取的版本,例如 4.0.1+vmware.1-tkg.1
。執行 tanzu package installed get
以檢查已安裝的套件狀態。
tanzu package installed get multus-cni --namespace NAMESPACE
為 NetworkAttachmentDefinition
建立自訂資源定義 (CRD),以針對 Multus CNI 使用的網路介面定義 CNI 組態。
建立 CRD 規格。例如,此 multus-cni-crd.yaml
指定名為 macvlan-conf
的 NetworkAttachmentDefinition
來設定 macvlan
CNI:
---
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: macvlan-conf
spec:
config: '{
"cniVersion": "0.3.0",
"type": "macvlan",
"master": "ens5",
"mode": "bridge",
"ipam": {
"type": "host-local",
"subnet": "192.168.1.0/24",
"rangeStart": "192.168.1.200",
"rangeEnd": "192.168.1.216",
"routes": [
{ "dst": "0.0.0.0/0" }
],
"gateway": "192.168.1.1"
}
}'
建立資源,例如 kubectl create -f multus-cni-crd.yaml
建立網繭,註解為 k8s.v1.cni.cncf.io/networks
,以取用 NetworkAttachmentDefinition
自訂資源的名稱 (逗號分隔清單)。
建立網繭規格,例如 my-multi-cni-pod.yaml
:
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: macvlan-conf
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
seccompProfile:
type: RuntimeDefault
runAsNonRoot: true
containers:
- name: sample-pod
image: harbor-repo.vmware.com/dockerhub-proxy-cache/library/busybox:1.28
command: [ "sh", "-c", "sleep 1h" ]
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
建立網繭,例如 kubectl create -f my-multi-cni-crd.yaml
建立網繭 sample-pod
。
建立的網繭會有三個網路介面:
lo
回送介面eth0
由 Antrea 或 Calico CNI 管理的預設網繭網路net1
透過註解 k8s.v1.cni.cncf.io/networks: macvlan-conf
建立的新介面。附註預設網路的名稱為
eth0
,其他網路網繭介面的名稱為net1
、net2
等。
在網繭上執行 kubectl describe pod
,並確認註解 k8s.v1.cni.cncf.io/network-status
列出所有網路介面。例如:
$ kubectl describe pod sample-pod
Name: sample-pod
Namespace: default
Priority: 0
Node: tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
Start Time: Thu, 27 May 2021 15:31:20 +0000
Labels: <none>
Annotations: k8s.v1.cni.cncf.io/network-status:
[{
"name": "",
"interface": "eth0",
"ips": [
"100.96.1.80"
],
"mac": "66:39:dc:63:50:a3",
"default": true,
"dns": {}
},{
"name": "default/macvlan-conf",
"interface": "net1",
"ips": [
"192.168.1.201"
],
"mac": "02:77:cb:a0:60:e3",
"dns": {}
}]
k8s.v1.cni.cncf.io/networks: macvlan-conf
然後,執行 kubectl exec sample-pod -- ip a show dev net1
,以檢查目標介面是否以上面註解列出的 IP 啟動並執行。
Multus CNI 安裝在叢集後,就不應該刪除。
刪除 Multus 並不會從 CNI 指令碼目錄卸載 Multus 組態檔 /etc/cni/net.d/00-multus.conf
,這會導致如下問題:
Terminating
狀態,同時 kubelet
日誌中顯示錯誤。