내부 부하 분산

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

개요

내부 부하 분산을 사용하면 클러스터 서비스가 동일 네트워크에서 실행되지만 클러스터 외부에서 실행되는 애플리케이션에 액세스할 수 있습니다. 예를 들어 동일 네트워크에서 일부 Compute Engine VM 인스턴스와 함께 클러스터를 실행하고, 클러스터 내부 서비스를 클러스터 외부 인스턴스에 제공하려는 경우, 내부 부하 분산기를 추가하도록 클러스터의 서비스 리소스 중 하나를 구성해야 합니다.

내부 부하 분산 없이는 외부 부하 분산기를 설정하고, 액세스를 제한하도록 방화벽 규칙을 만들고, 애플리케이션의 IP 주소를 클러스터 외부에서 액세스하도록 네트워크 경로를 설정해야 합니다.

내부 부하 분산은 사용자 서브넷의 IP 범위로 동일한 컴퓨팅 지역 내의 네트워크에서 트래픽을 수신하도록 클러스터에서 비공개(RFC 1918) LoadBalancer Ingress IP 주소를 만듭니다.

cloud.google.com/load-balancer-type: "Internal" 주석 및 LoadBalancer 사양으로 서비스 리소스를 만들기 위해 kubectl을 사용하여 내부 부하 분산기를 만듭니다.

가격 책정

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

시작하기 전에

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

  • 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

내부 부하 분산기 만들기

다음 섹션에서는 서비스를 사용하여 내부 부하 분산기를 만드는 방법을 설명합니다. 내부 부하 분산기는 externalTrafficPolicy, sessionAffinity, loadBalancerSourceRanges와 같은 서비스 매개변수를 지원합니다.

서비스 구성 파일 작성

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

apiVersion: v1
kind: Service
metadata:
  name: [SERVICE_NAME]
  annotations:
    cloud.google.com/load-balancer-type: "Internal"
  labels:
    [KEY]: [VALUE]
spec:
  type: LoadBalancer
  loadBalancerIP: [IP_ADDRESS] # if omitted, an IP is generated
  loadBalancerSourceRanges:
  - [IP_RANGE] # defaults to 0.0.0.0/0
  ports:
  - name: [PORT_NAME]
    port: 9000
    protocol: TCP # default; can also specify UDP
  selector:
    [KEY]: [VALUE] # label selector for Pods to target

서비스 구성 파일에는 다음이 포함되어야 합니다.

  • 선택한 서비스 이름인 [SERVICE_NAME]
  • 내부 부하 분산기를 구성하도록 지정하는 cloud.google.com/load-balancer-type: "Internal" 주석
  • LoadBalancer 유형 및 port 필드

또한 다음을 포함해야 합니다.

  • VPC 네트워크, 하위 네트워크 또는 VPN 게이트웨이에서 사용되는 하나 이상의 RFC 1918 범위를 지정하는 spec: loadBalancerSourceRanges 배열. loadBalancerSourceRanges는 부하 분산기를 통해 이 필드에 지정된 IP로 트래픽을 제한합니다. 이 필드를 수동으로 설정하지 않으면 필드에 기본적으로 0.0.0.0이 지정되고, 모든 IPv4 트래픽이 노드에 연결될 수 있습니다.
  • 서비스 대상이 되는 포드를 지정하기 위한 spec: selector 필드. 예를 들어 selector는 라벨이 app: web으로 지정된 포드를 대상으로 지정할 수 있습니다.

또한 다음과 같은 선택적인 필드를 포함할 수 있습니다.

  • spec: loadBalancerIP를 사용하면 부하 분산기에 대해 특정 IP 주소를 선택할 수 있습니다. IP 주소는 다른 내부 부하 분산기 또는 서비스에서 사용되지 않아야 합니다. 생략된 경우 임시 IP가 할당됩니다. 서브넷 내에서 비공개 IP 주소 예약에 대한 자세한 내용은 고정 내부 IP 주소 예약을 참조하세요.
  • spec: ports: protocol은 내부 부하 분산기 포트가 사용해야 하는 네트워크 프로토콜을 정의합니다. 생략된 경우 포트에 TCP가 사용됩니다.

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

서비스 배포

내부 부하 분산기를 만들려면 셸 또는 터미널 창에서 다음 명령어를 실행하세요.

kubectl apply -f service.yaml

서비스 조사

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

gcloud

내부 부하 분산기를 조사하려면 다음 명령어를 실행하세요.

kubectl describe service [SERVICE_NAME]

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

Name:     [SERVICE_NAME]
Namespace:    default
Labels:     app=echo
Annotations:    cloud.google.com/load-balancer-type=Internal
Selector:   app=echo
Type:     LoadBalancer
IP:     10.0.146.226
LoadBalancer Ingress: 10.128.0.6
Port:       9000/TCP
NodePort:   30387/TCP
Endpoints:    10.100.1.10:80,10.100.2.10:80,10.100.3.8:80
Session Affinity: ClientIP

IP는 서비스 클러스터의 IP 주소입니다.

콘솔

내부 부하 분산기를 조사하려면 다음 단계를 수행하세요.

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

    서비스 메뉴로 이동

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

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

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

내부 부하 분산기 사용

클러스터 IP 주소를 사용하여 클러스터 내에서 서비스에 액세스할 수 있습니다. 클러스터 외부에서 서비스에 액세스하려면 LoadBalancer Ingress IP 주소를 사용합니다.

기존 Ingress 고려 사항

클러스터에 기존 Ingress 리소스가 포함된 경우 해당 리소스는 분산 모드 RATE를 사용해야 합니다. UTILIZATION 분산 모드는 내부 부하 분산기와 호환되지 않습니다.

Kubernetes Ingress 리소스 객체에 의해 생성된 이전 BackendService 리소스는 분산 모드가 지정되지 않은 상태로 생성되었습니다. 기본적으로 API에는 HTTP 부하 분산기를 위해 분산 모드 UTILIZATION이 사용되었습니다. 하지만 UTILIZATION을 사용하는 다른 부하 분산기로는 내부 부하 분산기를 인스턴스 그룹에 연결할 수 없습니다.

내부 부하 분산기와 Ingress 리소스와의 호환성을 보장하기 위해서는 일부 수동 단계를 수행해야 할 수 있습니다.

Ingress가 호환되는지 확인

Ingress가 호환되는지 확인하려면 셸 또는 터미널 창에서 다음 명령어를 실행하세요.

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 BackendService 리소스가 폴링되고 $GROUPNAME 내용을 기준으로 결과 범위가 좁혀집니다.

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

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

출력이 RATE 항목을 반환하거나, 항목이 반환되지 않으면 내부 부하 분산기가 호환되고, 추가 작업이 필요하지 않습니다.

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

기존 Ingress 업데이트

Ingress 분산 모드 유형은 클러스터를 가리키는 기존 HTTP(S) 분산기가 없는 경우에만 변경할 수 있습니다.

내부 부하 분산기와 호환되도록 Ingress 리소스를 업데이트하려면, Kubernetes 버전 1.7.2 이상을 실행하는 새 클러스터를 만든 후 서비스를 해당 클러스터로 이전할 수 있습니다. 새 클러스터로 이전하면 호환되지 않는 분산 모드로 Ingress가 존재할 수 없도록 보장합니다.

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

  • 마스터 및 노드가 Kubernetes 버전 1.7.2 이상을 실행해야 합니다.
  • 동일한 네트워크 및 지역 내에서만 내부 부하 분산기에 액세스할 수 있습니다.
  • 내부 부하 분산기 포트는 TCP 또는 UDP 중 하나의 프로토콜 유형으로만 트래픽을 제공할 수 있습니다. 내부 부하 분산기는 서비스 정의에 지정된 첫 번째 포트의 프로토콜을 사용합니다.
  • 내부 부하 분산기에서는 UDP 및 sessionAffinity: ClientIP를 함께 사용할 수 없습니다.
  • Kubernetes 버전 1.7.4 이상을 실행하는 클러스터의 경우, 자동 모드 서브넷 외에도 커스텀 모드 서브넷에서 내부 부하 분산기를 사용할 수 있습니다.
  • Kubernetes 1.7.X를 실행하는 클러스터의 경우, clusterIP가 변경되지 않은 상태로 유지되지만 내부 부하 분산기 IP 주소를 예약할 수 없습니다. 포트, 프로토콜 또는 세션 어피니티를 변경하면 IP 주소가 변경될 수 있습니다.

제한사항

  • 각 클러스터 노드는 백엔드 인스턴스이며, 백엔드 인스턴스 제한으로 계산됩니다. 예를 들어 클러스터에 300개 노드가 포함되었고 백엔드 인스턴스 제한이 250개인 경우, 250개의 인스턴스만 트래픽을 수신합니다. 이것은 externalTrafficPolicyLocal로 설정된 서비스에 부정적인 영향을 줄 수 있습니다.
  • 내부 부하 분산기 전달 규칙은 네트워크당 50개까지 허용됩니다.

내부 부하 분산기 제한에 대한 자세한 내용은 Compute Engine 내부 부하 분산 페이지의 제한사항 섹션을 참조하세요.

다음 단계

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

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

Kubernetes Engine