내용으로 건너뛰기

Amazon EKS에서 Application Load Balancer가 사용하는 서브넷을 자동으로 검색하려면 어떻게 해야 합니까?

5분 분량
0

Amazon Elastic Kubernetes Service(Amazon EKS)에서 내 Application Load Balancer가 사용하는 서브넷을 자동으로 검색하고 싶습니다.

간략한 설명

Application Load Balancer가 사용하는 서브넷을 식별하기 위해 aws-load-balancer-controller AWS Load Balancer Controller는 클러스터의 서브넷을 쿼리합니다. 쿼리는 다음 태그를 필터로 사용합니다.

kubernetes.io/cluster/cluster-name      shared
kubernetes.io/role/elb                    1
OR    
kubernetes.io/role/internal-elb           1

참고: cluster-name을 Amazon EKS 클러스터 이름으로 바꾸십시오.

AWS Load Balancer Controller에서 Application Load Balancer가 사용하는 서브넷을 자동으로 검색할 수 있도록 하려면 서브넷에 태그를 지정하십시오.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.

서브넷에 태그 추가

다음 단계를 완료하십시오.

  1. Amazon EKS 클러스터에 AWS Load Balancer Controller를 배포합니다.
  2. AWS Load Balancer Controller를 올바르게 설치했는지 확인하려면 다음 명령을 실행합니다.
    kubectl get deployment -n kube-system aws-load-balancer-controller
    참고: 다른 네임스페이스에 AWS Load Balancer Controller를 배포한 경우 -n kube-system을 올바른 네임스페이스로 바꾸십시오.
  3. 다음 주석을 사용해 클러스터에 Kubernetes Ingress 리소스를 만듭니다.
    annotations:    kubernetes.io/ingress.class: alb
    참고: AWS Load Balancer Controller는 로드 밸런서를 만드는 데 도움이 됩니다. Ingress 리소스는 HTTP 및 HTTPS 트래픽을 클러스터의 다른 포드로 라우팅하도록 Application Load Balancer를 구성합니다.
  4. Ingress 객체 annotations에서 internal을 입력하여 내부 로드 밸런서를 만들거나 internet-facing을 입력하여 퍼블릭 로드 밸런서를 만듭니다.
    alb.ingress.kubernetes.io/scheme: internal            
    -또는-
    alb.ingress.kubernetes.io/scheme: internet-facing
    참고: 수동 alb.ingress.kubernetes.io/subnets 주석 대신 서브넷 자동 검색에 태그를 사용할 수 있습니다.
    클러스터 버전 1.18 이하의 경우 Amazon EKS는 클러스터 생성 중에 Amazon EKS가 전달하는 모든 서브넷에 다음 태그를 추가합니다.
    kubernetes.io/cluster/CLUSTER_NAME
    참고: CLUSTER_NAME을 클러스터 이름으로 바꾸십시오.
    kubernetes.io/cluster/CLUSTER_NAME 태그는 AWS Load Balancer Controller 버전 2.1.1 이하를 사용하는 경우에만 필요합니다. Amazon EKS는 이 태그를 자동으로 추가 또는 제거하지 않습니다. 이 태그는 버전 1.19 이전의 클러스터에 필요했지만 클러스터 업그레이드 후에도 서브넷에 남아 있습니다.
  5. 서브넷에 올바른 태그가 있는지 확인하려면 다음 describe-subnets AWS CLI 명령을 실행합니다.
    aws ec2 describe-subnets --subnet-ids your-subnet-abcdefghxyz
    참고: your-subnet-abcdefghxyz를 서브넷 ID로 바꾸십시오.
  6. 애플리케이션을 배포하려면 다음 명령을 실행합니다.
    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
    참고: 위 명령은 Ingress 객체 때문에 Application Load Balancer를 만듭니다.
  7. Amazon EKS에서 Ingress 리소스 및 관련 Application Load Balancer를 생성했는지 확인하려면 다음 명령을 실행합니다.
    kubectl get ingress/2048-ingress -n game-2048

태그 오류 해결

태그를 사용하여 서브넷을 자동으로 검색할 때 발생하는 오류에 따라 다음 작업을 수행하십시오.

권한 거부 문제

AWS Load Balancer Controller에 대한 AWS 계정의 AWS Identity and Access Management(IAM) 역할에는 필요한 권한이 있어야 합니다. 그렇지 않으면 다음과 같은 오류 메시지가 표시됩니다.

"{"level":"error","ts":1621443417.9175518,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":" ingress-2048","namespace":" game-2048","error":"couldn't auto-discover subnets: UnauthorizedOperation: You are not authorized to perform this operation.\n\tstatus code: 403, request id: 72ee57ae-f804-4f81-b069-8b04114b67b0"}"

이 문제를 해결하려면 다음 단계를 완료하십시오.

  1. 서비스 계정이 AWS Load Balancer Controller와 연결되어 있는지 확인하려면 다음 명령을 실행합니다.

    kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount

    참고: 다른 네임스페이스에 AWS Load Balancer Controller를 배포한 경우 -n kube-system을 올바른 네임스페이스로 바꾸십시오.
    출력 예시:

    serviceAccount: aws-load-balancer-controller
    serviceAccountName: aws-load-balancer-controller
  2. AWS Load Balancer Controller와 연결한 서비스 계정에 연결된 IAM 역할을 식별하려면 다음 명령을 실행합니다.

    kubectl describe sa aws-load-balancer-controller -n kube-system | grep role-arn

    출력 예시:

    annotations: eks.amazonaws.com/role-arn: arn:aws:iam::abcdefxyz:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-abcdefxyz

참고: 서비스 계정(IRSA)에 IAM 역할을 사용하지 않는 경우 Amazon EKS 워커 노드 IAM 역할에 필요한 권한이 있는지 확인하십시오. 필요한 권한을 보려면 GitHub 웹 사이트에서 iam_policy.json을 참조하십시오.

단일 서브넷 검색 문제

AWS Load Balancer Controller가 하나 이상의 서브넷을 검색하지 못하면 다음 오류 메시지 중 하나가 표시됩니다.

"{"level":"error","ts":1608229710.3212903,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"couldn't auto-discover subnets: unable to resolve at least one subnet"}"

-또는-

"kubebuilder/controller "msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to
retrieval of subnets failed to resolve 2 qualified subnets. Subnets must contain the kubernetes.io/cluster/\u003ccluster name\u003e tag with a value of shared or owned and the kubernetes.io/role/elb tag signifying it should be used for ALBs Additionally, there must be at least 2 subnets with unique availability zones as required by ALBs. Either tag subnets to meet this requirement or use the subnets annotation on the ingress resource to explicitly call out what subnets to use for ALB creation. The subnets that did resolve were []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"

이 문제를 해결하려면 AWS Load Balancer Controller가 자동 검색을 사용하여 로드 밸런서를 생성할 수 있도록 서브넷에 태그를 추가하십시오.

프라이빗 서브넷의 경우 다음 태그를 추가합니다.

kubernetes.io/role/internal-elb                1

퍼블릭 서브넷의 경우 다음 태그를 추가합니다.

kubernetes.io/role/elb                         1

참고: alb.ingress.kubernetes.io/subnets 주석을 사용해 로드 밸런서에 서브넷을 수동으로 할당할 수 있습니다. 필요한 권한을 보려면 GitHub 웹 사이트에서 iam_policy.json을 참조하십시오.

앞 뒤에 공백 없이 다음 형식으로 서브넷에 태그를 지정합니다.

  • 키에 kubernetes.io/cluster/your-cluster-name을 입력합니다.
  • 값에 공유됨 또는 소유됨을 입력합니다.

AWS Load Balancer Controller 버전 2.1.1 이하를 사용하는 경우 서브넷에 위 형식으로 태그를 지정해야 합니다. 버전 2.1.2 이상에서는 태그 지정이 선택 사항입니다.

다음과 같은 시나리오의 경우 서브넷에 태그를 지정하는 것이 좋습니다.

  • 동일한 Virtual Private Cloud(VPC)에서 실행되는 클러스터가 여러 개 있을 경우
  • VPC에서 서브넷을 공유하는 AWS 서비스가 여러 개 있을 경우
  • 각 클러스터에 로드 밸런서가 할당되는 위치를 더 세밀하게 제어하고 싶을 경우

여러 서브넷 검색 오류

AWS Load Balancer Controller가 적격 서브넷을 두 개 이상 발견하지 못하면 다음과 같은 오류 메시지가 표시됩니다.

"{"level":"error","ts":"2024-08-12T19:01:27Z","msg":"Reconciler error","controller":"ingress","object":{"name":"ingress-2048","namespace":"game-2048"},"namespace":"game-2048","name":"ingress-2048","reconcileID":"1234567","error":"couldn't auto-discover subnets: unable to resolve at least one subnet (2 match VPC and tags: [kubernetes.io/role/internal-elb], 2 have fewer than 8 free IPs)"}"

이 문제를 해결하려면 다음 단계를 완료하십시오.

  1. 두 개의 서로 다른 가용 영역에 서브넷이 두 개 이상 있는지 확인합니다.
    참고: Application Load Balancer를 만들기 위한 요구 사항입니다. 단일 서브넷으로 Network Load Balancer를 만들 수 있습니다.
  2. 각 서브넷에 최소 /27 비트 마스크(예: 10.0.0.0/27)와 8개 이상의 사용 가능한 IP 주소를 포함하는 CIDR 블록을 지정합니다.
  3. 서브넷의 태그 형식을 올바르게 지정했는지 확인합니다. 예를 들어 태그 앞이나 뒤에 공백이 없어야 합니다.