외부 통신을 위한 이그레스 NAT 게이트웨이 구성

이 문서에서는 베어메탈용 Anthos 클러스터에 이그레스 NAT 게이트웨이를 설정하는 방법을 설명합니다. 이 게이트웨이는 클러스터의 이그레스 트래픽에 대해 영구적이고 확정적인 라우팅을 제공합니다. 클러스터 외부의 이그레스 사용자 트래픽을 갖는 워크로드를 실행할 때 고객은 몇 가지 확정적인 IP 주소를 사용하여 이 트래픽을 식별하기를 원합니다. 이렇게 하면 고객이 허용 목록 정책과 같은 IP 기반의 보안 측정 기준을 설정할 수 있습니다. 미리보기 중에는 이 기능을 사용하는 데 요금이 부과되지 않습니다.

이그레스 NAT 게이트웨이는 2개의 커스텀 리소스를 사용하여 사용 설정됩니다. 제공된 네임스페이스에 대해 AnthosNetworkGateway 커스텀 리소스는 게이트웨이로 작동하도록 선택된 노드의 네트워크 인터페이스에 구성할 수 있는 유동 IP 주소를 지정합니다. EgressNatPolicy 커스텀 리소스를 사용하면 이그레스 게이트웨이에서 트래픽을 제어하는 이그레스 라우팅 정책을 지정할 수 있습니다.

이그레스 NAT 게이트웨이를 설정하지 않거나 이그레스 트래픽이 트래픽 선택 규칙을 충족하지 않으면 지정된 Pod에서 클러스터 외부의 대상으로의 이그레스 트래픽이 Pod가 실행되는 노드의 IP 주소로 매스커레이드됩니다. 이 시나리오에서는 특정 Pod의 모든 이그레스 트래픽이 동일한 소스 IP 주소를 갖거나 동일한 노드 IP 주소로 매스커레이드된다고 보장하지 않습니다.

이그레스 NAT 게이트웨이 작동 방법

이그레스 트래픽 선택 논리는 CIDR 블록 표기법의 대상 IP 주소 범위 집합, Pod 선택기, 네임스페이스 선택기를 기반으로 합니다. 이그레스 NAT 게이트웨이 작동 방법을 보려면 Pod에서 외부 소비자로의 패킷 흐름 및 해당 응답을 고려하세요. 노드 서브넷에 192.168.1.0/24 CIDR 블록의 IP 주소가 있다고 가정하세요.

다음 다이어그램은 게이트웨이 노드를 통해 이그레스 트래픽의 네트워크 아키텍처를 보여줍니다.

베어메탈용 Anthos 클러스터의 이그레스 NAT 게이트웨이 다이어그램

이그레스 NAT 게이트웨이를 통한 패킷 흐름은 다음과 같습니다.

  1. 이그레스 트래픽은 IP 주소가 192.168.1.1인 노드에서 IP 주소가 10.10.10.1인 Pod로부터 생성됩니다.

    트래픽의 대상 주소는 클러스터 외부의 엔드포인트입니다.

  2. 트래픽이 이그레스 규칙과 일치하면 eBPF 프로그램이 노드 IP 주소로 직접 매스커레이드하는 대신 게이트웨이 노드로 이그레스 트래픽을 라우팅합니다.

  3. 게이트웨이 노드가 이그레스 트래픽을 수신합니다.

  4. 게이트웨이 노드는 EgressNATPolicy 커스텀 리소스에 지정된 소스 이그레스 IP 주소 192.168.1.100을 사용하여 원래 트래픽의 소스 IP 주소 10.10.10.1을 매스커레이드합니다.

  5. 반환 트래픽은 192.168.1.100을 대상으로 사용하여 게이트웨이 노드로 돌아옵니다.

  6. 게이트웨이 노드는 반환 트래픽의 conntrack을 원본 이그레스 트래픽의 conntrack과 일치하는지 확인하고 대상 IP 주소를 10.10.10.1로 다시 작성합니다.

  7. 10.10.10.1은 원본 노드로 라우팅되는 클러스터 내 트래픽으로 취급되고 원본 Pod로 다시 전달됩니다.

노드 트래픽의 유동 IP 주소 구성

Anthos Network Gateway 컨트롤러는 베어메탈용 Anthos 클러스터의 번들 구성요소입니다. 이 컨트롤러는 클러스터의 노드에서 이그레스 트래픽에 사용할 하나 이상의 유동 IP 주소 목록을 관리합니다. 노드 참가는 지정된 네임스페이스로 결정됩니다. Anthos Network Gateway는 최선의 방식으로 유동 IP 주소를 항상 사용할 수 있게 해줍니다. 유동 IP 주소를 사용하는 노드가 작동 중지되면 Anthos Network Gateway가 할당된 IP 주소를 사용 가능한 다음 노드로 이동합니다. 이 IP 주소를 사용하는 모든 워크로드 이그레스 트래픽도 함께 이동합니다.

새 1.8.0 클러스터를 만들 때 클러스터 구성 파일에 Anthos Network Gateway 세부정보(주석 및 사양)를 포함합니다.

AnthosNetworkGateway 커스텀 리소스 만들기

클러스터를 만들 때 클러스터 구성 파일에서 baremetal.cluster.gke.io/enable-anthos-network-gateway 주석을 사용하여 Anthos Network Gateway를 사용 설정합니다. 다음 예시에 표시된 것처럼 주석을 true로 설정합니다.

apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
  annotations:
    baremetal.cluster.gke.io/enable-anthos-network-gateway: "true"
  name: cluster1
  namespace: cluster-cluster1

AnthosNetworkGateway 커스텀 리소스를 만들 때 해당 네임스페이스를 클러스터 네임스페이스로 설정하고 다음 예시에 표시된 것처럼 유동 IP 주소 목록을 지정합니다.

kind: AnthosNetworkGateway
apiVersion: networking.gke.io/v1alpha1
metadata:
  namespace: cluster-cluster1
  name: default
spec:
  floatingIPs:
  - 192.168.1.100
  - 192.168.1.101
  - 192.168.1.102

지정되는 유동 IP 주소 수는 클러스터의 안정성에 영향을 줍니다. 예를 들어 이그레스 NAT 게이트웨이가 하나만 지정된 유동 IP 주소로 작동할 수 있지만 노드 실패가 발생하면 트래픽이 중단될 수 있습니다. 유동 IP 주소를 더 추가하면 AnthosNetworkGateway가 필요에 따라 이를 할당하고 이동합니다. 클러스터에 사용되는 L2 도메인별로 유동 IP 주소를 2개 이상 제공하는 것이 좋습니다.

컨트롤러는 다음 기준에 따라 유동 IP를 노드에 할당합니다.

  • 노드 서브넷 - 유동 IP 주소가 노드의 서브넷과 일치해야 합니다.
  • 노드 역할(마스터, 워커) - 워커 노드는 유동 IP 주소를 할당할 때 마스터 노드보다 우선 적용됩니다.
  • 노드에 유동 IP 주소가 있는지 여부에 따라 컨트롤러는 유동 IP가 아직 할당되지 않은 노드에 할당을 우선 적용합니다.

주소/노드 매핑은 AnthosNetworkGateway 객체를 가져올 때 status 섹션에서 찾을 수 있습니다. AnthosNetworkGateway 객체는 kube-system 네임스페이스에 있습니다. 게이트웨이 노드가 작동 중지되면 AnthosNetworkGateway의 컨트롤러가 사용 가능한 다음 노드에 유동 IP 주소를 할당합니다.

게이트웨이 구성 확인

게이트웨이 구성 변경사항을 적용한 후 kubectl을 사용하여 게이트웨이 상태를 확인하고 게이트웨이에 대해 지정된 유동 IP 주소를 검색할 수 있습니다.

  1. 다음 명령어를 사용하여 AnthosNetworkGateway의 상태를 확인하고 유동 IP 주소가 할당되는 방법을 확인하세요.

    kubectl -n kube-system get anthosnetworkgateway.networking.gke.io default -oyaml
    

    worker1worker2의 2개 노드가 있는 클러스터에 대한 응답은 다음과 같습니다.

    kind: AnthosNetworkGateway
    apiVersion: networking.gke.io/v1alpha1
    metadata:
      namespace: kube-system
      name: default
    spec:
      floatingIPs:
      - 192.168.1.100
      - 192.168.1.101
      - 192.168.1.102
    status:
      nodes:
        worker1: Up
        worker2: Up // Or Down
      floatingIPs:
        192.168.1.100: worker1
        192.168.1.101: worker2
        192.168.1.102: worker1
    
  2. 다음 명령어를 사용하여 특정 노드의 주소 할당 및 AnthosNetworkGateway 상태를 검색합니다.

    kubectl -n kube-system get anthosnetworkgatewaynode.networking.gke.io NODE_NAME -oyaml
    

    NODE_NAME을 검사하려는 특정 노드/머신 이름으로 바꿉니다.

트래픽 선택 규칙 설정

EgressNATPolicy 커스텀 리소스는 트래픽 선택 규칙을 지정하고 클러스터를 나가는 이그레스 트래픽에 대해 확정적인 IP 주소를 할당합니다. CR을 지정할 때 egress(최소 하나 이상의 규칙 포함), destinationCIDRs, egressSourceIP는 모두 필수입니다.

kubectl apply를 사용하여 EgressNATPolicy 커스텀 리소스를 만듭니다. 다음 섹션에서는 사양 정의에 대한 세부정보 및 예시를 보여줍니다.

이그레스 라우팅 규칙 지정

EgressNatPolicy 커스텀 리소스를 사용하면 이그레스 트래픽에 대해 다음 규칙을 지정할 수 있습니다.

  • egress 섹션에서 이그레스 트래픽 선택 규칙을 하나 이상 지정해야 합니다.

    • 각 규칙은 podSelectornamespaceSelector로 구성됩니다.
    • 선택은 네임스페이스 라벨 namespaceSelector.matchLabels.**user** 및 Pod 라벨 podSelector.matchLabels.**role**을 기반으로 합니다.
    • Pod가 규칙 중 하나와 일치하면(일치에 OR 관계 사용) 이그레스 트래픽용으로 선택됩니다.
  • destinationCIDRs 섹션에서 허용된 대상 주소를 지정합니다.

    • destinationCIDRs는 CIDR 블록 목록을 가져옵니다.
    • Pod에서 나가는 트래픽에 지정된 CIDR 블록 범위에 포함되는 대상 IP 주소가 있으면 이그레스 트래픽용으로 선택됩니다.

다음 예시에서 다음 기준이 충족되었을 때 Pod의 이그레스 트래픽이 허용됩니다.

  • Pod 라벨이 role: frontend로 지정되었습니다.
  • Pod가 user: alice 또는 user: paul로 라벨 지정된 네임스페이스에 있습니다.
  • Pod가 8.8.8.0/24 범위의 IP 주소와 통신합니다.
kind: EgressNATPolicy
apiVersion: networking.gke.io/v1alpha1
metadata:
  name: egress
spec:
  egress:
  - namespaceSelector:
      matchLabels:
        user: alice
    podSelector:
      matchLabels:
        role: frontend
  - namespaceSelector:
      matchLabels:
        user: paul
    podSelector:
      matchLabels:
        role: frontend
  destinationCIDRs:
  - 8.8.8.0/24
  egressSourceIP: 192.168.1.100

라벨 사용에 대한 자세한 내용은 Kubernetes 문서의 라벨 및 선택기를 참조하세요.

이그레스 트래픽을 위한 소스 IP 주소 지정

egressSourceIP 필드에서 사용하려는 소스 IP 주소를 지정합니다. 소스 IP 주소는 AnthosNetworkGateway 커스텀 리소스에 지정된 유동 IP 주소 중 하나와 일치해야 합니다.

이전 섹션의 EgressNATPolicy 예시를 사용하여 Pod 선택 및 대상 IP 주소 기준이 충족되면 Pod의 이그레스 트래픽이 SNAT를 사용하여 192.168.1.100으로 변환됩니다.

경로가 수락되게 하려면 egressSourceIP 주소가 게이트웨이 노드 IP와 동일한 서브넷에 있어야 합니다. egressSourceIP 주소가 게이트웨이 노드에 알려지지(할당되지) 않았으면 경로 요청이 충족될 수 없습니다. 이 경우 Kubernetes 이벤트에서 UnknownEgressIP 오류가 발생합니다.

다음 kubectl 명령어를 사용하여 EgressNATPolicy 객체에 대해 이벤트를 출력합니다.

kubectl describe EgressNATPolicy egress

EgressNATPolicy CR이 여러 개 있으면 각 항목에 서로 다른 egressSourceIP 주소가 있어야 합니다. 충돌을 방지하려면 개발 팀과 조율합니다.

이그레스 트래픽 선택 규칙 및 네트워크 정책

이그레스 NAT 게이트웨이는 네트워크 정책 API와 호환됩니다. 네트워크 정책이 먼저 평가되고 이그레스 NAT 게이트웨이의 트래픽 선택 규칙보다 우선 적용됩니다. 예를 들어 이그레스 트래픽이 트래픽 삭제를 일으키는 네트워크 정책을 트리거하는 경우, 이그레스 게이트웨이 규칙이 패킷을 확인하지 않습니다. 네트워크 정책으로 이그레스로 패킷 전송이 허용되는 경우에만 이그레스 NAT 게이트웨이를 사용하거나 Pod가 실행되는 노드의 IP 주소를 사용하여 직접 매스커레이드하는 방식으로 트래픽이 처리되는 방법을 결정하기 위해 이그레스 트래픽 선택 규칙이 평가됩니다.

제한사항

현재 이그레스 NAT 게이트웨이의 제한사항은 다음과 같습니다.

  • 이그레스 NAT 게이트웨이는 IPv4 모드로만 사용 설정됩니다.

  • 이그레스 IP 주소는 이 미리보기에 대해 노드 IP 주소를 사용하는 동일한 L2 도메인에 있어야 합니다.

  • 이그레스 NAT 게이트웨이의 미리보기를 사용하도록 구성된 클러스터는 업그레이드가 지원되지 않습니다.