Fargate용 Amazon EKS 클러스터에 AWS Load Balancer Controller를 설정하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 6월 7일

AWS Fargate용 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에 AWS Load Balancer Controller를 설정하려고 합니다.

간략한 설명

다음 단계는 기존 Application Load Balancer(ALB) Ingress Controller 배포 없이 새 Fargate 클러스터에 AWS Load Balancer Controller를 설정하는 방법을 보여줍니다.

시작하기 전에 다음을 고려하세요.

  • AWS ALB Ingress Controller for Kubernetes를 제거합니다. AWS Load Balancer Controller는 AWS ALB Ingress Controller의 기능을 대체합니다.
  • eksctl 버전 0.38.0 이상을 사용합니다.
  • 워크스테이션에 Helm을 설치합니다.
  • --region 변수가 명령에 항상 사용되는 것은 아닙니다. AWS 리전의 기본값이 사용되기 때문입니다. 기본값을 확인하려면 aws configure 명령을 실행합니다. AWS 리전을 변경하려면 --region 플래그를 사용합니다.
  • Fargate 기반 Amazon EKS는 중국(베이징), 중국(닝샤), AWS GovCloud(미국 동부) 및 AWS GovCloud(미국 서부)를 제외한 모든 Amazon EKS 리전에서 사용할 수 있습니다.
  • 코드 조각의 자리 표시자 값을 사용자 고유의 값으로 바꿉니다.

해결 방법

Amazon EKS 클러스터, 서비스 계정 정책 및 RBAC 정책 생성

1.    eksctl을 사용하여 Amazon EKS Cluster for Fargate를 생성하려면 다음 명령을 실행합니다.

eksctl create cluster --name YOUR_CLUSTER_NAME --version 1.18 --fargate

참고: Fargate 포드(--fargate)만 사용하는 클러스터에 대해서는 Fargate 포드 실행 역할을 생성할 필요가 없습니다. 기존 Amazon EKS 클러스터를 사용할 수 있지만 클러스터에서 Kubernetes 버전 1.15 이상을 실행해야 합니다.

2.    클러스터가 서비스 계정에 AWS Identity and Access Management(IAM)를 사용하도록 허용하려면 다음 명령을 실행합니다.

eksctl utils associate-iam-oidc-provider --cluster YOUR_CLUSTER_NAME --approve

참고: FargateExecutionRolekubeletkube-proxy가 Fargate Pod를 실행하는 역할입니다. 그러나 Fargate 포드(즉, aws-load-balancer-controller)의 역할은 아닙니다. Fargate 포드의 경우 서비스 계정에 대한 IAM 역할을 사용해야 합니다. 자세한 내용은 AWS Load Balancer Controller서비스 계정용 IAM 역할을 참조하세요.

3.    AWS Load Balancer Controller에서 사용자 대신 AWS API를 호출하는 것을 허용하는 IAM 정책을 다운로드하려면 다음 명령을 실행합니다.

curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.2.0/docs/install/iam_policy.json

4.    3단계에서 다운로드한 정책을 사용하여 IAM 정책을 생성하려면 다음 명령을 실행합니다.

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

5.    AWS Load Balancer Controller에 대한 kube-system 네임스페이스에 aws-load-balancer-controller라는 이름의 서비스 계정을 생성하려면 다음 명령을 실행합니다.

eksctl create iamserviceaccount \
  --cluster=YOUR_CLUSTER_NAME \
  --namespace=kube-system \
  --name=aws-load-balancer-controller \
  --attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
  --override-existing-serviceaccounts \
  --approve

6.    새 서비스 역할이 생성되었는지 확인하려면 다음 명령을 실행합니다.

eksctl get iamserviceaccount --cluster YOUR_CLUSTER_NAME --name aws-load-balancer-controller --namespace kube-system

또는

kubectl get serviceaccount aws-load-balancer-controller --namespace kube-system

Helm을 사용하여 AWS Load Balancer Controller 설치

중요: 자세한 내용은 Jetstack GitHub 사이트의 cert-manager 및 Kubernetes GitHub 사이트의 토론 주제 Cert-manager issues with Fargate를 참조하세요.

1.    Helm에 Amazon EKS 차트 리포지토리를 추가하려면 다음 명령을 실행합니다.

helm repo add eks https://aws.github.io/eks-charts

2.    TargetGroupBinding 사용자 지정 리소스 정의(CRD)를 설치하려면 다음 명령을 실행합니다.

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

3.    Helm 차트를 설치하려면 다음 명령을 실행합니다.

helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
    --set clusterName=YOUR_CLUSTER_NAME \
    --set serviceAccount.create=false \
    --set region=<REGION_CODE> \
    --set vpcId=<VPC_ID> \
    --set serviceAccount.name=aws-load-balancer-controller \
    -n kube-system

AWS Load Balancer Controller 테스트

AWS Load Balancer Controller를 사용하여 ALB Ingress 또는 Network Load Balancer 서비스를 생성할 수 있습니다. 다음 단계에서는 ALB Ingress와 함께 2048이라는 샘플 앱을 배포하는 방법을 보여줍니다.

1.    게임 배포에 필요한 Fargate 프로파일을 생성하려면 다음 명령을 실행합니다.

eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

2.    샘플 게임을 배포하고 AWS Load Balancer Controller가 ALB Ingress를 생성하는지 확인하려면 다음 명령을 실행합니다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.3/docs/examples/2048/2048_full.yaml

3.    몇 분 후에 다음 명령을 사용하여 Ingress 리소스가 생성되었는지 확인합니다.

kubectl get ingress/ingress-2048 -n game-2048

출력:

NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-east-2.elb.amazonaws.com   80      2m32s

참고: 몇 분 후에 Ingress가 생성되지 않으면 다음 명령을 실행하여 AWS Load Balancer Controller 로그를 확인합니다.

kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller

참고: 이 로그에는 배포 문제를 진단하는 데 도움이 되는 오류 메시지가 포함될 수 있습니다.

4.    브라우저를 열고 이전 명령 출력의 ADDRESS URL로 이동하여 샘플 애플리케이션을 확인합니다.

참고: 아무 것도 표시되지 않으면 몇 분 정도 기다린 다음 브라우저를 새로 고칩니다.

NLB IP 모드 서비스를 사용하여 샘플 애플리케이션 배포

Network Load Balancer(NLB) IP 모드를 사용하려면 클러스터에서 Kubernetes v1.16 이상을 실행해야 합니다. 자세한 내용은 Kubernetes 웹 사이트에서 NLB IP 모드를 참조하세요.

1.    Fargate 프로파일을 생성하려면 다음 명령을 실행합니다.

eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

2.    2048 게임 배포를 위한 매니페스트를 가져오려면 다음 명령을 실행합니다.

curl -o 2048-game.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.1.3/docs/examples/2048/2048_full.yaml

3.    2단계의 매니페스트를 편집하고 Ingress 섹션을 삭제하려면 다음 명령을 실행합니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service-2048
              servicePort: 80

4.     다음과 같이 Service 객체를 편집합니다.

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: nlb-ip
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: app-2048

5.    서비스 및 배포 매니페스트를 생성하려면 다음 명령을 실행합니다.

kubectl apply -f 2048-game.yaml

6.    서비스 생성 및 Network Load Balancer의 DNS 이름을 확인하려면 다음 명령을 실행합니다.

kubectl get svc -n game-2048

출력:

NAME           TYPE           CLUSTER-IP       EXTERNAL-IP                                                                     PORT(S)        AGE
service-2048   LoadBalancer   10.100.114.197   k8s-game2048-service2-xxxxxxxxxx-yyyyyyyyyy.us-east-2.elb.amazonaws.com   80:30159/TCP   23m

7.    로드 밸런서가 활성화될 때까지 몇 분 정도 기다립니다. 그런 다음 배포에 연결할 수 있는지 확인하려면 웹 브라우저의 EXTERNAL-IP 섹션에 참조된 Network Load Balancer의 정규화된 도메인 이름(FQDN)을 엽니다.

AWS Load Balancer Controller 문제 해결

컨트롤러 설정에 문제가 있는 경우 다음 명령을 실행합니다.

$ kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
$ kubectl get endpoints -n game-2048
$ kubectl get ingress/2048-ingress -n 2048-game

logs 명령의 출력은 일반적인 오류를 해결하는 데 도움이 될 수 있는 Kubernetes GitHub 웹 사이트 오류 메시지(예: 태그 또는 서브넷 포함)를 반환합니다. get endpoints 명령은 지원되는 배포 포드가 올바르게 등록되었는지 보여줍니다. get ingress 명령은 Ingress 리소스가 배포되었는지 보여줍니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?