5.4. 关于 all-multicast 模式
启用 all-multicast 模式(特别是在无根应用程序上下文中)非常重要。如果没有启用此模式,则需要为 Pod 的安全上下文约束(SCC )授予 NET_ADMIN 功能。如果您要允许 NET_ADMIN 功能授予 pod 权限,以便更改超出其特定要求的更改,您可能会暴露安全漏洞。
tuning CNI 插件支持更改几个接口属性,包括 all-multicast 模式。通过启用此模式,您可以在 SR-IOV 网络设备上配置的虚拟功能 (VF) 上运行的应用程序从其他 VF 上的应用程序接收多播流量,无论是附加到同一还是不同的物理功能。
5.4.1. 在 SR-IOV 网络中启用 all-multicast 模式 复制链接链接已复制到粘贴板!
您可以通过以下方法在 SR-IOV 接口中启用 all-multicast 模式:
-
在
SriovNetwork资源的metaPlugins参数中添加调优配置 在调优配置中将
allmulti字段设置为true注意确保创建启用了信任的虚拟功能 (VF)。
SR-IOV Network Operator 管理额外网络定义。当您指定要创建的额外 SR-IOV 网络时,SR-IOV Network Operator 会自动创建 NetworkAttachmentDefinition 自定义资源(CR)。
不要编辑 SR-IOV Network Operator 所管理的 NetworkAttachmentDefinition 自定义资源。这样做可能会破坏额外网络上的网络流量。
按照本指南,在 SR-IOV 网络中启用 all-multicast 模式。
先决条件
- 已安装 OpenShift Container Platform CLI (oc)。
-
以具有
cluster-admin权限的用户身份登录 OpenShift Container Platform 集群。 - 已安装 SR-IOV Network Operator。
-
您已配置了适当的
SriovNetworkNodePolicy对象。
流程
使用以下设置创建一个 YAML 文件,为 Mellanox ConnectX-5 设备定义
SriovNetworkNodePolicy对象。将 YAML 文件保存为sriovnetpolicy-mlx.yaml。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriovnetpolicy-mlx namespace: openshift-sriov-network-operator spec: deviceType: netdevice nicSelector: deviceID: "1017" pfNames: - ens8f0np0#0-9 rootDevices: - 0000:d8:00.0 vendor: "15b3" nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" numVfs: 10 priority: 99 resourceName: resourcemlx-
可选:如果支持 SR-IOV 的集群节点还没有标记,请添加
SriovNetworkNodePolicy.Spec.NodeSelector标签。有关标记节点的更多信息,请参阅"了解如何更新节点上的标签"。 运行以下命令来创建
SriovNetworkNodePolicy对象:$ oc create -f sriovnetpolicy-mlx.yaml应用配置更新后,
sriov-network-operator命名空间中的所有 pod 会自动进入Running状态。运行以下命令来创建
enable-allmulti-test命名空间:$ oc create namespace enable-allmulti-test为额外 SR-IOV 网络附加创建
SriovNetwork自定义资源 (CR) 并插入metaPlugins配置,如下例所示,并将该文件保存为sriov-enable-all-multicast.yaml。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: enableallmulti1 namespace: openshift-sriov-network-operator2 spec: resourceName: enableallmulti3 networkNamespace: enable-allmulti-test4 ipam: '{ "type": "static" }'5 capabilities: '{ "mac": true, "ips": true }'6 trust: "on"7 metaPlugins : |8 { "type": "tuning", "capabilities":{ "mac":true }, "allmulti": true } }- 1
- 指定对象的名称。SR-IOV Network Operator 创建一个名称相同的
NetworkAttachmentDefinition对象。 - 2
- 指定 SR-IOV Network Operator 安装到的命名空间。
- 3
- 指定来自用于为这个额外网络定义 SR-IOV 硬件的
SriovNetworkNodePolicy对象的spec.resourceName参数的值。 - 4
- 为
SriovNetwork对象指定目标命名空间。只有目标命名空间中的 pod 可以附加到额外网络。 - 5
- 为 IPAM CNI 插件指定一个配置对象作为 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
- 6
- 可选:为额外网络设置功能。您可以指定
"{ "ips": true }"来启用 IP 地址支持,或指定"{ "mac": true }"来启用 MAC 地址支持。 - 7
- 指定虚拟功能的信任模式。这必须设置为 "on"。
- 8
- 使用
metaPlugins参数为设备添加更多功能。在此用例中,将type字段设置为tuning,并添加allmulti字段,并将它设为true。
运行以下命令来创建
SriovNetwork资源:$ oc create -f sriov-enable-all-multicast.yaml
验证 NetworkAttachmentDefinition CR
运行以下命令,确认 SR-IOV Network Operator 创建了
NetworkAttachmentDefinitionCR:$ oc get network-attachment-definitions -n <namespace>1 - 1
- 将
<namespace>替换为您在SriovNetwork对象中指定的networkNamespace的值。在本例中,是enable-allmulti-test。预期输出显示 NAD CR 的名称和创建年龄(以分钟为单位)。
注意SR-IOV Network Operator 创建 CR 之前可能会有延迟。
运行以下命令,显示 SR-IOV 网络资源的信息:
$ oc get sriovnetwork -n openshift-sriov-network-operator
验证额外的 SR-IOV 网络附加
要验证 tuning CNI 是否已正确配置并附加了额外的 SR-IOV 网络附加,请按照以下步骤执行:
创建
PodCR。将以下 YAML 示例保存到名为examplepod.yaml的文件中:apiVersion: v1 kind: Pod metadata: name: samplepod namespace: enable-allmulti-test annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "enableallmulti",1 "mac": "0a:56:0a:83:04:0c",2 "ips": ["10.100.100.200/24"]3 } ] spec: containers: - name: podexample image: centos command: ["/bin/bash", "-c", "sleep INF"] securityContext: runAsUser: 2000 runAsGroup: 3000 allowPrivilegeEscalation: false capabilities: drop: ["ALL"] securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault运行以下命令来创建
PodCR:$ oc apply -f examplepod.yaml运行以下命令验证 pod 是否已创建:
$ oc get pod -n enable-allmulti-test输出示例
NAME READY STATUS RESTARTS AGE samplepod 1/1 Running 0 47s运行以下命令登录到 pod:
$ oc rsh -n enable-allmulti-test samplepod运行以下命令,列出与 pod 关联的所有接口:
sh-4.4# ip link输出示例
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8901 qdisc noqueue state UP mode DEFAULT group default link/ether 0a:58:0a:83:00:10 brd ff:ff:ff:ff:ff:ff link-netnsid 01 3: net1@if24: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether ee:9b:66:a4:ec:1d brd ff:ff:ff:ff:ff:ff link-netnsid 02