Cloudnet AWES 2주차 스터디를 진행하며 정리한 글입니다.
인스턴스 타입별 ENI 최대 갯수와 할당 가능한 최대 IP 갯수가 정해져 있고, 이를 통해서 워커 노드에 파드 배치 갯수가 결정됩니다.
이번 포스팅에서 EKS 워커 노드에서는 인스턴스 타입 별로 생성할 수 있는 파드 생성 갯수에 대해 알아보도록 하겠습니다.
최대 파드 생성 갯수
(Number of network interfaces for the instance type × (the number of IP addressess per network interface - 1)) + 2
워커 노드의 인스턴스 정보 확인 - 1) 직접 확인
# 타입에 따른 할당 가능 갯수 확인
❯ aws ec2 describe-instance-types --filters Name=instance-type,Values=t3.\* --query "InstanceTypes[].{Type: InstanceType, MaxENI: NetworkInfo.MaximumNetworkInterfaces, IPv4addr: NetworkInfo.Ipv4AddressesPerInterface}" --output table
--------------------------------------
| DescribeInstanceTypes |
+----------+----------+--------------+
| IPv4addr | MaxENI | Type |
+----------+----------+--------------+
| 6 | 3 | t3.medium |
| 12 | 3 | t3.large |
| 15 | 4 | t3.xlarge |
| 15 | 4 | t3.2xlarge |
| 2 | 2 | t3.micro |
| 2 | 2 | t3.nano |
| 4 | 3 | t3.small |
+----------+----------+--------------+
# 워커 노드에서 할당 가능한 파드 갯수 확인
❯ kubectl describe node | grep Allocatable: -A6
워커 노드의 인스턴스 정보 확인 - 2) AWS 제공 스크립트 확인
❯ curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/templates/al2/runtime/max-pods-calculator.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 5372 100 5372 0 0 11505 0 --:--:-- --:--:-- --:--:-- 11627
❯ chmod +x max-pods-calculator.sh
❯ ./max-pods-calculator.sh --instance-type t3.medium --cni-version 1.9.0-eksbuild.1 05:42:16
17
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/choosing-instance-type.html
최적의 Amazon EC2 노드 인스턴스 유형 선택 - Amazon EKS
이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.
docs.aws.amazon.com
VPC CNI에서 Pod IP를 할당하는 방법 - 1) Secondary IPv4 Addresses 방식
t3.medium 3대가 사용할 수 있는 Pod IP 갯수
- 최대 ENI 개수: 3개
- ENI당 Secondary IPv4 주소 개수: 6개
- 총 IP 개수: (기본 IP 1개 + Secondary IP 5개) * 3 ENI = 18개
- Pod 최대 개수: 17개
- 1개는 노드 자체에서 사용해야 하기 때문 (18개 - 1개 = 17개)
- 하지만, AWS Node에서 기본적으로 사용하는 파드(aws-node, kube-proxy 등)가 노드에 있다면 해당 파드 갯수를 제외하고 실제로 사용할 수 있음 (17개 - 2개 = 15개)
-> t3.medium에서 Secondary IPv4 방식으로 Pod를 할당하면 최대 14개의 Pod를 실행할 수 있습니다.
AWS VPC CNI는 ENI를 기반으로 IP를 할당하므로, 노드의 ENI 개수 및 할당 가능한 IP 수에 의해 Pod 개수가 제한됩니다.
Pod가 증가할 때 새로운 ENI를 추가하지만, 노드의 인스턴스 타입이 지원하는 ENI 개수를 초과하면 더 이상 Pod를 추가할 수 없습니다.
이를 최적화하기 위해 WARM_ENI_TARGET, WARM_IP_TARGET, MINIMUM_IP_TARGET을 설정하여 미리 ENI 및 IP를 확보할 수 있습니다.
ENI의 프라이빗 IP 사전할당 갯수 선정에 필요한 파라미터
https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/prefix-and-ip-target.md
amazon-vpc-cni-k8s/docs/prefix-and-ip-target.md at master · aws/amazon-vpc-cni-k8s
Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces on AWS - aws/amazon-vpc-cni-k8s
github.com
- WARM_ENI_TARGET
- 미리 생성할 추가 ENI 갯수
- 노드가 새 Pod을 생성할 때 IP 부족을 방지하기 위해 미리 ENI를 확보
- 새로운 ENI 필요할 때마다 즉시 할당할 수 있도록 보장
- WARM_IP_TARGET
- 미리 확보할 추가 IP 갯수
- Pod 스케줄링 지연을 방지하기 위해 ENI에 미리 할당할 IP 갯수 설정
- Pod가 급격하게 늘어날 경우 IP를 미리 확보
- MINIMUM_IP_TARGET
- ENI 당 최소 보장할 IP 갯수
- 노드의 ENI당 최소한 확보할 IP 갯수 설정
- ENI 추가하기 전에 IP를 먼저 활용할 수 있도록 설정
❯ kubectl set env daemonset aws-node -n kube-system WARM_ENI_TARGET=2
❯ kubectl set env daemonset aws-node -n kube-system WARM_IP_TARGET=5
❯ kubectl set env daemonset aws-node -n kube-system MINIMUM_IP_TARGET=10
++ 참고 노드에 스케줄된 pod 갯수 시각화하기
# 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 service.main.type=LoadBalancer --set env.TZ="Asia/Seoul" --namespace kube-system
# 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"}'
VPC CNI에서 Pod IP를 할당하는 방법 - 2) IPv4 Prefix Delegation 방식
t3.medium 3대가 사용할 수 있는 Pod IP 갯수
하지만, 기존 방식으로는 IP가 부족해서 IPv4 Prefix Delegation 방식이 나왔다고 했었는데요. IPv4 Prefix Delegation 방식은 기존보다 더 많은 Pod IP를 사용할 수 있도록 설정할 수 있습니다.
IPv4 Prefix Delegation 방식은 각 ENI에 /28(16개) 단위로 IP를 할당하는 방식입니다. (IPv6은 /80)
- 최대 ENI 개수: 3개
- ENI당 IPv4 Prefix 개수: 1개 (/28 = 16개 IP)
- 총 IP 개수: 16개 * 3 ENI = 48개
- Pod 최대 개수: 47개
- 1개는 노드 자체에서 사용해야 하기 때문 (48개 - 1개 = 47개)
- 하지만, AWS Node에서 기본적으로 사용하는 파드(aws-node, kube-proxy 등)가 노드에 있다면 해당 파드 갯수를 제외하고 실제로 사용할 수 있음 (47개 - 2개 = 45개)
-> t3.medium에서 IPv4 Prefix Delegation을 사용하면 최대 47개의 Pod를 실행할 수 있습니다.
하지만, 서브넷에 사용 가능한 IP 주소가 있더라도, 서브넷이 인접한 /28 블록을 사용할 수 없는 경우 노드 이벤트에 다음 오류가 표시된다고 합니다. 이는 서브넷의 IP 파편화가 이루어졌기 때문입니다.
InsufficientCidrBlocks: The specified subnet does not have enough free cidr blocks to satisfy the request
https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/cni-increase-ip-addresses-procedure.html
Amazon EKS 노드에 대해 사용 가능한 IP 주소 증가 - Amazon EKS
서브넷에 사용 가능한 IP 주소가 있더라도 서브넷이 인접한 /28 블록을 사용할 수 없는 경우, Amazon VPC CNI plugin for Kubernetes 로그에 다음 오류가 표시됩니다.
docs.aws.amazon.com
서브넷 IP 파편화
서브넷 내부에서 작은 단위로 IP가 조각나 있어서, 큰 블록(/28)을 할당할 수 없는 상태를 의미합니다.
EKS에서 IPv4 Prefix Delegation을 활성화하면, ENI는 /28 단위(16개 IP)를 블록으로 요청했을 때 서브넷의 사용 가능한 IP가 충분하더라도, 필요한 크기의 블록(/28)을 확보하지 못할 가능성이 있습니다. 그 결과, IPv4 Prefix를 할당하지 못해 Pod가 Pending 상태가 될 수 있습니다.
예를 들어, ENI가 /28을 요청하면 192.168.1.16/28 또는 192.168.1.48/28을 할당 가능한 상태입니다.
ENI 사용 중인 대역 | ENI 사용 가능 대역 | 사용 가능 여부 |
192.168.1.0/28 (192.168.1.0 ~ 192.168.1.15) |
사용 중 | |
- | 192.168.1.16/28 (192.168.1.16 ~ 192.168.1.31) |
사용 가능 |
192.168.1.32/28 (192.168.1.32 ~ 192.168.1.47) |
사용 중 | |
192.168.1.48/28 (192.168.1.47 ~ 192.168.1.63) |
사용 가능 |
하지만, 서브넷의 분산된 기존 보조 IP 주소의 조각화로 ENI가 /28을 요청해도 공간이 없어서 실패할 가능성 높습니다.
ENI 대역 | 사용 가능 여부 | |
192.168.1.0/30 (192.168.1.0 ~ 192.168.1.3) |
사용 중 | |
192.168.1.4 | 사용 중 | |
/NN로 비트로 분할 불가능 (192.168.1.5 ~ 192.168.1.17) |
사용 불가능 | |
192.168.1.18 | 사용 중 | |
/NN로 비트로 분할 불가능 (192.168.1.19 ~ 192.168.1.63) |
사용 불가능 |
이런 경우는 새 서브넷을 생성하고 거기서 Pods를 시작하거나 Amazon EC2 서브넷 CIDR 예약을 사용하여 접두사 할당과 함께 사용할 서브넷 내에 공간을 예약해야한다고 합니다.
EKS 클러스터에 사용할 파드의 갯수를 에측하고 할당하기란 쉽지 않은 것 같네요.
회사에서 운영 경험이 쌓인다면, 어떻게 운영하고 있는지 작성할 수 있는 날이 머지 않아 오길 바랍니다.
'스터디 > AEWS' 카테고리의 다른 글
[AEWS] 3주차 쿠버네티스 스토리지 이해하기 (emptyDir, hostPath, PV, PVC, storageClass, CSI) (0) | 2025.02.22 |
---|---|
[AEWS] 2주차 EKS VPC CNI를 통한 파드 간 통신 (작성중) (0) | 2025.02.16 |
[AEWS] 2주차 EKS VPC CNI 알아보기 (0) | 2025.02.15 |
[AEWS] 1주차 EKS 데이터 플레인 다양하게 구성하기 (Spot, Fargate, Custom AMI 등) (0) | 2025.02.09 |
[AEWS] 1주차 내 PC에서 EKS 코드로 설치해보기 (0) | 2025.02.09 |