在工作负载集群上部署具有 Whereabouts 的 Multus

Whereabouts 是一个 IP 地址管理(IP Address Management,IPAM)CNI 插件,可跨集群中的所有节点为 Pod 动态分配 IP 地址。与仅将 IP 地址分配给同一节点上的 Pod 的其他 IPAM 插件(如 host-local)相比,whereabouts 可在集群范围内分配 IP 地址。

在本主题中,我们将展示如何将辅助网络接口连接到使用 whereabouts 指定的范围内分配的 IP 地址的 Pod。例如,可将 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.6.1+vmware.2-tkg.1  2023-30-04 18:00:00 +0000 UTC   tanzu-package-repo-global
      
      
      注意

      如果在网络受限的环境中运行,请确保可以访问自定义映像注册表。

    3. 使用 --values-schema 运行 tanzu package available get 命令以查看可以设置哪些字段值:

      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.6.1+vmware.2-tkg.1
  4. 运行 tanzu package installed get 以检查已安装软件包的状态。

    tanzu package installed get whereabouts -o <json|yaml|table>
    
  5. NetworkAttachmentDefinition 创建自定义资源定义 (CRD),该定义明确了 Multus CNI 使用的网络接口的 CNI 配置,其中 Whereabouts 作为 IPAM 类型。

    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. 创建 Pod 规范;例如 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. 创建 Pod。例如,kubectl create -f my-multi-cni-crd.yaml 创建 Pod pod0

    3. 在创建 Pod 后,它将具有三个网络接口:

      • lo 环回接口
      • eth0 由 Antrea 或 Calico CNI 管理的默认 Pod 网络
      • net1 通过注释 k8s.v1.cni.cncf.io/networks: macvlan-conf 创建新接口。
      注意

      默认网络将获取名称 eth0,其他网络 Pod 接口将该名称获取为 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。重复此步骤以验证将在下一步中创建的其他 Pod 的配置。

  7. 创建两个额外的 Pod:在同一节点上创建 pod1,在其他节点上创建 pod2。我们将使用这些 Pod 验证集群内单个节点和节点内的网络访问。

验证跨集群的 Pod 之间的网络流量

现在,可以检查同一节点中的 Pod 与集群中 Pod 之间的网络访问。

  1. 验证同一节点上的 Pod 之间的网络访问正常工作。例如,以下命令验证 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. 验证不同节点上的 Pod 之间的网络访问正常工作。例如,以下命令验证 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