이 페이지에서는 Google Kubernetes Engine(GKE) 포드에서 영구 IP 주소를 구현하는 방법을 보여줍니다. 커스텀 영구 IP 주소 매핑을 사용하여 GKE 포드 네트워킹을 제어할 수 있습니다. 영구 IP 주소, 사용 사례, 이점에 대한 자세한 내용은 GKE 포드의 영구 IP 주소 정보를 참조하세요.
요구사항
- GKE 버전 1.31 이상
- Google 제공 IP 주소 예약 또는 자체 IP 주소 사용(BYOIP) 중에서 선택합니다.
- 할당된 영구 IP 주소를 인식하고 사용하도록 포드 내에서 실행되는 애플리케이션을 구성합니다.
- GKE 포드의 영구 IP 주소에는 GKE Dataplane V2 및 게이트웨이 API가 사용 설정된 클러스터가 필요합니다.
제한사항
- 애플리케이션에서 할당된 영구 IP 주소를 사용하도록 구성해야 합니다. GKE는 IP 주소 구성을 포드의 네트워크 인터페이스에 자동으로 추가하지 않습니다.
- 각 영구 IP 주소를 한 번에 단일 포드와 연결할 수 있습니다.
사용 가능한 포드가 여러 개 있으면 GKE는 일반적으로 트래픽을 일치하는 최신 포드로 보냅니다. 하지만 GKE는 최신 포드가 정상인 경우에만 이를 수행합니다. 즉, 포드의
Ready
조건 상태가 기본적으로True
여야 합니다. 이 동작을 구성하고GKEIPRoute
의reactionMode
설정을 사용하여 변경할 수 있습니다. - GKE에서는 IPv4 주소만 영구 IP 주소로 지원합니다.
- GKE는 Layer 3 또는 기기 유형 멀티 네트워크만 지원합니다.
- DPDK가 아닌 사용 사례에서는 영구 IP 주소를 사용하는 고가용성(HA) 지원이 지원되지 않습니다.
- 단일
GKEIPRoute
에서 IP 주소를 최대 16개까지 지정할 수 있습니다. 더 많은 주소를 구성하려면GKEIPRoute
객체를 여러 개 만들면 됩니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- Google Kubernetes Engine API를 사용 설정합니다. Google Kubernetes Engine API 사용 설정
- 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화하세요. 이전에 gcloud CLI를 설치한 경우
gcloud components update
를 실행하여 최신 버전을 가져옵니다.
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 주소가 있는 네트워크를 정의하여 영구 IP 주소를 사용하도록 포드를 준비합니다.
- 선택한 워크로드의 GKEIPRoute 객체 만들기:
GKEIPRoute
를 구성하여 특정 포드에 영구 IP 주소를 할당합니다. 라벨을 사용하여 올바른 포드를 타겟팅하고 라우팅이 포드 변경사항에 대응하는 방식을 선택적으로 구성할 수 있습니다. - 애플리케이션 인식 구성: 영구 IP 주소를 적극적으로 사용하도록 포드 내 애플리케이션을 구성합니다.
- 모니터링: 게이트웨이 및
GKEIPRoute
객체의 상태를 추적하여 모든 것이 예상대로 작동하는지 확인합니다.
GKE 포드에 영구 IP 주소를 구현하려면 다음 단계를 수행합니다.
1단계: Gateway API 및 GKE Dataplane V2가 사용 설정된 GKE 클러스터 만들기
GKE 포드에서 영구 IP 주소를 구현하는 데 필요한 고급 네트워크 라우팅 및 IP 주소 관리 기능을 사용 설정하려면 다음과 같이 GKE Dataplane V2 클러스터를 만들어야 합니다.
gcloud container clusters create CLUSTER_NAME \
--cluster-version=CLUSTER_VERSION \
--enable-dataplane-v2 \
--enable-ip-alias \
--gateway-api=standard
다음을 바꿉니다.
CLUSTER_NAME
: 클러스터의 이름CLUSTER_VERSION
: 클러스터의 버전
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로 가져온 후에는 개발자가 이 IP 주소를 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 주소를 사용하려면 멀티 네트워크 포드를 설정하고 영구 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: default
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 # point to the right network if you intend to use persistent-ip on additional networks
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: <- Remove these lines if the pods are not multi-nic pods
# 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
클러스터에 매니페스트를 적용합니다.
kubectl apply -f my-ip-route.yaml
추가 네트워크를 사용하는 경우 'blue-network'라는 네트워크가 있는지 확인합니다.
6단계: 포드 내에서 영구 IP 주소 사용
GKEIPRoute를 사용하여 GKE 포드에 영구 IP 주소를 할당해도 애플리케이션에서 자동으로 IP 주소를 사용할 수 있게 되는 것은 아닙니다. 영구 IP 주소는 네트워크 라우팅 수준에서 처리되지만 포드 기본 구성에서는 이를 인식하지 못합니다. 포드 내에서 주소를 인식하고 사용하도록 애플리케이션 구성을 설정해야 합니다. 이를 위해서는 포드에 권한 권한이 필요합니다.
애플리케이션을 구성하려면 다음 옵션을 고려하세요.
- net.ipv4.ip_nonlocal_bind: 애플리케이션에서 인터페이스에 직접 할당되지 않은 IP 주소를 사용할 수 있도록 시스템 설정을 수정합니다.
- ip address add: 애플리케이션 로직 내에서 이 명령어를 사용하여 수동으로 영구 IP 주소를 인터페이스에 추가합니다.
- Raw sockets: 더욱 효율적인 제어를 위해 애플리케이션에서 네트워크 스택과 직접 상호작용할 수 있습니다(고급).
- Userspace IP address stack: 특수한 경우 포드 내에서 개별 애플리케이션이 실행되어 IP 주소를 관리할 수 있습니다(매우 고급).
7단계: 영구 IP 주소에 ARP 사용 설정(기본 네트워크만 해당)
유효한 주소 결정 프로토콜(ARP) 요청 및 응답을 생성하고 기본 네트워크에서 영구 IP 주소를 사용하여 포드에 새 연결을 설정하려면 ARP_ANNOUNCE
변수를 구성해야 합니다.
ARP_ANNOUNCE
변수를 설정하려면 포드에서 다음 명령어를 실행합니다.
echo "2" > /proc/sys/net/ipv4/conf/eth0/ARP_ANNOUNCE
여기서 ARP_ANNOUNCE
변수는 ARP 공지사항이 처리되는 방식을 제어합니다. '2'로 설정하면 영구 IP 주소에 대한 ARP 공지사항이 게시되므로 네트워크의 다른 기기에서 새 연결을 학습할 수 있습니다.
포드 변경 중 영구 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 리소스를 설정하므로 구성 중에 '변경됨' 상태가 표시될 수 있습니다.
해결 방법:
- 대기 및 재시도: 대부분의 경우 구성 프로세스는 짧은 시간 내에 자동으로 완료됩니다. 기다린 후 상태를 확인합니다. 성공하면
Ready
로 변경됩니다. - 추가 조사(필요한 경우): 'Mutated' 상태가 장시간 동안 지속된다면 구성 오류가 있을 수 있습니다.
GKEIPRoute
의 다른 상태 조건을 검토합니다.- Accepted:
GKEIPRoute
설정이 올바른지 여부를 나타냅니다. - DPV2Ready: 노드의 데이터 경로가 올바르게 프로그래밍되었는지 여부를 나타냅니다.
- GCPReady: Google Cloud 리소스가 예상대로 설정되었는지 여부를 나타냅니다.
- Accepted:
이러한 조건에서 문제를 해결하는 데 도움이 되는 오류 메시지를 찾습니다.
다음 단계
- GKE 포드의 영구 IP 주소 정보 읽기
- 포드의 다중 네트워크 지원 설정 알아보기