11.3. 在 SR-IOV 网络中为 LACP 状态监控配置 PF Status Relay Operator
使用 PF Status Relay Operator 为使用 pod 级别绑定到 SR-IOV 网络的工作负载启用链路聚合控制协议(LACP)状态监控。Operator 监控物理功能(PF)上的 LACP 状态,并在检测到上游失败时更改附加虚拟功能(VF)的链接状态。使用此方法,您可以检测附加到 PF 的 VF 上的故障,以确保及时切换到备份网络路径,确保工作负载的高可用性。
以下场景演示了如何为 SR-IOV 网络配置和验证 LACP 状态监控:
- 在 worker 节点上创建主机级别的 NIC 绑定并配置 LACP。
- 定义 SR-IOV 网络策略以在绑定接口上创建虚拟功能(VF)。
- 部署 PF Status Relay Operator 以监控 PF 并监控 LACP 状态。
- 在进行上游交换机失败时,验证使用这些 VF 的 pod 是否自动切换到备份网络路径。
以下场景演示了如何为 SR-IOV 网络配置和验证 LACP 状态监控。此场景使用每个节点上有两个端口的 SR-IOV 网卡( worker-0 和 worker-1 ),两个端口都连接到共享交换机,以支持 LACP 绑定。
先决条件
- 节点必须具有支持 SR-IOV 的 NIC。
- SR-IOV Network Operator 已安装。
- 已安装 PF Status Relay Operator。
- 连接到 worker 节点的物理交换机端口被配置为带有快速轮询率的 LACP。
-
linkState设置为auto或disable用于您要监控的 SR-IOV VF。Operator 会忽略将linkState设置为enable的 VF。SR-IOV VF 的默认值为linkState: auto。
流程
通过创建一个
namespace.yaml文件来创建项目命名空间,如下例所示:namespace.yaml文件示例apiVersion: v1 kind: Namespace metadata: labels: kubernetes.io/metadata.name: sriov-operator-tests pod-security.kubernetes.io/audit: privileged pod-security.kubernetes.io/enforce: privileged pod-security.kubernetes.io/warn: privileged security.openshift.io/scc.podSecurityLabelSync: "false" name: sriov-operator-tests1 - 1
- 部署高可用性 pod 的命名空间。
运行以下命令来应用命名空间:
$ oc apply -f namespace.yaml配置主机级别的 LACP 绑定:
为
worker-0节点上的ens5f0接口定义NodeNetworkConfigurationPolicy资源的 YAML 文件:nncpBondF0Worker0.yaml文件示例apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: example-bond-f0 spec: nodeSelector: kubernetes.io/hostname: worker-01 desiredState: interfaces: - name: example-bond-f0 description: example-bond-f0 type: bond state: up mtu: 9216 link-aggregation: mode: 802.3ad2 options: miimon: '100' lacp_rate: 'fast'3 min_links: '1' port: - ens5f04 - name: ens5f0 type: ethernet state: up mtu: 9216为
worker-0节点上的ens5f1接口创建定义NodeNetworkConfigurationPolicy资源的 YAML 文件:nncpBondF1Worker0.yaml文件示例apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: example-bond-f1 spec: nodeSelector: kubernetes.io/hostname: worker-01 desiredState: interfaces: - name: example-bond-f1 description: example-bond-f1 type: bond state: up mtu: 9216 link-aggregation: mode: 802.3ad2 options: miimon: '100' lacp_rate: 'fast'3 min_links: '1' port: - ens5f14 - name: ens5f1 type: ethernet state: up mtu: 9216运行以下命令来应用资源:
$ oc apply -f nncpBondF0Worker0.yaml $ oc apply -f nncpBondF1Worker0.yaml
为绑定接口创建 SR-IOV 网络 VF:
为
worker-0节点上的ens5f0接口定义SriovNetworkNodePolicy资源的 YAML 文件:sriovnetworkpolicy-port1.yaml文件示例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriovnetpolicy-port-0 namespace: openshift-sriov-network-operator spec: deviceType: netdevice nicSelector: pfNames: - ens5f01 nodeSelector: kubernetes.io/hostname: worker-02 numVfs: 103 priority: 99 resourceName: resourceport04 为
worker-0节点上的ens5f1接口定义SriovNetworkNodePolicy资源的 YAML 文件:sriovnetworkpolicy-port2.yaml文件示例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriovnetpolicy-port-1 namespace: openshift-sriov-network-operator spec: deviceType: netdevice nicSelector: pfNames: - ens5f11 nodeSelector: kubernetes.io/hostname: worker-02 numVfs: 103 priority: 99 resourceName: resourceport14 运行以下命令来应用资源:
$ oc apply -f sriovnetworkpolicy-port1.yaml $ oc apply -f sriovnetworkpolicy-port2.yaml
配置 PF Status Relay Operator:
创建定义
PFLACPMonitor资源的 YAML 文件。这个示例文件将 Operator 配置为监控worker-0节点上的ens5f0和ens5f1绑定接口:pflacpmonitor.yaml文件示例apiVersion: pfstatusrelay.openshift.io/v1alpha1 kind: PFLACPMonitor metadata: namespace: openshift-pf-status-relay-operator labels: app.kubernetes.io/name: pf-status-relay-operator name: pflacpmonitor-worker-0 spec: interfaces: - ens5f01 - ens5f1 pollingInterval: 10002 nodeSelector: kubernetes.io/hostname: worker-03 重要仅使用一个
PFLACPMonitor自定义资源来监控节点上的每个网络接口。如果您创建以同一接口为目标的多个资源,PF Status Relay Operator 不会处理冲突的配置。运行以下命令来应用
PFLACPMonitor资源:$ oc apply -f pflacpmonitor.yaml
验证
检查 PF Status Relay Operator 的日志,以验证它是否监控 LACP 状态:
$ oc logs -n openshift-pf-status-relay-operator <pf_status_relay_operator_pod_name>输出示例
{"time":"2025-07-24T13:35:54.653201692Z","level":"INFO","msg":"lacp is up","interface":"ens5f0"} {"time":"2025-07-24T13:35:54.65347273Z","level":"INFO","msg":"vf link state was set","id":0,"state":"auto","interface":"ens5f0"} ...应用
SriovNetwork资源,使 VF 可用于在sriov-operator-tests命名空间中使用:为
ens5f0上创建的 VF 定义SriovNetwork资源的 YAML 文件:sriovnetwork-port1.yaml文件示例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriovnetwork-port0 namespace: openshift-sriov-network-operator spec: capabilities: '{ "mac": true }' networkNamespace: sriov-operator-tests resourceName: resourceport0为
ens5f1上创建的 VF 定义SriovNetwork资源的 YAML 文件:sriovnetwork-port2.yaml文件示例apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriovnetwork-port1 namespace: openshift-sriov-network-operator spec: capabilities: '{ "mac": true }' networkNamespace: sriov-operator-tests resourceName: resourceport1运行以下命令来应用资源:
$ oc apply -f sriovnetwork-port1.yaml $ oc apply -f sriovnetwork-port2.yaml
定义使用 SR-IOV VF 的高可用性 pod:
应用
NetworkAttachmentDefinition资源,以使用两个 SR-IOV 网络创建active-backup绑定:nad-bond.yaml文件示例apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: nad-bond-1 namespace: sriov-operator-tests spec: config: |- {"type": "bond", "cniVersion": "0.3.1", "name": "bond-net1", "mode": "active-backup", "failOverMac": 1, "linksInContainer": true, "miimon": "100", "mtu": 1450, "links": [{"name": "net1"},{"name": "net2"}], "capabilities": {"ips": true}, "ipam": {"type": "static"}}-
linksInContainer: true在 pod 的网络命名空间中创建绑定。 -
mode:active-backup将绑定配置为使用 active-backup 模式。 links指定要包含在绑定中的 pod 级别接口。重要PF Status Relay Operator 为 pod 级别绑定提供 LACP 状态监控,且只为
mode: active-backup配置。
-
运行以下命令来应用
NetworkAttachmentDefinition资源:$ oc apply -f nad-bond.yaml创建定义使用 active-backup 模式的绑定接口中的 VF 的
Pod资源的 YAML 文件:client-bond.yaml文件示例apiVersion: v1 kind: Pod metadata: name: client-bond namespace: sriov-operator-tests annotations: k8s.v1.cni.cncf.io/networks: |-1 [{ "name": "sriovnetwork-port0", "interface": "net1", "mac": "<mac_address>" },{ "name": "sriovnetwork-port1", "interface": "net2", "mac": "<mac_address>" },{ "name": "nad-bond-1", "interface": "bond0", "ips": ["192.168.10.254/24","2001:100::254/64"], "mac": "<mac_address>" }] spec: nodeName: worker-0 containers: - name: client-bond image: quay.io/nginx/nginx-unprivileged imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c", "sleep 3650d"] securityContext: privileged: true command: ["/bin/sleep", "3650d"]- 1
- 该注解请求三个网络:两个 SR-IOV VF、
net1和net2,以及一个绑定,bond0使用它们。
运行以下命令来应用
Pod资源:$ oc apply -f client-bond.yaml
检查故障切换机制:
运行以下命令登录到
client-bondpod:$ oc rsh -n sriov-operator-tests client-bond运行以下命令,检查 pod 级别绑定的初始状态:
sh-4.4# cat /proc/net/bonding/bond0输出示例
[root@client-bond-tlb /]# cat /proc/net/bonding/bond0 ... Bonding Mode: transmit load balancing Transmit Hash Policy: layer2 (0) Primary Slave: None Currently Active Slave: net1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Peer Notification Delay (ms): 0 Slave Interface: net1 MII Status: up Speed: 25000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: AA:BB:CC:DD:EE:FF Slave queue ID: 0 Slave Interface: net2 MII Status: up Speed: 25000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: BB:CC:DD:EE:FF:GG-
net1和net2接口都已启动。
-
- 退出 pod shell。
- 在上游物理交换机上模拟 LACP 失败。要模拟此场景,您可以在要测试故障的交换机端口上过滤 LACP 流量。这样可确保物理链接在 LACP 轮询失败时保留。要执行此操作的命令取决于供应商。
通过重新登录
client-bondpod 并再次检查绑定状态来验证 pod 中的故障切换:sh-4.4# cat /proc/net/bonding/bond0输出示例
... Bonding Mode: transmit load balancing Transmit Hash Policy: layer2 (0) Primary Slave: None Currently Active Slave: net2 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Peer Notification Delay (ms): 0 Slave Interface: net1 MII Status: down Speed: Unknown Duplex: Unknown Link Failure Count: 1 Permanent HW addr: AA:BB:CC:DD:EE:FF Slave queue ID: 0 Slave Interface: net2 MII Status: up Speed: 25000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: BB:CC:DD:EE:FF:GG Slave queue ID: 0net1接口已关闭,net2接口现在是活跃的接口。client-bond pod 检测到链路状态更改,并切换到备份网络路径。