在工作負載叢集上部署使用 Whereabouts 的 Multus

Whereabouts 是 IP 位址管理 (IPAM) CNI 外掛程式,可跨叢集中的所有節點動態指派 IP 位址給 Pod。不同於其他 IPAM 外掛程式 (例如 host-local) 僅指派 IP 位址給同一節點上的 Pod,whereabouts 指派叢集範圍的 IP 位址。

在本主題中,我們說明如何將次要網路介面連結到 Pod,而指派給該 Pod 的 IP 位址在您使用 whereabouts 指定的範圍內。例如,您會有 Antrea 或 Calico 作為主要 CNI、使用 macvlanipvlan 建立的次要介面,以及 Whereabouts 作為 IPAM CNI。

必要條件

安裝 Whereabouts 套件

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

  1. 設定和安裝 Whereabouts。

    1. 建立組態檔來擷取 Whereabouts 參數。

      tanzu package available get whereabouts.tanzu.vmware.com/PACKAGE-VERSION --default-values-file-output FILE-PATH
      
      
      附註

      部署 whereabouts 元件的命名空間必須為 kube-system。任何自訂的命名空間安裝都將失敗。

      其中,PACKAGE-VERSION 是您要安裝的 Whereabouts 套件版本,FILE-PATH 是用來儲存組態檔的位置,例如,whereabouts-data-values.yaml。上面的命令建立名為 whereabouts-data-values.yaml 的組態檔,其中包含預設值。

    2. 執行 tanzu package available list 命令以列出可用的 Whereabouts 套件版本,例如:

      tanzu package available list whereabouts.tanzu.vmware.com -A
       NAME                           VERSION               RELEASED-AT                     NAMESPACE
       whereabouts.tanzu.vmware.com   0.5.1+vmware.2-tkg.1  2022-30-04 18:00:00 +0000 UTC   tanzu-package-repo-global
      
      
      附註

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

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

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

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

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

  2. whereabouts-data-values.yaml 檔案中移除所有註解:

    yq -i eval '... comments=""' whereabouts-cni-default-values.yaml
    
  3. 執行 tanzu package install 以安裝套件。

    tanzu package install whereabouts --package whereabouts.tanzu.vmware.com --version AVAILABLE-PACKAGE-VERSION --values-file whereabouts-data-values.yaml --namespace TARGET-NAMESPACE
    

    其中:

    • TARGET-NAMESPACE 是要在其中安裝 Whereabouts 軟體包的命名空間。例如,my-packagestanzu-cli-managed-packages 命名空間。

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

    tanzu package installed get whereabouts -o <json|yaml|table>
    
  5. NetworkAttachmentDefinition 建立自訂資源定義 (CRD),針對以 Whereabouts 為 IPAM 類型的 Multus CNI 所使用的網路介面定義 CNI 組態。

    1. 建立 CRD 規格。例如,此 multus-cni-crd.yaml 指定名為 macvlan-confNetworkAttachmentDefinition,其中設定 macvlan CNI 並以 whereabouts 為 IPAM 類型:

      ---
      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: macvlan-conf
      spec:
        config: '{
          "cniVersion": "0.3.1",
          "plugins": [
            {
            "type": "macvlan",
            "capabilities": { "ips": true },
            "master": "eth0",
            "mode": "bridge",
            "ipam": {
              "type": "whereabouts",
              "range": "192.168.20.0/24",
              "range_start": "192.168.20.10",
              "range_end": "192.168.20.100",
              "gateway": "192.168.20.1"
              }
            } ]
          }'
      
    2. 建立資源,例如 kubectl create -f multus-cni-crd.yaml

  6. 建立含有註解 k8s.v1.cni.cncf.io/networks 的 Pod,以指定要新增的其他網路。

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

      apiVersion: v1
      kind: Pod
      metadata:
        name: pod0
        annotations:
          k8s.v1.cni.cncf.io/networks: macvlan-conf
      spec:
        containers:
        - name: pod0
          command: ["/bin/ash", "-c", "trap : TERM INT; sleep infinity & wait"]
          image: docker.io/kserving/tools:latest
      
      
    2. 建立網繭。例如,kubectl create -f my-multi-cni-crd.yaml 建立網繭 pod0

    3. 建立的網繭會有三個網路介面:

      • lo 回送介面
      • eth0 由 Antrea 或 Calico CNI 管理的預設網繭網路
      • net1 透過註解 k8s.v1.cni.cncf.io/networks: macvlan-conf 建立的新介面。
      附註

      預設網路的名稱為 eth0,其他網路網繭介面的名稱為 net1net2 等。

    4. pod0 上執行 kubectl describe pod,並確認註解 k8s.v1.cni.cncf.io/network-status 列出所有網路介面。

      例如:

      $ kubectl describe pod pod0
      
      Name:         pod0
      Namespace:    default
      Priority:     0
      Node:         tcecluster-md-0-6476897f75-rl9vt/10.170.109.225
      Start Time:   Thu, 25 August 2022 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.20.11"
                         ],
                         "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 啟動並執行。針對將在下一步建立的其他網繭,重複此步驟以驗證組態。

  7. 建立兩個額外的網繭:pod1 在同一節點上,pod2 在另一個節點上。我們將使用這些網繭驗證單一節點內和整個叢集的節點之間的網路存取。

驗證整個叢集的網繭之間的網路流量

現在,您可以檢查同一節點中的網繭和整個叢集的網繭之間的網路存取。

  1. 驗證同一節點上的網繭之間的網路存取是否正常運作。例如,以下命令驗證 pod0 是否可以透過指派的 IP 位址連線到 pod1

      kubectl exec -it pod0 -- ping -c 3 192.168.20.12
      PING 192.168.20.12 (192.168.20.12) 56(84) bytes of data.
      64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.237 ms
      64 bytes from 192.168.20.12: icmp_seq=2 ttl=64 time=0.215 ms
      64 bytes from 192.168.20.12: icmp_seq=3 ttl=64 time=0.156 ms
    
    --- 192.168.20.12 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.156/0.202/0.237/0.037 ms
    
  2. 驗證不同節點上的網繭之間的網路存取是否正常運作。例如,以下命令驗證 pod0 是否可以透過指派的 IP 位址連線到 pod2

      kubectl exec -it pod0 -- ping -c 3 <192.168.20.13
      PING 192.168.20.13 (192.168.20.13) 56(84) bytes of data.
      64 bytes from 192.168.20.13: icmp_seq=1 ttl=64 time=0.799 ms
      64 bytes from 192.168.20.13: icmp_seq=2 ttl=64 time=0.626 ms
      64 bytes from 192.168.20.13: icmp_seq=3 ttl=64 time=0.655 ms
    
    --- 192.168.20.13 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2030ms
    rtt min/avg/max/mdev = 0.626/0.693/0.799/0.078 ms
    
check-circle-line exclamation-circle-line close-line
Scroll to top icon