AWS 로드 밸런서 컨트롤러가 Amazon Elastic Kubernetes Service(Amazon EKS) 에서 내 서브넷을 찾을 수 없습니다.
간략한 설명
AWS 로드 밸런서 컨트롤러가 Amazon EKS에서 서브넷을 찾을 수 없는 경우 오류가 발생합니다. 오류를 해결하려면 수신된 오류 메시지에 대한 관련 단계를 완료하세요.
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"}
위의 오류를 해결하려면 권한 거부 오류 해결 섹션의 단계를 완료하세요.
-또는-
AWS 로드 밸런서 컨트롤러가 하나 이상의 서브넷을 검색할 수 없는 경우 다음 오류가 발생합니다.
{"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 discover at least one subnet"}
위의 오류를 해결하려면 단일 서브넷 검색 오류 해결 섹션의 단계를 완료하세요.
-또는-
AWS 로드 밸런서 컨트롤러가 둘 이상의 적격 서브넷을 검색할 수 없는 경우 다음과 같은 오류가 발생합니다.
"msg"="Reconciler error" "error"="failed to build LoadBalancer configuration due to failed to resolve 2 qualified subnet with at least 8 free IP Addresses for ALB
{"level":"error","ts":1606329481.2930484,"logger":"controller","msg":"Reconciler error","controller":"ingress","name":"reciter-ing","namespace":"reciter","error":"InvalidSubnet: Not enough IP space available in subnet-xxxxxxxxxxxxxx. ELB requires at least 8 free IP addresses in each subnet.\n\tstatus code: 400, request id: 2a37780c-f411-xxxxx-xxxxx-xxxxxxxxx"}
위의 오류를 해결하려면 다중 서브넷 검색 오류 해결 섹션의 단계를 완료하세요.
해결 방법
권한 거부 오류 해결
1. 다음 명령을 입력하여 서비스 계정이 AWS 로드 밸런서 컨트롤러와 연결되어 있는지 확인합니다.
$ kubectl get deploy aws-load-balancer-controller -n kube-system -o yaml | grep -i serviceAccount
그러면 다음과 유사한 출력이 나타납니다.
serviceAccount: aws-load-balancer-controller
serviceAccountName: aws-load-balancer-controller
참고: 배포가 다른 네임스페이스에 배포된 경우 -n kube-system을 적절한 네임스페이스로 바꿉니다.
2. AWS 로드 밸런서 컨트롤러와 연결된 서비스 계정에 어떤 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
3. 2단계에서 식별한 IAM 역할에 대해 ec2:DescribeAvailabilityZones 권한을 부여합니다.
단일 서브넷 검색 오류 해결
1. 서브넷에 적절한 태그를 추가하면 AWS 로드 밸런서 수신 컨트롤러가 자동 검색을 사용하여 로드 밸런서를 생성할 수 있습니다.
다음은 프라이빗 서브넷 태그의 예입니다.
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 주석을 사용하여 로드 밸런서에 서브넷을 수동으로 할당할 수 있습니다. 자세한 내용은 AWS 로드 밸런서 컨트롤러 웹 사이트에서 수신 주석을 참조하세요.
다음은 내부 로드 밸런서가 있는 클러스터에 대해 올바른 태그가 지정된 서브넷의 예입니다(프라이빗 서브넷).
kubernetes.io/role/internal-elb 1
다음은 퍼블릭 로드 밸런서가 있는 클러스터에 올바른 태그가 지정된 서브넷의 예입니다(퍼블릭 서브넷).
kubernetes.io/role/elb
2. 서브넷에 적절한 형식으로 태그를 지정합니다.
키: kubernetes.io/cluster/your-cluster-name
값: 공유 또는 소유
중요: AWS 로드 밸런서 컨트롤러 버전 2.1.1 이하를 사용하는 경우 서브넷에 기존 형식으로 태그를 지정해야 합니다. 버전 2.1.2 이상에서는 태그 지정이 선택 사항입니다. 다음 중 하나에 해당하는 경우에는 서브넷에 태그를 지정하는 것이 좋습니다.
- 동일한 VPC에서 실행되는 클러스터가 여러 개 있는 경우.
- VPC에서 서브넷을 공유하는 여러 AWS 서비스가 있는 경우.
- 각 클러스터에 대해 로드 밸런서가 프로비저닝되는 위치를 보다 세밀하게 제어하려는 경우.
다중 서브넷 검색 오류 해결
1. 서로 다른 두 가용 영역에 최소 2개의 서브넷이 있는지 확인합니다. 이는 Application Load Balancer를 생성하기 위한 요구 사항입니다.
참고: 단일 서브넷으로 Network Load Balancer를 생성할 수 있습니다.
2. 각 서브넷에 대해 최소 /27 비트마스크(예: 10.0.0.0/27)와 8개 이상의 사용 가능한 IP 주소가 있는 CIDR 블록을 지정합니다.
3. 서브넷의 태그 형식이 올바른지 확인합니다. 예를 들어 태그의 앞과 뒤에 공백이 없어야 합니다.