Amazon VPC CNI를 사용해서 EKS 환경을 구축할 때 인스턴스의 유형에 따른 파드의 생성 수량에 제한이 발생한다.❗
노드에 정의된 파드의 max-pod 수는 넉넉해도, 실제 부여하고자 하는 IP수 부족으로 파드에 IP를 할당하지 못해 파드를 생성하지 못하는 경우가 발생한다.
이러한 AWS VPC CNI 내 파드 IP는 몇 개까지 부여 가능한 지 알아보도록 하자.
파드에 IP를 어떻게 할당하느냐에 따라 2가지로 비교해 볼 수있다.
이전 장에서 봐왔던 Seconday IPv4 Address 방식부터 알아보자.
최대 파드의 수는 다음과 같다.
# 최대 파드의 수
ENI 수 x (ENI내 IP 수 -1) + 2
ENI 수 x ENI내 IP 수
하면 간단할 것 같은데, 왜 이렇게 되는가?
- ENI의 첫번재 IP는 Primary IP로 노드가 사용할 IP이므로 파드에 할당 불가능 하므로
-1
- 노드 별로 구성되는 aws-node(IPAM 포함) 파드 및 kube-proxy 파드 개수를 더해주므로
+2
따라서 ENI 수 x (ENI내 IP 수 -1) + 2
가 된다.
최대 ENI 수
: 3ENI 당 IP 수
: 10 (1개는 Primary IP)aws-node
,kube-proxy
: 2
(⚠️엄밀히 말하자면 사실 이들은 노드의 IP인 Primary IP를 사용하기에 내가 쓸 수 있는 Secondary IP도 아니다.
하지만, "파드"는 "파드"이므로 Max Pods 수에 들어갈 뿐이다.😒 참고 )
Primary IP 1개를 빼주고, 2개를 더해주므로
결과 : 3 x (10 - 1) + 2 = 29
참고 : AWS EKS에서 EC2 타입과 --max-pods 관계
한글로 직역하면 프리픽스 대표단이다.😀
이 방식은 21년 8월 추가된 방안으로 최대 파드의 생성 제약을 늘리기 위해 추가되었다.
기존에는 ENI의 슬롯에 하나의 IP를 넣었기에 1개의 슬롯 당 1개의 IP로 1:1 방식이였다.
그러나, Prefix Delegation는 Prefix 형태로 /28
Prefix를 함께 집어넣어 1개의 슬롯당 16개의 IP로 1:16을 가능하게 한다.
이 방법을 좀 더 풀어서 설명해보겠다.
기존에는 1개의 IP만 1개의 ENI의 슬롯에 들어갈 수 있었는데, IP 뒤에 /28
를 추가하면서 호스트ID 영역이 총 4
개로 2^4
, 총16
개의 IP를 슬롯 당 사용할 수 있다.
따라서 총 사용 가능한 IP 수는 다음과 같다.
ENI 수 x (ENI내 IP 수 -1) X 16
🧐 엇? 그럼 당연히 Prifix Delegation을 사용하면 되는 거 아닌가?
안타깝지만 21년 8월의 최신기술인 프리픽스 델리게이션은 최신 인스턴스 종류인 Nitro System 계열의 인스턴스만 지원한다.
또한 이 마저도 약간의 ⚠️제약사항이 있는게 vCPU의 개수에 따라 생성할 수 있는 파드의 수가 110개~250개까지 제한이 걸려있다.
(근데 사실 110개만 써도 엄청 많긴하다.🙄)
m5.large 인스턴스는 Nitro 인스턴스이므로 Prefix Delegation이 가능한데 계산해보면 다음과 같다.
최대 ENI 수
: 3ENI 당 IP 수
: 10 (1개는 Primary IP)/28 프리픽스
: 슬롯 당 16 가능
따라서 3 x (10 - 1) x 16 = 432 가 된다.
하지만, 프리픽스 델리게이션 방식에는 ⚠️제약사항이 걸려있으므로 vCPU 30개 미만인 m5.large 인스턴스는 110개까지 파드를 생성할 수 있다.
실습의 이해를 돕기 위해 kube-ops-view라는 가시성 도구를 설치한다.
해당 도구를 통해 워커 노드에 구성된 파드 정보를 쉽게 확인할 수 있다.
// kube-ops-view 설치
helm repo add geek-cookbook https://geek-cookbook.github.io/charts/
helm install kube-ops-view geek-cookbook/kube-ops-view --version 1.2.2 --set env.TZ="Asia/Seoul" --namespace kube-system
kubectl patch svc -n kube-system kube-ops-view -p '{"spec":{"type":"LoadBalancer"}}'
// kube-ops-view 접속 URL 확인 (1.5 배율)
kubectl get svc -n kube-system kube-ops-view -o jsonpath={.status.loadBalancer.ingress[0].hostname} | awk '{ print "KUBE-OPS-VIEW URL = http://"$1":8080/#scale=1.5"}'
다음과 같이 kube-ops-view 화면을 확인할 수 있다.
클러스터 하나에 3개의 노드가 구성되어있는 것을 확인할 수 있다.
// t3 타입의 인스턴스 정보 (최대 ENI 수량, 최대 IP 수량)
aws ec2 describe-instance-types --filters Name=instance-type,Values=t3.* \
--query "InstanceTypes[].{Type: InstanceType, MaxENI: NetworkInfo.MaximumNetworkInterfaces, IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" \
--output table
인스턴스 정보를 확인해보면 현재 환경인 t3.medium 환경에서는 3개의 ENI와 각 ENI 당 6개의 IP를 가지는 것을 확인할 수 있다.
따라서 3 * (6-1) + 2 = 17개의 파드를 생성할 수 있고 이는 다음 명령어로도 확인 가능하다.
실제로 최대 17개의 파드를 생성할 수 있다.
// 워커 노드의 상세 정보 확인 (Allocatable - pods)
kubectl describe node | grep Allocatable: -A7
이제 파드를 최대로 생성해보며 실제 나온 값이 맞는지 검증해보자.
먼저 디플로이먼트로 2개의 파드를 배포해보고, 3개 그리고 50개까지 배포를 수행한다.
// 디플로이먼트 생성 (최초 2대)
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/nginx-dp.yaml
kubectl apply -f nginx-dp.yaml
// 파드 수량 8대로 변경 (replicas)
kubectl scale deployment nginx-deployment --replicas=8
// 파드 수량 50대로 변경 (replicas)
kubectl scale deployment nginx-deployment --replicas=50
3개까지는 정상적으로 파드의 개수가 추가적으로 늘어나나, 50개로 변경했을 때는 42개까지 밖에 파드가 배포가 안되는 것을 확인할 수 있다.
왜 42개의 파드만 정상적으로 배포될까?🧐
현재 노드가 3개이므로 최대 17x3=51 개의 파드를 배포할 수 있다. 이때, 이미 aws-node
및 kube-proxy
파드는 노드당 고정이므로 2개씩 빼줘야 한다. 따라서, 실제 사용자가 배포할 수 있는 파드의 수는 (17-2)x3 로 총 45개의 파드를 배포할 수 있다.
여기서 이미 배포한 CoreDNS
의 파드 수 2개와 kube-ops-view
를 위한 파드 1개를 제외하면?
➡️ 최대 42개의 파드를 배포할 수 있다!
실제 대기중인 파드를 확인해보자.
// 대기 중인 파드 확인
kubectl get pods | grep Pending
// 대기 중인 파드 지정하여 정보 확인
kubectl describe pod [대기 파드 이름]
위와 같이 8개의 파드가 생성 대기중인 것을 확인할 수 있다.
※ wc (word count)
파일의 행, 단어, 문자수를 셈한다.
-l
: 행(line) 수를 카운트한다.
-w
: 단어(word) 수를 카운트한다.
끝으로 Amazon VPC CNI의 장단점을 정리해 보면 다음과 같다.
Reference📎 | CloudNet@와 함께하는 Amazon EKS 기본 강의
Retro Bowl 인스턴스 유형에 따른 제한: 각 인스턴스 유형마다 최대 ENI 수와 IP 주소 수가 다르므로, 사용하는 인스턴스 유형에 맞춰 최대 파드 수를 계산해야 합니다.
정리가 너무 잘 되어있네요. 감사합니다 :)
혹시 괜찮으시면 주로 어떤 자료 참고하여 조사하신 것인지도 알 수 있을까요?