이 문서에서는 베어메탈용 GDCV의 이그레스 NAT 게이트웨이를 설정하는 방법을 설명합니다. 이 게이트웨이는 클러스터에서 이그레스 트래픽에 영구적이고 확정적인 SNAT IP 주소를 제공합니다. 클러스터 외부에 이그레스 사용자 트래픽이 있는 워크로드를 실행할 때 고객은 몇 가지 확정적인 IP 주소를 사용하여 이 트래픽을 식별하려고 합니다. 이를 통해 고객이 허용 목록 정책과 같은 IP 기반 보안 측정을 설정할 수 있습니다.
이그레스 NAT 게이트웨이는 2개의 커스텀 리소스를 사용하여 사용 설정됩니다. 제공된 네임스페이스에 대해 NetworkGatewayGroup
커스텀 리소스는 게이트웨이로 작동하도록 선택된 노드의 네트워크 인터페이스에 구성할 수 있는 유동 IP 주소를 지정합니다. EgressNatPolicy
커스텀 리소스를 사용하면 이그레스 게이트웨이에서 트래픽을 제어하는 이그레스 라우팅 정책을 지정할 수 있습니다.
이그레스 NAT 게이트웨이를 설정하지 않거나 이그레스 트래픽이 트래픽 선택 규칙을 충족하지 않으면 지정된 Pod에서 클러스터 외부의 대상으로의 이그레스 트래픽이 Pod가 실행되는 노드의 IP 주소로 매스커레이드됩니다. 이 시나리오에서는 특정 Pod의 모든 이그레스 트래픽이 동일한 소스 IP 주소를 갖거나 동일한 노드 IP 주소로 매스커레이드된다고 보장하지 않습니다.
이그레스 NAT 게이트웨이는 Dataplane V2 위에 빌드된 고급 네트워킹 제품입니다.
이그레스 NAT 게이트웨이 작동 방법
이그레스 트래픽 선택 논리는 CIDR 블록 표기법의 대상 IP 주소 범위 집합, Pod 선택기, 네임스페이스 선택기를 기반으로 합니다. 이그레스 NAT 게이트웨이 작동 방법을 보려면 Pod에서 외부 소비자로의 패킷 흐름 및 해당 응답을 고려하세요. 노드 서브넷에 192.168.1.0/24 CIDR 블록의 IP 주소가 있다고 가정하세요.
다음 다이어그램은 게이트웨이 노드를 통해 이그레스 트래픽의 네트워크 아키텍처를 보여줍니다.
이그레스 NAT 게이트웨이를 통한 패킷 흐름은 다음과 같습니다.
이그레스 트래픽은 IP 주소가
192.168.1.1
인 노드에서 IP 주소가10.10.10.1
인 Pod로부터 생성됩니다.트래픽의 대상 주소는 클러스터 외부의 엔드포인트입니다.
트래픽이 이그레스 규칙과 일치하면 eBPF 프로그램이 노드 IP 주소로 직접 매스커레이드하는 대신 게이트웨이 노드로 이그레스 트래픽을 라우팅합니다.
게이트웨이 노드가 이그레스 트래픽을 수신합니다.
게이트웨이 노드는
EgressNATPolicy
커스텀 리소스에 지정된 소스 이그레스 IP 주소192.168.1.100
을 사용하여 원래 트래픽의 소스 IP 주소10.10.10.1
을 매스커레이드합니다.반환 트래픽은
192.168.1.100
을 대상으로 사용하여 게이트웨이 노드로 돌아옵니다.게이트웨이 노드는 반환 트래픽의 conntrack을 원본 이그레스 트래픽의 conntrack과 일치하는지 확인하고 대상 IP 주소를
10.10.10.1
로 다시 작성합니다.10.10.10.1
은 원본 노드로 라우팅되는 클러스터 내 트래픽으로 취급되고 원본 포드로 다시 전달됩니다.
노드 트래픽의 유동 IP 주소 구성
네트워크 게이트웨이 그룹 커스텀 리소스는 베어메탈용 GKE 번들 구성요소입니다. 리소스는 클러스터의 노드에서 이그레스 트래픽에 사용할 유동 IP 주소 목록 하나 이상의 목록을 관리합니다. 노드 참가는 지정된 네임스페이스로 결정됩니다. 네트워크 게이트웨이 그룹은 가장 효과적인 방식으로 유동 IP 주소를 항상 제공합니다. 유동 IP 주소를 사용하는 노드가 중지되면 고급 네트워크 운영자가 할당된 IP 주소를 사용 가능한 다음 노드로 이동합니다. 이 IP 주소를 사용하는 모든 워크로드 이그레스 트래픽도 함께 이동합니다.
새 1.15.11 클러스터를 만들 때 클러스터 구성 파일에 네트워크 게이트웨이 그룹 세부정보(주석 및 사양)를 포함합니다.
NetworkGatewayGroup
커스텀 리소스 만들기
다음 예시와 같이 클러스터를 만들 때 클러스터 구성 파일에서 spec.clusterNetwork.advancedNetworking
필드를 true
로 설정하여 네트워크 게이트웨이 그룹을 사용 설정합니다.
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
clusterNetwork:
...
advancedNetworking: true
...
NetworkGatewayGroup
커스텀 리소스를 만들 때 해당 네임스페이스를 클러스터 네임스페이스로 설정하고 다음 예시에 표시된 것처럼 유동 IP 주소 목록을 지정합니다.
kind: NetworkGatewayGroup
apiVersion: networking.gke.io/v1
metadata:
namespace: cluster-cluster1
name: default
spec:
floatingIPs:
- 192.168.1.100
- 192.168.1.101
- 192.168.1.102
고급 네트워킹 운영자는 다음 기준에 따라 유동 IP를 노드에 할당합니다.
- 노드 서브넷: 유동 IP 주소가 노드의 서브넷과 일치해야 합니다.
- 노드 역할(제어 영역, 작업자): 워커 노드는 유동 IP 주소를 할당할 때 제어 영역 노드보다 우선 적용됩니다.
- 노드에 유동 IP 주소가 있는지 여부: 운영자는 유동 IP가 아직 할당되지 않은 노드에 할당을 우선 적용합니다.
주소/노드 매핑은 NetworkGatewayGroup
객체를 가져올 때 status
섹션에서 찾을 수 있습니다. NetworkGatewayGroup
객체는 kube-system
네임스페이스에 있습니다. 게이트웨이 노드가 다운되면 고급 네트워크 운영자는 유동 IP 주소를 사용 가능한 다음 노드에 할당합니다.
게이트웨이 구성 확인
게이트웨이 구성 변경사항을 적용한 후 kubectl
을 사용하여 게이트웨이 상태를 확인하고 게이트웨이에 대해 지정된 유동 IP 주소를 검색할 수 있습니다.
다음 명령어를 사용하여
NetworkGatewayGroup
의 상태를 확인하고 유동 IP 주소가 할당되는 방법을 확인하세요.kubectl -n kube-system get networkgatewaygroups.networking.gke.io default -o yaml
worker1
및worker2
의 2개 노드가 있는 클러스터에 대한 응답은 다음과 같습니다.kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 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
트래픽 선택 규칙 설정
EgressNATPolicy
커스텀 리소스는 트래픽 선택 규칙을 지정하고 클러스터를 나가는 이그레스 트래픽에 대해 확정적인 IP 주소를 할당합니다.
CR을 지정할 때 egress
(최소 하나 이상의 규칙 포함), destinationCIDRs
, egressSourceIP
는 모두 필수입니다.
kubectl apply
를 사용하여 EgressNATPolicy
커스텀 리소스를 만듭니다. 다음 섹션에서는 사양 정의에 대한 세부정보 및 예시를 보여줍니다.
이그레스 라우팅 규칙 지정
EgressNatPolicy
커스텀 리소스를 사용하면 이그레스 트래픽에 대해 다음 규칙을 지정할 수 있습니다.
egress
섹션에서 이그레스 트래픽 선택 규칙을 하나 이상 지정해야 합니다.- 각 규칙은
podSelector
및namespaceSelector
로 구성됩니다. - 선택은 네임스페이스 라벨
namespaceSelector.matchLabels.user
및 Pod 라벨podSelector.matchLabels.role
을 기반으로 합니다. - Pod가 규칙 중 하나와 일치하면(일치에 OR 관계 사용) 이그레스 트래픽용으로 선택됩니다.
- 각 규칙은
destinationCIDRs
섹션에서 허용된 대상 주소를 지정합니다.destinationCIDRs
는 CIDR 블록 목록을 가져옵니다.- Pod에서 나가는 트래픽에 지정된 CIDR 블록 범위에 포함되는 대상 IP 주소가 있으면 이그레스 트래픽용으로 선택됩니다.
다음 예시에서 다음 기준이 충족되었을 때 Pod의 이그레스 트래픽이 허용됩니다.
- Pod 라벨이
role: frontend
로 지정되었습니다. - Pod가
user: alice
또는user: paul
로 라벨 지정된 네임스페이스에 있습니다. - 포드가
8.8.8.0/24
CIDR 블록의 IP 주소와 통신합니다.
kind: EgressNATPolicy
apiVersion: networking.gke.io/v1
metadata:
name: egress
spec:
sources:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: frontend
- namespaceSelector:
matchLabels:
user: paul
podSelector:
matchLabels:
role: frontend
action: SNAT
destinations:
- cidr: 8.8.8.0/24
gatewayRef:
name: default
namespace: kube-system
라벨 사용에 대한 자세한 내용은 Kubernetes 문서의 라벨 및 선택기를 참조하세요.
이그레스 트래픽의 소스 IP 주소 가져오기
EgressNATPolicy
커스텀 리소스(정책)는 gatewayRef.name
값과 gatewayRef.namespace
값을 사용하여 NetworkGatewayGroup
객체(게이트웨이)를 찾습니다.
정책은 게이트웨이의 유동 IP 주소 중 하나를 이그레스 트래픽의 소스 IP 주소로 사용합니다. 일치하는 게이트웨이에 유동 IP 주소가 여러 개 있으면 정책은 floatingIPs
목록의 첫 번째 IP 주소를 사용하고 다른 IP 주소를 무시합니다. 예시 게이트웨이에서 floatingIPs
목록의 첫 번째 주소는 192.168.1.100
입니다. gatewayRef
섹션에 잘못된 필드나 값이 있으면 정책 객체를 적용하지 못합니다.
여러 이그레스 정책 및 여러 게이트웨이 객체
이전 섹션의 설명대로 각 egressNATPolicy
객체(정책)는 gatewayRef.name
및 gatewayRef.namespace
와 일치하는 게이트웨이 객체의 floatingIPs
목록에 있는 첫 번째 IP 주소를 사용합니다. 정책을 여러 개 만들 수 있으며 다른 IP 주소를 사용하려면 NetworkGatewayGroup
객체를 여러 개 만들고 각각 참조해야 합니다.
각 NetworkGatewayGroup
리소스에는 고유한 유동 IP 주소가 포함되어야 합니다.
여러 EgressNATPolicy
객체에서 같은 IP 주소를 사용하도록 구성하려면 두 객체 모두에 같은 gatewayRef.name
및 gatewayRef.namespace
를 사용합니다.
이그레스 정책 여러 개와 게이트웨이 객체 여러 개를 설정하려면 다음 안내를 따르세요.
kube-system
네임스페이스에 게이트웨이 객체를 만들어 각 유동 IP 주소를 관리합니다. 일반적으로 올바른 이그레스 IP 주소가 할당되도록 하려면 각 이그레스 정책에 해당 게이트웨이 객체가 있어야 합니다.그런 다음
kubectl
로 각 게이트웨이 객체를 확인하여 유동 IP 주소의 할당 상태를 가져옵니다.kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway1 spec: floatingIPs: - 192.168.1.100 status: ... floatingIPs: 192.168.1.100: worker1 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway2 spec: floatingIPs: - 192.168.1.101 status: ... floatingIPs: 192.168.1.101: worker2 --- kind: NetworkGatewayGroup apiVersion: networking.gke.io/v1 metadata: namespace: kube-system name: gateway3 spec: floatingIPs: - 192.168.1.102 status: ... floatingIPs: 192.168.1.102: worker1
이전 단계에서 만든
gateway1
과 같이 게이트웨이 객체를 참조하는 정책을 여러 개 만듭니다.kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress1 spec: ... gatewayRef: name: gateway1 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress2 spec: ... gatewayRef: name: gateway2 namespace: kube-system --- kind: EgressNATPolicy apiVersion: networking.gke.io/v1 metadata: name: egress3 spec: ... gatewayRef: name: gateway3 namespace: kube-system
이그레스 트래픽 선택 규칙 및 네트워크 정책
이그레스 NAT 게이트웨이는 네트워크 정책 API와 호환됩니다. 네트워크 정책이 먼저 평가되고 이그레스 NAT 게이트웨이의 트래픽 선택 규칙보다 우선 적용됩니다. 예를 들어 이그레스 트래픽이 트래픽 삭제를 일으키는 네트워크 정책을 트리거하는 경우, 이그레스 게이트웨이 규칙이 패킷을 확인하지 않습니다. 네트워크 정책으로 이그레스로 패킷 전송이 허용되는 경우에만 이그레스 NAT 게이트웨이를 사용하거나 Pod가 실행되는 노드의 IP 주소를 사용하여 직접 매스커레이드하는 방식으로 트래픽이 처리되는 방법을 결정하기 위해 이그레스 트래픽 선택 규칙이 평가됩니다.
제한사항
현재 이그레스 NAT 게이트웨이의 제한사항은 다음과 같습니다.
이그레스 NAT 게이트웨이는 IPv4 모드로만 사용 설정됩니다.
이그레스 IP 주소는 노드 IP 주소와 동일한 Layer 2 도메인에 있어야 합니다.
이그레스 NAT 게이트웨이의 미리보기를 사용하도록 구성된 클러스터는 업그레이드가 지원되지 않습니다. 베어메탈용 GKE 출시 버전 1.15.0 이상의 경우 이그레스 NAT 게이트웨이는 Ubuntu 18.04에서만 미리보기 버전입니다. 이 기능이 미리보기 단계인 동안에는 요금이 부과되지 않습니다.