오해하기 쉬운 EKS 클러스터의 subnet 설정

EKS 클러스터를 생성할 때 subnet 설정의 의미를 오해하기 쉽다.

이 설정은 EKS master가 worker node와 통신하기 위해 사용할 subnet을 지정하는 것이다. 그런데 worker node가 사용하는 모든 subnet을 지정하는 것으로 잘못 이해하면 나중에 worker node들이 사용할 subnet을 추가하기 위해 EKS 클러스터(master)를 재생성해야 하는 것으로 오해할 수 있다.

특히 Terraform 등 코드로 클러스터를 만들 때 argument의 이름만 보고 오해하기 쉽다.

AWSCLI 문서 중 클러스터 subnetIds에 대한 설명이 아래와 같다.

subnetIds -> (list)

Specify subnets for your Amazon EKS worker nodes. Amazon EKS creates cross-account elastic network interfaces in these subnets to allow communication between your worker nodes and the Kubernetes control plane.

(string)

첫 문장을 보고 worker node들이 사용하는 모든 subnet으로 설정해야 한다고 생각할 수 있는데 그렇지 않다. 첫 문장에 오해의 소지가 있다.

이어지는 내용을 차분히 읽으면 알 수 있듯이, control plane (master)이 해당 subnet에 network interface를 생성해서 worker node들과 통신할 수 있으면 된다. VPC 내의 subnet들은 서로 라우팅이 되니 VPC 내의 private subnet 중 아무 것이나 사용해도 된다. 단, 서로 다른 AZ에 있는 2개 이상의 subnet으로 설정해야 한다.

잘못 이해했을 때의 문제

이것을 잘못 이해하면 곤란한 상황에 처할 수 있다. EKS에선 Pod들도 실제 VPC의 IP를 사용하니 많은 IP가 필요하다.

처음에 클러스터의 규모를 작게 예상해서 worker node가 사용하는 subnet에 작은 크기의 IP 대역을 할당할 수 있다. 이후에 IP가 부족하면 subnet을 늘려야 하는데, 설정의 의미를 오해하면 EKS cluster(master)의 subnet도 그에 맞게 변경해야 한다고 생각하게 된다.

문제는 AWS EKS API가 subnetIds 속성의 변경을 허용하지 않는다는 것이다.

API 문서에서도 아래처럼 알려주고 있다. (2020년 10월 16일 기준)

Important At this time, you can not update the subnets or security group IDs for an existing cluster.

Terraform에서 subnet_ids 값을 변경하고 terraform apply를 실행하면 클러스터를 삭제하고 새로 생성한다.

결국 IP 대역을 늘리기 위해 불필요하게 cluster를 삭제하고 새로 만드는 수고를 하게 될 수 있다. 아니면 IP 대역을 늘리는 것이 쉬운 일이 아니라고 생각해서 처음부터 지나치게 큰 IP 대역을 할당할 수도 있다.

올바른 설정의 예

범용으로 사용하는 private subnet (private_subnet이라 하자)과 eks worker 전용 subnet (eks_worker_subnet)을 따로 만들었다고 가정하자.

EKS 클러스터에는 private_subnet을 설정하면 된다.

Terraform 코드 예제

 1resource "aws_eks_cluster" "main" {
 2  name     = "main"
 3  role_arn = data.terraform_remote_state.tf_iam.outputs.common_role_arn.eks_master
 4
 5  vpc_config {
 6    security_group_ids = [data.terraform_remote_state.tf_sg.outputs.eks_sg_ids.eks_master]
 7    # 2개 이상의 AZ를 포함하기만 하면 되므로 2개만 잘라서 쓴다. 
 8    # 2개로 고정했기 때문에 나중에 만약 private_subnet_ids에 새로운 subnet이 추가되어도 여기를 수정하지 않아도 된다.
 9    subnet_ids = slice(data.terraform_remote_state.tf_vpc.outputs.private_subnet_ids,0,2)
10  }
11}

eks_woker_subnet은 worker node를 생성하는 Auto Scaling Group에 설정하면 된다. Terraform 이라면 aws_autoscaling_group의 vpc_zone_identifier에 설정하면 된다.

이 argument는 Auto Scaling Group 재생성 없이 업데이트가 가능하기 때문에 Pod이 사용할 IP가 모자라면 쉽게 subnet을 추가해서 해결할 수 있다.

comments powered by Disqus