11.3. SR-IOV 네트워크에서 LACP 상태 모니터링을 위한 PF Status Relay Operator 구성
SR-IOV 네트워크와 Pod 수준 본딩을 사용하여 워크로드에 대한 PF Status Relay Operator를 사용하여 LACP(Link Aggregation Control Protocol) 상태 모니터링을 활성화합니다. Operator는 물리적 기능(PF)에서 LACP 상태를 모니터링하고 업스트림 실패를 감지할 때 연결된 VF(가상 기능)의 링크 상태를 변경합니다. 이 방법을 사용하면 PF에 연결된 VF의 오류를 탐지하여 네트워크 경로를 적시에 백업하여 워크로드에 대한 고가용성을 보장할 수 있습니다.
다음 시나리오에서는 SR-IOV 네트워크에 대한 LACP 상태 모니터링을 구성하고 확인하는 방법을 보여줍니다.
- 작업자 노드에서 호스트 수준 NIC 본딩을 생성하고 LACP를 구성합니다.
- 결합된 인터페이스에서 VF(가상 기능)를 생성하도록 SR-IOV 네트워크 정책을 정의합니다.
- PF Status Relay Operator를 배포하여 PF를 모니터링하고 LACP 상태를 모니터링합니다.
- 이러한 VF를 사용하는 Pod가 업스트림 스위치에 실패하는 경우 백업 네트워크 경로로 자동으로 실패하는지 확인합니다.
다음 시나리오에서는 SR-IOV 네트워크에 대한 LACP 상태 모니터링을 구성하고 확인하는 방법을 보여줍니다. 이 시나리오는 각 노드에 두 개의 포트인 worker-0 및 worker-1 과 함께 SR-IOV 네트워크 카드를 사용하며 LACP 본딩을 지원하기 위해 두 개의 포트가 모두 연결되어 있습니다.
사전 요구 사항
- 노드에는 SR-IOV를 지원하는 NIC가 있어야 합니다.
- SR-IOV Network Operator가 설치되어 있습니다.
- PF Status Relay Operator가 설치되어 있습니다.
- 작업자 노드에 연결된 물리적 스위치 포트는 빠른 폴링 속도로 LACP용으로 구성됩니다.
-
linkState는 모니터링할 SR-IOV VF의 경우auto또는disable로 설정됩니다. Operator는linkState가활성화되도록 설정된 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: 9216worker-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 파일을 생성합니다. 이 예제 파일은작업자-0노드에서ens5f0및ens5f1본딩 인터페이스의 LACP 상태를 모니터링하도록 Operator를 구성합니다.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리소스를 적용하여sriov-operator-tests네임스페이스 내에서 VF를 사용할 수 있도록 합니다.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: resourceport0ens5f1에서 생성된 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를 정의합니다.
두 SR-IOV 네트워크를 사용하여
active-backup본딩을 생성하려면NetworkAttachmentDefinition리소스를 적용합니다.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는
mode: active-backup구성만 사용하여 Pod 수준 본딩에 대한 LACP 상태 모니터링을 제공합니다.
-
다음 명령을 실행하여
NetworkAttachmentDefinition리소스를 적용합니다.$ oc apply -f nad-bond.yamlactive-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및 1개의 본딩,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인터페이스가 모두 up입니다.
-
- 포드 쉘을 종료합니다.
- 업스트림 물리적 스위치에서 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인터페이스가 down이고net2인터페이스가 이제 활성 인터페이스입니다.client-bond Pod는 링크 상태 변경을 감지하고 백업 네트워크 경로로 전환합니다.