8.6. 将 Pod 添加到额外网络
您可以将 Pod 添加到现有的单根 I/O 虚拟化(SR-IOV)网络。
8.6.1. 将 Pod 添加到额外网络
您可以将 Pod 添加到额外网络。Pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 Pod 时会附加额外网络。但是,如果 Pod 已存在,您无法为其附加额外网络。
如果 NetworkAttachmentDefinition 由 SR-IOV Network Operator 管理,SR-IOV 网络资源注入器会自动将 resource
字段添加到 Pod 对象中。
在为部署资源或 ReplicationController 资源指定 SR-IOV 硬件网络时,必须指定 NetworkAttachmentDefinition CR 的命名空间。如需更多信息,请参阅以下 bug: BZ#1846333 和 BZ#1840962。
先决条件
- Pod 必须与额外网络处于相同的命名空间。
-
安装 OpenShift CLI(
oc
)。 - 您必须登录集群。
- 您必须安装了 SR-IOV Operator ,并定义了 SriovNetwork CR。
流程
为 Pod 对象添加注解。只能使用以下注解格式之一:
要在没有自定义的情况下附加额外网络,请使用以下格式添加注解。将
<network>
替换为要与 Pod 关联的额外网络的名称:metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...] 1
- 1
- 要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则 Pod 会将多个网络接口附加到该网络。
要通过自定义来附加额外网络,请添加具有以下格式的注解:
metadata: annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "<network>", 1 "namespace": "<namespace>", 2 "default-route": ["<default-route>"] 3 } ]
运行以下命令来创建 Pod。将
<name>
替换为 Pod 的名称。$ oc create -f <name>.yaml
可选: 要确认 Pod CR 中是否存在注解,请输入以下命令,将
<name>
替换为 Pod 的名称。$ oc get pod <name> -o yaml
在以下示例中,
example-pod
Pod 附加到net1
额外网络:$ oc get pod example-pod -o yaml apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: macvlan-bridge k8s.v1.cni.cncf.io/networks-status: |- 1 [{ "name": "openshift-sdn", "interface": "eth0", "ips": [ "10.128.2.14" ], "default": true, "dns": {} },{ "name": "macvlan-bridge", "interface": "net1", "ips": [ "20.2.2.100" ], "mac": "22:2f:60:a5:f8:00", "dns": {} }] name: example-pod namespace: default spec: ... status: ...
- 1
k8s.v1.cni.cncf.io/networks-status
参数是对象的 JSON 数组。每个对象描述附加到 Pod 的额外网络的状态。注解值保存为纯文本值。
8.6.2. 创建与 SR-IOV pod 兼容的非统一内存访问 (NUMA)
您可以通过限制 SR-IOV 和从相同 NUMA 节点分配的 CPU 资源,使用 restricted
或 single-numa-node
Topology Manager 来创建与 SR-IOV pod 兼容的 NUMA。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
启用 LatencySensitive 配置集,并将 CPU Manager 策略配置为
static
。
流程
创建以下 SR-IOV pod 规格,然后在
<name>-sriov-pod.yaml
文件中保存 YAML。将<name>
替换为这个 pod 的名称。以下示例显示了 SR-IOV pod 规格:
apiVersion: v1 kind: Pod metadata: name: sample-pod annotations: k8s.v1.cni.cncf.io/networks: <name> 1 spec: containers: - name: sample-container image: <image> 2 command: ["sleep", "infinity"] resources: limits: memory: "1Gi" 3 cpu: "2" 4 requests: memory: "1Gi" cpu: "2"
运行以下命令来创建 SR-IOV pod 示例:
$ oc create -f <filename> 1
- 1
- 将
<filename>
替换为您在上一步中创建的文件的名称。
确认
sample-pod
配置为带有保证 QoS。$ oc describe pod sample-pod
确认
sample-pod
被分配了独有的 CPU。$ oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpus
确认为
sample-pod
分配的 SR-IOV 设备和 CPU 位于相同的 NUMA 节点上。$ oc exec sample-pod -- cat /sys/fs/cgroup/cpuset/cpuset.cpus