[EKS] Amazon VPC CNI에서의 최대 파드 개수

vinca·2024년 2월 1일
0

🦓 EKS

목록 보기
7/23
post-thumbnail

Introduction

Amazon VPC CNI를 사용해서 EKS 환경을 구축할 때 인스턴스의 유형에 따른 파드의 생성 수량에 제한이 발생한다.❗

노드에 정의된 파드의 max-pod 수는 넉넉해도, 실제 부여하고자 하는 IP수 부족으로 파드에 IP를 할당하지 못해 파드를 생성하지 못하는 경우가 발생한다.

이러한 AWS VPC CNI 내 파드 IP는 몇 개까지 부여 가능한 지 알아보도록 하자.


파드에 IP를 어떻게 할당하느냐에 따라 2가지로 비교해 볼 수있다.

Secondary Address

이전 장에서 봐왔던 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 가 된다.

예시 (m5.large)

  • 최대 ENI 수 : 3
  • ENI 당 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 관계

IPv4 Prefix Delegation

한글로 직역하면 프리픽스 대표단이다.😀

이 방식은 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

Nitro System 인스턴스

🧐 엇? 그럼 당연히 Prifix Delegation을 사용하면 되는 거 아닌가?

안타깝지만 21년 8월의 최신기술인 프리픽스 델리게이션은 최신 인스턴스 종류인 Nitro System 계열의 인스턴스만 지원한다.

또한 이 마저도 약간의 ⚠️제약사항이 있는게 vCPU의 개수에 따라 생성할 수 있는 파드의 수가 110개~250개까지 제한이 걸려있다.
(근데 사실 110개만 써도 엄청 많긴하다.🙄)

예시 (m5.large)

m5.large 인스턴스는 Nitro 인스턴스이므로 Prefix Delegation이 가능한데 계산해보면 다음과 같다.

  • 최대 ENI 수 : 3
  • ENI 당 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 설치

// 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-nodekube-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) 수를 카운트한다.

End...

끝으로 Amazon VPC CNI의 장단점을 정리해 보면 다음과 같다.


Reference📎 | CloudNet@와 함께하는 Amazon EKS 기본 강의

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

2개의 댓글

comment-user-thumbnail
2024년 2월 14일

정리가 너무 잘 되어있네요. 감사합니다 :)
혹시 괜찮으시면 주로 어떤 자료 참고하여 조사하신 것인지도 알 수 있을까요?

1개의 답글