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 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
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
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 갯수 확인
aws ec2 describe-subnets
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
/28
CIDR을 할당한다.WARM_PREFIX_TARGET
을 유지하는 데 필요한 접두사 수를 결정한 다음 접두사를 할당한다. 새로운 ENI는 기존 ENI에 할당된 모든 접두사가 소진된 경우에만 추가된다.WARM_PREFIX_TARGET
의 권장 설정 값은 1인데, 이 값을 가질 때 인스턴스에 할당된 미사용된 IP 주소를 최소화하면서 시작 시간을 빠르게 할 수 있다고 한다.