20.10. 송신 서비스 구성
클러스터 관리자는 송신 서비스를 사용하여 로드 밸런서 서비스 뒤의 Pod에 대한 송신 트래픽을 구성할 수 있습니다.
송신 서비스는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
EgressService
CR(사용자 정의 리소스)을 사용하여 다음과 같은 방법으로 송신 트래픽을 관리할 수 있습니다.
로드 밸런서 서비스 IP 주소를 로드 밸런서 서비스 뒤의 포드의 송신 트래픽의 소스 IP 주소로 할당합니다.
이 컨텍스트에서 로드 밸런서 IP 주소를 소스 IP 주소로 할당하는 것은 단일 송신 및 수신 지점을 제공하는 데 유용합니다. 예를 들어 일부 시나리오에서는 로드 밸런서 서비스 뒤의 애플리케이션과 통신하는 외부 시스템은 애플리케이션의 소스 및 대상 IP 주소가 같을 것으로 예상할 수 있습니다.
참고서비스 뒤의 pod에 대한 트래픽을 송신하도록 로드 밸런서 서비스 IP 주소를 할당하면 OVN-Kubernetes는 수신 및 송신 지점을 단일 노드로 제한합니다. 이렇게 하면 MetalLB에서 일반적으로 제공하는 트래픽의 로드 밸런싱이 제한됩니다.
로드 밸런서 뒤의 Pod에 대한 송신 트래픽을 기본 노드 네트워크와 다른 네트워크에 할당합니다.
이는 로드 밸런서 뒤의 애플리케이션에 대한 송신 트래픽을 기본 네트워크와 다른 네트워크에 할당하는 데 유용합니다. 일반적으로 다른 네트워크는 네트워크 인터페이스와 연결된 VRF 인스턴스를 사용하여 구현됩니다.
20.10.1. 송신 서비스 사용자 정의 리소스
EgressService
사용자 정의 리소스에서 송신 서비스에 대한 구성을 정의합니다. 다음 YAML은 송신 서비스 구성에 대한 필드를 설명합니다.
apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: <egress_service_name> 1 namespace: <namespace> 2 spec: sourceIPBy: <egress_traffic_ip> 3 nodeSelector: 4 matchLabels: node-role.kubernetes.io/<role>: "" network: <egress_traffic_network> 5
- 1
- 송신 서비스의 이름을 지정합니다.
EgressService
리소스의 이름은 수정할 로드 밸런서 서비스의 이름과 일치해야 합니다. - 2
- 송신 서비스의 네임스페이스를 지정합니다.
EgressService
의 네임스페이스는 수정하려는 로드 밸런서 서비스의 네임스페이스와 일치해야 합니다. 송신 서비스는 네임스페이스 범위입니다. - 3
- 서비스 뒤의 포드에 대한 송신 트래픽의 소스 IP 주소를 지정합니다. 유효한 값은
LoadBalancerIP
또는네트워크입니다
.LoadBalancerIP
값을 사용하여LoadBalancer
서비스 수신 IP 주소를 송신 트래픽의 소스 IP 주소로 할당합니다. 네트워크 인터페이스 IP 주소를 송신 트래픽의 소스 IP 주소로 할당하려면Network
를 지정합니다. - 4
- 선택 사항:
sourceIPBy
사양에LoadBalancerIP
값을 사용하는 경우 단일 노드에서LoadBalancer
서비스 트래픽을 처리합니다.nodeSelector
필드를 사용하여 이 작업을 할당할 수 있는 노드를 제한합니다. 서비스 트래픽을 처리하기 위해 노드를 선택하면 OVN-Kubernetes는 다음 형식으로 노드에 레이블을 지정합니다.egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""
.nodeSelector
필드를 지정하지 않으면 모든 노드에서LoadBalancer
서비스 트래픽을 관리할 수 있습니다. - 5
- 선택 사항: 송신 트래픽에 대한 라우팅 테이블을 지정합니다.
네트워크
사양을 포함하지 않으면 송신 서비스에서 기본 호스트 네트워크를 사용합니다.
송신 서비스 사양의 예
apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: test-egress-service namespace: test-namespace spec: sourceIPBy: "LoadBalancerIP" nodeSelector: matchLabels: vrf: "true" network: "2"
20.10.2. 송신 서비스 배포
송신 서비스를 배포하여 LoadBalancer
서비스 뒤의 Pod에 대한 송신 트래픽을 관리할 수 있습니다.
다음 예제에서는 LoadBalancer
서비스의 수신 IP 주소와 동일한 소스 IP 주소를 갖도록 송신 트래픽을 구성합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)를 설치합니다. -
cluster-admin
권한이 있는 사용자로 로그인합니다. -
MetalLB
BGPPeer
리소스를 구성했습니다.
프로세스
서비스에 원하는 IP를 사용하여
IPAddressPool
CR을 만듭니다.다음 예와 같은 콘텐츠를 사용하여
ip-addr-pool.yaml
과 같은 파일을 생성합니다.apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: example-pool namespace: metallb-system spec: addresses: - 172.19.0.100/32
다음 명령을 실행하여 IP 주소 풀에 대한 구성을 적용합니다.
$ oc apply -f ip-addr-pool.yaml
Service
및EgressService
CR을 생성합니다.다음 예와 같은 콘텐츠를 사용하여
service-egress-service.yaml
과 같은 파일을 생성합니다.apiVersion: v1 kind: Service metadata: name: example-service namespace: example-namespace annotations: metallb.universe.tf/address-pool: example-pool 1 spec: selector: app: example ports: - name: http protocol: TCP port: 8080 targetPort: 8080 type: LoadBalancer --- apiVersion: k8s.ovn.org/v1 kind: EgressService metadata: name: example-service namespace: example-namespace spec: sourceIPBy: "LoadBalancerIP" 2 nodeSelector: 3 matchLabels: node-role.kubernetes.io/worker: ""
- 1
LoadBalancer
서비스는example-pool
IP 주소 풀에서 MetalLB에서 할당한 IP 주소를 사용합니다.- 2
- 이 예에서는
LoadBalancerIP
값을 사용하여LoadBalancer
서비스의 수신 IP 주소를 송신 트래픽의 소스 IP 주소로 할당합니다. - 3
LoadBalancerIP
값을 지정하면 단일 노드가LoadBalancer
서비스의 트래픽을 처리합니다. 이 예에서는worker
레이블이 있는 노드만 트래픽을 처리하도록 선택할 수 있습니다. 노드를 선택하면 OVN-Kubernetes는 다음 형식의egress-service.k8s.ovn.org/<svc-namespace>-<svc-name>: ""
로 노드에 레이블을 지정합니다.
참고sourceIPBy: "LoadBalancerIP"
설정을 사용하는 경우BGPAdvertisement
CR(사용자 정의 리소스)에 로드 밸런서 노드를 지정해야 합니다.다음 명령을 실행하여 서비스 및 송신 서비스에 대한 구성을 적용합니다.
$ oc apply -f service-egress-service.yaml
서비스를 알리기 위해
BGPAdvertisement
CR을 생성합니다.다음 예와 같은 콘텐츠를 사용하여
service-bgp-advertisement.yaml
과 같은 파일을 생성합니다.apiVersion: metallb.io/v1beta1 kind: BGPAdvertisement metadata: name: example-bgp-adv namespace: metallb-system spec: ipAddressPools: - example-pool nodeSelector: - matchLabels: egress-service.k8s.ovn.org/example-namespace-example-service: "" 1
- 1
- 이 예에서
EgressService
CR은 로드 밸런서 서비스 IP 주소를 사용하도록 송신 트래픽의 소스 IP 주소를 구성합니다. 따라서 Pod에서 시작되는 트래픽에 대해 동일한 반환 경로를 사용하도록 트래픽을 반환하려면 로드 밸런서 노드를 지정해야 합니다.
검증
다음 명령을 실행하여 MetalLB 서비스 뒤에서 실행 중인 Pod의 애플리케이션 끝점에 액세스할 수 있는지 확인합니다.
$ curl <external_ip_address>:<port_number> 1
- 1
- 애플리케이션 엔드포인트에 맞게 외부 IP 주소 및 포트 번호를 업데이트합니다.
-
LoadBalancer
서비스의 수신 IP 주소를 송신 트래픽의 소스 IP 주소로 할당한 경우tcpdump
와 같은 툴을 사용하여 외부 클라이언트에서 수신된 패킷을 분석하여 이 구성을 확인합니다.