24.14. 송신 IP 주소 구성

클러스터 관리자는 OVN-Kubernetes CNI(Container Network Interface) 네트워크 플러그인을 구성하여 하나 이상의 송신 IP 주소를 네임스페이스 또는 네임스페이스의 특정 Pod에 할당할 수 있습니다.

24.14.1. 송신 IP 주소 아키텍처 설계 및 구현

OpenShift Container Platform 송신 IP 주소 기능을 사용하면 하나 이상의 네임스페이스에 있는 하나 이상의 Pod에서 발생하는 트래픽의 소스 IP 주소가 클러스터 네트워크 외부 서비스에 일관되게 표시되도록 할 수 있습니다.

예를 들어 클러스터 외부 서버에서 호스팅되는 데이터베이스를 주기적으로 쿼리하는 Pod가 있을 수 있습니다. 서버에 대한 액세스 요구 사항을 적용하기 위해 패킷 필터링 장치는 특정 IP 주소의 트래픽만 허용하도록 구성됩니다. 특정 Pod에서만 서버에 안정적으로 액세스할 수 있도록 허용하려면 서버에 요청하는 Pod에 대해 특정 송신 IP 주소를 구성하면 됩니다.

네임스페이스에 할당된 송신 IP 주소는 특정 대상으로 트래픽을 보내는 데 사용되는 송신 라우터와 다릅니다.

일부 클러스터 구성에서 애플리케이션 Pod 및 인그레스 라우터 Pod는 동일한 노드에서 실행됩니다. 이 시나리오에서 애플리케이션 프로젝트에 대한 송신 IP 주소를 구성하는 경우 애플리케이션 프로젝트에서 경로로 요청을 보낼 때 IP 주소가 사용되지 않습니다.

중요

송신 IP 주소는 ifcfg-eth0 과 같은 Linux 네트워크 구성 파일에서 구성해서는 안 됩니다.

24.14.1.1. 플랫폼 지원

다음 표에는 다양한 플랫폼의 송신 IP 주소 기능에 대한 지원이 요약되어 있습니다.

플랫폼지원됨

베어 메탈

있음

VMware vSphere

있음

Red Hat OpenStack Platform (RHOSP)

있음

AWS(Amazon Web Services)

있음

GCP(Google Cloud Platform)

있음

Microsoft Azure

있음

중요

EgressIP 기능이 있는 컨트롤 플레인 노드에 송신 IP 주소 할당은 AWS(Amazon Web Services)에서 프로비저닝된 클러스터에서 지원되지 않습니다. (BZ#2039656)

24.14.1.2. 퍼블릭 클라우드 플랫폼 고려 사항

퍼블릭 클라우드 인프라에서 프로비저닝된 클러스터의 경우 노드당 할당 가능한 IP 주소의 절대 수에 제약 조건이 있습니다. 노드당 할당 가능한 최대 IP 주소 수 또는 IP 용량 을 다음 공식으로 설명할 수 있습니다.

IP capacity = public cloud default capacity - sum(current IP assignments)

Egress IP 기능은 노드당 IP 주소 용량을 관리하는 반면 배포에서 이 제약 조건을 계획하는 것이 중요합니다. 예를 들어, 8개의 노드가 있는 베어 메탈 인프라에 클러스터의 경우 150개의 송신 IP 주소를 구성할 수 있습니다. 그러나 퍼블릭 클라우드 공급자가 IP 주소 용량을 노드당 IP 주소 10개로 제한하는 경우 할당 가능한 총 IP 주소 수는 80개뿐입니다. 이 예제 클라우드 공급자에서 동일한 IP 주소 용량을 달성하려면 7 개의 추가 노드를 할당해야 합니다.

퍼블릭 클라우드 환경에서 모든 노드의 IP 용량 및 서브넷을 확인하려면 oc get node <node_name> -o yaml 명령을 입력합니다. cloud.network.openshift.io/egress-ipconfig 주석에는 노드의 용량 및 서브넷 정보가 포함됩니다.

주석 값은 기본 네트워크 인터페이스에 다음 정보를 제공하는 필드가 있는 단일 오브젝트가 있는 배열입니다.

  • Interface: AWS 및 Azure의 인터페이스 ID와 GCP의 인터페이스 이름을 지정합니다.
  • ifaddr: 하나 또는 두 IP 주소 제품군에 대한 서브넷 마스크를 지정합니다.
  • capacity: 노드의 IP 주소 용량을 지정합니다. AWS에서는 IP 주소 제품군별로 IP 주소 용량이 제공됩니다. Azure 및 GCP에서 IP 주소 용량에는 IPv4 및 IPv6 주소가 모두 포함됩니다.

노드 간 트래픽에 대한 송신 IP 주소 자동 연결 및 분리를 사용할 수 있습니다. 이렇게 하면 네임스페이스의 많은 Pod에서 트래픽이 클러스터 외부의 위치와 일관된 소스 IP 주소를 가질 수 있습니다. 이는 OpenShift Container Platform 4.12의 Red Hat OpenShift Networking의 기본 네트워킹 플러그인인 OpenShift SDN 및 OVN-Kubernetes도 지원합니다.

참고

RHOSP 송신 IP 주소 기능은 egressip-<IP address>라는 Neutron 예약 포트를 생성합니다. OpenShift Container Platform 클러스터 설치에 사용된 RHOSP 사용자와 동일한 RHOSP 사용자를 사용하면 이 예약 포트에 유동 IP 주소를 할당하여 송신 트래픽에 대해 예측 가능한 SNAT 주소를 보유할 수 있습니다. RHOSP 네트워크의 송신 IP 주소가 한 노드에서 다른 노드로 이동되면 노드 장애 조치로 인해 Neutron 예약 포트가 제거되고 다시 생성됩니다. 즉, 유동 IP 연결이 손실되고 유동 IP 주소를 새 예약 포트에 수동으로 다시 할당해야 합니다.

다음 예제에서는 여러 퍼블릭 클라우드 공급자의 노드의 주석을 보여줍니다. 가독성을 위해 주석은 들여쓰기됩니다.

AWS의 cloud.network.openshift.io/egress-ipconfig 주석 예

cloud.network.openshift.io/egress-ipconfig: [
  {
    "interface":"eni-078d267045138e436",
    "ifaddr":{"ipv4":"10.0.128.0/18"},
    "capacity":{"ipv4":14,"ipv6":15}
  }
]

GCP의 cloud.network.openshift.io/egress-ipconfig 주석 예

cloud.network.openshift.io/egress-ipconfig: [
  {
    "interface":"nic0",
    "ifaddr":{"ipv4":"10.0.128.0/18"},
    "capacity":{"ip":14}
  }
]

다음 섹션에서는 용량 계산에 사용할 지원되는 퍼블릭 클라우드 환경에 대한 IP 주소 용량을 설명합니다.

24.14.1.2.1. AWS(Amazon Web Services) IP 주소 용량 제한

AWS에서 IP 주소 할당에 대한 제약 조건은 구성된 인스턴스 유형에 따라 다릅니다. 자세한 내용은 인스턴스 유형별 네트워크 인터페이스당 IP 주소를참조하십시오.

24.14.1.2.2. GCP(Google Cloud Platform) IP 주소 용량 제한

GCP에서 네트워킹 모델은 IP 주소 할당 대신 IP 주소 별칭을 통해 추가 노드 IP 주소를 구현합니다. 그러나 IP 주소 용량은 IP 별칭 용량에 직접 매핑됩니다.

IP 별칭 할당에는 다음과 같은 용량 제한이 있습니다.

  • 노드당 최대 IP 별칭 수이며 IPv4 및 IPv6은 모두 10입니다.
  • VPC당 최대 IP 별칭 수는 지정되지 않지만 OpenShift Container Platform 확장성 테스트는 최대 15,000개입니다.

자세한 내용은 인스턴스 할당량 및 별칭 IP 범위 개요 를 참조하십시오.

24.14.1.2.3. Microsoft Azure IP 주소 용량 제한

Azure에서는 IP 주소 할당에 대해 다음과 같은 용량 제한이 있습니다.

  • NIC당 IPv4 및 IPv6 둘 다에 대해 할당 가능한 최대 IP 주소 수는 256입니다.
  • 가상 네트워크당 할당된 IP 주소의 최대 수는 65,536을 초과할 수 없습니다.

자세한 내용은 네트워킹 제한을 참조하십시오.

24.14.1.3. Pod에 송신 IP 할당

하나 이상의 송신 IP를 네임스페이스 또는 네임스페이스의 특정 Pod에 할당하려면 다음 조건을 충족해야 합니다.

  • 클러스터에서 하나 이상의 노드에 k8s.ovn.org/egress-assignable: "" 레이블이 있어야 합니다.
  • 네임스페이스의 Pod에서 클러스터를 나가는 트래픽의 소스 IP 주소로 사용할 하나 이상의 송신 IP 주소를 정의하는 EgressIP 오브젝트가 있습니다.
중요

송신 IP 할당을 위해 클러스터의 노드에 레이블을 지정하기 전에 EgressIP 오브젝트를 생성하면 OpenShift Container Platform에서 모든 송신 IP 주소를 k8s.ovn.org/egress-assignable: "" 레이블이 있는 첫 번째 노드에 할당할 수 있습니다.

송신 IP 주소가 클러스터의 여러 노드에 널리 분산되도록 하려면 EgressIP 오브젝트를 생성하기 전에 송신 IP 주소를 호스팅할 노드에 항상 라벨을 적용합니다.

24.14.1.4. 노드에 송신 IP 할당

EgressIP 오브젝트를 생성할 때 k8s.ovn.org/egress-assignable: "" 레이블이 지정된 노드에 다음 조건이 적용됩니다.

  • 송신 IP 주소는 한 번에 두 개 이상의 노드에 할당되지 않습니다.
  • 송신 IP 주소는 송신 IP 주소를 호스팅할 수 있는 사용 가용한 노드 간에 균형을 이룹니다.
  • EgressIP 오브젝트의 spec.EgressIPs 배열에서 두 개 이상의 IP 주소를 지정하는 경우 다음 조건이 적용됩니다.

    • 지정된 IP 주소 중 두 개 이상을 호스팅할 노드는 없습니다.
    • 지정된 네임스페이스에 대해 지정된 IP 주소 간에 트래픽이 거의 동일하게 분산됩니다.
  • 노드를 사용할 수 없게 되면 할당된 모든 송신 IP 주소가 이전에 설명한 조건에 따라 자동으로 재할당됩니다.

Pod가 여러 EgressIP 오브젝트의 선택기와 일치하는 경우 EgressIP 오브젝트에 지정된 송신 IP 주소 중 어느 것이 Pod의 송신 IP 주소로 할당되는지 보장할 수 없습니다.

또한 EgressIP 오브젝트에서 여러 송신 IP 주소를 지정하는 경우 송신 IP 주소를 사용할 수 있다는 보장이 없습니다. 예를 들어 Pod가 두 개의 송신 IP 주소인 10.10.20.110.10.20.2 를 사용하여 EgressIP 오브젝트의 선택기와 일치하는 경우 각 TCP 연결 또는 UDP 대화에 사용할 수 있습니다.

24.14.1.5. 송신 IP 주소 구성에 대한 아키텍처 다이어그램

다음 다이어그램에서는 송신 IP 주소 구성을 보여줍니다. 다이어그램은 클러스터의 세 개 노드에서 실행 중인 두 개의 다른 네임스페이스에 있는 포드 4개를 설명합니다. 노드는 호스트 네트워크의 192.168.126.0/18 CIDR 블록에서 IP 주소가 할당됩니다.

노드 1과 노드 3은 모두 k8s.ovn.org/egress-assignable: "" 로 레이블이 지정되어 있으므로 송신 IP 주소 할당에 사용할 수 있습니다.

다이어그램에 있는 점선은 노드 1 및 노드 3에서 클러스터를 나가기 위해 포드 네트워크를 통해 이동하는 pod1, pod2, pod3의 트래픽 흐름을 나타냅니다. 외부 서비스에서 예제 EgressIP 오브젝트에서 선택한 Pod 중 하나에서 트래픽을 수신하는 경우 소스 IP 주소는 192.168.126.10 또는 192.168.126.102 입니다. 트래픽은 이 두 노드 간에 대략적으로 균등하게 분산됩니다.

다이어그램의 다음 리소스는 자세히 설명되어 있습니다.

네임스페이스 오브젝트

네임스페이스는 다음 매니페스트에 정의됩니다.

네임스페이스 오브젝트

apiVersion: v1
kind: Namespace
metadata:
  name: namespace1
  labels:
    env: prod
---
apiVersion: v1
kind: Namespace
metadata:
  name: namespace2
  labels:
    env: prod

EgressIP 오브젝트

다음 EgressIP 오브젝트는 env 레이블이 prod 로 설정된 모든 Pod를 선택하는 구성을 설명합니다. 선택한 Pod의 송신 IP 주소는 192.168.126.10192.168.126.102 입니다.

EgressIP 오브젝트

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egressips-prod
spec:
  egressIPs:
  - 192.168.126.10
  - 192.168.126.102
  namespaceSelector:
    matchLabels:
      env: prod
status:
  items:
  - node: node1
    egressIP: 192.168.126.10
  - node: node3
    egressIP: 192.168.126.102

이전 예제의 구성에 대해 OpenShift Container Platform은 두 송신 IP 주소를 사용 가능한 노드에 할당합니다. status 필드는 송신 IP 주소가 할당되었는지 여부와 위치를 반영합니다.

24.14.2. EgressIP 오브젝트

다음 YAML은 EgressIP 오브젝트의 API를 설명합니다. 오브젝트의 범위는 클러스터 전체이며 네임스페이스에 생성되지 않습니다.

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: <name> 1
spec:
  egressIPs: 2
  - <ip_address>
  namespaceSelector: 3
    ...
  podSelector: 4
    ...
1
EgressIPs 오브젝트의 이름입니다.
2
하나 이상의 IP 주소로 이루어진 배열입니다.
3
송신 IP 주소를 연결할 네임스페이스에 대해 하나 이상의 선택기입니다.
4
선택사항: 지정된 네임스페이스에서 송신 IP 주소를 연결할 Pod에 대해 하나 이상의 선택기입니다. 이러한 선택기를 적용하면 네임스페이스 내에서 Pod 하위 집합을 선택할 수 있습니다.

다음 YAML은 네임스페이스 선택기에 대한 스탠자를 설명합니다.

네임스페이스 선택기 스탠자

namespaceSelector: 1
  matchLabels:
    <label_name>: <label_value>

1
네임스페이스에 대해 일치하는 하나 이상의 규칙입니다. 둘 이상의 일치 규칙이 제공되면 일치하는 모든 네임스페이스가 선택됩니다.

다음 YAML은 Pod 선택기에 대한 선택적 스탠자를 설명합니다.

Pod 선택기 스탠자

podSelector: 1
  matchLabels:
    <label_name>: <label_value>

1
선택 사항: 지정된 namespaceSelector 규칙과 일치하는 네임스페이스의 Pod에 대해 일치하는 하나 이상의 규칙입니다. 지정된 경우 일치하는 Pod만 선택됩니다. 네임스페이스의 다른 Pod는 선택되지 않습니다.

다음 예에서 EgressIP 오브젝트는 192.168.126.11192.168.126.102 송신 IP 주소를 app 레이블을 web 으로 설정하고 env 라벨이 prod 로 설정된 네임스페이스에 있는 Pod와 연결합니다.

EgressIP 오브젝트의 예

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egress-group1
spec:
  egressIPs:
  - 192.168.126.11
  - 192.168.126.102
  podSelector:
    matchLabels:
      app: web
  namespaceSelector:
    matchLabels:
      env: prod

다음 예에서 EgressIP 오브젝트는 192.168.127.30192.168.127.40 송신 IP 주소를 environment 라벨이 development 로 설정되지 않은 모든 Pod와 연결합니다.

EgressIP 오브젝트의 예

apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: egress-group2
spec:
  egressIPs:
  - 192.168.127.30
  - 192.168.127.40
  namespaceSelector:
    matchExpressions:
    - key: environment
      operator: NotIn
      values:
      - development

24.14.3. 송신 IP 주소 호스팅을 위해 노드에 레이블 지정

OpenShift Container Platform에서 노드에 하나 이상의 송신 IP 주소를 할당할 수 있도록 k8s.ovn.org/egress-assignable="" 레이블을 클러스터의 노드에 적용할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)를 설치합니다.
  • 클러스터 관리자로 클러스터에 로그인합니다.

프로세스

  • 하나 이상의 송신 IP 주소를 호스팅할 수 있도록 노드에 레이블을 지정하려면 다음 명령을 입력합니다.

    $ oc label nodes <node_name> k8s.ovn.org/egress-assignable="" 1
    1
    레이블을 지정할 노드 이름입니다.
    작은 정보

    다음 YAML을 적용하여 노드에 레이블을 추가할 수 있습니다.

    apiVersion: v1
    kind: Node
    metadata:
      labels:
        k8s.ovn.org/egress-assignable: ""
      name: <node_name>

24.14.4. 다음 단계

24.14.5. 추가 리소스