Multus CNI 是适用于 Kubernetes 的容器网络接口 (CNI) 插件,可用于将多个网络接口连接到单个 pod,并将每个容器与不同的地址范围相关联。
本主题介绍了如何将 Multus 软件包安装到独立管理集群部署的工作负载集群上,并使用该软件包创建具有多个网络接口的 Pod。例如,Antrea 或 Calico 作为主 CNI,以及辅助接口(如 macvlan 或 ipvlan、SR-IOV 或 DPDK 设备用于硬件或加速接口。
macvlan 和 ipvlan 的二进制文件已安装在工作负载集群节点模板中。
注意由 vSphere with Tanzu 主管部署的工作负载集群不支持 Multus CNI。
kubectl
,如安装 Tanzu CLI 和其他工具以与 vSphere with Tanzu 主管配合使用或安装 Tanzu CLI 和其他工具以与独立管理集群配合使用中所述。large
或 extra-large
的工作负载集群工作节点,如预定义的节点大小中所述。注意在集群中安装 Multus CNI 后,不应将其删除。请参见下面的删除 Multus 不受支持。
要在工作负载集群上安装 Multus CNI 软件包并将集群配置为使用该软件包,请执行以下操作:
如果集群没有安装 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) 列表。(可选)要配置 Multus,请执行以下操作:
创建一个可检索 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
参数。
运行 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
注意如果在网络受限的环境中运行,请确保可以访问自定义映像注册表。
使用 --values-schema
运行 tanzu package available get
命令以查看可以设置哪些字段值:
tanzu package available get multus-cni.tanzu.vmware.com/VERSION --values-schema -o FORMAT
其中:- VERSION
是 tanzu package available list
输出中列出的版本 - FORMAT
为 yaml
或 json
在 multus-data-values.yaml
配置文件中填充所需的字段值。
从 multus-data-values.yaml
文件中移除所有注释:
yq -i eval '... comments=""' multus-data-values.yaml
运行 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-packages
或 tanzu-cli-managed-packages
命名空间。
--namespace
标记,则 Tanzu CLI 会在 default
命名空间中安装软件包。kubectl create namespace my-packages
。AVAILABLE-PACKAGE-VERSION
是上面检索到的版本,例如 3.8.0+vmware.3-tkg.1
。运行 tanzu package installed get
以检查已安装软件包的状态。
tanzu package installed get multus-cni --namespace NAMESPACE
为 NetworkAttachmentDefinition
创建自定义资源定义 (CRD),该定义明确了 Multus CNI 使用的网络接口的 CNI 配置。
创建 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"
}
}'
创建资源;例如 kubectl create -f multus-cni-crd.yaml
使用注释 k8s.v1.cni.cncf.io/networks
创建一个 pod,该操作采用逗号分隔的 NetworkAttachmentDefinition
自定义资源名称列表。
创建 pod 规范,例如 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
创建 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 接口将该名称获取为net1
、net2
等。
在 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 CNI 后,不应将其删除。
删除 Multus 并不会从 CNI 脚本目录卸载 Multus 配置文件 /etc/cni/net.d/00-multus.conf
,这会导致如下问题:
Terminating
状态,同时 kubelet
日志中显示错误。