Amazon EKS Cluster for Fargate에 ALB 인그레스 컨트롤러를 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 1월 30일

Amazon Elastic Kubernetes Service(Amazon EKS) Cluster for AWS Fargate에서 ALB 인그레스 컨트롤러를 설정하려고 합니다.

간략한 설명

해결 단원의 단계를 완료하기 전에 다음 사항을 고려하십시오.

  • 탭이 아닌 공백을 사용하여 YAML 파일을 올바르게 들여쓰십시오.
  • 명령에 <placeholder-value>가 표시되면 자리 표시자 값을 사용자의 값으로 바꿉니다.
  • 다음 명령에서는 -region 변수가 사용되지 않습니다. AWS 리전의 기본값이 사용되기 때문입니다. 기본값을 확인하려면 aws configure 명령을 실행합니다. AWS 리전을 변경하려면 -region 플래그를 사용합니다.
  • Amazon EKS for Fargate는 미국 동부(버지니아 북부), 미국 동부(오하이오), 유럽(아일랜드) 및 아시아 태평양(도쿄) AWS 리전에서만 사용할 수 있습니다.
  • eksctl 버전 0.11.1 이상을 사용합니다.

해결 방법

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

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

$ eksctl create cluster --name <your-cluster> --version 1.14 --fargate

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

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

$ eksctl utils associate-iam-oidc-provider --cluster your-cluster-name --approve

참고: FargateExecutionRolekubeletkube-proxy가 Fargate 포드를 실행하는 역할이지만 Fargate 포드(즉, alb-ingress-controller)의 역할은 아닙니다. Fargate 포드의 경우 서비스 계정에 대한 IAM 역할을 사용해야 합니다.

3.    올바른 권한을 사용하여 서비스 계정에 대한 IAM 정책을 생성하고 IAM 정책의 Amazon 리소스 이름(ARN)을 기록합니다.

참고: ALB 수신 컨트롤러는 수신 리소스 유형에 대한 ALB 구성 요소를 프로비저닝하기 위해 여러 API 호출이 필요합니다.

4.    서비스 객체를 생성하려면 다음 명령을 실행합니다.

$ eksctl create iamserviceaccount --name <service-account-name> --namespace kube-system --cluster <cluster-name> --attach-policy-arn IAM-policy-arn --approve --override-existing-serviceaccounts

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

$ eksctl get iamserviceaccount --cluster <cluster-name> --name <service-account-name> --namespace <namespace>

참고: 역할 이름은 eksctl-<cluster-name>-addon-iamserviceaccount-로 시작합니다.

6.    ALB 수신 컨트롤러에 대한 RBAC 권한 및 서비스 계정을 생성하려면 다음 명령을 실행합니다.

$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/rbac-role.yaml

7.    텍스트 편집기에서 rbac-role.yaml 파일을 열고 ServiceAccount 섹션에서만 다음과 같이 변경합니다.

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/name: alb-ingress-controller
  annotations:                                                                        # Add the annotations line
    eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/<IAM_ROLE_NAME>    # Add the IAM role
  name: alb-ingress-controller
  namespace: kube-system

8.    rbac-role.yaml 파일을 저장하고 다음 명령을 실행합니다.

$ kubectl apply -f rbac-role.yaml

ALB 수신 컨트롤러 설정

ALB 수신 컨트롤러를 Fargate 포드로 실행하려면 iam-for-pods를 사용해야 합니다.

참고: 테스트 목적으로만 alb-ingress-controller.yaml 파일에서 AWS_ACCESS_KEY_ID 및 AWS_SECRET_ACCESS_KEY를 환경 변수로 추가할 수 있습니다. 서비스 계정에 대한 IAM 역할을 생성하는 것이 가장 좋습니다.

1.    컨트롤러용 YAML 파일을 다운로드하려면 다음 명령을 실행합니다.

$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/alb-ingress-controller.yaml

2.    텍스트 편집기에서 alb-ingress-controller.yaml 파일을 열고 다음과 같이 변경합니다.

    spec:
      containers:
      - args:
        - --ingress-class=alb
        - --cluster-name=<cluster-name>			               	#<-- Add the cluster name
        - --aws-vpc-id=vpc-xxxxxxxxxxxxxxxxx	         		#<-- Add the VPC ID 
        - --aws-region=eu-west-1			        	#<-- Add the region 
        image: docker.io/amazon/aws-alb-ingress-controller:v1.1.4	#<======= Please make sure the Image is 1.1.4 and above. 
        imagePullPolicy: IfNotPresent

3.    alb-ingress-controller.yaml 파일을 적용하려면 다음 명령을 실행합니다.

$ kubectl apply -f alb-ingress-controller.yaml

4.    alb-ingress-controller 배포의 상태를 확인하려면 다음 명령을 실행합니다.

$ kubectl rollout status deployment alb-ingress-controller -n kube-system

ALB 수신 컨트롤러 테스트

ALB 수신 리소스와 Fargate 프로필을 생성하여 ALB 수신 컨트롤러를 테스트할 수 있습니다.

1.    Amazon EKS 콘솔에서 네임스페이스 2048-게임에 대해 Fargate 프로필을 생성하거나 다음 명령을 실행하여 eksctl을 사용하는 프로필을 생성합니다.

$ eksctl create fargateprofile --namespace 2048-game --cluster <your-cluster-name>

참고: Amazon EKS 콘솔을 사용하여 프로필을 생성하는 경우 Amazon Virtual Private Cloud(Amazon VPC)와 연결된 프라이빗 서브넷을 사용합니다. Fargate에서 실행 중인 포드에는 퍼블릭 IP 주소가 할당되지 않습니다. Fargate 프로필은 프라이빗 서브넷만 지원합니다(인터넷 게이트웨이에 대한 직접 경로 없음).

2.    2048 수신 파일을 다운로드하려면 다음 명령을 실행합니다.

$ curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/2048/2048-ingress.yaml

3.    텍스트 편집기에서 2048 수신 파일을 열고 주석을 다음과 같이 변경합니다.

 annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip                         # Add this annotation
    alb.ingress.kubernetes.io/security-groups: <Your-security-group>  # Custom security group

참고: ALB 수신 컨트롤러는 Amazon EKS for Fargate의 IP 모드에서만 작동합니다. 자세한 내용은 수신 주석을 참조하십시오.

4.    테스트 배포에 파일을 적용하려면 다음 명령을 실행합니다.

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/2048/2048-namespace.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/2048/2048-deployment.yaml
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/2048/2048-service.yaml
$ kubectl apply -f 2048-ingress.yaml

5.    수신한 주소를 사용하여 2048 페이지를 보려면 다음 명령을 실행합니다.

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

명령 출력에는 웹 브라우저에서 액세스할 수 있는 로드 밸런서의 완전히 정규화된 도메인 이름(FQDN)이 있어야 합니다.

ALB 수신 컨트롤러 문제 해결

ALB 수신 컨트롤러를 설정하는 데 문제가 있는 경우 다음 명령을 실행합니다.

$ kubectl logs your-alb-ingress-controller -n kube-system
$ kubectl get endpoints -A
$ kubectl get ingress/2048-ingress -n 2048-game

logs 명령의 출력은 일반적인 오류를 해결하는 데 도움이 될 수 있는 오류 메시지(예: 태그 또는 서브넷 포함)를 반환합니다. get endpointget ingress 명령은 성공적으로 배포되지 않은 수신 리소스를 표시할 수 있습니다.

이미지를 1.1.4로 변경하지 않고 ALB 수신 컨트롤러에 대해 YAML 파일을 실행하면 ALB 수신 컨트롤러가 인스턴스 ID를 찾을 수 없다는 오류가 표시됩니다. 이 오류를 해결하려면 aws-alb-ingress-controller에 대한 Kubernetes GitHub 페이지를 참조하십시오.

참고: 이미지 1.1.3v에는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 네트워크 인터페이스를 확인하는 구성이 있습니다. Fargate에서 ALB Ingress Controller를 실행할 수 있도록 이미지 코드가 변경되어 Amazon EC2 작업자 노드 대신 연결된 탄력적 네트워크 인터페이스를 찾습니다. 


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?