로드 밸런서 또는 수신 컨트롤러의 자동 서브넷 검색을 위해 Amazon EKS 클러스터의 Amazon VPC 서브넷에 태그를 지정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 2월 7일

Amazon Virtual Private Cloud(Amazon VPC)의 퍼블릭 또는 프라이빗 서브넷에 로드 밸런서 또는 수신 컨트롤러를 배포하려고 합니다. Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터에서 Kubernetes로 서브넷을 검색할 수 없는 이유는 무엇입니까?

간략한 설명

클러스터의 서브넷을 식별하기 위해 Kubernetes Cloud Controller Manager(cloud-controller-manager) 및 ALB Ingress Controller(alb-ingress-controller)는 다음 태그를 필터로 사용하여 클러스터의 서브넷을 쿼리합니다.

kubernetes.io/cluster/cluster-name

Cloud Controller Manager와 ALB Ingress Controller에는 서브넷에 다음 태그 중 하나가 있어야 합니다.

kubernetes.io/role/elb

또는

kubernetes.io/role/internal-elb

참고: 앞의 태그를 사용하지 않는 경우 Cloud Controller Manager는 해당 서브넷과 연결된 라우팅 테이블을 검사하여 서브넷이 퍼블릭 또는 프라이빗인지 확인합니다. 프라이빗 서브넷과 달리 퍼블릭 서브넷은 인터넷 게이트웨이를 사용하여 인터넷으로 직접 경로를 가져옵니다.

서브넷을 두 태그와 연결하지 않으면 오류가 발생합니다.

예를 들어 Kubernetes 서비스의 문제를 해결하고 kubectl describe service your-service-name 명령을 실행하면 다음과 같은 오류가 발생합니다.

Events:
  Type     Reason                      Age               From                Message
  ----     ------                      ----              ----                -------
  Normal   EnsuringLoadBalancer        9s (x2 over 14s)  service-controller  Ensuring load balancer
  Warning  CreatingLoadBalancerFailed  9s (x2 over 14s)  service-controller  Error creating load balancer (will retry): failed to ensure load balancer for service default/guestbook: could not find any suitable subnets for creating the ELB

ALB Ingress Controller 문제를 해결하고 kubectl logs your-alb-ingress-controller-pod-name 명령을 실행하면 다음과 같은 오류가 발생합니다.

E0121 22:44:02.864753       1 controller.go:217] 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"}

참고: eksctl을 사용하여 VPC를 생성하는 경우 해당 VPC의 모든 서브넷에는 kubernetes.io/role/elbkubernetes.io/role/internal-elb 태그가 있습니다.

​해결 방법

서브넷에 태그를 지정하기 위한 적절한 옵션을 선택합니다.

로드 밸런서 리소스에서 사용하는 퍼블릭 및 프라이빗 서브넷의 경우

다음 키–값 페어를 사용하여 클러스터가 로드 밸런서 리소스에 사용하는 모든 퍼블릭 및 프라이빗 서브넷에 태그를 지정합니다.

Key: kubernetes.io/cluster/cluster-name
Value: shared

cluster-name 값은 Amazon EKS 클러스터용입니다. 공유 값은 둘 이상의 클러스터가 서브넷을 사용할 수 있도록 허용합니다.

내부 로드 밸런서가 사용하는 프라이빗 서브넷의 경우

Kubernetes가 내부 로드 밸런서에 프라이빗 서브넷을 사용하도록 허용하려면 다음 키–값 페어를 사용하여 VPC의 모든 프라이빗 서브넷에 태그를 지정합니다.

Key: kubernetes.io/role/internal-elb
Value: 1

외부 로드 밸런서가 사용하는 퍼블릭 서브넷의 경우

Kubernetes가 외부 로드 밸런서에 태그가 지정된 서브넷만 사용하도록 허용하려면 다음 키–값 페어를 사용하여 VPC의 모든 퍼블릭 서브넷에 태그를 지정합니다.

Key: kubernetes.io/role/elb
Value: 1

참고: 각 가용 영역에서 퍼블릭 서브넷을 사용하는 대신 앞의 태그를 사용하십시오.


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

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


도움이 필요하십니까?