백엔드 서비스 기반 외부 부하 분산기 만들기

이 페이지에서는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 빌드하는 외부 LoadBalancer 서비스를 배포하는 방법을 설명합니다. 이 페이지를 읽기 전 다음 내용을 숙지해야 합니다.

일반적인 외부 패스 스루 네트워크 부하 분산기에 대해 자세히 알아보려면 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 참고하세요.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

요구사항

  • 클러스터에 HttpLoadBalancing 부가기능이 사용 설정되어 있어야 합니다. 이 부가기능은 기본적으로 사용 설정되어 있습니다. 클러스터에서 백엔드 서비스를 사용하는 부하 분산기를 관리할 수 있습니다.

  • 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 사용하는 외부 LoadBalancer 서비스를 만들려면 GKE 클러스터에서 버전 1.25.5 이상을 사용해야 합니다.

  • 가중치 기반 부하 분산을 사용하는 외부 LoadBalancer 서비스를 만들려면 GKE 클러스터가 버전 1.31.0-gke.1506000 이상을 사용해야 합니다.

  • GCE_VM_IP 네트워크 엔드포인트 그룹 (NEG) 백엔드를 사용하는 외부 LoadBalancer 서비스를 만들려면 GKE 클러스터에서 버전 1.32.2-gke.1652000 이상을 사용해야 합니다.

클러스터 선택

새 클러스터를 만들거나 요구사항을 충족하는 기존 클러스터를 선택할 수 있습니다.

새 클러스터 만들기

Autopilot

새 Autopilot 클러스터를 만들려면 다음 단계를 따르세요.

gcloud container clusters create-auto CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름
  • RELEASE_CHANNEL: 클러스터의 GKE 출시 채널 이름
  • VERSION: 클러스터의 GKE 버전입니다.
  • COMPUTE_LOCATION: 클러스터의 Compute Engine 리전

LoadBalancer 서비스에 대한 자동 VPC 방화벽 규칙 생성을 사용 중지하려면 --disable-l4-lb-firewall-reconciliation 플래그를 포함하세요. 자세한 내용은 GKE LoadBalancer 서비스에 대한 사용자 관리형 방화벽 규칙을 참고하세요.

Standard

새 표준 클러스터를 만들려면 다음 단계를 따르세요.

gcloud container clusters create CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름
  • RELEASE_CHANNEL: 클러스터의 GKE 출시 채널 이름
  • VERSION: 클러스터의 GKE 버전입니다.
  • COMPUTE_LOCATION: 클러스터의 Compute Engine 리전

LoadBalancer 서비스에 대한 자동 VPC 방화벽 규칙 생성을 사용 중지하려면 --disable-l4-lb-firewall-reconciliation 플래그를 포함하세요. 자세한 내용은 GKE LoadBalancer 서비스에 대한 사용자 관리형 방화벽 규칙을 참고하세요.

기존 클러스터 업그레이드

gcloud CLI를 사용하여 기존 클러스터를 업데이트합니다.

gcloud container clusters upgrade CLUSTER_NAME \
    --cluster-version=VERSION \
    --master \
    --location=COMPUTE_LOCATION

다음을 바꿉니다.

LoadBalancer 서비스에 대한 자동 VPC 방화벽 규칙 생성을 사용 중지하려면 --disable-l4-lb-firewall-reconciliation 플래그를 포함하세요. 자세한 내용은 GKE LoadBalancer 서비스에 대한 사용자 관리형 방화벽 규칙을 참고하세요.

샘플 워크로드 배포하기

외부 LoadBalancer 서비스의 제공 포드를 제공하는 다음 샘플 워크로드를 배포합니다.

  1. 다음 샘플 배포를 store-deployment.yaml로 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store
    spec:
      replicas: 20
      selector:
        matchLabels:
          app: store
      template:
        metadata:
          labels:
            app: store
        spec:
          containers:
          - image: gcr.io/google_containers/echoserver:1.10
            imagePullPolicy: Always
            name: echoserver
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
    
  2. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f store-deployment.yaml
    
  3. 배포에 20개의 서빙 포드가 있는지 확인합니다.

    kubectl get pods
    

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

    NAME                     READY   STATUS    RESTARTS   AGE
    store-cdb9bb4d6-s25vw      1/1     Running   0          10s
    store-cdb9bb4d6-vck6s      1/1     Running   0          10s
    ....
    

외부 LoadBalancer 서비스 만들기

  1. 외부 LoadBalancer 서비스를 만들어 샘플 워크로드를 노출합니다.

    1. 다음 서비스 매니페스트를 store-v1-lb-svc.yaml로 저장합니다.

      apiVersion: v1
      kind: Service
      metadata:
        name: store-v1-lb-svc
        annotations:
          cloud.google.com/l4-rbs: "enabled"
      spec:
        type: LoadBalancer
        selector:
          app: store
        ports:
        - name: tcp-port
          protocol: TCP
          port: 8080
          targetPort: 8080
      
    2. 클러스터에 매니페스트를 적용합니다.

      kubectl apply -f store-v1-lb-svc.yaml
      

    이 샘플 매니페스트에 관해 다음 사항에 유의하세요.

    • 서비스 매니페스트는 매니페스트가 클러스터에 처음 적용될 때 cloud.google.com/l4-rbs: "enabled" 주석을 포함해야 합니다. 이렇게 하면 GKE가 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만듭니다. IPv6 및 가중치 부하 분산과 같은 기능을 지원하려면 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기가 필요합니다.

    • GKE는 클러스터 버전에 따라 GCE_VM_IP NEG 백엔드 또는 비관리형 인스턴스 그룹 백엔드를 사용합니다. 버전 1.32.2-gke.1652000이 적용된 클러스터에서 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기는 GCE_VM_IP NEG를 사용합니다. 이전 버전에서는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기가 비관리형 인스턴스 그룹을 사용합니다.

    • 기존 외부 LoadBalancer 서비스의 매니페스트에 cloud.google.com/l4-rbs: "enabled" 주석을 추가하면 (즉, 부하 분산기가 생성된 후) GKE는 주석을 무시합니다. 매니페스트에 이 주석이 없는 외부 LoadBalancer 서비스는 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기를 사용합니다. 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기는 사용하지 않는 것이 좋습니다.

가중치가 적용된 부하 분산 사용 설정

각 노드에 있는 서빙, 준비, 종료되지 않은 포드의 수에 따라 새 연결을 노드에 비례적으로 분산하려면 서비스 매니페스트에 networking.gke.io/weighted-load-balancing: "pods-per-node" 주석을 추가하여 가중치가 적용된 부하 분산을 사용 설정하세요.

  1. store-v1-lb-svc.yaml 서비스 매니페스트에 networking.gke.io/weighted-load-balancing: "pods-per-node" 주석을 추가하고 다음과 같이 externalTrafficPolicy: Local도 설정해야 합니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        cloud.google.com/l4-rbs: "enabled"
        networking.gke.io/weighted-load-balancing: "pods-per-node"
    spec:
      type: LoadBalancer
      externalTrafficPolicy: Local
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    
  2. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f store-v1-lb-svc.yaml
    

가중치가 적용된 부하 분산에 관한 이 예시에서 다음 사항에 유의하세요.

  • 서비스 매니페스트는 externalTrafficPolicy: Local을 사용합니다. 가중치가 적용된 부하 분산을 사용 설정할 필요가 없는 경우 externalTrafficPolicy: Cluster를 사용할 수도 있습니다. externalTrafficPolicy에서 노드 그룹화를 정의하는 방법, 부하 분산기 상태 점검을 통과하는 노드, 패킷 처리 방법에 대한 자세한 내용은 LoadBalancer 서비스 개념을 참고하세요.

  • 가중치가 적용된 부하 분산을 사용 설정하면 GKE는 externalTrafficPolicy: Cluster 사용을 차단하지 않지만 패킷이 부하 분산 후 다른 노드로 라우팅될 수 있으므로 externalTrafficPolicy: Cluster는 가중치가 적용된 부하 분산을 효과적으로 사용 중지합니다.

kubectl edit svc service-name를 사용하여 기존 외부 LoadBalancer 서비스에서 가중치가 적용된 부하 분산을 사용 설정할 수도 있습니다. kubectl edit 명령어를 사용하면 구성된 텍스트 편집기에서 기존 부하 분산기의 서비스 매니페스트가 열리며, 여기에서 매니페스트를 수정하고 변경사항을 저장할 수 있습니다. 기존 외부 LoadBalancer 서비스를 수정할 때는 다음 사항에 유의하세요.

  • 기존 외부 LoadBalancer 서비스로 인해 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기가 생성되어야 합니다. 즉, 매니페스트가 클러스터에 처음 적용되었을 때 기존 외부 LoadBalancer 서비스에 cloud.google.com/l4-rbs: "enabled" 주석이 포함되어 있어야 합니다.

    대상 풀 기반 외부 패스 스루 네트워크 부하 분산기를 사용하는 기존 외부 LoadBalancer 서비스에 networking.gke.io/weighted-load-balancing: "pods-per-node" 주석을 추가해도 아무런 효과가 없습니다.

  • 기존 외부 LoadBalancer 서비스 매니페스트를 업데이트할 때는 externalTrafficPolicy: Local를 설정해야 합니다. externalTrafficPolicy: Cluster를 사용하면 패킷이 부하 분산 후 다른 노드로 라우팅될 수 있으므로 가중치가 적용된 부하 분산이 효과적으로 사용 중지됩니다.

가중치가 적용된 부하 분산 사용 중지

각 노드에 있는 제공 포드 수와 관계없이 새 연결을 노드에 분산하려면 서비스 매니페스트에서 networking.gke.io/weighted-load-balancing: "pods-per-node" 주석을 삭제하여 가중치가 적용된 부하 분산을 사용 중지합니다.

외부 LoadBalancer 서비스 및 구성요소 확인

  1. 서비스가 실행 중인지 확인합니다.

    kubectl get svc store-v1-lb-svc
    

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

    NAME               TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
    store-v1-lb-svc   LoadBalancer   10.44.196.160     35.193.28.231   8080:32466/TCP   11m
    

    GKE가 외부 패스 스루 네트워크 부하 분산기에 EXTERNAL_IP를 할당했습니다.

  2. 부하 분산기에 대한 연결을 테스트합니다.

    curl EXTERNAL_IP:PORT
    

    다음을 바꿉니다.

    • EXTERNAL_IP: 외부 네트워크 부하 분산기에 할당된 IP 주소입니다.
    • PORT: 외부 패스 스루 네트워크 부하 분산기에 할당된 포트 번호입니다.

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

    Hostname: store-v1-lb-svc-cdb9bb4d6-hflxd
    
    Pod Information:
      -no pod information available-
    
    Server values:
      server_version=nginx: 1.13.3 - lua: 10008
    
    Request Information:
      client_address=10.128.0.50
      method=GET
      real path=/
      query=
      request_version=1.1
      request_scheme=http
      request_uri=EXTERNAL_IP
    
    Request Headers:
      accept=*/*
      host=EXTERNAL_IP
      user-agent=curl/7.81.0
    
    Request Body:
      -no body in request-
    
    
  3. LoadBalancer 서비스와Google Cloud 리소스를 설명하는 주석 집합을 확인합니다.

    kubectl describe svc store-v1-lb-svc
    

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

    Name:                     my-service-external
    Namespace:                default
    Labels:                   <none>
    Annotations:              cloud.google.com/l4-rbs: enabled
                              cloud.google.com/neg-status: {"network_endpoint_groups":{"0":"k8s2-qvveq1d8-default-my-service-ext-5s55db85"},"zones":["us-central1-c"]} #This annotation appears in the output only if the service uses NEG backends.
                              networking.gke.io/weighted-load-balancing: pods-per-node #This annotation appears in the output only if weighted load balancing is enabled.
                              service.kubernetes.io/backend-service: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule-for-hc: k8s2-qvveq1d8-default-my-service-ext-5s55db85-fw
                              service.kubernetes.io/healthcheck: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/tcp-forwarding-rule: a808124abf8ce406ca51ab3d4e7d0b7d
    Selector:                 app=my-app
    Type:                     LoadBalancer
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.18.102.23
    IPs:                      10.18.102.23
    LoadBalancer Ingress:     35.184.160.229
    Port:                     tcp-port  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 tcp-port  31864/TCP
    Endpoints:                10.20.1.28:8080,10.20.1.29:8080
    Session Affinity:         None
    External Traffic Policy:  Local
    HealthCheck NodePort:     30394
    
    Events:
      Type    Reason                Age                    From                     Message
      ----    ------                ----                   ----                     -------
      Normal  ADD                   4m55s                  loadbalancer-controller  default/my-service-ext
    

    백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기 및 Google Cloud 리소스가 성공적으로 만들어졌음을 나타내는 몇 가지 필드가 있습니다.

    • Events 필드: LoadBalancer 서비스와 리소스가 성공적으로 생성되면 이 필드가 비어 있습니다. 오류가 발생한 경우 여기에 표시됩니다.
    • 사용 설정된 Annotations 목록: GKE에서 다음 읽기 전용 주석 목록을 서비스 매니페스트에 추가합니다. 이름이 service.kubernetes.io/로 시작하는 각 주석을 사용해 부하 분산기의 일부로 또는 부하 분산기를 지원하기 위해 생성된Google Cloud 리소스의 이름을 나타냅니다.

      • networking.gke.io/weighted-load-balancing: pods-per-node 주석은 가중치가 적용된 부하 분산이 적용되었으며 부하 분산기가 각 노드에서 실행되는 포드 수를 기준으로 백엔드 포드에 트래픽을 분산함을 나타냅니다.
      • service.kubernetes.io/backend-service 주석은 부하 분산기의 백엔드 서비스 이름을 나타냅니다.
      • service.kubernetes.io/healthcheck 주석은 백엔드 서비스에서 사용하는 부하 분산기 상태 점검의 이름을 나타냅니다.
      • service.kubernetes.io/tcp-forwarding-rule 또는 service.kubernetes.io/udp-forwarding-rule 주석은 부하 분산기의 전달 규칙 이름을 나타냅니다.
      • service.kubernetes.io/firewall-rule 주석은 클러스터 노드로의 트래픽을 허용하기 위해 생성된 방화벽 규칙의 이름을 나타냅니다. 이 방화벽 규칙의 소스 범위는 spec.loadBalancerSourceRanges[]를 사용하여 맞춤설정할 수 있습니다. LoadBalancer 서비스의 방화벽 규칙에 관한 자세한 내용은 방화벽 규칙 및 소스 IP 주소 허용 목록을 참고하세요.
      • service.kubernetes.io/firewall-rule-for-hc 주석은 부하 분산기 상태 점검에 필요한 방화벽 규칙의 이름을 나타냅니다.
      • cloud.google.com/neg-status 주석은 부하 분산기에서 사용되는 NEG와 해당 영역을 모두 나타냅니다. 이 주석은 다음 두 가지가 모두 참인 경우에만 표시됩니다.

        • 매니페스트가 클러스터에 적용되었을 때 클러스터가 GKE 버전 1.32.2-gke.1652000 이상을 실행하고
        • 서비스 매니페스트가 클러스터에 적용될 때 cloud.google.com/l4-rbs: "enabled" 주석이 있었습니다.
  4. 외부 LoadBalancer 서비스의 부하 분산기 리소스 및 방화벽 규칙이 생성되었는지 확인합니다.

    • 전달 규칙을 확인하려면 다음 명령어를 실행합니다.

        gcloud compute forwarding-rules describe FWD_RULE_NAME \
          --region=REGION_NAME
      

      다음을 바꿉니다.

      • FWD_RULE_NAME: service.kubernetes.io/tcp-forwarding-rule 또는 service.kubernetes.io/udp-forwarding-rule 읽기 전용 주석에서 제공하는 전달 규칙 이름입니다. 이러한 주석을 확인하려면 kubectl describe svc SERVICE_NAME을 실행하세요.
      • REGION_NAME: 클러스터가 포함된 Google Cloud 리전입니다. 영역 클러스터의 경우 클러스터에서 사용되는 영역이 리전에 포함됩니다.
    • 백엔드 서비스를 확인하려면 다음 명령어를 실행합니다.

      gcloud compute backend-services describe BACKEND_SERVICE_NAME \
        --region=REGION_NAME
      

      다음을 바꿉니다.

      • BACKEND_SERVICE_NAME: service.kubernetes.io/backend-service 읽기 전용 주석에서 제공하는 백엔드 서비스의 이름입니다. 이 읽기 전용 주석을 확인하려면 kubectl describe svc SERVICE_NAME을 실행하세요.
      • REGION_NAME: 클러스터가 포함된 Google Cloud 리전입니다. 영역 클러스터의 경우 클러스터에서 사용되는 영역이 리전에 포함됩니다.
    • 부하 분산기 상태 점검을 보려면 다음 명령어를 실행합니다.

      gcloud compute health-checks describe HEALTH_CHECK_NAME \
        --region=REGION_NAME
      

      다음을 바꿉니다.

      • HEALTH_CHECK_NAME: 부하 분산기의 상태 점검 이름입니다. 상태 점검의 이름은 service.kubernetes.io/healthcheck 읽기 전용 주석에 의해 제공됩니다. 이 읽기 전용 주석을 확인하려면 kubectl describe svc SERVICE_NAME을 실행하세요.
      • REGION_NAME: 클러스터가 포함된 Google Cloud 리전입니다. 영역 클러스터의 경우 클러스터에서 사용되는 영역이 리전에 포함됩니다.
    • 방화벽 규칙을 보려면 다음 명령어를 실행합니다.

      gcloud compute firewall-rules describe FIREWALL_RULE_NAME \
      gcloud compute firewall-rules describe HEALTH_CHECK_FIREWALL_RULE_NAME
      

      다음을 바꿉니다.

      • FIREWALL_RULE_NAME: 부하 분산기에 대한 트래픽을 허용하는 방화벽 규칙의 이름입니다. 이 방화벽 규칙의 이름은 service.kubernetes.io/firewall-rule 읽기 전용 주석에 의해 제공됩니다. 이 읽기 전용 주석을 확인하려면 kubectl describe svc SERVICE_NAME을 실행하세요.
      • HEALTH_CHECK_FIREWALL_RULE_NAME: 부하 분산기의 백엔드(클러스터 노드)의 상태 점검을 허용하는 방화벽 규칙의 이름입니다. 이 방화벽 규칙의 이름은 service.kubernetes.io/firewall-rule-for-hc 읽기 전용 주석에서 제공합니다. 이 읽기 전용 주석을 확인하려면 kubectl describe svc SERVICE_NAME을 실행하세요.
    • 부하 분산기 NEG를 보려면 다음 명령어를 실행합니다.

      gcloud compute network-endpoint-groups describe NEG_NAME \
        --zone=ZONE_NAME
      

      다음을 바꿉니다.

      • NEG_NAME: 부하 분산기의 NEG 이름입니다. NEG의 이름은 cloud.google.com/neg-status 읽기 전용 주석에 의해 제공됩니다. 이 읽기 전용 주석을 확인하려면 kubectl describe svc SERVICE_NAME 명령어를 실행하세요. 주석에는 부하 분산기에서 사용되는 NEG 이름과 영역에 관한 정보가 포함된 구조화된 데이터가 포함됩니다. 영역 클러스터의 경우 이 주석에는 하나의 NEG에 관한 정보가 포함됩니다. 리전 클러스터의 경우 이 주석에는 클러스터가 있는 각 영역의 NEG에 관한 정보가 포함됩니다.
      • ZONE_NAME: NEG가 포함된 Google Cloud 영역입니다.

외부 LoadBalancer 서비스 삭제

샘플 store-v1-lb-svc 외부 LoadBalancer 서비스를 삭제하려면 다음 명령어를 사용하세요.

kubectl delete service store-v1-lb-svc

GKE는 외부 LoadBalancer 서비스를 위해 생성한 모든 부하 분산기 리소스를 자동으로 삭제합니다.

GCE_VM_IP NEG 백엔드로 이전

cloud.google.com/l4-rbs: "enabled" 주석이 있는 외부 LoadBalancer 서비스는 클러스터의 GKE 버전에 따라 GCE_VM_IP 네트워크 엔드포인트 그룹 또는 인스턴스 그룹 백엔드를 사용하는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만듭니다.

  • GKE 버전 1.32.2-gke.1652000 이상을 실행하는 클러스터에 서비스 매니페스트가 적용된 경우 결과 외부 패스 스루 네트워크 부하 분산기는 GCE_VM_IP 네트워크 엔드포인트 그룹 (NEG) 백엔드를 사용합니다.

  • 이전 GKE 버전을 실행하는 클러스터에 서비스 매니페스트가 적용된 경우 결과 외부 패스 스루 네트워크 부하 분산기는 비관리형 인스턴스 그룹 백엔드를 사용합니다.

자세한 내용은 LoadBalancer 서비스 정보의 노드 그룹화를 참고하세요.

기존 서비스에서 다음 부하 분산기 중 하나를 사용하는 경우 GCE_VM_IP NEG 백엔드를 사용하는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기로 구동되는 새 외부 LoadBalancer 서비스를 만들 수 있습니다.

  • 인스턴스 그룹 백엔드가 있는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기
  • 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기

GCE_VM_IP NEG 백엔드를 사용하는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기로 전환하려면 다음 단계를 따르세요.

  1. 아직 클러스터를 GKE 버전 1.32.2-gke.1652000 이상으로 업그레이드하지 않은 경우 업그레이드합니다.

  2. GCE_VM_IP NEG 백엔드를 사용하여 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기로 전환할 외부 LoadBalancer 서비스를 식별합니다. 다음 명령어를 사용하여 서비스를 설명합니다.

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    다음을 바꿉니다.

    • SERVICE_NAME: 기존 외부 LoadBalancer 서비스의 이름입니다.

    • SERVICE_NAMESPACE: 기존 외부 LoadBalancer 서비스의 네임스페이스

    명령어 출력의 EXTERNAL-IP 열에서 기존 부하 분산기에서 사용하는 외부 IPv4 주소를 확인합니다.

  3. 기존 LoadBalancer 서비스의 서비스 매니페스트를 가져옵니다.

    • 이전에 클러스터에 적용한 원래 서비스 매니페스트가 있는 것이 가장 좋습니다. 예를 들어 소스 제어 저장소에 있을 수 있습니다.

    • 원본 서비스 매니페스트가 없는 경우 다음 단계를 따르세요.

      • 다음 명령어를 실행하여 부하 분산기의 현재 구현을 나타내는 서비스 매니페스트의 YAML 사본을 가져옵니다.

        kubectl get svc SERVICE_NAME -n SERVICE_NAMESPACE -o yaml
        
      • 매니페스트 YAML을 텍스트 편집기에 복사합니다. status 속성과 다음 metadata 속성을 삭제합니다.

        • 다음 주석 모두:
          • kubectl.kubernetes.io/last-applied-configuration 주석
          • service.kubernetes.io로 시작하는 모든 주석
        • creationTimestamp
        • finalizers
        • resourceVersion
        • uid
    • 매니페스트에 cloud.google.com/l4-rbs: "enabled" 주석이 포함되어 있는지 확인합니다. 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기에서 마이그레이션하는 경우 주석을 추가해야 합니다.

    서비스 매니페스트 파일이 포함된 로컬 경로를 확인합니다. 이 절차의 나머지 부분에서는 경로를 MANIFEST_FILE_PATH이라고 합니다.

  4. 기존 부하 분산기에서 사용하는 외부 IPv4 주소를 보유하도록 고정 외부 IPv4 주소 리소스를 구성합니다.

    gcloud compute addresses create IP_ADDRESS_NAME --region=CLUSTER_REGION --addresses LB_EXTERNAL_IP
    

    다음을 바꿉니다.

    • IP_ADDRESS_NAME: 고정 외부 IP 주소의 이름입니다. 이름은 Compute Engine 리소스의 이름 지정 규칙을 준수해야 합니다.

    • CLUSTER_REGION: 클러스터가 포함된 리전 영역 클러스터의 경우 클러스터의 영역이 포함된 리전입니다.

    • LB_EXTERNAL_IP: 이 절차의 두 번째 단계에서 결정된 현재 부하 분산기에서 사용하는 외부 IPv4 주소입니다.

  5. 고정 외부 IPv4 주소 리소스가 생성되었는지 확인합니다.

    gcloud compute addresses describe IP_ADDRESS_NAME --region=CLUSTER_REGION
    

    이전 단계에 표시된 대로 변수를 바꿉니다.

  6. 기존 서비스를 삭제합니다.

    kubectl delete svc SERVICE_NAME -n SERVICE_NAMESPACE
    
  7. MANIFEST_FILE_PATH 서비스 매니페스트 파일에 다음 주석을 추가합니다.

    networking.gke.io/load-balancer-ip-addresses: IP_ADDRESS_NAME
    

    이 주석에 대한 자세한 내용은 LoadBalancer 서비스 매개변수의 고정 IP 주소를 참고하세요.

  8. 업데이트된 서비스 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f MANIFEST_FILE_PATH
    
  9. (선택사항) 고정 IPv4 주소 리소스를 해제합니다.

    gcloud compute addresses delete IP_ADDRESS_NAME --region=CLUSTER_REGION
    

문제 해결

이 섹션에서는 가중치가 적용된 부하 분산을 구성할 때 발생할 수 있는 문제를 설명합니다.

가중치가 적용된 부하 분산에 잘못된 외부 트래픽 정책

가중치 부하 분산을 사용 설정할 때 externalTrafficPolicy: Local를 설정하지 않으면 다음 명령어를 사용하여 서비스를 설명할 때 경고 이벤트가 표시될 수 있습니다.

kubectl describe svc store-v1-lb-svc`
Events:
  Type     Reason                   Age      From                     Message
  ----     ------                   ----     ----                     -------
  Warning  UnsupportedConfiguration 4m55s    loadbalancer-controller  Weighted load balancing by pods-per-node has no effect with External Traffic Policy: Cluster.

가중치가 적용된 부하 분산을 효과적으로 사용 설정하려면 externalTrafficPolicy: Local를 설정해야 합니다.

다음 단계