AWS 로드 밸런서 컨트롤러 - Amazon EKS

AWS 로드 밸런서 컨트롤러

AWS 로드 밸런서 컨트롤러는 Kubernetes 클러스터의 AWS Elastic Load Balancer를 관리합니다. 이 컨트롤러는 다음 리소스를 프로비저닝합니다.

  • Kubernetes Ingress를 생성할 때 AWS Application Load Balancer(ALB)

  • LoadBalancer 유형의 Kubernetes Service를 생성할 때 AWS 네트워크 로드 밸런서(NLB) 과거에는 인스턴스 대상에 대해 Kubernetes 인트리 로드 밸런서를 사용했지만 IP 대상에 대해서는 AWS 로드 밸런서 컨트롤러를 사용했습니다. AWS 로드 밸런서 컨트롤러 버전 2.3.0 이상에서 대상 유형 중 하나를 사용하여 네트워크 로드 밸런서를 생성할 수 있습니다. NLB 대상 유형에 대한 자세한 내용은 네트워크 로드 밸런서 사용 설명서에서 대상 유형을 참조하세요.

이 컨트롤러는 이전 이름은 AWS ALB 수신 컨트롤러였습니다. GitHub에서 관리되는 오픈 소스 프로젝트입니다. 이 주제에서는 기본 옵션을 사용하여 컨트롤러를 설치하는 방법을 설명합니다. GitHub에서 컨트롤러에 대한 전체 설명서를 볼 수 있습니다. 컨트롤러를 배포하기 전에 Amazon EKS의 애플리케이션 로드 밸런싱Amazon EKS의 네트워크 로드 밸런싱에서 필수 구성 요소 및 고려 사항을 검토하는 것이 좋습니다. 이러한 항목에는 컨트롤러가 AWS 리소스를 프로비저닝하도록 요구하는 샘플 애플리케이션을 배포하는 방법에 관한 단계도 포함되어 있습니다.

Prerequisites

  • 기존 클러스터가 있어야 합니다. 기존 클러스터가 없는 경우 Amazon EKS 시작하기 섹션을 참조하세요.

  • 클러스터에 대한 OpenID Connect(OIDC) 공급자 기존 OIDC 공급자가 있는지 확인하거나 클러스터에 대해 OIDC 공급자를 사용하도록 설정하려면 클러스터에 대한 IAM OIDC 공급자 생성 섹션을 참조하세요.

Amazon EKS 클러스터에 AWS 로드 밸런서 컨트롤러를 배포하려면

다음 단계에서 example values를 사용자의 값으로 교체합니다.

  1. 사용자 대신 AWS API를 호출할 수 있는 AWS 로드 밸런서 컨트롤러의 IAM 정책을 다운로드합니다. GitHub에서 정책 문서를 볼 수 있습니다.

    curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.0/docs/install/iam_policy.json
  2. 이전 단계에서 다운로드한 정책을 사용하여 IAM 정책을 만듭니다.

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

    AWS Management Console에서 정책을 보는 경우 ELB에 대한 경고가 표시될 수 있습니다. 일부 작업은 ELB v2에 대해서만 존재하기 때문에 이러한 작업은 무시해도 안전합니다. ELB v2에 대한 경고가 표시되지 않습니다.

  3. eksctl 또는 AWS Management Console 및 kubectl을 사용하여 IAM 역할을 생성하고 AWS 로드 밸런서 컨트롤러의 kube-system 네임스페이스에 aws-load-balancer-controller라는 Kubernetes 서비스 계정을 추가합니다.

    eksctl

    my_cluster를 실제 클러스터의 이름으로 바꾸고 111122223333을 계정 ID로 바꾼 다음 명령을 실행합니다.

    eksctl create iamserviceaccount \ --cluster=my_cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
    AWS Management Console and kubectl

    AWS Management Console 및 kubectl 사용

    1. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

    2. 탐색 창에서 [역할(Roles)], [역할 생성(Create Role)]을 선택합니다.

    3. Select type of trusted entity(신뢰할 수 있는 유형의 엔터티 선택) 섹션에서 Web identity(웹 자격 증명)를 선택합니다.

    4. Choose a web identity provider(웹 자격 증명 공급자 선택) 섹션에서 다음과 같이 합니다.

      1. 자격 증명 공급자에서 클러스터의 URL을 선택합니다. URL이 표시되지 않으면 이 항목의 필수 구성 요소를 충족했는지 확인합니다.

      2. Audience(대상)에서 sts.amazonaws.com을 입력합니다.

    5. Next: Permissions(다음: 권한)를 선택합니다.

    6. 정책 연결(Attach Policy) 섹션에서 서비스 계정에 사용하기 위해 이전 단계에서 생성한 AWSLoadBalancerControllerIAMPolicy 정책을 선택합니다.

    7. 다음: 태그를 선택합니다.

    8. Add tags(optional)(태그 추가(선택 사항)) 화면에서 계정에 대한 태그를 추가할 수 있습니다. 다음: 검토를 선택합니다.

    9. [역할 이름(Role Name)]에 AmazonEKSLoadBalancerControllerRole과 같은 역할의 이름을 입력하고 [역할 생성(Create role)]을 선택합니다.

    10. 역할을 생성한 후 편집할 수 있도록 콘솔에서 이 역할을 선택하여 엽니다.

    11. 신뢰 관계 탭을 선택한 후 Edit trust relationship(신뢰 관계 편집)을 선택합니다.

    12. 다음과 비슷한 줄을 찾습니다.

      "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

      해당 줄을 다음 줄처럼 변경합니다. EXAMPLED539D4633E53DE1B716D3041E를 클러스터의 OIDC 공급자 ID로 바꾸고 필요한 경우 region-code를 클러스터가 있는 리전 코드로 바꿉니다. audsub로 변경하고 sts.amazonaws.com을 다음 텍스트의 값으로 바꿉니다.

      "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:kube-system:aws-load-balancer-controller"
    13. Update Trust Policy(신뢰 정책 업데이트)를 선택하여 종료합니다.

    14. 이후 단계에서 사용할 수 있도록 역할의 ARN 적어둡니다.

    15. 다음 내용을 aws-load-balancer-controller-service-account.yaml이라는 파일에 저장합니다. 이때 111122223333을 계정 ID로 바꿉니다.

      apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
    16. 클러스터에 서비스 계정을 생성합니다.

      kubectl apply -f aws-load-balancer-controller-service-account.yaml
  4. 현재 Kubernetes용 AWS ALB 수신 컨트롤러가 설치되어 있는 경우 제거합니다. AWS 로드 밸런서 컨트롤러가 Kubernetes용 AWS ALB 수신 컨트롤러의 기능을 대신합니다.

    1. 이 컨트롤러가 현재 설치되어 있는지 확인합니다.

      kubectl get deployment -n kube-system alb-ingress-controller

      컨트롤러가 설치되어 있지 않은 경우의 출력입니다. 컨트롤러 설치 단계로 건너뜁니다.

      Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

      컨트롤러가 설치된 경우의 출력입니다.

      NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d
    2. 다음 명령을 입력하여 컨트롤러를 제거합니다.

      kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
    3. 이전 단계에서 생성한 IAM 역할에 다음 IAM 정책을 추가합니다. 이 정책은 Kubernetes용 ALB 수신 컨트롤러에서 생성된 리소스에 대한 AWS 로드 밸런서 컨트롤러 액세스를 허용합니다.

      1. IAM 정책을 다운로드합니다. 정책을 볼 수도 있습니다.

        curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.0/docs/install/iam_policy_v1_to_v2_additional.json
      2. IAM 정책을 생성하고 반환된 ARN 적어둡니다.

        aws iam create-policy \ --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \ --policy-document file://iam_policy_v1_to_v2_additional.json
      3. IAM 정책을 이전 단계에서 생성한 IAM 역할에 연결합니다. your-role-name을 역할의 이름으로 바꿉니다. eksctl을 사용하여 생성한 경우 생성된 역할 이름을 찾으려면 AWS CloudFormation 콘솔을 열고 eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller 스택을 선택합니다. 리소스 탭을 선택합니다. [실제 ID(Physical ID) 열에 역할 이름이 있습니다. AWS Management Console을 사용하여 역할을 생성하는 경우 역할 이름은 사용자가 지정한 이름(예: AmazonEKSLoadBalancerControllerRole)입니다.

        aws iam attach-role-policy \ --role-name your-role name \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
  5. Helm V3 이상을 사용하거나 Kubernetes 매니페스트를 적용하여 AWS 로드 밸런서 컨트롤러를 설치합니다. Fargate에서 컨트롤러를 배포하려면 Helm 차트를 사용하세요. cert-manager에 의존하지 않습니다.

    Helm V3 or later
    1. eks-charts 리포지토리를 추가합니다.

      helm repo add eks https://aws.github.io/eks-charts
    2. 최신 차트가 적용되도록 로컬 리포지토리를 업데이트합니다.

      helm repo update
    3. AWS 로드 밸런서 컨트롤러를 설치합니다. Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 대해 제한적인 액세스 권한이 있는 Amazon EC2 노드에 컨트롤러를 배포하거나 Fargate에 배포하는 경우, 다음 명령에 다음 플래그를 추가합니다.

      • --set region=region-code

      • --set vpcId=vpc-xxxxxxxx

      us-west-2 이외의 리전에 배포하는 경우 다음 명령에 다음 플래그를 추가한 후 accountregion-codeAmazon EKS 추가 기능 컨테이너 이미지 주소에 나열된 리전의 값으로 대체합니다.

      --set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=cluster-name \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
      중요

      배포된 차트는 보안 업데이트를 자동으로 수신하지 않습니다. 새 차트가 사용 가능해지면 수동으로 업그레이드해야 합니다. 업그레이드 시 이전 명령에서 installupgrade로 변경하되, 이전 명령을 실행하기 전에 다음 명령을 실행하여 TargetGroupBinding 사용자 지정 리소스 정의를 설치합니다.

      kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
    Kubernetes manifest
    1. cert-manager를 설치하여 인증서 구성을 Webhook에 주입합니다.

      kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
    2. 컨트롤러를 설치합니다.

      1. 컨트롤러 사양을 다운로드합니다. 컨트롤러에 대한 자세한 내용은 GitHub에서 문서를 참조하세요.

        curl -Lo v2_3_0_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.3.0/v2_3_0_full.yaml
      2. v2_3_0_full.yaml 파일에 대해 편집한 항목:

        • 파일의 ServiceAccount 섹션을 삭제합니다. 이 섹션을 삭제하면 컨트롤러가 배포될 때 IAM 역할의 주석이 덮어쓰여지지 않으며 컨트롤러를 삭제할 경우 3단계에서 생성한 서비스 계정이 유지됩니다.

        • 파일의 Deployment spec 섹션에 있는 your-cluster-name을 클러스터의 이름으로 바꿉니다.

          ... spec: containers: - args: - --cluster-name=your-cluster-name ...
        • Amazon EC2 인스턴스 메타데이터 서비스(IMDS)에 대해 제한적인 액세스 권한이 있는 Amazon EC2 노드에 컨트롤러를 배포하거나 Fargate에 배포하는 경우, - args:에서 following parameters를 추가합니다.

          ... spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code ...
      3. 파일을 적용합니다.

        kubectl apply -f v2_3_0_full.yaml
  6. 컨트롤러가 설치되어 있는지 확인합니다.

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

    결과

    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s

    Helm을 사용하여 배포한 경우 이전 출력이 표시됩니다. Kubernetes 매니페스트를 사용하여 배포한 경우 복제본이 하나만 있습니다.

  7. 컨트롤러를 사용하여 AWS 리소스를 프로비저닝하기 전에 클러스터가 특정 요구 사항을 충족해야 합니다. 자세한 내용은 Amazon EKS의 애플리케이션 로드 밸런싱Amazon EKS의 네트워크 로드 밸런싱 단원을 참조하십시오.