이 페이지에서는 Google Kubernetes Engine(GKE) 포드에서 영구 IP 주소를 구현하는 방법을 보여줍니다. 커스텀 영구 IP 주소 매핑을 사용하여 GKE 포드 네트워킹을 제어할 수 있습니다. 영구 IP 주소, 사용 사례, 이점에 대한 자세한 내용은 GKE 포드의 영구 IP 주소 정보를 참조하세요.
요구사항
- GKE 버전 1.29 이상
- Google 제공 IP 주소(Google 제공 IP 주소) 예약 또는 자체 IP 주소 사용(BYOIP) 중에서 선택합니다.
- 할당된 영구 IP 주소를 인식하고 사용하도록 포드 내에서 실행되는 애플리케이션을 구성합니다.
- GKE 포드의 영구 IP 주소에는 GKE Dataplane V2 및 다중 네트워킹이 사용 설정된 클러스터가 필요합니다.
제한사항
- 기본 네트워크에서는 영구 IP 주소를 지원하지 않습니다. 클러스터를 만드는 동안 다중 네트워킹을 사용 설정해야 합니다.
- 할당된 영구 IP 주소를 사용하도록 애플리케이션을 구성합니다. GKE는 IP 주소 구성을 포드의 네트워크 인터페이스에 자동으로 추가하지 않습니다.
- 각 영구 IP 주소를 한 번에 단일 포드와 연결할 수 있습니다.
사용 가능한 포드가 여러 개 있으면 일반적으로 GKE는 트래픽을 최신 포드로 보냅니다. 하지만 GKE는 최신 포드가 정상인 경우에만 이를 수행합니다. 즉, 포드의
Ready
조건 상태가 기본적으로True
여야 합니다. 이 동작을 구성하고GKEIPRoute
의reactionMode
설정을 사용하여 변경할 수 있습니다. - GKE에서는 IPv4 주소만 영구 IP 주소로 지원합니다.
- GKE는 영구 IP 주소에 Layer 3 또는 기기 유형 다중 네트워크만 지원합니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
IP 주소에 대해 알아봅니다.
가격 책정
다음 Network Function Optimizer(NFO) 기능은 GKE Enterprise에서 사용 설정된 프로젝트에 포함된 클러스터에서만 지원됩니다.
- 포드에 대한 다중 네트워크 지원
- 포드의 영구 IP 주소 지원(미리보기)
- 멀티 네트워크 정책(미리보기)
- 포드의 서비스 스티어링 지원(미리보기)
Google Kubernetes Engine(GKE) Enterprise 버전 사용 설정 시 적용되는 요금을 알아보려면 GKE Enterprise 가격 책정을 참조하세요.
GKE 포드의 영구 IP 주소 구현
GKE의 영구 IP 주소는 포드 자체가 업데이트되거나 이동되더라도 포드에 안정적인 네트워크 ID를 제공할 수 있는 방법을 제공합니다.
이 섹션에는 GKE 포드의 영구 IP 주소를 구현하기 위한 워크플로가 요약되어 있습니다.
- 클러스터 만들기: Gateway API, GKE Dataplane V2, 다중 네트워킹이 사용 설정된 클러스터를 만듭니다.
- IP 주소 예약: 외부(공개적으로 액세스 가능) 또는 내부(Google Cloud 전용) IP 주소 중 무엇이 필요한지 결정하고 해당 IP 주소를 예약합니다. GKE 클러스터와 동일한 리전을 선택합니다.
- 게이트웨이 만들기: 예약된 영구 IP 주소를 저장하는 Kubernetes Gateway 객체를 구성하고 클러스터에서 이러한 영구 IP 주소를 사용할 수 있는 포드에 대한 규칙(
GKEIPRoutes
)을 만들 수 있습니다. - 영구 IP 주소에 대한 추가 네트워크로 워크로드 만들기 또는 식별: 여러 네트워크 인터페이스를 사용 설정하고 영구 IP 주소가 있는 네트워크를 정의하여 영구 IP 주소를 사용하도록 포드를 준비합니다.
- 선택한 워크로드의 GKEIPRoute 객체 만들기: 특정 포드에 영구 IP 주소를 할당하도록
GKEIPRoute
를 구성합니다. 라벨을 사용하여 올바른 포드를 타겟팅할 수 있으며 라우팅이 포드 변경사항에 대응하는 방식을 선택적으로 구성할 수 있습니다. - 애플리케이션 인식 구성: 영구 IP 주소를 적극적으로 사용하도록 포드 내 애플리케이션을 구성합니다.
- 모니터링: 게이트웨이 및
GKEIPRoute
객체의 상태를 추적하여 모든 것이 예상대로 작동하는지 확인합니다.
GKE 포드에 영구 IP 주소를 구현하려면 다음 단계를 수행합니다.
1단계: GKE Dataplane V2 및 다중 네트워킹이 사용 설정된 GKE 클러스터 만들기
GKE 포드에서 영구 IP 주소를 구현하는 데 필요한 고급 네트워크 라우팅 및 IP 주소 관리 기능을 사용 설정하려면 GKE Dataplane V2 및 다중 네트워킹이 사용 설정된 클러스터를 create 합니다.
2단계: 영구 IP 주소 예약
포드의 신뢰할 수 있는 네트워크 ID를 설정하고 영구 IP 주소를 설정하려면 먼저 영구 IP 주소를 획득해야 합니다. Google 제공 IP 주소를 예약하거나 자체 IP 주소를 사용(BYOIP)하도록 선택할 수 있습니다.
2a단계: Google 제공 IP 주소 예약
외부 IP 주소를 예약하려면 다음 명령어를 실행합니다.
gcloud compute addresses create ADDRESS_NAME \
--region=REGION
다음을 바꿉니다.
ADDRESS_NAME
: 이 주소와 연결할 이름입니다.REGION
: 이 주소를 예약할 리전입니다. 이 리전은 IP 주소를 연결하려는 포드와 같은 리전이어야 합니다.참고: 영구 IP 주소의 트래픽 라우팅을 처리하는 전달 규칙이 리전에 해당하기 때문에 IP 주소를 예약할 때 리전을 지정해야 합니다. 라우팅이 제대로 작동하려면 IP 주소와 GKE 클러스터가 같은 리전에 있어야 합니다.
내부 IP 주소를 예약하려면 다음 명령어를 실행합니다.
gcloud compute addresses create ADDRESS_NAME \
--region REGION
--subnet SUBNETWORK \
--addresses IP_ADDRESS
다음을 바꿉니다.
ADDRESS_NAME
: 예약하려는 주소 하나 이상의 이름입니다. 주소가 여러 개인 경우 모든 주소를 공백으로 구분하여 목록으로 지정합니다. 예를 들면 example-address-1 example-address-2 example-address-3입니다.REGION
: 이 요청의 리전SUBNETWORK
: 이 내부 IPv4 주소의 서브넷입니다.
비공개 네트워크 내에서 트래픽이 올바르게 라우팅되려면 내부 IP 주소가 지정된 서브넷에 속해야 합니다.
외부 및 내부 IP 주소에 대한 자세한 내용은 고정 외부 IP 주소 예약 및 고정 내부 IP 주소 예약을 참조하세요.
2b단계: 자체 IP 주소 사용(BYOIP)
Google 제공 IP 주소를 사용하는 대신 자체 IP 주소를 사용(BYOIP)할 수 있습니다. BYOIP는 애플리케이션에 특정 IP 주소가 필요하거나 기존 시스템을 Google Cloud로 이동하는 경우에 유용합니다. BYOIP를 사용하기 위해 Google은 사용자가 IP 주소 범위를 소유하고 있는지 검증하고, IP 주소를 Google Cloud로 가져온 후 이를 GKE 포드의 영구 IP 주소로 할당할 수 있습니다. 자세한 내용은 자체 IP 주소 사용을 참조하세요.
3단계: Gateway 객체 만들기
Gateway 객체는 IP 주소를 저장하고 이를 사용할 수 있는 포드를 정의합니다. 영구 IP 주소가 GKE 포드에 할당되는 방법을 제어하려면 Gateway 객체를 사용합니다.
- 적절한 클래스의 Kubernetes Gateway 객체를 만듭니다.
gke-persistent-regional-external-managed
: 외부(공개) IP 주소의 경우gke-persistent-regional-internal-managed
: 내부(Google Cloud 전용) IP 주소의 경우
- Gateway의 주소 섹션에서 이 Gateway가 관리하는 영구 IP 주소(Google 제공 또는 BYOIP)를 나열합니다.
Listeners
섹션을 사용하여 Gateway의 IP 주소를 잠재적으로 사용할 수 있는 포드(및 연관된GKEIPRoute
객체)를 확인합니다.Listeners
는GKEIPRoute
객체가 있는 GKEIPRoute의 네임스페이스를 기반으로 하는 필터 역할을 합니다.다음 Kubernetes 네임스페이스 선택 옵션 중에서 선택할 수 있습니다.
- 모든 네임스페이스: 클러스터의 모든
GKEIPRoute
입니다. - 선택기: 특정 라벨과 일치하는 GKEIPRoute 네임스페이스의
GKEIPRoute
입니다. - 동일한 네임스페이스: Gateway와 동일한 GKEIPRoute의 네임스페이스 내에 있는
GKEIPRoutes
만 해당합니다.
- 모든 네임스페이스: 클러스터의 모든
다음 예시에서는 외부 영구 IP 주소에 클러스터 전체 액세스 권한을 제공하여 모든 포드에서 잠재적으로 이를 사용할 수 있도록 합니다.
다음 샘플 매니페스트를 allowed-pod-ips.yaml
로 저장합니다.
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
namespace: default
name: allowed-pod-ips
spec:
gatewayClassName: gke-persistent-regional-external-managed
listeners:
- name: default
port: 443
protocol: none
allowedRoutes:
namespaces:
from: All
addresses:
- value: "34.123.10.1/32"
type: "gke.networking.io/cidr"
- value: "34.123.10.2/32"
type: "gke.networking.io/cidr"
각 항목의 의미는 다음과 같습니다.
- addresses: 특정 Gateway에서 권한을 관리하는 모든 IP 주소를 나열합니다.
- listeners:
GKEIPRoute
객체가 이 Gateway를 참조할 수 있는 네임스페이스를 식별하는 데 사용됩니다.
클러스터에 매니페스트를 적용합니다.
kubectl apply -f allowed-pod-ips.yaml
4단계: 영구 IP 주소의 추가 네트워크로 워크로드 만들기 또는 식별
다중 네트워크 포드를 설정하고 영구 IP 주소가 속한 네트워크를 나타내는 네트워크 객체를 만듭니다.
5단계: 선택한 워크로드의 GKEIPRoute
객체 만들기
선택한 포드에 영구 IP 주소를 할당하려면 GKEIPRoute
객체를 만듭니다.
다음 샘플 매니페스트를 my-ip-route.yaml
로 저장합니다.
kind: GKEIPRoute
apiVersion: networking.gke.io/v1
metadata:
namespace: default
name: my-ip-route
spec:
parentRefs:
- name: allowed-pod-ips
namespace: default
addresses:
- value: "34.123.10.1/32"
type: "gke.networking.io/cidr"
network: blue-network
reactionMode: ReadyCondition
podSelector: # Only one pod is selected.
matchLabels:
component: proxy
각 항목의 의미는 다음과 같습니다.
- parentRefs: 영구 IP 주소가 사용되는 Gateway를 가리킵니다. 이 필드는 변경할 수 없습니다.
- addresses:
podSelector
로 식별된 포드로 라우팅되는 모든 영구 IP 주소를 나열합니다. 이 필드를 변경할 수 있습니다. IPv4의 경우 /32 주소만 지원됩니다. - podSelector: 영구 IP 주소가 라우팅되는 포드를 식별하는 라벨을 지정합니다. 이 필드는 변경 가능하며
GKEIPRoute
가 배치된 네임스페이스와 동일한 네임스페이스에 적용됩니다. 여러 포드를 선택하면 포드 생성 시간(GKE에서 가장 최근 시간 선택)과reactionMode
필드 설정이라는 두 가지 추가 요소가 고려됩니다. - reactionMode: 특정 포드(
podSelector
에서 선택)가 생성되거나 삭제될 때 이 기능이 어떻게 작동하는지 지정합니다. 이 필드는 선택사항이며 기본값은ReadyCondition
입니다.ReadyCondition
필드는 변경할 수 없습니다.reactionMode
를 설정하여 포드가 생성, 삭제 또는 업데이트될 때 기능이 작동하는 방식을 제어할 수 있습니다. - network: 영구 IP 주소가 라우팅되는 포드의 네트워크 인터페이스를 가리킵니다. 이 필드는 변경할 수 없습니다.
클러스터에 매니페스트를 적용합니다.
kubectl apply -f my-ip-route.yaml
StatefulSet 포드에 영구 IP 주소 할당
StatefulSet 내의 특정 포드에 영구 IP 주소를 할당하려면 다음 예시와 같이 포드의 예측 가능한 호스트 이름과 Kubernetes의 자동 라벨 지정을 사용합니다.
다음 샘플 매니페스트를 my-pod-ips.yaml
로 저장합니다.
kind: GKEIPRoute
apiVersion: networking.gke.io/v1
metadata:
namespace: proxy-ss-ns
name: my-pod-ips
spec:
parentRefs:
- name: allowed-pod-ips
namespace: default
addresses:
- value: "34.123.10.1/32"
type: "gke.networking.io/cidr"
- value: "34.123.10.2/32"
type: "gke.networking.io/cidr"
network: blue-network
reactionMode: ReadyCondition
podSelector:
matchLabels:
statefulset.kubernetes.io/pod-name: proxy-ss-1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
namespace: proxy-ss-ns
name: proxy-ss
spec:
selector:
matchLabels:
component: proxy
serviceName: "proxy"
replicas: 3
template:
metadata:
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: '[{"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"blue-network"}]'
labels:
component: proxy
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
클러스터에 매니페스트를 적용합니다(네트워크 이름이 'blue-network'인지 확인).
kubectl apply -f my-pod-ips.yaml
배포 포드에 영구 IP 주소 할당
배포의 최신 포드에 영구 IP 주소를 할당하려면 다음 구성을 사용하여 GKEIPRoute
를 적용합니다.
다음 샘플 매니페스트를 my-pod-ips.yaml
로 저장합니다.
kind: GKEIPRoute
apiVersion: networking.gke.io/v1
metadata:
namespace: proxy-deploy-ns
name: my-pod-ips
spec:
parentRefs:
- name: allowed-pod-ips
namespace: default
addresses:
- value: "34.123.10.1/32"
type: "gke.networking.io/cidr"
- value: "34.123.10.2/32"
type: "gke.networking.io/cidr"
network: blue-network
reactionMode: ReadyCondition
podSelector:
matchLabels:
component: proxy
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: proxy-deploy-ns
name: proxy-deploy
spec:
selector:
matchLabels:
component: proxy
replicas: 4 # Latest Pod is used
template:
metadata:
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: '[{"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"blue-network"}]'
labels:
component: proxy
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
클러스터에 매니페스트를 적용합니다(네트워크 이름이 'blue-network'인지 확인).
kubectl apply -f my-ip-route.yaml
6단계: 포드 내에서 영구 IP 주소 사용
GKEIPRoute
를 사용하여 GKE 포드에 영구 IP 주소를 할당한다고 해서 애플리케이션이 자동으로 IP 주소를 사용할 수 있게 되는 것은 아닙니다. 영구 IP 주소는 네트워크 라우팅 수준에서 처리되지만 포드의 기본 구성은 이를 인식하지 못합니다. 포드 내에서 주소를 인식하고 사용하도록 애플리케이션 구성을 설정해야 합니다. 이를 위해서는 포드에 권한 권한이 필요합니다.
애플리케이션을 구성하려면 다음 옵션을 고려하세요.
- net.ipv4.ip_nonlocal_bind: 애플리케이션이 해당 인터페이스에 직접 할당되지 않은 IP 주소를 사용할 수 있도록 시스템 설정을 수정합니다.
- ip address add: 애플리케이션의 로직 내에서 이 명령어를 사용하여 영구 IP 주소를 인터페이스에 수동으로 추가합니다.
- Raw sockets: 보다 세부적인 제어를 위해 애플리케이션이 네트워크 스택과 직접 상호작용할 수 있습니다(고급).
- Userspace IP address stack: 특수한 경우 포드 내에서 개별 애플리케이션이 실행되어 IP 주소를 관리할 수 있습니다(매우 고급).
포드 변경 중 영구 IP 주소 동작 맞춤설정
이 섹션에서는 대상 포드가 생성되거나 삭제될 때 GKE 포드의 영구 IP 주소가 어떻게 작동하는지 설명합니다. GKE 컨트롤러는 포드 및 GKEIPRoute
구성을 모니터링합니다. 업데이트 발생을 감지하면 선택된 reactionMode
에 따라 적합한 포드에 영구 IP 주소를 자동으로 다시 할당합니다.
영구 IP 주소 기능이 포드 변경사항과 사용 가능한 구성 옵션을 자동으로 처리하는 방법을 이해합니다.
GKEIPRoute
구성의 reactionMode 필드 내에서 ReadyCondition 또는 Exists 중에 결정합니다. 애플리케이션에 필요한 IP 주소 할당 속도와 엄격한 준비 요구사항을 고려하세요.- 준비를 위해
ReadyCondition
을 사용하는 경우 포드가 Kubernetes 준비 프로브를 올바르게 구현했는지 확인합니다. 그렇지 않으면 영구 IP 주소가 의도한 대로 작동하지 않을 수 있습니다. - 포드 상태와
GKEIPRoute
객체의Conditions
필드를 모니터링하여 시스템이 올바르게 작동하는지 확인하는 것이 좋습니다.Ready
조건의true
상태는 시스템이 올바르게 작동하고 있음을 나타냅니다.
포드의 영구 IP 주소와의 통신 문제 해결
이 섹션에서는 포드의 영구 IP 주소와 관련된 문제를 해결하는 방법을 보여줍니다.
일치하는 포드가 없는 경우 NoPodsFound
증상
GKEIPRoute
객체는 영구 IP 주소와 연결된 포드를 식별하기 위해 podSelector
(라벨 집합)를 지정합니다. NoPodsFound
상태는 대상 GKEIPRoute's
네임스페이스 내에 일치하는 라벨이 있는 포드가 없음을 나타냅니다.
가능한 원인
- 잘못된 라벨: 영구 IP 주소를 사용하려는 포드에 잘못된 라벨이 있거나 라벨이 아예 없을 수 있습니다.
- 포드가 없음:
reactionMode == Exists
이면pod.Spec.nodeName
필드를 확인하여 포드가 노드에 할당되었는지 확인합니다.GKEIPRoute's
네임스페이스에서 실행 중인 포드 중에 선택기와 일치하는 포드가 없을 수 있습니다. - 포드가 준비되지 않음:
reactionMode == ReadyCondition
인 경우 포드 상태가READY
인지 확인합니다. 일치하는 포드가 있더라도Ready
상태가 아니면 트래픽을 처리할 수 없으므로 선택되지 않습니다.
해결 방법
- 라벨 확인:
GKEIPRoute's
podSelector
의 라벨이 의도한 포드에 적용한 라벨과 일치하는지 다시 확인합니다. - 포드 존재 확인: 올바른 라벨이 있는 포드가 실제로 Gateway의
Listeners
에 지정된GKEIPRoute's
네임스페이스에 있는지 확인합니다.reactionMode == Exists
인 경우pod.Spec.nodeName
필드를 확인하여 포드가 노드에 할당되었는지 확인합니다. 포드 준비 확인:
reactionMode == ReadyCondition
인 경우 포드 상태가READY
인지 확인합니다. 다음 명령어를 사용하여 포드가Ready
상태인지 확인합니다.kubectl get pods -n <namespace>
다른 상태(예: '대기 중', '오류')의 포드는 선택되지 않습니다.
할당된 영구 IP 주소에서 응답하도록 포드를 구성합니다.
일치하는 포드가 있고 영구 IP 주소 프로그래밍이 진행 중인 경우 Mutated
증상
GKEIPRoute
상태가 'Mutated'로 표시됩니다. 이는 일치하는 포드의 영구 IP 주소 구성이 진행 중임을 나타냅니다.
잠재적 원인:
시스템에서 영구 IP 주소의 GKE 데이터 경로와 Google Cloud 리소스를 설정하므로 구성 중에 'Mutated' 상태가 표시될 수 있습니다.
해결 방법:
- 대기 및 재시도: 대부분의 경우 구성 프로세스는 짧은 시간 내에 자동으로 완료됩니다. 기다린 후 상태를 확인합니다. 성공하면
Ready
로 변경됩니다. - 추가 조사(필요한 경우): 'Mutated' 상태가 장시간 동안 지속된다면 구성 오류가 있을 수 있습니다.
GKEIPRoute
의 다른 상태 조건을 검토합니다.- Accepted:
GKEIPRoute
설정이 올바른지 여부를 나타냅니다. - DPV2Ready: 노드의 데이터 경로가 올바르게 프로그래밍되었는지 여부를 나타냅니다.
- GCPReady: Google Cloud 리소스가 예상대로 설정되었는지 여부를 나타냅니다.
- Accepted:
이러한 조건에서 문제를 해결하는 데 도움이 되는 오류 메시지를 찾습니다.
다음 단계
- GKE 포드의 영구 IP 주소 정보 읽기
- 포드의 다중 네트워크 지원 설정 알아보기