Fargate용 Amazon EKS 클러스터에 AWS Load Balancer Controller를 설정하고 2048 게임을 배포하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 8월 8일

AWS Fargate용 Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에 AWS Load Balancer Controller를 설정하려고 합니다. 그런 다음 2048 게임을 배포하고 싶습니다.

간략한 설명

다음 단계에서는 새 Fargate 클러스터에서 AWS 로드 밸런서 컨트롤러를 설정하는 방법을 보여줍니다. 기존 ALB(Application Load Balancer) 인그레스 컨트롤러 배포 없이 AWS 로드 밸런서 컨트롤러를 설정합니다.

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

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

해결 방법

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

1.    eksctl을 사용하여 Fargate용 Amazon EKS 클러스터를 생성하려면 이 명령을 실행합니다.

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

참고: Fargate 포드(--fargate)만 사용하는 클러스터에 대해서는 Fargate 포드 실행 역할을 생성할 필요가 없습니다.

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 역할을 사용해야 합니다. 자세한 내용은 서비스 계정용 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.4.1/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 사이트의 토론 주제 Fargate와 관련된 cert-manager 문제를 참조하세요.

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=YOUR_REGION_CODE \
    --set vpcId=<VPC_ID> \
    --set serviceAccount.name=aws-load-balancer-controller \
    -n kube-system

AWS Load Balancer Controller 테스트

AWS Load Balancer Controller를 사용하여 Ingress용 ALB 또는 k8s 서비스 생성용 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.4.1/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

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

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

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

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

참고: 몇 분 정도 기다린 다음 브라우저를 새로 고쳐야 할 수 있습니다.

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

NLB(Network Load Balancer) IP 모드를 사용하려면 클러스터에서 Kubernetes v1.16 이상을 실행해야 합니다.

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.4.1/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.    서비스 객체를 수정합니다.

apiVersion: v1
kind: Service
metadata:
  namespace: game-2048
  name: service-2048
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-type: external
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
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 리소스가 배포되었는지 보여줍니다.


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


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