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-0worker-1 ),两个端口都连接到共享交换机,以支持 LACP 绑定。

先决条件

  • 节点必须具有支持 SR-IOV 的 NIC。
  • SR-IOV Network Operator 已安装。
  • 已安装 PF Status Relay Operator。
  • 连接到 worker 节点的物理交换机端口被配置为带有快速轮询率的 LACP。
  • linkState 设置为 autodisable 用于您要监控的 SR-IOV VF。Operator 忽略了将 linkState 设置为启用的 VF。SR-IOV VF 的默认值为 linkState: auto

流程

  1. 通过创建一个 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-tests 
    1
    Copy to Clipboard Toggle word wrap

    1
    部署高可用性 pod 的命名空间。
  2. 运行以下命令来应用命名空间:

    $ oc apply -f namespace.yaml
    Copy to Clipboard Toggle word wrap
  3. 配置主机级别的 LACP 绑定:

    1. worker-0 节点上的 ens5f0 接口定义 NodeNetworkConfigurationPolicy 资源的 YAML 文件:

      nncpBondF0Worker0.yaml 文件示例

      apiVersion: nmstate.io/v1
      kind: NodeNetworkConfigurationPolicy
      metadata:
        name: example-bond-f0
      spec:
        nodeSelector:
          kubernetes.io/hostname: worker-0 
      1
      
        desiredState:
          interfaces:
            - name: example-bond-f0
              description: example-bond-f0
              type: bond
              state: up
              mtu: 9216
              link-aggregation:
                mode: 802.3ad 
      2
      
                options:
                  miimon: '100'
                  lacp_rate: 'fast' 
      3
      
                  min_links: '1'
                port:
                  - ens5f0 
      4
      
            - name: ens5f0
              type: ethernet
              state: up
              mtu: 9216
      Copy to Clipboard Toggle word wrap

      1
      创建绑定接口的节点。
      2
      您必须将 LACP 模式设置为 802.3ad,以便在绑定上启用 LACP。
      3
      您必须在接口和交换机 快速设置 LACP 速率。快速 速率每秒发送 LACP 数据包。
      4
      要包含在绑定中的 PF。
    2. worker-0 节点上的 ens5f1 接口创建定义 NodeNetworkConfigurationPolicy 资源的 YAML 文件:

      nncpBondF1Worker0.yaml 文件示例

      apiVersion: nmstate.io/v1
      kind: NodeNetworkConfigurationPolicy
      metadata:
        name: example-bond-f1
      spec:
        nodeSelector:
          kubernetes.io/hostname: worker-0 
      1
      
        desiredState:
          interfaces:
            - name: example-bond-f1
              description: example-bond-f1
              type: bond
              state: up
              mtu: 9216
              link-aggregation:
                mode: 802.3ad 
      2
      
                options:
                  miimon: '100'
                  lacp_rate: 'fast' 
      3
      
                  min_links: '1'
                port:
                  - ens5f1 
      4
      
            - name: ens5f1
              type: ethernet
              state: up
              mtu: 9216
      Copy to Clipboard Toggle word wrap

      1
      创建绑定接口的节点。
      2
      您必须将 LACP 模式设置为 802.3ad,以便在绑定上启用 LACP。
      3
      您必须在接口和交换机 快速设置 LACP 速率。快速 速率每秒发送 LACP 数据包。
      4
      要包含在绑定中的 PF。
    3. 运行以下命令来应用资源:

      $ oc apply -f nncpBondF0Worker0.yaml
      $ oc apply -f nncpBondF1Worker0.yaml
      Copy to Clipboard Toggle word wrap
  4. 为绑定接口创建 SR-IOV 网络 VF:

    1. 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:
            - ens5f0 
      1
      
        nodeSelector:
          kubernetes.io/hostname: worker-0 
      2
      
        numVfs: 10 
      3
      
        priority: 99
        resourceName: resourceport0 
      4
      Copy to Clipboard Toggle word wrap

      1
      要从中创建 VF 的 PF。
      2
      创建 VF 的节点。
      3
      要在 PF 上创建的 VF 数量。
      4
      pod 用于请求这些 VF 的资源名称。
    2. 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:
            - ens5f1 
      1
      
        nodeSelector:
          kubernetes.io/hostname: worker-0 
      2
      
        numVfs: 10 
      3
      
        priority: 99
        resourceName: resourceport1 
      4
      Copy to Clipboard Toggle word wrap

      1
      要从中创建 VF 的 PF。
      2
      创建 VF 的节点。
      3
      要在 PF 上创建的 VF 数量。
      4
      pod 用于请求这些 VF 的资源名称。
    3. 运行以下命令来应用资源:

      $ oc apply -f sriovnetworkpolicy-port1.yaml
      $ oc apply -f sriovnetworkpolicy-port2.yaml
      Copy to Clipboard Toggle word wrap
  5. 配置 PF Status Relay Operator:

    1. 创建定义 PFLACPMonitor 资源的 YAML 文件。这个示例文件将 Operator 配置为监控 worker-0 节点上的 ens5f0ens5f1 绑定接口:

      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:
          - ens5f0 
      1
      
          - ens5f1
        pollingInterval: 1000 
      2
      
        nodeSelector:
          kubernetes.io/hostname: worker-0 
      3
      Copy to Clipboard Toggle word wrap

      1
      要监控的 PF 列表。
      2
      轮询间隔,以毫秒为单位检查受监控接口上的 LACP 状态。最小值为 1000
      3
      目标接口的节点。
      重要

      仅使用一个 PFLACPMonitor 自定义资源来监控节点上的每个网络接口。如果您创建以同一接口为目标的多个资源,PF Status Relay Operator 不会处理冲突的配置。

    2. 运行以下命令来应用 PFLACPMonitor 资源:

      $ oc apply -f pflacpmonitor.yaml
      Copy to Clipboard Toggle word wrap

验证

  1. 检查 PF Status Relay Operator 的日志,以验证它是否监控 LACP 状态:

    $ oc logs -n openshift-pf-status-relay-operator <pf_status_relay_operator_pod_name>
    Copy to Clipboard Toggle word wrap

    输出示例

    {"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"}
    ...
    Copy to Clipboard Toggle word wrap

  2. 应用 SriovNetwork 资源,使 VF 可用于在 sriov-operator-tests 命名空间中使用:

    1. 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
      Copy to Clipboard Toggle word wrap

    2. 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
      Copy to Clipboard Toggle word wrap

    3. 运行以下命令来应用资源:

      $ oc apply -f sriovnetwork-port1.yaml
      $ oc apply -f sriovnetwork-port2.yaml
      Copy to Clipboard Toggle word wrap
  3. 定义使用 SR-IOV VF 的高可用性 pod:

    1. 应用 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"}}
      Copy to Clipboard Toggle word wrap

      • linksInContainer: true 在 pod 的网络命名空间中创建绑定。
      • mode:active-backup 将绑定配置为使用 active-backup 模式。
      • links 指定要包含在绑定中的 pod 级别接口。

        重要

        PF Status Relay Operator 为 pod 级别绑定提供 LACP 状态监控,且只为 mode: active-backup 配置。

    2. 运行以下命令来应用 NetworkAttachmentDefinition 资源:

      $ oc apply -f nad-bond.yaml
      Copy to Clipboard Toggle word wrap
    3. 创建定义使用 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"]
      Copy to Clipboard Toggle word wrap

      1
      该注解请求三个网络:两个 SR-IOV VF、net1net2,以及一个绑定,bond0 使用它们。
    4. 运行以下命令来应用 Pod 资源:

      $ oc apply -f client-bond.yaml
      Copy to Clipboard Toggle word wrap
  4. 检查故障切换机制:

    1. 运行以下命令登录到 client-bond pod:

      $ oc rsh -n sriov-operator-tests client-bond
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,检查 pod 级别绑定的初始状态:

      sh-4.4# cat /proc/net/bonding/bond0
      Copy to Clipboard Toggle word wrap

      输出示例

      [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
      Copy to Clipboard Toggle word wrap

      • net1net2 接口都已启动。
    3. 退出 pod shell。
    4. 在上游物理交换机上模拟 LACP 失败。要模拟此场景,您可以在要测试故障的交换机端口上过滤 LACP 流量。这样可确保物理链接在 LACP 轮询失败时保留。要执行此操作的命令取决于供应商。
    5. 通过重新登录 client-bond pod 并再次检查绑定状态来验证 pod 中的故障切换:

      sh-4.4# cat /proc/net/bonding/bond0
      Copy to Clipboard Toggle word wrap

      输出示例

      ...
      
      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: 0
      Copy to Clipboard Toggle word wrap

      • net1 接口已关闭,net2 接口现在是活跃的接口。

        client-bond pod 检测到链路状态更改,并切换到备份网络路径。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat