[
{
"name": "<name>", (1)
"mac": "<mac_address>", (2)
"ips": ["<cidr_range>"] (3)
}
]
将 Pod 附加到附加网络时,您可以指定运行时配置以对 Pod 进行特定自定义。例如,您可以请求特定的 MAC 硬件地址。
您可以通过在 Pod 规范中设置注释来指定运行时配置。注释键是k8s.v1.cni.cncf.io/networks
,它接受一个描述运行时配置的 JSON 对象。
以下 JSON 描述了基于以太网的 SR-IOV 网络附件的运行时配置选项。
[
{
"name": "<name>", (1)
"mac": "<mac_address>", (2)
"ips": ["<cidr_range>"] (3)
}
]
1 | SR-IOV 网络附件定义 CR 的名称。 |
2 | 可选:从 SR-IOV 网络附件定义 CR 中定义的资源类型分配的 SR-IOV 设备的 MAC 地址。要使用此功能,还必须在SriovNetwork 对象中指定{ "mac": true } 。 |
3 | 可选:从 SR-IOV 网络附件定义 CR 中定义的资源类型分配的 SR-IOV 设备的 IP 地址。支持 IPv4 和 IPv6 地址。要使用此功能,还必须在SriovNetwork 对象中指定{ "ips": true } 。 |
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "net1",
"mac": "20:04:0f:f1:88:01",
"ips": ["192.168.10.1/24", "2001::1/64"]
}
]
spec:
containers:
- name: sample-container
image: <image>
imagePullPolicy: IfNotPresent
command: ["sleep", "infinity"]
以下 JSON 描述了基于 InfiniBand 的 SR-IOV 网络附件的运行时配置选项。
[
{
"name": "<network_attachment>", (1)
"infiniband-guid": "<guid>", (2)
"ips": ["<cidr_range>"] (3)
}
]
1 | SR-IOV 网络附件定义 CR 的名称。 |
2 | SR-IOV 设备的 InfiniBand GUID。要使用此功能,还必须在SriovIBNetwork 对象中指定{ "infinibandGUID": true } 。 |
3 | 从 SR-IOV 网络附件定义 CR 中定义的资源类型分配的 SR-IOV 设备的 IP 地址。支持 IPv4 和 IPv6 地址。要使用此功能,还必须在SriovIBNetwork 对象中指定{ "ips": true } 。 |
apiVersion: v1
kind: Pod
metadata:
name: sample-pod
annotations:
k8s.v1.cni.cncf.io/networks: |-
[
{
"name": "ib1",
"infiniband-guid": "c2:11:22:33:44:55:66:77",
"ips": ["192.168.10.1/24", "2001::1/64"]
}
]
spec:
containers:
- name: sample-container
image: <image>
imagePullPolicy: IfNotPresent
command: ["sleep", "infinity"]
您可以将 Pod 添加到附加网络。Pod 将继续通过默认网络发送正常的集群相关网络流量。
创建 Pod 时,会附加附加网络。但是,如果 Pod 已经存在,则无法向其附加附加网络。
Pod 必须与附加网络位于相同的命名空间。
SR-IOV 网络资源注入器会自动将 如果您在数据平面开发套件 (DPDK) 模式下使用英特尔网络接口控制器 (NIC),则仅配置 Pod 中的第一个容器才能访问 NIC。如果在 您可以通过以下两种方法解决此问题:确保需要访问 NIC 的容器是 |
安装 OpenShift CLI (oc
)。
登录到集群。
安装 SR-IOV 运算符。
创建SriovNetwork
对象或SriovIBNetwork
对象以将 Pod 附加到其中。
向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)
}
]
1 | 指定由NetworkAttachmentDefinition 对象定义的附加网络的名称。 |
2 | 指定定义NetworkAttachmentDefinition 对象的命名空间。 |
3 | 可选:指定默认路由的覆盖,例如192.168.17.1 。 |
要创建 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/network-status: |- (1)
[{
"name": "ovn-kubernetes",
"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/network-status 参数是对象的 JSON 数组。每个对象描述附加到 Pod 的附加网络的状态。注释值存储为纯文本值。 |
将 Pod 添加到附加网络后,您可以检查 SR-IOV 网络是否可用 MTU。
通过运行以下命令检查 Pod 注释是否包含 MTU
$ oc describe pod example-pod
以下示例显示示例输出
"mac": "20:04:0f:f1:88:01",
"mtu": 1500,
"dns": {},
"device-info": {
"type": "pci",
"version": "1.1.0",
"pci": {
"pci-address": "0000:86:01.3"
}
}
通过运行以下命令,验证 MTU 是否在 Pod 内的/etc/podnetinfo/
中可用
$ oc exec example-pod -n sriov-tests -- cat /etc/podnetinfo/annotations | grep mtu
以下示例显示示例输出
k8s.v1.cni.cncf.io/network-status="[{
\"name\": \"ovn-kubernetes\",
\"interface\": \"eth0\",
\"ips\": [
\"10.131.0.67\"
],
\"mac\": \"0a:58:0a:83:00:43\",
\"default\": true,
\"dns\": {}
},{
\"name\": \"sriov-tests/sriov-nic-1\",
\"interface\": \"net1\",
\"ips\": [
\"192.168.10.1\"
],
\"mac\": \"20:04:0f:f1:88:01\",
\"mtu\": 1500,
\"dns\": {},
\"device-info\": {
\"type\": \"pci\",
\"version\": \"1.1.0\",
\"pci\": {
\"pci-address\": \"0000:86:01.3\"
}
}
}]"
您可以通过使用restricted
或single-numa-node
拓扑管理器策略限制从同一 NUMA 节点分配的 SR-IOV 和 CPU 资源来创建 NUMA 对齐的 SR-IOV Pod。
您已安装 OpenShift CLI (oc
)。
您已将 CPU 管理器策略配置为static
。有关 CPU 管理器的更多信息,请参阅“其他资源”部分。
您已将拓扑管理器策略配置为single-numa-node
。
当 |
创建以下 SR-IOV Pod 规范,然后将 YAML 保存到<name>-sriov-pod.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"
1 | 将<name> 替换为 SR-IOV 网络附件定义 CR 的名称。 |
2 | 将<image> 替换为sample-pod 镜像的名称。 |
3 | 要创建具有保证 QoS 的 SR-IOV Pod,请将内存限制 设置为等于内存请求 。 |
4 | 要创建具有保证 QoS 的 SR-IOV Pod,请将cpu 限制 设置为等于cpu 请求 。 |
通过运行以下命令创建示例 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
以下testpmd
Pod 演示了使用巨页、保留的 CPU 和 SR-IOV 端口创建容器。
testpmd
Pod 示例apiVersion: v1
kind: Pod
metadata:
name: testpmd-sriov
namespace: mynamespace
annotations:
cpu-load-balancing.crio.io: "disable"
cpu-quota.crio.io: "disable"
# ...
spec:
containers:
- name: testpmd
command: ["sleep", "99999"]
image: registry.redhat.io/openshift4/dpdk-base-rhel8:v4.9
securityContext:
capabilities:
add: ["IPC_LOCK","SYS_ADMIN"]
privileged: true
runAsUser: 0
resources:
requests:
memory: 1000Mi
hugepages-1Gi: 1Gi
cpu: '2'
openshift.io/sriov1: 1
limits:
hugepages-1Gi: 1Gi
cpu: '2'
memory: 1000Mi
openshift.io/sriov1: 1
volumeMounts:
- mountPath: /dev/hugepages
name: hugepage
readOnly: False
runtimeClassName: performance-cnf-performanceprofile (1)
volumes:
- name: hugepage
emptyDir:
medium: HugePages
1 | 此示例假设性能配置文件的名称为cnf-performance profile 。 |