부하 분산기 만들기

이 주제에서는 AWS의 GKE에서 AWS Elastic Load Balancer(ELB)를 설정하는 방법을 설명합니다.

LoadBalancer 유형의 서비스를 만들면 GKE on AWS 컨트롤러는 기본 또는 네트워크 ELB on AWS를 구성합니다.

빠른 시작을 따라 Google Cloud 콘솔에서 외부에 노출된 기본 ELB 또는 AWS 애플리케이션 부하 분산기(ALB)를 만들 수도 있습니다.

시작하기 전에

GKE on AWS를 사용하기 전에 다음 작업을 수행했는지 확인합니다.

  • 관리 서비스를 설치합니다.
  • 사용자 클러스터를 만듭니다.
  • anthos-aws 디렉터리에서 anthos-gke를 사용하여 컨텍스트를 사용자 클러스터로 전환합니다.
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME을 사용자 클러스터 이름으로 바꿉니다.
  • curl 명령줄 도구 또는 유사한 도구를 설치합니다.

외부 또는 내부 부하 분산기 선택

GKE on AWS는 LoadBalancer 리소스의 주석에 따라 외부(공개 서브넷) 또는 내부(비공개 서브넷) 부하 분산기를 만듭니다.

외부 부하 분산기를 선택하면 노드 풀의 보안 그룹 및 서브넷의 네트워크 액세스제어 목록(ACL)에서 허용되는 IP 주소가 부하 분산기에 액세스할 수 있습니다.

부하 분산기 유형 선택

기본 부하 분산기(기본 ELB)를 만들지 또는 네트워크 부하 분산기(NLB)를 만들지 선택합니다. 부하 분산기 유형 간의 차이점에 대한 자세한 내용은 AWS 문서의 부하 분산기 유형을 참조하세요.

부하 분산기 만들기

배포를 만들고 서비스를 통해 해당 배포를 노출하여 부하 분산기를 만듭니다.

  1. 배포를 만듭니다. 이 배포의 컨테이너는 포트 50001에서 리슨합니다. 다음 YAML을 my-deployment-50001.yaml 파일에 저장합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment-50001
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: "gcr.io/google-samples/hello-app:2.0"
            env:
            - name: "PORT"
              value: "50001"
    
  2. kubectl apply를 사용하여 배포를 만듭니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-deployment-50001.yaml
    
  3. 3개의 포드가 실행 중인지 확인합니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    
  4. 배포에 LoadBalancer 유형의 서비스를 만듭니다. 공개 또는 비공개 서브넷에 기본 또는 네트워크 ELB를 만들 수 있습니다. 다음 옵션 중 하나를 선택합니다.

    • 공개 서브넷에 기본 ELB
    • 공개 서브넷에 NLB
    • 비공개 서브넷에 기본 ELB
    • 비공개 서브넷에 NLB

    그런 다음 아래 매니페스트를 my-lb-service.yaml 파일에 복사합니다.

    기본 공개

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    NLB 공개

    service.beta.kubernetes.io/aws-load-balancer-type 주석을 nlb로 설정하여 NLB를 만듭니다. 다음 YAML에는 이 주석이 포함되어 있습니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    기본 비공개

    service.beta.kubernetes.io/aws-load-balancer-internal 주석을 "true"로 설정하여 비공개 LoadBalancer를 만듭니다. 다음 YAML에는 이 주석이 포함되어 있습니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    NLB 비공개

    다음과 같이 주석을 설정하여 비공개 NLB를 만듭니다.

    • service.beta.kubernetes.io/aws-load-balancer-internal"true"로 설정
    • service.beta.kubernetes.io/aws-load-balancer-typenlb로 설정

    다음 YAML에는 두 주석이 모두 포함됩니다.

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    
  5. kubectl apply를 사용하여 서비스를 만듭니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-lb-service.yaml
    
  6. kubectl get service를 사용하여 서비스의 호스트 이름을 봅니다.

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get service my-lb-service \
      --output jsonpath="{.status.loadBalancer.ingress..hostname}{'\n'}"
    

    elb-id.elb.aws-region.amazonaws.com과 유사한 결과가 출력됩니다.

  7. 외부에 노출된 부하 분산기를 만들고 공개 VPC 서브넷에 액세스할 수 있는 경우 curl을 사용하여 부하 분산기에 연결할 수 있습니다. external-ip를 이전 단계의 kubectl get service 출력 IP로 바꿉니다.

    curl external-ip:60000
    

    다음과 유사한 결과가 출력됩니다.

    Hello, world!
    Version: 2.0.0
    Hostname: my-deployment-50001-84b6dc5555-zmk7q
    

삭제

서비스 및 배포를 삭제하려면 kubectl delete를 사용합니다.

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f my-lb-service.yaml

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f my-deployment-50001.yaml

문제해결

부하 분산기 엔드포인트에 액세스할 수 없는 경우 서브넷에 태그를 지정해 보세요.

다음 단계