This site will be decommissioned on January 30th 2025. After that date content will be available at techdocs.broadcom.com.

在工作负载集群上部署 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