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


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

백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기

클러스터 관리자는 클러스터 외부의 클라이언트가 서비스의 포드로 패킷을 전송할 수 있도록 외부 LoadBalancer 서비스를 만들 수 있습니다. 다음 다이어그램은 2개의 외부 LoadBalancer 서비스(store-v1-lb-svcstore-v2-lb-svc)에 대해 생성된 2개의 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 보여줍니다. 두 부하 분산기 모두 클러스터의 노드에 패킷을 배포하며 노드에서는 패킷을 제공 포드로 라우팅합니다.

리전 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기로 지원되는 외부 LoadBalancer 서비스

이 가이드에서는 다음 단계에 따라 store-v1-lb-svc라는 이름의 외부 LoadBalancer 서비스를 설정하는 방법을 보여줍니다.

  1. HttpLoadBalancing 부가기능이 사용 설정된 클러스터를 만듭니다.
  2. cloud.google.com/l4-rbs 주석이 포함된 서비스를 만듭니다. 이 주석은 GKE에서 리전 백엔드 서비스를 사용하는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만들도록 지시합니다.
  3. 부하 분산기가 store-v1-lb-svc 서비스의 포드에 패킷을 전송하는지 확인합니다. 또한 GKE가 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기의 구성요소를 만들었는지 확인합니다.

    • 전달 규칙
    • 리전별 백엔드 서비스
    • 인스턴스 그룹
    • 상태 점검
    • VPC 방화벽 규칙
  4. store-v1-lb-svc 외부 LoadBalancer 서비스를 삭제합니다.

시작하기 전에

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

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

클러스터 설정

클러스터 만들기

gcloud CLI를 사용하여 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기 생성을 지원하는 새 클러스터를 만듭니다.

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

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름
  • RELEASE_CHANNEL: 클러스터의 GKE 출시 채널 이름
  • VERSION: 클러스터의 GKE 버전으로 1.24.9 이상이어야 함
  • COMPUTE_LOCATION: 클러스터의 Compute Engine 리전

새 클러스터에는 기본적으로 HttpLoadBalancing 부가기능이 사용 설정되어 있습니다. 이 부가기능은 컨트롤 플레인이 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만들고 관리하는 데 필요합니다.

기존 클러스터 업그레이드

gcloud CLI를 사용하여 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기의 생성을 지원할 수 있도록 기존 클러스터를 업데이트합니다.

  1. 컨트롤 플레인을 GKE 버전 1.24.9 이상으로 업그레이드합니다.

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

    다음을 바꿉니다.

외부 LoadBalancer 서비스 만들기

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

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store
    spec:
      replicas: 2
      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. 배포에 두 개의 제공 포드가 있는지 확인합니다.

    kubectl get pods
    

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

    NAME                     READY   STATUS    RESTARTS   AGE
    store-cdb9bb4d6-s25vw      1/1     Running   0          10s
    store-cdb9bb4d6-vck6s      1/1     Running   0          10s
    
  4. 다음 서비스 매니페스트를 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
      externalTrafficPolicy: Cluster
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    

    이 외부 LoadBalancer 서비스는 기본 externalTrafficPolicyCluster를 사용합니다. externalTrafficPolicy에서 노드 그룹화를 정의하는 방법, 부하 분산기 상태 점검을 통과하는 노드, 패킷 처리에 대한 자세한 내용은 LoadBalancer 서비스 개념을 참조하세요.

    IPv4/IPv6 이중 스택 클러스터를 사용하는 경우 spec.ipFamilyPolicyipFamilies를 추가하여 GKE가 서비스에 IP 주소를 할당하는 방법을 정의합니다. ipFamilyPolicyipFamilies 사양을 사용할 때 다음 조건을 고려하세요.

    • 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만들면 GKE는 IPv4/IPv6 듀얼 스택 클러스터에서 생성된 새 서비스에 cloud.google.com/l4-rbs 주석을 자동으로 추가합니다. 하지만 기존 서비스 매니페스트에 cloud.google.com/l4-rbs: "enabled" 주석을 추가하면 클러스터에 이미 있는 LoadBalancer 서비스는 IPv4에만 해당하는 대상 풀 기반 외부 패스 스루 네트워크 부하 분산기를 계속 사용합니다. 자세한 내용은 노드 그룹화를 참조하세요.
    • GKE는 단일 스택(IPv4 또는 IPv6만) 또는 이중 스택 LoadBalancer 서비스를 할당할 수 있습니다. 이중 스택 LoadBalancer 서비스는 두 개의 개별 외부 패스 스루 네트워크 부하 분산기 전달 규칙으로 구현됩니다. 하나는 IPv4를 통해 TCP 트래픽을 처리하는 규칙이고 다른 하나는 IPv6를 통해 TCP 트래픽을 처리합니다. 자세한 내용은 서비스를 참조하세요.
  5. 클러스터에 매니페스트를 적용합니다.

    kubectl apply -f store-v1-lb-svc.yaml
    
  6. 서비스가 실행 중인지 확인합니다.

    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를 할당했습니다.

  7. 부하 분산기 연결을 테스트합니다.

    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-
    
    

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

  1. LoadBalancer 서비스와 Google Cloud 리소스를 설명하는 주석 집합을 확인합니다.

    kubectl describe svc store-v1-lb-svc
    

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

    Name:                     store-v1-lb-svc
    Namespace:                default
    Labels:                   <none>
    Annotations:              cloud.google.com/l4-rbs: enabled
                              service.kubernetes.io/backend-service: k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
                              service.kubernetes.io/firewall-rule: k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
                              service.kubernetes.io/firewall-rule-for-hc: k8s2-c086604n-l4-shared-hc-fw
                              service.kubernetes.io/healthcheck: k8s2-c086604n-l4-shared-hc
                              service.kubernetes.io/tcp-forwarding-rule: a683373f85bfe433ba929a50ca8d72e2
    Selector:                 app=store
    Type:                     LoadBalancer
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.44.196.160
    IPs:                      10.44.196.160
    LoadBalancer Ingress:     35.193.28.231
    Port:                     tcp-port  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 tcp-port  32466/TCP
    Endpoints:                10.48.0.5:8080,10.48.2.8:8080
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:
      Type    Reason                Age                   From                     Message
      ----    ------                ----                  ----                     -------
      Normal  ADD                   2m42s                 loadbalancer-controller  default/store-v1-lb-svc
      Normal  EnsuringLoadBalancer  102s (x2 over 2m42s)  service-controller       Ensuring load balancer
      Normal  Annotations           102s                  loadbalancer-controller  map[cloud.google.com/l4-rbs:enabled kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"Service","metadata":{"annotations":
    {"cloud.google.com/l4-rbs":"enabled"},"name":"store-v1-lb-svc","namespace":"default"}
    ,"spec":{"externalTrafficPolicy":"Cluster","ports":
    [{"name":"tcp-port","port":8080,"protocol":"TCP","targetPort":8080}],
    "selector":{"app":"store"},"type":"LoadBalancer"}}
    ] -> map[cloud.google.com/l4-rbs:enabled
    kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":
    "Service","metadata":{"annotations":{"cloud.google.com/l4-rbs":"enabled"},
    "name":"store-v1-lb-svc","namespace":"default"},"spec":{"externalTrafficPolicy"
    :"Cluster","ports":[{"name":"tcp-port","port":8080,"protocol":"TCP","targetPort"
    :8080}],"selector":{"app":"store"},"type":"LoadBalancer"}}
    service.kubernetes.io/backend-service:k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
    service.kubernetes.io/firewall-rule:k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
    service.kubernetes.io/firewall-rule-for-hc:k8s2-c086604n-l4-shared-hc-fw
    service.kubernetes.io/healthcheck:k8s2-c086604n-l4-shared-hc
    service.kubernetes.io/tcp-forwarding-rule:a683373f85bfe433ba929a50ca8d72e2]
    Normal  SyncLoadBalancerSuccessful  16s (x3 over 102s)  loadbalancer-controller  Successfully ensured L4 External LoadBalancer resources
    

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

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

    • 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 주석은 부하 분산기 상태 점검에 필요한 방화벽 규칙의 이름을 나타냅니다.

  2. 외부 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을 실행하세요.

외부 LoadBalancer 서비스 및 구성요소 삭제

store-v1-lb-svc 외부 LoadBalancer 서비스를 삭제합니다.

kubectl delete service store-v1-lb-svc

GKE에서 다음 리소스를 삭제합니다.

  • 부하 분산기의 전달 규칙입니다.
  • 부하 분산기의 백엔드 서비스
  • 부하 분산기의 상태 점검
  • 부하 분산기와 상태 점검 트래픽에 필요한 VPC 방화벽 규칙
  • 영역별 비관리형 인스턴스 그룹 백엔드(GKE가 이를 클러스터에서 만든 다른 부하 분산기의 백엔드로 사용할 필요가 없는 경우에만 해당)

다음 단계