이 페이지에서는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 빌드하는 외부 LoadBalancer 서비스를 배포하는 방법을 설명합니다. 이 페이지를 읽기 전 다음 내용을 숙지해야 합니다.
백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기
클러스터 관리자는 클러스터 외부의 클라이언트가 서비스의 포드로 패킷을 전송할 수 있도록 외부 LoadBalancer 서비스를 만들 수 있습니다. 다음 다이어그램은 2개의 외부 LoadBalancer 서비스(store-v1-lb-svc
및 store-v2-lb-svc
)에 대해 생성된 2개의 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 보여줍니다. 두 부하 분산기 모두 클러스터의 노드에 패킷을 배포하며 노드에서는 패킷을 제공 포드로 라우팅합니다.
이 가이드에서는 다음 단계에 따라 store-v1-lb-svc
라는 이름의 외부 LoadBalancer 서비스를 설정하는 방법을 보여줍니다.
HttpLoadBalancing
부가기능이 사용 설정된 클러스터를 만듭니다.cloud.google.com/l4-rbs
주석이 포함된 서비스를 만듭니다. 이 주석은 GKE에서 리전 백엔드 서비스를 사용하는 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만들도록 지시합니다.부하 분산기가
store-v1-lb-svc
서비스의 포드에 패킷을 전송하는지 확인합니다. 또한 GKE가 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기의 구성요소를 만들었는지 확인합니다.- 전달 규칙
- 리전별 백엔드 서비스
- 인스턴스 그룹
- 상태 점검
- VPC 방화벽 규칙
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를 사용하여 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기의 생성을 지원할 수 있도록 기존 클러스터를 업데이트합니다.
컨트롤 플레인을 GKE 버전 1.24.9 이상으로 업그레이드합니다.
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=VERSION \ --master \ --location=COMPUTE_LOCATION
다음을 바꿉니다.
CLUSTER_NAME
: 클러스터 이름VERSION
: GKE 버전 1.24.9 이상이어야 함. 버전은 클러스터의 출시 채널에서 유효한 부 버전이어야 합니다. 자세한 내용은 컨트롤 플레인 수동 업그레이드를 참조하세요.COMPUTE_LOCATION
: 새 클러스터의 Compute Engine 위치
외부 LoadBalancer 서비스 만들기
다음 샘플 배포를
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
클러스터에 매니페스트를 적용합니다.
kubectl apply -f store-deployment.yaml
배포에 두 개의 제공 포드가 있는지 확인합니다.
kubectl get pods
출력은 다음과 비슷합니다.
NAME READY STATUS RESTARTS AGE store-cdb9bb4d6-s25vw 1/1 Running 0 10s store-cdb9bb4d6-vck6s 1/1 Running 0 10s
다음 서비스 매니페스트를
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 서비스는 기본
externalTrafficPolicy
인Cluster
를 사용합니다.externalTrafficPolicy
에서 노드 그룹화를 정의하는 방법, 부하 분산기 상태 점검을 통과하는 노드, 패킷 처리에 대한 자세한 내용은 LoadBalancer 서비스 개념을 참조하세요.IPv4/IPv6 이중 스택 클러스터를 사용하는 경우
spec.ipFamilyPolicy
및ipFamilies
를 추가하여 GKE가 서비스에 IP 주소를 할당하는 방법을 정의합니다.ipFamilyPolicy
및ipFamilies
사양을 사용할 때 다음 조건을 고려하세요.- 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만들면 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 트래픽을 처리합니다. 자세한 내용은 서비스를 참조하세요.
- 백엔드 서비스 기반 외부 패스 스루 네트워크 부하 분산기를 만들면 GKE는 IPv4/IPv6 듀얼 스택 클러스터에서 생성된 새 서비스에
클러스터에 매니페스트를 적용합니다.
kubectl apply -f store-v1-lb-svc.yaml
서비스가 실행 중인지 확인합니다.
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
를 할당했습니다.부하 분산기 연결을 테스트합니다.
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 서비스 및 구성요소 확인
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
주석은 부하 분산기 상태 점검에 필요한 방화벽 규칙의 이름을 나타냅니다.
외부 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가 이를 클러스터에서 만든 다른 부하 분산기의 백엔드로 사용할 필요가 없는 경우에만 해당)
다음 단계
- LoadBalancer 서비스에 대한 일반적인 개요는 LoadBalancer 서비스 참조하기
- LoadBalancer 서비스 파라미터에 대한 설명은 LoadBalancer 서비스 파라미터 참조하기
- GKE의 부하 분산 문제 해결