4.7.3. MetalLB와 함께 VRF를 사용하여 대칭 라우팅 구성
동일한 수신 및 송신 네트워크 경로가 필요한 MetalLB 서비스 뒤의 애플리케이션에 대해 대칭 네트워크 라우팅을 구성할 수 있습니다.
이 예에서는 VRF 라우팅 테이블을 MetalLB 및 송신 서비스와 연결하여 LoadBalancer 서비스 뒤의 Pod의 수신 및 송신 트래픽에 대한 대칭 라우팅을 활성화합니다.
-
EgressServiceCR에서sourceIPBy: "LoadBalancerIP"설정을 사용하는 경우BGPAdvertisementCR(사용자 정의 리소스)에 로드 밸런서 노드를 지정해야 합니다. -
gatewayConfig.routingViaHost사양이true로 설정된 OVN-Kubernetes를 사용하는 클러스터에서sourceIPBy: "Network"설정을 사용할 수 있습니다. 또한sourceIPBy: "Network"설정을 사용하는 경우 네트워크 VRF 인스턴스로 구성된 노드에서 애플리케이션 워크로드를 예약해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)를 설치합니다. -
cluster-admin권한이 있는 사용자로 로그인합니다. - Kubernetes NMState Operator를 설치합니다.
- MetalLB Operator를 설치합니다.
프로세스
NodeNetworkConfigurationPolicyCR을 생성하여 VRF 인스턴스를 정의합니다.다음 예와 같은 콘텐츠를 사용하여
node-network-vrf.yaml과 같은 파일을 생성합니다.apiVersion: nmstate.io/v1 kind: NodeNetworkConfigurationPolicy metadata: name: vrfpolicy1 spec: nodeSelector: vrf: "true"2 maxUnavailable: 3 desiredState: interfaces: - name: ens4vrf3 type: vrf4 state: up vrf: port: - ens45 route-table-id: 26 - name: ens47 type: ethernet state: up ipv4: address: - ip: 192.168.130.130 prefix-length: 24 dhcp: false enabled: true routes:8 config: - destination: 0.0.0.0/0 metric: 150 next-hop-address: 192.168.130.1 next-hop-interface: ens4 table-id: 2 route-rules:9 config: - ip-to: 172.30.0.0/16 priority: 998 route-table: 25410 - ip-to: 10.132.0.0/14 priority: 998 route-table: 254 - ip-to: 169.254.0.0/17 priority: 998 route-table: 254- 1
- 정책의 이름입니다.
- 2
- 이 예제에서는
vrf:true레이블이 있는 모든 노드에 정책을 적용합니다. - 3
- 인터페이스의 이름입니다.
- 4
- 인터페이스 유형입니다. 이 예에서는 VRF 인스턴스를 생성합니다.
- 5
- VRF가 연결하는 노드 인터페이스입니다.
- 6
- VRF의 경로 테이블 ID의 이름입니다.
- 7
- VRF와 연결된 인터페이스의 IPv4 주소입니다.
- 8
- 네트워크 경로에 대한 구성을 정의합니다.
next-hop-address필드는 경로에 대한 다음 홉의 IP 주소를 정의합니다.next-hop-interface필드는 경로에 대한 발신 인터페이스를 정의합니다. 이 예에서 VRF 라우팅 테이블은2이며, 이는EgressServiceCR에 정의된 ID를 참조합니다. - 9
- 추가 경로 규칙을 정의합니다.
ip-to필드는Cluster NetworkCIDR,Service NetworkCIDR,Internal Masquerade서브넷 CIDR과 일치해야 합니다.oc describe network.operator/cluster를 실행하여 이러한 CIDR 주소 사양의 값을 볼 수 있습니다. - 10
- 경로를 계산할 때 Linux 커널이 사용하는 기본 라우팅 테이블에는 ID
254가 있습니다.
다음 명령을 실행하여 정책을 적용합니다.
$ oc apply -f node-network-vrf.yaml
BGPPeerCR(사용자 정의 리소스)을 생성합니다.다음 예와 같은 콘텐츠를 사용하여
frr-via-vrf.yaml과 같은 파일을 생성합니다.apiVersion: metallb.io/v1beta2 kind: BGPPeer metadata: name: frrviavrf namespace: metallb-system spec: myASN: 100 peerASN: 200 peerAddress: 192.168.130.1 vrf: ens4vrf1 - 1
- BGP 피어와 연결할 VRF 인스턴스를 지정합니다. MetalLB는 VRF의 라우팅 정보를 기반으로 서비스를 알리고 라우팅 결정을 내릴 수 있습니다.
다음 명령을 실행하여 BGP 피어에 대한 구성을 적용합니다.
$ oc apply -f frr-via-vrf.yaml
IPAddressPoolCR을 생성합니다.다음 예와 같은 콘텐츠를 사용하여
first-pool.yaml과 같은 파일을 생성합니다.apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: first-pool namespace: metallb-system spec: addresses: - 192.169.10.0/32다음 명령을 실행하여 IP 주소 풀에 대한 구성을 적용합니다.
$ oc apply -f first-pool.yaml
BGPAdvertisementCR을 생성합니다.다음 예와 같은 콘텐츠를 사용하여
first-adv.yaml과 같은 파일을 생성합니다.apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: first-adv namespace: metallb-system spec: ipAddressPools: - first-pool peers: - frrviavrf1 nodeSelectors: - matchLabels: egress-service.k8s.ovn.org/test-server1: ""2 다음 명령을 실행하여 BGP 알림에 대한 구성을 적용합니다.
$ oc apply -f first-adv.yaml
EgressServiceCR을 생성합니다.다음 예와 같은 콘텐츠를 사용하여
egress-service.yaml과 같은 파일을 생성합니다.apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: server11 namespace: test2 spec: sourceIPBy: "LoadBalancerIP"3 nodeSelector: matchLabels: vrf: "true"4 network: "2"5 - 1
- 송신 서비스의 이름을 지정합니다.
EgressService리소스의 이름은 수정할 로드 밸런서 서비스의 이름과 일치해야 합니다. - 2
- 송신 서비스의 네임스페이스를 지정합니다.
EgressService의 네임스페이스는 수정하려는 로드 밸런서 서비스의 네임스페이스와 일치해야 합니다. 송신 서비스는 네임스페이스 범위입니다. - 3
- 이 예에서는
LoadBalancer서비스 수신 IP 주소를 송신 트래픽의 소스 IP 주소로 할당합니다. - 4
sourceIPBy사양에LoadBalancer를 지정하면 단일 노드가LoadBalancer서비스 트래픽을 처리합니다. 이 예에서는vrf: "true"레이블이 있는 노드만 서비스 트래픽을 처리할 수 있습니다. 노드를 지정하지 않으면 OVN-Kubernetes는 서비스 트래픽을 처리할 작업자 노드를 선택합니다. 노드를 선택하면 OVN-Kubernetes는egress-service.k8s.ovn.org/<svc_namespace>-<svc_name>: ""형식으로 노드에 레이블을 지정합니다.- 5
- 송신 트래픽의 라우팅 테이블 ID를 지정합니다. 값이
NodeNetworkConfigurationPolicy리소스에 정의된route-table-idID와 일치하는지 확인합니다(예:route-table-id: 2).
다음 명령을 실행하여 송신 서비스에 대한 구성을 적용합니다.
$ oc apply -f egress-service.yaml
검증
다음 명령을 실행하여 MetalLB 서비스 뒤에서 실행 중인 Pod의 애플리케이션 끝점에 액세스할 수 있는지 확인합니다.
$ curl <external_ip_address>:<port_number>1 - 1
- 애플리케이션 엔드포인트에 맞게 외부 IP 주소 및 포트 번호를 업데이트합니다.
-
선택 사항:
LoadBalancer서비스 수신 IP 주소를 송신 트래픽의 소스 IP 주소로 할당한 경우tcpdump와 같은 툴을 사용하여 외부 클라이언트에서 수신된 패킷을 분석하여 이 구성을 확인합니다.