내부 TCP/UDP 부하 분산

이 페이지에서는 Google Kubernetes Engine에서 Compute Engine 내부 TCP/UDP 부하 분산기를 만드는 방법을 설명합니다.

개요

내부 TCP/UDP 부하 분산을 사용하면 동일한 VPC 네트워크를 사용하고 같은 GCP 리전에 위치한 클러스터 외부의 애플리케이션에 클러스터 서비스가 액세스할 수 있습니다. 예를 들어 us-west1 리전에 클러스터가 있고 서비스 중 하나가 이 리전의 동일한 VPC 네트워크에서 실행 중인 Compute Engine VM 인스턴스에 액세스할 수 있도록 한다고 가정합니다.

cloud.google.com/load-balancer-type: "Internal" 주석 및 type: LoadBalancer 사양으로 서비스 리소스를 만들어 내부 TCP/UDP 부하 분산기를 만들 수 있습니다. 아래의 안내와 예에서 이를 수행하는 방법을 설명합니다.

내부 TCP/UDP 부하 분산이 없으면 클러스터 외부에 있는 애플리케이션에 액세스할 수 있도록 외부 부하 분산기와 방화벽 규칙을 설정해야 합니다.

내부 TCP/UDP 부하 분산은 동일한 컴퓨팅 리전 내에서 네트워크 트래픽을 수신하는 클러스터에 사용할 비공개(RFC 1918) IP 주소를 만듭니다.

가격 책정

Compute Engine의 가격 모델에 따라 비용이 청구됩니다. 자세한 내용은 내부 TCP/UDP 부하 분산 가격 책정 페이지를 참조하세요.

시작하기 전에

이 작업을 준비하려면 다음 단계를 완료하세요.

  • Google Kubernetes Engine API가 사용 설정되었는지 확인합니다.
  • Google Kubernetes Engine API 사용 설정
  • Cloud SDK가 설치되었는지 확인합니다.
  • 기본 프로젝트 ID를 설정합니다.
    gcloud config set project [PROJECT_ID]
  • 영역 클러스터를 사용하는 경우 기본 컴퓨팅 영역을 설정합니다.
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 리전 클러스터를 사용하는 경우 기본 컴퓨팅 리전을 설정합니다.
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud를 최신 버전으로 업데이트합니다.
    gcloud components update

배포 만들기

다음 매니페스트에서는 Hello World 앱의 복제본 3개를 실행하는 배포를 설명합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
spec:
  selector:
    matchLabels:
      app: hello
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"

이 샘플 앱의 소스 코드와 Dockerfile은 GitHub에 있습니다. PORT 환경 변수를 지정하지 않았으므로 컨테이너는 기본 포트인 8080에서 리슨합니다.

배포를 만들려면 매니페스트에서 my-deployment.yaml 파일을 만든 후 셸 또는 터미널 창에서 다음 명령어를 실행합니다.

kubectl apply -f my-deployment.yaml

내부 TCP 부하 분산기 만들기

다음 섹션에서는 서비스를 사용하여 내부 TCP 부하 분산기를 만드는 방법을 설명합니다.

서비스 구성 파일 작성

다음은 내부 TCP 부하 분산기를 만드는 서비스의 예입니다.

apiVersion: v1
kind: Service
metadata:
  name: ilb-service
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    app: hello
spec:
  type: LoadBalancer
  selector:
    app: hello
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP

최소 서비스 요구사항

매니페스트에는 다음이 포함되어야 합니다.

  • 서비스의 name: 이 경우는 ilb-service입니다.
  • cloud.google.com/load-balancer-type: "Internal" 주석: 내부 TCP/UDP 부하 분산기를 구성하도록 지정합니다.
  • type: LoadBalancer
  • spec: selector 필드: 서비스 대상 Pod를 지정합니다(예: app: hello).
  • porttargetPort: 서비스가 노출되는 포트 및 컨테이너가 리슨하는 포트입니다.

서비스 배포

내부 TCP 부하 분산기를 만들려면 매니페스트에서 my-service.yaml 파일을 만든 후 셸 또는 터미널 창에서 다음 명령어를 실행합니다.

kubectl apply -f my-service.yaml

서비스 검사

배포 후에는 서비스가 성공적으로 구성되었는지 검사합니다.

gcloud

내부 TCP/UDP 부하 분산기를 검사하려면 다음 명령어를 실행합니다.

kubectl describe service ilb-service

명령어 출력은 다음과 비슷합니다.


Name:                     ilb-service
Namespace:                default
Labels:                   app=hello
Annotations:              cloud.google.com/load-balancer-type=Internal
Selector:                 app=hello
Type:                     LoadBalancer
IP:                       10.23.250.184
LoadBalancer Ingress:     10.138.0.13
Port:                     80/TCP
TargetPort:               8080/TCP
NodePort:                 31979/TCP
Endpoints:                10.20.0.10:8080,10.20.1.12:8080,10.20.1.13:8080
Session Affinity:         None

LoadBalancer Ingress는 내부 TCP 부하 분산기의 IP 주소입니다.

콘솔

내부 TCP/UDP 부하 분산기를 검사하려면 다음 단계를 수행합니다.

  1. GCP Console에서 Google Kubernetes Engine 서비스 메뉴로 이동합니다.

    서비스 메뉴로 이동

  2. 원하는 서비스를 선택합니다.

서비스 세부정보 메뉴에는 다음이 포함됩니다.

  • 외부 엔드포인트
  • 클러스터 IP
  • 부하 분산기 IP
  • 서비스에서 제공되는 Pod 목록

내부 TCP 부하 분산기 확인

SSH를 통해 VM 인스턴스를 연결하고 다음 명령어를 실행합니다.

curl [LOAD_BALANCER_IP]

여기서, [LOAD_BALANCER_IP]LoadBalancer Ingress IP 주소입니다.

응답에는 hello-app 출력이 표시됩니다.

Hello, world!
Version: 2.0.0
Hostname: hello-app-77b45987f7-pw54n

동일한 VPC 네트워크 외부에서 또는 같은 리전 외부에서 명령어를 실행하면 타임아웃 오류가 발생합니다.

삭제

kubectl delete 또는 GCP Console을 사용하여 배포와 서비스를 삭제할 수 있습니다.

GCLOUD

배포 삭제

배포를 삭제하려면 다음 명령어를 실행합니다.

kubectl delete deployment hello-app

서비스 삭제

서비스를 삭제하려면 다음 명령어를 실행합니다.

kubectl delete service ilb-service

콘솔

배포 삭제

배포를 삭제하려면 다음 단계를 수행합니다.

  1. GCP Console에서 Google Kubernetes Engine 작업 부하 메뉴로 이동합니다.

    작업 부하 메뉴로 이동

  2. 메뉴에서 원하는 작업 부하를 선택합니다.

  3. 삭제를 클릭합니다.

  4. 확인 대화상자 메뉴에서 삭제를 클릭합니다.

서비스 삭제

서비스를 삭제하려면 다음 단계를 수행합니다.

  1. GCP Console에서 Google Kubernetes Engine 서비스 메뉴로 이동합니다.

    서비스 메뉴로 이동

  2. 메뉴에서 원하는 서비스를 선택합니다.

  3. 삭제를 클릭합니다.

  4. 확인 대화상자 메뉴에서 삭제를 클릭합니다.

기존 인그레스 고려사항

내부 TCP/UDP 부하 분산기와 분산 모드 UTILIZATION을 사용하는 인그레스를 모두 가질 수 없습니다. 인그레스와 내부 TCP/UDP 부하 분산을 모두 사용하려면 인그레스가 분산 모드 RATE를 사용해야 합니다.

클러스터에 Kubernetes 버전 1.7.1 이하로 생성된 기존 인그레스 리소스가 있으면 내부 TCP/UDP 부하 분산기와 호환되지 않습니다. Kubernetes 인그레스 리소스 객체에서 생성된 이전 BackendService 리소스는 분산 모드를 지정하지 않은 상태에서 생성되었습니다. 기본적으로 API에서는 HTTP 부하 분산기에 분산 모드 UTILIZATION이 사용되었습니다. 그러나 내부 TCP/UDP 부하 분산기는 UTILIZATION을 사용하는 다른 부하 분산기가 있는 인스턴스 그룹을 가리킬 수 없습니다.

인그레스 분산 모드 확인

인그레스 분산 모드가 실행되고 있는지 확인하려면 셸 또는 터미널 창에서 다음 명령어를 실행합니다.

GROUPNAME=`kubectl get configmaps ingress-uid -o jsonpath='k8s-ig--{.data.uid}' --namespace=kube-system`
gcloud compute backend-services list --format="table(name,backends[].balancingMode,backends[].group)" | grep $GROUPNAME

이러한 명령어는 클러스터의 인스턴스 그룹 이름을 가져오는 셸 변수 GROUPNAME을 내보냅니다. 그러면 프로젝트의 Compute Engine backend service 리소스가 폴링되고 $GROUPNAME 콘텐츠를 기준으로 결과 범위가 좁아집니다.

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

k8s-be-31210--...  [u'RATE']       us-central1-b/instanceGroups/k8s-ig--...
k8s-be-32125--...  [u'RATE']       us-central1-b/instanceGroups/k8s-ig--...

출력에서 RATE 항목 또는 0개 항목이 반환되면 내부 부하 분산기가 호환되므로 추가 작업이 필요하지 않습니다.

출력에 UTILIZATION으로 표시된 항목이 반환되면 인그레스가 호환되지 않습니다.

인그레스 리소스가 내부 TCP/UDP 부하 분산기와 호환되도록 업데이트하려면 Kubernetes 버전 1.7.2 이상을 실행하는 새 클러스터를 만든 후 서비스를 이 클러스터로 이전하면 됩니다.

추가 서비스 매개변수

내부 TCP/UDP 부하 분산기는 loadBalancerSourceRanges와 같은 서비스 매개변수를 지원합니다.

  • VPC 네트워크, 서브네트워크 또는 VPN 게이트웨이에서 사용되는 RFC 1918 범위를 1개 이상 지정하는 spec: loadBalancerSourceRanges 배열. loadBalancerSourceRanges는 부하 분산기를 통해 이 필드에서 지정된 IP로 트래픽을 제한합니다. 이 필드를 수동으로 설정하지 않으면 필드가 0.0.0.0으로 기본 설정되고, 모든 IPv4 트래픽이 노드에 연결될 수 있습니다.

  • spec: loadBalancerIP를 사용하면 부하 분산기의 특정 IP 주소를 선택할 수 있습니다. IP 주소는 다른 내부 TCP/UDP 부하 분산기 또는 서비스에서 사용되지 않아야 합니다. 생략되면 임시 IP가 할당됩니다. 서브넷 내에서 비공개 IP 주소 예약에 대한 자세한 내용은 고정 내부 IP 주소 예약을 참조하세요.

내부 TCP/UDP 부하 분산기에 대한 액세스를 제한하는 loadBalancerSourceRanges 구성에 대한 자세한 내용은 클라우드 제공업체의 방화벽 구성을 참조하세요. 서비스 사양에 대한 자세한 내용은 서비스 API 참조를 참조하세요.

모든 포트 사용

주석이 있는 서비스를 사용하여 내부 TCP/UDP 부하 분산기를 만드는 경우 모든 포트를 사용하는 전달 규칙을 설정할 방법이 없습니다. 그러나 수동으로 내부 TCP/UDP 부하 분산기를 만드는 경우에는 Google Kubernetes Engine 노드의 인스턴스 그룹을 백엔드로 선택할 수 있습니다. ILB를 통해 type: NodePort Kubernetes 서비스를 사용할 수 있습니다.

내부 TCP/UDP 부하 분산기 제한사항

  • Kubernetes 버전 1.7.3 이하를 실행하는 클러스터의 경우, 자동 모드 서브넷에만 내부 TCP/UDP 부하 분산기를 사용할 수 있지만, Kubernetes 버전 1.7.4 이상에서는 자동 모드 서브넷 외에 커스텀 모드 서브넷에도 내부 부하 분산기를 사용할 수 있습니다.
  • Kubernetes 1.7.X를 실행하는 클러스터의 경우, clusterIP가 변경되지 않고 유지되지만 내부 TCP/UDP 부하 분산기 IP 주소를 예약할 수 없습니다. 포트, 프로토콜 또는 세션 어피니티를 변경하면 IP 주소가 변경될 수 있습니다.

내부 UDP 부하 분산기 제한사항

  • 내부 UDP 부하 분산기에서는 sessionAffinity: ClientIP를 사용할 수 없습니다.

한도

내부 전달 규칙(ILB) 수는 VPC 네트워크공유 VPC 네트워크당 50개로 제한됩니다. VPC가 다른 VPC와 피어링되어 있으면 모든 피어링된 VPC에 이 한도가 공유됩니다.

type: Loadbalancer인 Kubernetes 서비스와 cloud.google.com/load-balancer-type: Internal 주석은 Kubernetes 서비스를 대상으로 하는 ILB를 만듭니다. 따라서 GKE는 피어링된 VPC를 포함하여 단일 VPC 또는 공유 VPC 네트워크에서 Kubernetes 서비스를 50개 이상 만드는 것을 지원하지 않습니다.

GKE 클러스터에서 내부 전달 규칙은 클러스터의 모든 노드를 가리킵니다. 클러스터의 각 노드는 ILB의 백엔드 VM입니다. ILB의 최대 백엔드 VM 수는 VM과 인스턴스 그룹의 연결 방식에 관계없이 250개입니다. 따라서 ILB가 있는 GKE 클러스터의 최대 노드 수는 250개입니다. 클러스터에 자동 확장이 사용 설정된 경우, 자동 확장으로 인해 클러스터가 250개 노드를 초과해서 확장되지 않도록 해야 합니다.

이러한 한도에 대한 자세한 내용은 VPC 리소스 할당량을 참조하세요.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서