HTTP 부하 분산기 설정

이 페이지에서는 AWS 애플리케이션 부하 분산기(ALB)를 설정하는 방법을 보여줍니다.

AWS용 GKE가 지원하는 다른 유형의 부하 분산기에 대한 자세한 내용은 부하 분산기 개요를 참조하세요.

시작하기 전에

AWS용 GKE로 ALB를 만들기 전에 다음을 수행해야 합니다.

개요

클러스터에 첫 번째 ALB 만들기에는 다음 단계가 포함됩니다.

  • VPC 내에서 ALB를 프로비저닝하려는 서브넷을 식별하고 태그 또는 주석을 지정합니다.
  • ALB 컨트롤러에 AWS 리소스 액세스 권한을 제공하는 AWS 역할을 만듭니다.
  • 오픈소스 aws-load-balancer-controller를 설치합니다.
  • ALB 구성을 만들고 배포합니다.

후속 ALB를 만들려면 다른 ALB 구성만 만들고 배포해야 합니다.

애플리케이션 부하 분산기 만들기

ALB에 대해 서브넷 태그 지정

ALB를 만들기 전에 AWS에 실행할 서브넷을 지정해야 합니다. 일반적인 방법은 자동 검색 프로세스에 제공되는 대로 이를 식별하는 태그를 서브넷에 지정하는 것입니다. 또는 실행할 서브넷을 명시적으로 나열하는 주석을 인그레스 객체에 추가할 수 있습니다.

자동 검색에 제공되는 대로 선택한 서브넷에 태그를 지정하려면 서비스 부하 분산기 서브넷 태그 지정을 참조하세요.

인그레스 객체에 서브넷 목록을 주석으로 추가하려면 alb.ingress.kubernetes.io/subnets라는 주석을 Kubernetes 인그레스 객체에 추가합니다. 주석 값을 서브넷 ID 또는 서브넷 이름이 쉼표로 구분된 목록으로 설정합니다(예: subnet-012345678abcdef,subnet- abcdef123456789,subnet-123456789abcdef).

AWS IAM 권한 만들기

AWS 부하 분산기 컨트롤러에 대한 IAM 정책을 다운로드합니다. 이 정책은 부하 분산기 컨트롤러가 작동하는 데 필요한 권한을 열거합니다. GitHub에서 정책을 검토할 수 있습니다. 이 명령어는 iam_policy.json이라는 파일에 정책을 저장합니다.

  curl -Lo iam_policy.json \
    https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json
  1. 이 파일을 사용하여 AWSLoadBalancerControllerIAMPolicy라는 IAM 정책을 만듭니다.

    aws iam create-policy \
      --policy-name AWSLoadBalancerControllerIAMPolicy \
      --policy-document file://iam_policy.json
    

부하 분산기에 대한 액세스 권한 부여

AWS IAM 역할 만들기의 안내에 따라 컨트롤러의 서비스 계정에 대해 AWS IAM 역할을 만듭니다. 안내에서 다음 항목을 바꿉니다.

  • AWS_POLICY_ARN: 이전 단계에서 만든 AWSLoadBalancerControllerIAPolicy의 ARN입니다.
  • KSA_NAME: "aws-load-balancer-controller"
  • K8S_NAMESPACE: "kube-system"
  • AWS_ROLE_NAME: "AWSLBControllerRole"

정책의 ARN을 검색하려면 다음 명령어를 실행합니다.

aws iam list-policies \
  --query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' \
  --output text

AWS 부하 분산기 컨트롤러 설치

  1. 이 단계를 완료하려면 다음 값을 추출하고 저장합니다. 나중에 이 값이 필요합니다.

    다음 명령어를 실행하여 클러스터의 UID를 찾습니다.

      gcloud container aws clusters describe CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --format "value(uid)"
    

    다음 명령어를 실행하여 클러스터의 VPC ID를 찾습니다.

      gcloud container aws clusters describe CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --format "value(networking.vpcId)"
    

    다음 명령어를 실행하여 AWSLBControllerRole이라는 역할의 ARN을 찾습니다.

    aws iam get-role --role-name AWSLBControllerRole --query Role.Arn --output text
    

    다음 명령어를 실행하여 클러스터의 AWS 리전을 찾습니다.

    gcloud container aws clusters describe CLUSTER_NAME \
      --location GOOGLE_CLOUD_LOCATION \
      --format "value(awsRegion)"
    

    다음과 같이 바꿉니다.

    • GOOGLE_CLOUD_LOCATION을 클러스터와 연결된 Google 리전의 이름으로 바꿉니다.
    • CLUSTER_NAME을 클러스터 이름으로 바꿉니다.
  2. 다음 명령어를 사용하여 cert-manager를 설치합니다.

    kubectl apply \
      --validate=false \
      -f https://github.com/jetstack/cert-manager/releases/download/v1.10.0/cert-manager.yaml
    
  3. aws-load-balancer-controller에 대해 매니페스트를 다운로드하고 다음 명령어를 사용하여 로컬 파일 v2_4_4_full.yaml에 저장합니다.

    curl -Lo v2_4_4_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.4/v2_4_4_full.yaml
    
  4. v2_4_4_full.yaml 파일을 수정하고 kind: Deployment를 검색합니다. Deployment 객체를 수정된 버전으로 바꿉니다.

    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/name: aws-load-balancer-controller
      name: aws-load-balancer-controller
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
      template:
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/name: aws-load-balancer-controller
        spec:
          containers:
          - args:
            - --cluster-name=CLUSTER_UID
            - --aws-region=AWS_REGION
            - --aws-vpc-id=AWS_VPC_ID
            - --ingress-class=alb
            - --disable-restricted-sg-rules=true
            image: amazon/aws-alb-ingress-controller:v2.4.4
            env:
            - name: AWS_ROLE_ARN
              value: AWS_ROLE_ARN
            - name: AWS_WEB_IDENTITY_TOKEN_FILE
              value: /var/run/secrets/aws-load-balancer-controller/serviceaccount/token
            livenessProbe:
              failureThreshold: 2
              httpGet:
                path: /healthz
                port: 61779
                scheme: HTTP
              initialDelaySeconds: 30
              timeoutSeconds: 10
            name: controller
            ports:
            - containerPort: 9443
              name: webhook-server
              protocol: TCP
            resources:
              limits:
                cpu: 200m
                memory: 500Mi
              requests:
                cpu: 100m
                memory: 200Mi
            securityContext:
              allowPrivilegeEscalation: false
              readOnlyRootFilesystem: true
              runAsNonRoot: true
            volumeMounts:
            - mountPath: /tmp/k8s-webhook-server/serving-certs
              name: cert
              readOnly: true
            - mountPath: /var/run/secrets/aws-load-balancer-controller/serviceaccount
              name: aws-iam-token
              readOnly: true
          priorityClassName: system-cluster-critical
          securityContext:
            fsGroup: 1337
          serviceAccountName: aws-load-balancer-controller
          terminationGracePeriodSeconds: 10
          volumes:
          - name: cert
            secret:
              defaultMode: 420
              secretName: aws-load-balancer-webhook-tls
          - name: aws-iam-token
            projected:
              defaultMode: 420
              sources:
              - serviceAccountToken:
                  audience: sts.amazonaws.com
                  expirationSeconds: 86400
                  path: token
    ---
    

    다음을 바꿉니다.

    • CLUSTER_UID: 클러스터의 UID입니다. 예를 들면 bbc7d232-21f6-4bb1-90dd-4b064cf8ccf8입니다.
    • AWS_VPC_ID: AWS VPC의 ID입니다. 예를 들면 vpc-1234567890abc입니다.
    • AWS_ROLE_ARN: AWSLBControllerRole이라는 역할의 ARN입니다.
    • AWS_REGION: 클러스터의 AWS 리전입니다. 예를 들면 us-east-1입니다.
  5. 다음 명령어를 사용하여 수정된 매니페스트를 클러스터에 적용합니다.

    kubectl apply -f v2_4_4_full.yaml
    
  6. 다음 명령어를 사용하여 부하 분산기 컨트롤러가 실행 중인지 확인합니다.

    kubectl get deployment -n kube-system aws-load-balancer-controller
    

    출력은 다음과 비슷하게 표시되며, 이는 aws-load-balancer-controller 배포를 사용할 수 있음을 보여줍니다.

    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    aws-load-balancer-controller   1/1     1            1           51s
    

ALB 예시 만들기

이 섹션에서는 2048 게임의 리메이크로 작동하는 예시 ALB를 만드는 방법을 보여줍니다.

  1. 다음 YAML 구성을 2048.yaml이라는 파일에 복사합니다. 구성은 Kubernetes 네임스페이스, 서비스, 배포를 만듭니다. 배포가 인그레스 ALB를 통해 노출됩니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: game-2048
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: game-2048
      name: deployment-2048
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: app-2048
      replicas: 5
      template:
        metadata:
          labels:
            app.kubernetes.io/name: app-2048
        spec:
          containers:
          - image: alexwhen/docker-2048
            imagePullPolicy: Always
            name: app-2048
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: game-2048
      name: service-2048
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      type: NodePort
      selector:
        app.kubernetes.io/name: app-2048
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      namespace: game-2048
      name: ingress-2048
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: service-2048
                    port:
                      number: 80
    
  2. 다음 명령어를 사용하여 클러스터에 구성을 적용합니다.

    kubectl apply -f 2048.yaml
    
  3. 다음 명령어를 사용하여 인그레스 리소스 상태를 확인합니다.

    kubectl get ingress -n game-2048 ingress-2048
    

    명령어 결과는 다음과 같습니다. ADDRESS 열에는 인그레스 리소스의 엔드포인트가 포함됩니다.

     NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
     ingress-2048   <none>   *       k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com   80      2m19s
     ```
    
  4. 브라우저에서 ALB 엔드포인트로 이동합니다(예: http://k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com). 2048 게임이 표시되고 ALB 부하 분산기가 성공적으로 배포되고 구성되었음을 나타냅니다.

삭제

이전 단계에서 만든 샘플 ALB 및 배포를 삭제하고 다음 명령어로 매니페스트를 삭제합니다.

kubectl delete -f 2048.yaml

다음 단계