GKE 포드에서 영구 IP 주소로 통신 제어


이 페이지에서는 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여야 합니다. 이 동작을 구성하고 GKEIPRoutereactionMode 설정을 사용하여 변경할 수 있습니다.
  • 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 주소 지원은 미리보기 상태이며 GKE Enterprise가 사용 설정된 프로젝트에 있는 클러스터에서만 지원됩니다. Google Kubernetes Engine(GKE) Enterprise 버전 사용 설정 시 적용되는 요금을 알아보려면 GKE Enterprise 가격 책정을 참조하세요.

GKE 포드의 영구 IP 주소 구현

GKE의 영구 IP 주소는 포드 자체가 업데이트되거나 이동되더라도 포드에 안정적인 네트워크 ID를 제공할 수 있는 방법을 제공합니다.

이 섹션에는 GKE 포드의 영구 IP 주소를 구현하기 위한 워크플로가 요약되어 있습니다.

  1. 클러스터 만들기: Gateway API, GKE Dataplane V2, 다중 네트워킹이 사용 설정된 클러스터를 만듭니다.
  2. IP 주소 예약: 외부(공개적으로 액세스 가능) 또는 내부(Google Cloud 전용) IP 주소 중 무엇이 필요한지 결정하고 해당 IP 주소를 예약합니다. GKE 클러스터와 동일한 리전을 선택합니다.
  3. 게이트웨이 만들기: 예약된 영구 IP 주소를 저장하는 Kubernetes Gateway 객체를 구성하고 클러스터에서 이러한 영구 IP 주소를 사용할 수 있는 포드에 대한 규칙(GKEIPRoutes)을 만들 수 있습니다.
  4. 영구 IP 주소에 대한 추가 네트워크로 워크로드 만들기 또는 식별: 여러 네트워크 인터페이스를 사용 설정하고 영구 IP 주소가 있는 네트워크를 정의하여 영구 IP 주소를 사용하도록 포드를 준비합니다.
  5. 선택한 워크로드의 GKEIPRoute 객체 만들기: 특정 포드에 영구 IP 주소를 할당하도록 GKEIPRoute를 구성합니다. 라벨을 사용하여 올바른 포드를 타겟팅할 수 있으며 라우팅이 포드 변경사항에 대응하는 방식을 선택적으로 구성할 수 있습니다.
  6. 애플리케이션 인식 구성: 영구 IP 주소를 적극적으로 사용하도록 포드 내 애플리케이션을 구성합니다.
  7. 모니터링: 게이트웨이 및 GKEIPRoute 객체의 상태를 추적하여 모든 것이 예상대로 작동하는지 확인합니다.

GKE 포드에 영구 IP 주소를 구현하려면 다음 단계를 수행합니다.

1단계: GKE Dataplane V2 및 다중 네트워킹이 사용 설정된 GKE 클러스터 만들기

GKE 포드에서 영구 IP 주소를 구현하는 데 필요한 고급 네트워크 라우팅 및 IP 주소 관리 기능을 사용 설정하려면 GKE Dataplane V2 및 다중 네트워킹이 사용 설정된 클러스터를 만들어야 합니다.

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 객체를 사용합니다.

  1. 적절한 클래스의 Kubernetes Gateway 객체를 만듭니다.
    • gke-persistent-regional-external-managed: 외부(공개) IP 주소의 경우
    • gke-persistent-regional-internal-managed: 내부(Google Cloud 전용) IP 주소의 경우
  2. Gateway의 주소 섹션에서 이 Gateway가 관리하는 영구 IP 주소(Google 제공 또는 BYOIP)를 나열합니다.
  3. Listeners 섹션을 사용하여 Gateway의 IP 주소를 잠재적으로 사용할 수 있는 포드(및 연관된 GKEIPRoute 객체)를 확인합니다. ListenersGKEIPRoute 객체가 있는 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 주소는 네트워크 라우팅 수준에서 처리되지만 포드의 기본 구성은 이를 인식하지 못합니다. 포드 내에서 주소를 인식하고 사용하도록 애플리케이션 구성을 설정해야 합니다. 이를 위해서는 포드에 권한 권한이 필요합니다.

애플리케이션을 구성하려면 다음 옵션을 고려하세요.

  1. net.ipv4.ip_nonlocal_bind: 애플리케이션이 해당 인터페이스에 직접 할당되지 않은 IP 주소를 사용할 수 있도록 시스템 설정을 수정합니다.
  2. ip address add: 애플리케이션의 로직 내에서 이 명령어를 사용하여 영구 IP 주소를 인터페이스에 수동으로 추가합니다.
  3. Raw sockets: 보다 세부적인 제어를 위해 애플리케이션이 네트워크 스택과 직접 상호작용할 수 있습니다(고급).
  4. 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 상태가 아니면 트래픽을 처리할 수 없으므로 선택되지 않습니다.

해결 방법

  1. 라벨 확인: GKEIPRoute's podSelector의 라벨이 의도한 포드에 적용한 라벨과 일치하는지 다시 확인합니다.
  2. 포드 존재 확인: 올바른 라벨이 있는 포드가 실제로 Gateway의 Listeners에 지정된 GKEIPRoute's 네임스페이스에 있는지 확인합니다. reactionMode == Exists인 경우 pod.Spec.nodeName 필드를 확인하여 포드가 노드에 할당되었는지 확인합니다.
  3. 포드 준비 확인: reactionMode == ReadyCondition인 경우 포드 상태가 READY인지 확인합니다. 다음 명령어를 사용하여 포드가 Ready 상태인지 확인합니다.

    kubectl get pods -n <namespace>
    

    다른 상태(예: '대기 중', '오류')의 포드는 선택되지 않습니다.

  4. 할당된 영구 IP 주소에서 응답하도록 포드를 구성합니다.

일치하는 포드가 있고 영구 IP 주소 프로그래밍이 진행 중인 경우 Mutated

증상

GKEIPRoute 상태가 'Mutated'로 표시됩니다. 이는 일치하는 포드의 영구 IP 주소 구성이 진행 중임을 나타냅니다.

잠재적 원인:

시스템에서 영구 IP 주소의 GKE 데이터 경로와 Google Cloud 리소스를 설정하므로 구성 중에 'Mutated' 상태가 표시될 수 있습니다.

해결 방법:

  1. 대기 및 재시도: 대부분의 경우 구성 프로세스는 짧은 시간 내에 자동으로 완료됩니다. 기다린 후 상태를 확인합니다. 성공하면 Ready로 변경됩니다.
  2. 추가 조사(필요한 경우): 'Mutated' 상태가 장시간 동안 지속된다면 구성 오류가 있을 수 있습니다. GKEIPRoute의 다른 상태 조건을 검토합니다.
    • Accepted: GKEIPRoute 설정이 올바른지 여부를 나타냅니다.
    • DPV2Ready: 노드의 데이터 경로가 올바르게 프로그래밍되었는지 여부를 나타냅니다.
    • GCPReady: Google Cloud 리소스가 예상대로 설정되었는지 여부를 나타냅니다.

이러한 조건에서 문제를 해결하는 데 도움이 되는 오류 메시지를 찾습니다.

다음 단계