hostPort를 사용하여 Autopilot 포드에 대한 직접 연결 허용


이 페이지에서는 Google Kubernetes Engine(GKE) Autopilot 클러스터에서 실행되는 포드에서 임의의 포트를 노출하는 방법을 보여줍니다.

포드에 포트를 노출하면 포드가 부하 분산기 없이 직접 수신 연결을 수락합니다. GKE는 포드 사양에 지정한 범위에서 열 임의의 포트를 선택합니다. 이러한 유형의 임의의 포트 노출은 워크로드에 직접 수신 연결이 필요하지만 영구 포트 번호를 사용하지 않는 경우에 유용합니다. 이 유형의 워크로드 예시로는 기본 Dynamic 포트 정책이 적용된 Agones GameServer 리소스가 있습니다.

임의의 포트를 요청하면 GKE는 컨테이너 사양의 hostPort 필드 값을 GKE에서 자동으로 선택한 포트로 재정의합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.
  • 버전 1.24.7-gke.1200 이상 또는 1.25.3-gke.1100 이상을 실행하는 GKE Autopilot 클러스터가 있는지 확인합니다.

제한사항

정적 포드 또는 Agones와 같은 커스텀 컨트롤러에서 관리하는 포드에만 임의의 hostPort를 할당할 수 있습니다. 배포와 같은 Kubernetes 관리형 컨트롤러에서는 이 기능을 지원하지 않습니다.

임의의 포트 요청

  1. 다음 매니페스트를 host-port-pod.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: game-pod
      annotations:
        autopilot.gke.io/host-port-assignment: '{"min":MIN_PORT,"max":MAX_PORT}'
    spec:
      containers:
      - name: local-chat
        image: ubuntu
        ports:
        - containerPort: 80
          hostPort: HOST_PORT1
          protocol: tcp
      - name: game-server
        image: ubuntu
        ports:
        - containerPort: 80
          hostPort: HOST_PORT2
          protocol: udp
    

    다음을 바꿉니다.

    • MIN_PORT: GKE가 임의의 포트를 선택하는 범위의 최소 포트 번호
    • MAX_PORT: GKE가 임의의 포트를 선택하는 범위의 최대 포트 번호
    • HOST_PORT1, HOST_PORT2: 유효한 포트 번호. 포드가 예약되면 GKE는 이 필드를 무작위로 할당된 포트로 업데이트합니다. 컨테이너가 여러 개인 경우 컨테이너마다 다른 포트 번호를 사용하세요.

    포트 범위(MAX_PORTMIN_PORT의 차이)는 1,000개 이상의 포트여야 합니다.

  2. 매니페스트 적용

    kubectl apply -f host-port-pod.yaml
    

매니페스트를 적용할 때 GKE는 범위에서 무작위로 포트를 선택하고 포트를 컨테이너에 할당합니다. GKE에서 같은 포트 값을 두 포드에 할당하면 GKE는 포트 충돌이 방지되도록 자동으로 별도의 노드에 포드를 배치합니다.

할당된 포트 확인

GKE에서 컨테이너에 할당한 포트 번호를 찾으려면 포드를 검사합니다.

kubectl get pod game-pod --output=yaml

출력은 다음과 비슷합니다.

apiVersion: v1
kind: Pod
metadata:
  annotations:
    autopilot.gke.io/host-port-assignment: '{"min":MIN_PORT,"max":MAX_PORT,"portsAssigned":{"HOST_PORT1":7300,"HOST_PORT2":7450}}'
  name: game-pod
  namespace: default
spec:
  containers:
  - name: local-chat
    image: ubuntu
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      hostPort: 7300
      protocol: TCP
  - name: game-server
    image: ubuntu
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
      hostPort: 7450
      protocol: UDP

이 출력에서 각 항목의 의미는 다음과 같습니다.

  • metadata.annotations.autopilot.gke.io/host-port-assignment: 각 컨테이너에 설정한 hostPort의 원래 값과 GKE가 할당한 hostPort의 업데이트된 값을 표시하는 포트 할당. 이 필드는 포드 사양에서 포트 여러 개를 요청한 경우에 유용합니다.
  • spec.containers.ports.hostPort: GKE가 각 컨테이너에 할당한 열린 포트

다음 단계

GitHub의 Autopilot에서 Agones 지원 추적하기