在工作負載叢集上部署 Multus

Multus CNI 是適用於 Kubernetes 的容器網路介面 (CNI) 外掛程式,可讓您將多個網路介面連結到單一網繭,而且各與不同的位址範圍相關聯。

本主題說明如何將 Multus 套件安裝到由獨立管理叢集部署的工作負載叢集,以及用來建立具有多個網路介面的網繭。例如,Antrea 或 Calico 作為主要 CNI,以及次要介面 (例如 macvlanipvlanSR-IOVDPDK 裝置) 作為硬體或加速介面。

macvlan 和 ipvlan 的二進位檔已安裝在工作負載叢集節點範本中。

附註

由 vSphere with Tanzu 主管部署的工作負載叢集不支援 Multus CNI。

必要條件

安裝 Multus CNI 套件

附註

Multus CNI 安裝在叢集後,就不應該刪除。請參閱下面的不支援刪除 Multus

若要在工作負載叢集上安裝 Multus CNI 套件,並將叢集設定為使用該套件,請執行下列動作:

  1. 如果叢集無已安裝 Multus CNI 套件的套件存放庫 (例如 tanzu-standard 存放庫),請安裝一個:

    附註

    如果要將以計劃為基礎的叢集 (舊版) 為目標,請跳過此步驟。對於以計劃為基礎的叢集,會在 tanzu-package-repo-global 命名空間中的每個叢集中,自動啟用 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:v2.2.0。若要從 Tanzu CLI 取得此值,請參閱列出套件存放庫,或在 Tanzu Mission Control 中查看叢集 (Cluster) 窗格中的附加元件 (Addons) > 存放庫 (Repositories) 清單。
  2. (選用) 若要設定 Multus,請執行下列動作:

    1. 建立組態檔來擷取 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 參數

    2. 執行 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 3.7.1+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.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
      
      附註

      如果在網路受限環境中操作,請確保可以存取自訂映像登錄。

    3. 執行 tanzu package available get 命令搭配 --values-schema,以查看可設定哪些欄位值:

      tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
      

      其中:- VERSIONtanzu package available list 輸出中列出的版本 - FORMATyamljson

    4. multus-data-values.yaml 組態檔中填入所需的欄位值。

  3. multus-data-values.yaml 檔案中移除所有註解:

    yq -i eval '... comments=""' multus-data-values.yaml
    
  4. 執行 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-packagestanzu-cli-managed-packages 命名空間。

      • 如果未指定 --namespace 旗標,則 Tanzu CLI 會在 default 命名空間中安裝套件。
      • 指定的命名空間必須已存在,例如,從執行 kubectl create namespace my-packages
    • AVAILABLE-PACKAGE-VERSION 是您在上方所擷取的版本,例如 3.8.0+vmware.3-tkg.1
  5. 執行 tanzu package installed get 以檢查已安裝的套件狀態。

    tanzu package installed get multus-cni --namespace NAMESPACE
    
  6. NetworkAttachmentDefinition 建立自訂資源定義 (CRD),以針對 Multus CNI 使用的網路介面定義 CNI 組態。

    1. 建立 CRD 規格。例如,此 multus-cni-crd.yaml 指定名為 macvlan-confNetworkAttachmentDefinition 來設定 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"
          }
        }'
      
    2. 建立資源,例如 kubectl create -f multus-cni-crd.yaml

  7. 建立網繭,註解為 k8s.v1.cni.cncf.io/networks,以取用 NetworkAttachmentDefinition 自訂資源的名稱 (逗號分隔清單)。

    1. 建立網繭規格,例如 my-multi-cni-pod.yaml

      apiVersion: v1
      kind: Pod
      metadata:
        name: sample-pod
        annotations:
          k8s.v1.cni.cncf.io/networks: macvlan-conf
      spec:
        containers:
        - name: sample-pod
          command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: harbor-repo.vmware.com/dockerhub-proxy-cache/library/alpine
      
      
    2. 建立網繭,例如 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,其他網路網繭介面的名稱為 net1net2 等。

驗證 Multus

在網繭上執行 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

Multus CNI 安裝在叢集後,就不應該刪除。

刪除 Multus 並不會從 CNI 指令碼目錄卸載 Multus 組態檔 /etc/cni/net.d/00-multus.conf,這會導致如下問題:

  • 無法建立新的 Pod。這是已知問題,請參閱 Multus 存放庫中的問題 #461
  • 在刪除 Multus 之前無法刪除使用其建立的 Pod。Pod 保持停滯並出現 Terminating 狀態,同時 kubelet 日誌中顯示錯誤。
check-circle-line exclamation-circle-line close-line
Scroll to top icon