AWS Load Balancer Controller를 사용하여 Amazon EKS의 Amazon EC2 노드 그룹에 Application Load Balancer를 설정하려면 어떻게 해야 합니까?
AWS Load Balancer Controller를 사용하여 Amazon Elastic Kubernetes Service(Amazon EKS)의 Amazon Elastic Compute Cloud(Amazon EC2) 노드 그룹에 Application Load Balancer를 설정하려고 합니다.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
전제 조건: 워커 노드에서 아웃바운드 인터넷 액세스를 허용하도록 서브넷을 구성합니다. AWS Load Balancer Controller에는 아웃바운드 인터넷 연결이 필요합니다.
AWS Fargate에 AWS Load Balancer Controller를 배포하려면 Fargate용 Amazon EKS 클러스터에 AWS Load Balancer Controller를 설정하려면 어떻게 해야 합니까?를 참조하십시오.
서브넷에 태그 지정
Amazon EKS 클러스터의 Amazon Virtual Private Cloud(Amazon VPC) 서브넷에 태그를 지정합니다. 서브넷에 태그를 지정하면 Application Load Balancer 리소스를 만들 때 AWS Load Balancer Controller가 서브넷을 자동으로 검색합니다.
퍼블릭 Application Load Balancer의 경우 클러스터 VPC에 kubernetes.io/role/elb 태그가 포함된 퍼블릭 서브넷이 2개 이상 있어야 합니다.
프라이빗 Application Load Balancer의 경우 클러스터 VPC에 kubernetes.io/role/internal-elb 태그가 포함된 프라이빗 서브넷이 2개 이상 있어야 합니다.
OIDC ID 제공업체 생성
Amazon EKS 콘솔, AWS CLI 또는 eksctl을 사용하여 서비스 계정(IRSA)의 AWS Identity and Access Management(IAM) 역할과 함께 사용할 OIDC ID 제공업체를 생성하십시오.
Amazon EKS 콘솔
콘솔을 사용하려면 OIDC ID 제공업체 생성(AWS 콘솔)을 참조하십시오.
AWS CLI
클러스터에서 사용하는 루트 인증 기관(CA)의 지문을 찾으십시오. 그 후 다음 create-open-id-connect-provider 명령을 실행합니다.
ISSUER_URL=$(aws eks describe-cluster --name cluster-name \ --query "cluster.identity.oidc.issuer" --region region-name --output text)aws iam create-open-id-connect-provider \ --url ${ISSUER_URL} \ --thumbprint-list ca-thumbprint \ --client-id-list sts.amazonaws.com \ --region region-name
참고: cluster-name을 클러스터 이름으로, region-name을 AWS 리전으로, ca-thumbprint를 루트 CA 인증서의 지문으로 바꾸십시오.
eksctl
eksctl 명령줄 도구를 사용하려면 OIDC ID 제공업체 생성(eksctl)을 참조하십시오.
IAM 정책 생성
AWS Load Balancer Controller가 AWS API를 직접적으로 호출할 수 있도록 허용하는 IAM 정책을 생성합니다.
중요: AWS API에 대한 액세스 권한을 부여할 때 IRSA를 사용하는 것이 가장 좋습니다.
다음 단계를 완료하십시오.
-
리전에 따라 다음 명령 중 하나를 실행하여 GitHub에서 AWS Load Balancer Controller용 IAM 정책을 다운로드합니다.
중국 베이징 및 닝샤 리전을 제외한 모든 리전에 대해 다음 describe-cluster 명령을 실행합니다.ISSUER_URL= aws eks describe-cluster --name example-cluster-name \ --query "cluster.identity.oidc.issuer" --region example-region-name --output text aws iam create-open-id-connect-provider \ --url example-issuer-url \ --thumbprint-list ca-thumbprint \ --client-id-list sts.amazonaws.com \ --region example-region-name참고: example-cluster-name을 클러스터 이름으로, example-region-name을 리전으로, example-issuer-url을 발급자 URL로 바꾸십시오.
중국 베이징 및 닝샤 리전의 경우 다음 curl 명령을 실행합니다.curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json -
다음 create-policy 명령을 실행하여 워커 노드 인스턴스 프로파일에 대해 AWSLoadBalancerControllerIAMPolicy라는 이름의 IAM 정책을 생성합니다.
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam-policy.json -
명령이 반환하는 정책의 Amazon 리소스 이름(ARN)을 기록해 둡니다.
-
기존 IAM 역할을 사용하거나 AWS Load Balancer Controller를 위한 새 IAM 역할을 생성합니다.
참고: eksctl을 사용하여 IAM 역할을 생성하려면 --attach-policy-arn 파라미터를 AWSLoadBalancerControllerIAMPolicy IAM 정책의 ARN과 함께 사용하십시오. -
다음 attach-role-policy 명령을 실행하여 AWSLoadBalancerControllerIAMPolicy를 IAM 역할에 연결합니다.
aws iam attach-role-policy \--policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \--role-name role-name참고: 111122223333을 AWS 계정 ID로 바꾸고 role-name을 해당 IAM 역할 이름으로 바꾸십시오.
AWS Load Balancer Controller 배포
다음 단계를 완료하십시오.
-
서브넷과 연결된 로드 밸런서에 필요한 태그가 있는지 확인합니다.
-
Kubernetes 1.16 이상에서 다음 명령을 실행하여 cert-manager를 설치합니다.
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/example-version/cert-manager.yaml -
GitHub에서 다운로드한 매니페스트 파일에서 다음 명령을 실행합니다.
curl -Lo ingress-controller.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/example-version/v2_13_3_full.yaml참고: example-version을 배포하려는 AWS Load Balancer Controller 버전으로 바꾸십시오. AWS Load Balancer Controller 버전을 확인하려면 GitHub 웹 사이트에서 Kubernetes SIG를 참조하십시오. 버전과 일치하도록 파일 이름을 수정해야 합니다. 위 코드 예제에서 v2_13_3_full.yaml은 AWS Load Balancer Controller v2.13.3과 일치합니다. 자세한 내용은 GitHub 웹 사이트에서 aws-load-balancer-controller를 참조하십시오.
-
.yaml 파일의 ServiceAccount 섹션에서 다음과 같이 업데이트합니다.
spec: containers: - args: - --cluster-name=example-cluster-name - --ingress-class=alb참고: example-cluster-name을 클러스터 이름으로 바꾸십시오.
다음 예제에서 111122223333은 계정 ID이고 example-role-name은 IAM 역할 이름입니다.apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/example-role-name name: aws-load-balancer-controller namespace: kube-system -
다음 명령을 실행하여 AWS Load Balancer Controller를 배포합니다.
kubectl apply -f ingress-controller.yaml
샘플 애플리케이션 배포
샘플 애플리케이션을 배포하여 AWS Load Balancer Controller가 인바운드 객체로 인해 퍼블릭 Application Load Balancer를 생성하는지 확인합니다.
다음 단계를 완료하십시오.
-
다음 명령을 실행하여 2048이라는 게임을 배포합니다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/example-version/docs/examples/2048/2048_full.yaml참고: example-version을 배포하려는 AWS Load Balancer Controller의 버전으로 바꾸십시오. AWS Load Balancer Controller 버전을 확인하려면 GitHub 웹 사이트에서 Kubernetes SIG를 참조하십시오.
-
몇 분 후 다음 명령을 실행하여 Kubernetes가 인바운드 리소스를 생성했는지 확인합니다.
kubectl get ingress/ingress-2048 -n game-2048출력 예시:
NAME CLASS HOSTS ADDRESS PORTS AGEingress-2048 <none> * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com 80 2m32s -
Kubernetes가 인바운드 리소스를 생성하지 않는 경우, 다음 명령을 실행하여 AWS Load Balancer Controller 로그에서 배포 오류 메시지를 검토합니다.
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller -
게임을 보려면 웹 브라우저를 연 다음, 2번 단계의 출력에서 URL 주소를 입력합니다.
-
다음 명령을 실행하여 게임을 삭제합니다.
kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/example-version/docs/examples/2048/2048_full.yaml참고: example-version을 배포하려는 AWS Load Balancer Controller의 버전으로 바꾸십시오.
- 언어
- 한국어
