Pod는 k8s에서 생성되고 관리될 수 있는 컴퓨팅의 가장 작은 배포 단위이다. 하나의 파드는 쿠버네티스 클러스터 내에서 통신하기 위해선(특히 다른 node에 있는 pod와의 통신을 위해선) 지정된 subnet 범위 내에서 고유한 IP 주소가 필요하다.

EKS는 기본적으로 VPC CNI 플러그인을 실행하고, EC2 인스턴스에서 네트워크 인터페이스와 IP 주소를 관리하여 Pod에 IP 주소를 할당하게 된다. 이 플러그인은 각 파드에 클러스터가 속한 VPC로부터 하나의 IP 주소를 받아 할당한다.

기본적으로 파드에 할당할 수 있는 IP 주소의 수는 EC2 인스턴스 유형에 연결할 수 있는 인터페이스당 보조 IP와 ENI의 최대 수를 기반으로 한다.

# 기본 max pod 수
ENI * (ENI 당 지원하는 IPv4 갯수 - 1) + 2

Prefix 모드

Prefix mode를 사용하면 인스턴스 유형 별 ENI의 최대수는 동일하지만, 네트워크 인터페이스에 개별 IPv4 주소를 할당하는 대신에 /28 (16개의 IP주소) IPv4 주소 접두사로 Amazon VPC CNI를 구성한다. 파드들은 ENI에 할당된 접두사로부터 하나의 IPv4 주소를 할당 받는다.

Xquare 특성상 사용자 트래픽이 적고 각 프로젝트 당 필요한 리소스가 적어 IP 갯수 제한으로 인해 스케줄링이 안 되는 사례가 많았기에 Prefix 모드를 설정하여 최대 pod 갯수를 늘려줬다.

# Prefix 모드를 사용할 때 max pod 수
# 단, 30vCPU 미만 인스턴스는 110으로 제한
(ENI * (ENI 당 지원하는 IPv4 갯수 - 1)) * 16

Untitled

Subnet이 많이 나뉘어진 상태이거나, /28 접두사를 만들기에 IP 주소가 부족한 경우 Prefix mode를 사용하면 안된다. 하지만 xquare는 IP 할당에 있어 부족한 상태가 아니고 Pod에 할당할 충분한 IP를 가지고 있으므로 Prefix mode를 사용하였다.

이 모드는 EC2 Nitro 인스턴스에만 적용할 수 있다. 따라서 사용할 인스턴스 타입을 아래 중 하나로 특정해야한다.

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances

Prefix 모드 적용

kubectl set env daemonset aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true
kubectl set env daemonset aws-node -n kube-system WARM_PREFIX_TARGET=1

aws-node daemonset에 위 설정을 해준다.

IP 할당 관련 설정 옵션

IP 할당 과정에 대하여 설정할 수 있는 옵션에 대한 설명이다. 위에 적혀있듯이 xquare 서버에는 WARM_PREFIX_TARGET=1 옵션이 설정되어 있다.

https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/eni-and-ip-target.md

https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/prefix-and-ip-target.md