AWS EKS “instances failed to join the kubernetes cluster” Error

AWS EKS “instances failed to join the kubernetes cluster” Error

AWS EKS Node Group을 생성 하는데, instances failed to join the kubernetes cluster 에러가 발생하는 문제가 있었다.

결론부터 나의 경우 체크해보아야 하는 부분은 크게 3가지였다.

  1. Cluster Private, Public Endpoint 확인
  2. Cluster Worker Node의 IAM 권한 확인
  3. Cluster가 배치된 VPC 내 Subnet 연결 설정 확인

노드 그룹 생성 시 인스턴스는 정상적으로 생성이 되었는데, 해당 인스턴스가 eks cluster에 Join이 되지 않아 cluster 생성에 실패하는 문제였는데 어떻게 해결했는지 복기해보자.

 

 

1. Cluster Private, Public Endpoint 확인

aws 공식문서에도 관련 문제 발생시 확인해야할 부분을 체크해주고 있다.

 

https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html#instances-failed-to-join

 

Amazon EKS troubleshooting - Amazon EKS

Amazon EKS troubleshooting This chapter covers some common errors that you may see while using Amazon EKS and how to work around them. If you need to troubleshoot specific Amazon EKS areas, see the separate Troubleshooting IAM, Troubleshooting issues in Am

docs.aws.amazon.com

 

If you receive the error Instances failed to join the Kubernetes cluster in the AWS Management Console, ensure that either the cluster's private endpoint access is enabled, or that you have correctly configured CIDR blocks for public endpoint access. For more information, see Amazon EKS cluster endpoint access control.

 

우선 나는 API endpoint access를 private, public으로 설정하고 public을 모든 트래픽을 허용하도록 설정했기 때문에 위 내용과는 별개의 문제라고 생각했다.

 

2. Cluster Worker Node의 IAM 권한 확인

그래서 다음 문서를 보고 확인한 부분은 worker node의 IAM 권한이였다.

https://repost.aws/knowledge-center/resolve-eks-node-failures

 

Troubleshoot EKS managed node group failures

My Amazon Elastic Kubernetes Service (Amazon EKS) managed node group failed to create. Nodes can't join the cluster and I received an error similar to the following: "Instances failed to join the k...

repost.aws

 

node group 생성 시 node에 IAM 지정하게 되는데, 지정해주는 IAM 권한에 EKS Cluster와 통신할 수 있는 권한이 필요하다고 한다.

AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly, AmazonEKS_CNI_Policy

 

 

이 3개의 권한이 필수적으로 있어야 했기에, 3개의 권한을 부여해주고 다시 노드 그룹을 생성했지만 여전히 join에 실패했다는 에러가 발생하고 있었다.

 

 

3. Cluster가 배치된 VPC 내 Subnet 연결 설정 확인

EKS Cluster가 배치된 VPC, Subnet 설정이였다.

현재 EKS Cluster가 배치된 VPC에는 총 4개의 Subnet을 만들고, 2개의 가용 영역에 각각 public subnet, private subnet을 만들었다.

 

각 가용영역의 public subnet은 라우팅 테이블을 이용해 인터넷 게이트웨이와 연결해 인터넷과 통신이 가능하도록 설정하고, private subnet은 라우팅 테이블으로 NAT 게이트웨이와 연결해 외부에서의 접근(인바운드 불가)은 불가하도록 하고, 인터넷에 접근은 가능하도록 설정(아웃바운드는 가능)하였다.

 

이렇게 해서 EKS Cluster는 Private Subnet에 배치하여 외부에서 Cluster에 접근할 수 없도록 만드는 것을 의도했는데, 이 부분이 잘못 설정되었었다.

 

나의 경우에는 Private Subnet의 라우팅 테이블 설정 문제였다.

 

NAT 게이트웨이를 인터넷 게이트웨이가 연결된 Public Subnet에 배치시켜 생성하고, 이 NAT 게이트웨이를 Private Subnet과 라우팅 테이블을 이용해 연결해야 했는데, 나는 NAT 게이트웨이를 Private Subnet내에 배치시켜 생성했던 것이 문제였다.

이렇게 되버리니 Cluster가 위치한 Private Subnet이 외부와 통신할 수 없는 상태가 되어 생성된 인스턴스가 cluster와 join에 실패한것이 였다.

 

그래서 IGW가 연결된 Public Subnet에 NAT 게이트웨이를 배치시키고 이 NAT 게이트웨이를 EKS Cluster가 위치한 Private Subnet과 라우팅 테이블을 만들어 라우팅 시켜주니, 정상적으로 Node Group이 생성되었다.

 

이번에 머리박으면서 EKS 이용해 서버 배포해보니 VPC, Subnet에 대해 아주 조금 알게 된 것 같다…

그래도 AWS 운영은 여전히 어렵다.