在工作负载集群上部署 Multus

Multus CNI 是适用于 Kubernetes 的容器网络接口 (CNI) 插件,可用于将多个网络接口连接到单个 pod,并将每个容器与不同的地址范围相关联。

本主题介绍了如何将 Multus 软件包安装到独立管理集群部署的工作负载集群上,并使用该软件包创建具有多个网络接口的 Pod。例如,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 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) 列表。
  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 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
      
      注意

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

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

      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 是上面检索到的版本,例如 4.0.1+vmware.1-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-conf 且配置了macvlan CNI 的 NetworkAttachmentDefinition

      ---
      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 创建一个 pod,该操作采用逗号分隔的 NetworkAttachmentDefinition 自定义资源名称列表。

    1. 创建 pod 规范,例如 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
      
    2. 创建 pod;例如 kubectl create -f my-multi-cni-crd.yaml 创建 pod sample-pod

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

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

默认网络将获取名称 eth0,其他网络 Pod 接口将该名称获取为 net1net2 等。

验证 Multus

在 Pod 上运行 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