Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
Amazon EKS에서 Application Load Balancer가 사용하는 서브넷을 자동으로 검색하려면 어떻게 해야 하나요?
Amazon Elastic Kubernetes Service(Amazon EKS)에서 내 Application Load Balancer가 사용하는 서브넷을 자동으로 검색하고 싶습니다.
간략한 설명
Kubernetes Cloud Controller Manager(cloud-controller-manager)와 AWS Load Balancer Controller(aws-load-balancer-controller)는 Application Load Balancer가 사용하는 서브넷을 파악하기 위해 클러스터의 서브넷을 쿼리합니다. 이 쿼리에 다음 태그를 필터로 사용합니다.
kubernetes.io/cluster/cluster-name shared
**참고: ** cluster-name을 내 Amazon EKS 클러스터 이름으로 바꾸세요.
AWS Load Balancer Controller에서 Application Load Balancer가 사용하는 서브넷을 자동으로 검색할 수 있도록 하려면 서브넷에 태그를 지정해야 합니다.
해결 방법
서브넷에 태그 추가
서브넷에 태그를 지정하려면 다음 단계를 완료하세요.
-
Amazon EKS 클러스터용 AWS Load Balancer Controller 애드온을 배포합니다.
-
AWS Load Balancer Controller가 설치되어 있는지 확인합니다.
kubectl get deployment -n kube-system aws-load-balancer-controller
**참고:**다른 네임스페이스에 배포할 경우 -n kube-system을 적절한 네임스페이스로 바꾸세요.
-
다음 주석을 사용해 클러스터에 Kubernetes Ingress 리소스를 생성하세요.
annotations: kubernetes.io/ingress.class: alb
참고: AWS Load Balancer Controller에서 로드 밸런서를 생성합니다. Ingress 리소스에서 HTTP(S) 트래픽을 클러스터 내 다른 포드로 라우팅하도록 Application Load Balancer를 구성합니다.
-
내부 또는 인터넷 연결 주석을 추가해 Ingress에서 로드 밸런서를 생성할 위치를 지정합니다.
alb.ingress.kubernetes.io/scheme: internal -or- alb.ingress.kubernetes.io/scheme: internet-facing
참고: 내부 로드 밸런서를 만들려면 내부를 선택하고, 공용 로드 밸런서를 만들려면 인터넷 연결을 선택하세요.
-
AWS Load Balancer Controller에서 서브넷을 자동 검색하는 로드 밸런서를 생성하도록 하려면 태그를 사용하세요. 태그 이름 앞과 뒤에 공백을 제거하세요. 다음 예를 참고하세요.
kubernetes.io/role/internal-elb Set to 1 or empty tag value for internal load balancers kubernetes.io/role/elb Set to 1 or empty tag value for internet-facing load balancers
참고: 수동으로 alb.ingress.kubernetes.io/subnets 주석을 사용하는 대신 태그를 사용해 자동 검색할 수 있습니다.
내부 로드 밸런서가 있는 클러스터에 올바른 태그가 있는 서브넷 예:kubernetes.io/role/internal-elb 1
공용 로드 밸런서가 있는 클러스터에 올바른 태그가 있는 서브넷 예:
kubernetes.io/role/elb 1
참고: 클러스터 버전 1.18 이하의 경우 Amazon EKS에서 클러스터 생성 중에 전달되는 모든 서브넷에 다음 태그를 추가합니다. 버전 1.19 클러스터에는 태그가 추가되지 않습니다. 태그를 사용하고 있으면서 클러스터 버전 1.19로 업데이트하면 태그를 다시 추가할 필요가 없습니다. 태그는 서브넷에 유지됩니다.
다음 태그를 사용해 Application Load Balancer가 할당되는 위치를 제어할 수 있습니다. 클러스터가 여럿일 경우 EKS 클러스터에 Application Load Balancer를 자동으로 할당하는 데 필요한 태그와 더불어 이 태그를 사용하세요.
kubernetes.io/cluster/$CLUSTER_NAME shared
-
서브넷 태그가 올바른지 확인하세요.
aws ec2 describe-subnets --subnet-ids your-subnet-xxxxxxxxxxxxxxxxx
-
애플리케이션 샘플을 배포해 AWS Load Balancer Controller가 Ingress 개체로 인해 Application Load Balancer를 생성하는지 확인하세요.
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/examples/2048/2048_full.yaml
-
Ingress 리소스가 생성되고 관련 Application Load Balancer가 있는지 확인하세요.
kubectl get ingress/2048-ingress -n game-2048
Ingress 개체 및 서브넷에서 정의한 주석(alb.ingress.kubernetes.io/scheme:)에 따라 내부 또는 인터넷 연결 로드 밸런서가 생성됩니다.
일반적인 태그 오류 문제 해결
태그를 사용해 서브넷을 자동으로 검색할 때 일반적으로 발생하는 오류에는 다음이 있습니다.
권한 거부 오류
계정의 AWS Identity and Access Management(IAM)에 AWS Load Balancer Controller에 접근하는 데 필요한 권한이 없는 경우 다음과 같은 오류 메시지가 나타납니다.
"{"level":"error","ts":1621443417.9175518,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":" ingress-2048","namespace":" game-2048","error":"서브넷을 자동 검색할 수 없음: UnauthorizedOperation: 이 작업을 할 권한이 없습니다.\n\tstatus code: 403, request id: 72ee57ae-f804-4f81-b069-8b04114b67b0"}”
이 문제를 해결하려면, 다음 단계를 완료하세요.
-
서비스 계정이 AWS Load Balancer Controller와 연결되어 있는지 확인하세요.
$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount
다음 예와 유사한 출력이 표시됩니다.
serviceAccount: aws-load-balancer-controllerserviceAccountName: aws-load-balancer-controller
**참고:**다른 네임스페이스에 배포할 경우 -n kube-system을 적절한 네임스페이스로 바꾸세요.
-
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::xxxxxxxxxxx:role/eksctl-cluster18-addon-iamserviceaccount-kub-Role1-xxxxxxxxxxxxx
-
ec2:DescribeAvailabilityZones와 같이 관련된 권한을 모두 IAM 역할에 부여합니다. AWS Load Balancer Controller가 IAM 역할을 맡아 API 호출을 실행하는 방법에 대한 자세한 내용은 서비스 계정의 IAM 역할을 참고하세요. 관련 권한 목록은 GitHub의 AWS Load Balancer Controller 웹 페이지에서 IAM JSON 정책을 참고하세요.
단일 서브넷 검색 오류
AWS Load Balancer Controller가 하나 이상의 서브넷을 검색하지 못하면 다음 오류 메시지 중 하나가 표시됩니다.
"{"level":"error","ts":1608229710.3212903,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"ingress-2048","namespace":"game-2048","error":"서브넷을 자동 검색할 수 없음: 서브넷 최소 한 개를 확인할 수 없음"}"
-또는-
"kubebuilder/controller "msg"="Reconciler error" "error"="적격 서브넷 2개를 가져오지 못해
LoadBalancer 구성 구축에 실패함. 서브넷에는 공유 값이나 소유 값인 kubernetes.io/cluster/\u003ccluster name\u003e 태그와 ALB에 사용해야 함을 나타내는 kubernetes.io/role/elb 태그가 포함되어야 합니다. 또한 ALB의 요구 조건에 따라 고유 가용 영역이 있는 서브넷이 2개 이상 있어야 합니다. 이 요구 사항을 충족하도록 서브넷에 태그를 지정하거나 Ingress 리소스의 서브넷 주석을 사용하여 ALB 생성에 사용할 서브넷을 명시적으로 호출하세요. 확인된 서브넷은 []" "controller"="alb-ingress-controller" "request"={"Namespace":"default","Name":"2048-ingress"}"입니다.
이 문제를 해결하려면 서브넷에 적절한 태그를 추가해 AWS Load Balancer Controller가 자동 검색을 통해 로드 밸런서를 생성할 수 있도록 하세요.
프라이빗 서브넷 태그:
kubernetes.io/role/internal-elb Set to 1 or empty tag value for internal load balancers
공용 서브넷 태그:
kubernetes.io/role/elb Set to 1 or empty tag value for internet-facing load balancers
**참고:******alb.ingress.kubernetes.io/subnets 주석을 사용해 로드 밸런서에 서브넷을 수동으로 할당할 수 있습니다.
앞 뒤에 공백 없이 다음 형식으로 서브넷에 태그를 지정하세요.
키: kubernetes.io/cluster/your-cluster-name
값: 공유 또는 소유
AWS Load Balancer Controller 버전 v2.1.1 이하를 사용하는 경우 서브넷을 이전 형식으로 태그를 지정해야 합니다. 버전 2.1.2 이상에서 태그 지정은 선택 사항입니다.
다음과 같은 시나리오의 경우 서브넷에 태그를 지정하는 것이 좋습니다.
- 동일한 Virtual Private Cloud(VPC)에서 실행되는 클러스터가 여러 개 있을 경우
- VPC에서 서브넷을 공유하는 AWS 서비스가 여러 개 있을 경우
- 각 클러스터에 로드 밸런서가 할당되는 위치를 더 세밀하게 제어하고 싶을 경우
여러 서브넷 검색 오류
AWS Load Balancer Controller가 적격 서브넷을 두 개 이상 발견하지 못하면 다음과 같은 오류 메시지가 나타납니다.
“{" 레벨”: “오류”, “ts”: “2024-08-12T 19:01:27 Z”, “msg”: “조정자 오류”, “컨트롤러”: “인그레스”, “개체”: {"이름”: “인그레스-2048", “네임스페이스”: “게임-2048"}, “게임-2048",” 이름”: “ingress-2048", "ReconcileId”: “1234567", "error”: “서브넷을 자동으로 검색할 수 없음: 적어도 하나의 서브넷을 확인할 수 없습니다. (두 개는 VPC 및 태그와 일치함):\ [kubernetes.io/role/internal-elb], 2개는 사용 가능한 IP가 8개 미만입니다.) "}”
이 문제를 해결하려면, 다음 단계를 완료하세요.
- 다른 가용 영역 두 개에 서브넷이 두 개 이상 있는지 확인하세요. Application Load Balancer를 생성하려면 필요합니다.
**참고:**단일 서브넷으로 Network Load Balancer를 만들 수 있습니다. - 각 서브넷에 최소**/27** 비트마스크가 있는 CIDR 블록을 지정하세요(예: 10.0.0.0/27) 및 사용 가능한 IP 주소 최소 8개
- 서브넷의 태그 형식이 올바른지 확인합니다. 예를 들어 태그 앞이나 뒤에 공백이 없어야 합니다.
관련 콘텐츠
- 질문됨 4달 전lg...