CPU: 18% Memory: 22% Pods: 29/29 ← 😐 CODE_BLOCK: CPU: 18% Memory: 22% Pods: 29/29 ← 😐 CODE_BLOCK: CPU: 18% Memory: 22% Pods: 29/29 ← 😐 CODE_BLOCK: MaxPods x Nodo = ENIs × (IPs_por_ENI − 1) + 2 CODE_BLOCK: MaxPods x Nodo = ENIs × (IPs_por_ENI − 1) + 2 CODE_BLOCK: MaxPods x Nodo = ENIs × (IPs_por_ENI − 1) + 2 CODE_BLOCK: MaxPods = ENIs × ((IPs_por_ENI − 1) × 16) + 2 CODE_BLOCK: MaxPods = ENIs × ((IPs_por_ENI − 1) × 16) + 2 CODE_BLOCK: MaxPods = ENIs × ((IPs_por_ENI − 1) × 16) + 2 CODE_BLOCK: { "env": { "ENABLE_PREFIX_DELEGATION": "true", "WARM_PREFIX_TARGET": "1" } } CODE_BLOCK: { "env": { "ENABLE_PREFIX_DELEGATION": "true", "WARM_PREFIX_TARGET": "1" } } CODE_BLOCK: { "env": { "ENABLE_PREFIX_DELEGATION": "true", "WARM_PREFIX_TARGET": "1" } } COMMAND_BLOCK: apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: disruption: consolidationPolicy: WhenEmptyOrUnderutilized expireAfter: Never limits: cpu: "50" template: spec: kubelet: maxPods: 110 # 👈 el cambio COMMAND_BLOCK: apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: disruption: consolidationPolicy: WhenEmptyOrUnderutilized expireAfter: Never limits: cpu: "50" template: spec: kubelet: maxPods: 110 # 👈 el cambio COMMAND_BLOCK: apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: default spec: disruption: consolidationPolicy: WhenEmptyOrUnderutilized expireAfter: Never limits: cpu: "50" template: spec: kubelet: maxPods: 110 # 👈 el cambio CODE_BLOCK: /etc/eks/bootstrap.sh my-cluster \ --use-max-pods false \ --kubelet-extra-args '--max-pods=110' CODE_BLOCK: /etc/eks/bootstrap.sh my-cluster \ --use-max-pods false \ --kubelet-extra-args '--max-pods=110' CODE_BLOCK: /etc/eks/bootstrap.sh my-cluster \ --use-max-pods false \ --kubelet-extra-args '--max-pods=110' CODE_BLOCK: min(110, 10*#cores) CODE_BLOCK: min(110, 10*#cores) CODE_BLOCK: min(110, 10*#cores) CODE_BLOCK: maxPods_real = min(kubelet_maxPods, EKS_cap, CNI_formula, 10 × cores) CODE_BLOCK: maxPods_real = min(kubelet_maxPods, EKS_cap, CNI_formula, 10 × cores) CODE_BLOCK: maxPods_real = min(kubelet_maxPods, EKS_cap, CNI_formula, 10 × cores) - 1 IP primaria (la del nodo en esa ENI)
- N IPs secundarias (las que se asignan a los pods)
- ENIs: cuántas placas virtuales atacha la instancia
- IPs_por_ENI − 1: descontamos la IP primaria - + 2: dos pods con hostNetwork: true que no consumen IP de pod (típicamente kube-proxy y aws-node)
- Por CPU: 2000m / 100m = 20 pods (sin overhead).
- Por RAM: 8192 MiB / 256 MiB = 32 pods.
- Por red: 29 pods.
- Pods grandes (>1 vCPU, >2 GiB de RAM): el cuello ya es CPU/RAM, no IPs. Activar PD no cambia nada.
- VPC con subnets chicas: un /28 reserva 16 IPs aunque uses 1. Con 10 nodos pidiendo 2 prefijos al boot, eso son 320 IPs apenas el cluster arranca. Una subnet /24 (251 IPs usables) se queda corta. Recomendación: subnets /20 o más grandes para clusters con PD.
- Instancias no-Nitro: no es compatible. Solo Nitro (m5, c5, r5+, t3, m6i, etc.).
- Subnets fragmentadas: si la subnet ya tiene muchas IPs sueltas dispersas, EC2 puede no encontrar un /28 contiguo. - 24 pods de app por nodo (descontando 5 de sistema) - 200 / 24 = 9 nodos - 9 × US$ 0.096/h × 730 h = US$ 631/mes - ~104 pods de app por nodo - 200 / 104 = 2 nodos - 2 × US$ 0.192/h × 730 h = US$ 280/mes
- Amazon VPC CNI — EKS Best Practices Guide
- Prefix Mode for Linux — EKS Best Practices
- Assign more IP addresses to EKS nodes with prefixes
- EKS Auto Mode — VPC Networking
- Karpenter NodeClass / kubelet
- Kubernetes Scalability Thresholds - eni-max-pods.txt — tabla canónica de max pods por instancia