<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lucas Blanco</title>
    <description>The latest articles on DEV Community by Lucas Blanco (@lucas_blanco).</description>
    <link>https://dev.to/lucas_blanco</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3946852%2F2a6c9756-5a3f-4d2d-9591-65501d207de7.jpg</url>
      <title>DEV Community: Lucas Blanco</title>
      <link>https://dev.to/lucas_blanco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucas_blanco"/>
    <language>en</language>
    <item>
      <title>VPC CNI en EKS: cómo dejar de pagar nodos que no usás</title>
      <dc:creator>Lucas Blanco</dc:creator>
      <pubDate>Fri, 22 May 2026 23:45:24 +0000</pubDate>
      <link>https://dev.to/aws-builders/vpc-cni-en-eks-como-dejar-de-pagar-nodos-que-no-usas-3de0</link>
      <guid>https://dev.to/aws-builders/vpc-cni-en-eks-como-dejar-de-pagar-nodos-que-no-usas-3de0</guid>
      <description>&lt;p&gt;Si alguna vez miraste un nodo de EKS y viste algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU:    18%
Memory: 22%
Pods:   29/29 ← 😐
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ya viviste el problema del que va este post. Tus nodos tienen recursos para utilizar pero no podes schedulear más pods en ellos...&lt;/p&gt;

&lt;p&gt;La &lt;strong&gt;buena noticia:&lt;/strong&gt; hay una configuración llamada &lt;strong&gt;Prefix Delegation&lt;/strong&gt; en AWS VPC CNI que amplia este techo, y bien configurada te puede bajar la factura de EC2 hasta un 75% sin tocar una sola línea de código de la app.&lt;/p&gt;

&lt;p&gt;Vamos por partes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cómo funciona el networking de un nodo de EKS
&lt;/h2&gt;

&lt;p&gt;Un nodo de EKS es una instancia EC2. A esa EC2 se le atachan &lt;strong&gt;Elastic Network Interfaces (ENIs)&lt;/strong&gt;, que son las placas de red virtuales. Cada ENI tiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 IP primaria (la del nodo en esa ENI)&lt;/li&gt;
&lt;li&gt;N IPs secundarias (las que se asignan a los pods)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e7tweoqceqzfzfmq2o7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6e7tweoqceqzfzfmq2o7.png" alt="VPC Architecture" width="449" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  El encargado de entregar IPs
&lt;/h3&gt;

&lt;p&gt;El plugin &lt;strong&gt;Amazon VPC CNI&lt;/strong&gt; (que corre como un DaemonSet llamado &lt;code&gt;aws-node&lt;/code&gt; en cada nodo) es el encargado de pedirle IPs a EC2 y dárselas a los pods cuando arrancan. Cada pod recibe &lt;strong&gt;una IP real y ruteable de la VPC&lt;/strong&gt;, no una IP virtual dentro de EKS. Lo cual es la causa del &lt;strong&gt;problema&lt;/strong&gt;: el número de pods queda atado a cuántas IPs aguanta la instancia.&lt;/p&gt;

&lt;p&gt;Para saber cuantos pods pueden schedulearse en un nodo puede usarse la siguiente formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MaxPods x Nodo = ENIs × (IPs_por_ENI − 1) + 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;donde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ENIs&lt;/code&gt;: cuántas placas virtuales atacha la instancia&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;IPs_por_ENI − 1&lt;/code&gt;: descontamos la IP primaria&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+ 2&lt;/code&gt;: dos pods con &lt;code&gt;hostNetwork: true&lt;/code&gt; que no consumen IP de pod (típicamente &lt;code&gt;kube-proxy&lt;/code&gt; y &lt;code&gt;aws-node&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los límites de ENIs e IPs por instancia están en la &lt;a href="https://docs.aws.amazon.com/ec2/latest/instancetypes/gp.html#gp_network" rel="noopener noreferrer"&gt;doc oficial de tipos de instancia EC2&lt;/a&gt;. Aplicada a la familia M5:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instancia&lt;/th&gt;
&lt;th&gt;vCPUs&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;ENIs&lt;/th&gt;
&lt;th&gt;IPs/ENI&lt;/th&gt;
&lt;th&gt;Max Pods&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;m5.large&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8 GiB&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.xlarge&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;16 GiB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.2xlarge&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;32 GiB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.4xlarge&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;64 GiB&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.8xlarge&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;128 GiB&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.16xlarge&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;256 GiB&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;737&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Veamos un ejemplo
&lt;/h3&gt;

&lt;p&gt;Analizando la m5.large: &lt;strong&gt;29 pods&lt;/strong&gt;. Con 2 vCPU y 8 GiB de RAM, si tus pods piden 100m CPU y 256 MiB de RAM (apis simples), la cuenta da:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Por CPU: 2000m / 100m = &lt;strong&gt;20 pods&lt;/strong&gt; (sin overhead).&lt;/li&gt;
&lt;li&gt;Por RAM: 8192 MiB / 256 MiB = &lt;strong&gt;32 pods&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Por red: &lt;strong&gt;29 pods&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y restando los pods de sistema (kube-proxy, aws-node, csi-drivers, coredns en algunos nodos), te quedan unos 24 slots útiles. Estás pagando 2 vCPUs y 8 GiB de RAM para correr aplicaciones que apenas usan la mitad del nodo. &lt;/p&gt;

&lt;p&gt;Si además estás utilizando escalado automático, tu controller al ver que no entran más pods, levanta otro nodo igual. Y otro. Y otro.&lt;/p&gt;

&lt;p&gt;Así aumentan los costos de nuestras EC2.&lt;/p&gt;




&lt;h2&gt;
  
  
  La solución: Prefix Delegation
&lt;/h2&gt;

&lt;p&gt;Este AWS VPC CNI plugin que analizamos anteriormente puede configurarse en otro modo de funcionamiento (&lt;strong&gt;&lt;em&gt;Prefix Delegation&lt;/em&gt;&lt;/strong&gt;). &lt;br&gt;
En este modo, en lugar de pedirle a la EC2 una IP a la vez, el CNI puede pedirle &lt;strong&gt;prefijos /28&lt;/strong&gt;. Es decir, bloques contiguos de 16 IPs. Cada "slot" de la ENI pasa de ser 1 IP a ser &lt;strong&gt;16 IPs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Entonces, a partir de este cambio tenemos una fórmula nueva:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MaxPods = ENIs × ((IPs_por_ENI − 1) × 16) + 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para la misma m5.large ahora tendriamos: &lt;code&gt;3 × (9 × 16) + 2 = 434 pods teóricos&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pero esto es más teórico que real. Debajo lo analizamos mejor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cómo se activa
&lt;/h3&gt;

&lt;p&gt;Es &lt;strong&gt;una variable de entorno&lt;/strong&gt; en el addon &lt;code&gt;vpc-cni&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ENABLE_PREFIX_DELEGATION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"WARM_PREFIX_TARGET"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Y kubelet?
&lt;/h2&gt;

&lt;p&gt;Acá viene la trampa. Activar Prefix Delegation no es suficiente — hay que decirle al &lt;code&gt;kubelet&lt;/code&gt; de cada nodo que use el límite nuevo (no lo detecta solo). Si no, vas a tener IPs disponibles pero Kubernetes va a seguir rechazando pods con un mensaje de error: &lt;em&gt;"Too many pods, 0/N nodes are available"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para configurarlo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Si usas Karpenter
&lt;/h3&gt;

&lt;p&gt;Karpenter por default usa &lt;code&gt;--use-max-pods=false&lt;/code&gt; y un cap de 110 pods, &lt;strong&gt;pero no lo ajusta por instancia automáticamente&lt;/strong&gt;. Hay que decirle explícitamente en el &lt;code&gt;NodePool&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;karpenter.sh/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NodePool&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;disruption&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;consolidationPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;WhenEmptyOrUnderutilized&lt;/span&gt;
    &lt;span class="na"&gt;expireAfter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Never&lt;/span&gt;
  &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;50"&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kubelet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;maxPods&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;110&lt;/span&gt;     &lt;span class="c1"&gt;# 👈 el cambio&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Por qué Karpenter no lo hace solo? Porque el script &lt;code&gt;max-pods-calculator.sh&lt;/code&gt; de AWS sigue usando la fórmula vieja (Secondary IP) y no entiende Prefix Delegation. Karpenter prefiere dejarte un default conservador y que vos decidas. Info en la &lt;a href="https://karpenter.sh/docs/concepts/nodeclasses/#speckubelet" rel="noopener noreferrer"&gt;doc de Karpenter NodeClass&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Con Managed Node Groups
&lt;/h3&gt;

&lt;p&gt;Hay que ajustar el bootstrap script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/eks/bootstrap.sh my-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--use-max-pods&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--kubelet-extra-args&lt;/span&gt; &lt;span class="s1"&gt;'--max-pods=110'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  La recomendación/limitación propia de Kubernetes
&lt;/h2&gt;

&lt;p&gt;Antes de poner el resultado de la nueva tabla, hay que tener en cuenta el siguiente thresholds de kubernetes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;min(110, 10*#cores)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La regla, validada por kubernetes, asegura que el promedio de procesos por core quede en un rango que el scheduler del kernel maneje bien.&lt;/p&gt;

&lt;p&gt;Entonces el nuevo calculo para pods por EC2 es el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maxPods_real = min(kubelet_maxPods, EKS_cap, CNI_formula, 10 × cores)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para una m5.large entonces con PD: &lt;code&gt;min(110, 250, 434, 20) = 20&lt;/code&gt;. Pero ahora tenemos menos. En este caso conviene dejar en: 110.&lt;/p&gt;

&lt;p&gt;Referencia: &lt;a href="https://github.com/kubernetes/community/blob/master/sig-scalability/configs-and-limits/thresholds.md" rel="noopener noreferrer"&gt;Kubernetes Scalability Thresholds (SIG Scalability)&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  EC2 vs Pods - Prefix Mod
&lt;/h2&gt;

&lt;p&gt;Ahora revisando nuevamente las EC2:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instancia&lt;/th&gt;
&lt;th&gt;vCPUs&lt;/th&gt;
&lt;th&gt;RAM&lt;/th&gt;
&lt;th&gt;ENIs&lt;/th&gt;
&lt;th&gt;IPs/ENI&lt;/th&gt;
&lt;th&gt;Max Pods (sin PD)&lt;/th&gt;
&lt;th&gt;Max Pods (con PD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;m5.large&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8 GiB&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.xlarge&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;16 GiB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.2xlarge&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;32 GiB&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.4xlarge&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;64 GiB&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.8xlarge&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;128 GiB&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.12xlarge&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;192 GiB&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.16xlarge&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;256 GiB&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;737&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.24xlarge&lt;/td&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;384 GiB&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;737&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Cuándo Prefix Delegation NO es la respuesta
&lt;/h2&gt;

&lt;p&gt;Hay casos donde no ganás nada o incluso te complica la vida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pods grandes&lt;/strong&gt; (&amp;gt;1 vCPU, &amp;gt;2 GiB de RAM): el cuello ya es CPU/RAM, no IPs. Activar PD no cambia nada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VPC con subnets chicas&lt;/strong&gt;: un /28 reserva 16 IPs aunque uses 1. Con 10 nodos pidiendo 2 prefijos al boot, eso son &lt;strong&gt;320 IPs apenas el cluster arranca&lt;/strong&gt;. Una subnet /24 (251 IPs usables) se queda corta. Recomendación: &lt;strong&gt;subnets /20 o más grandes&lt;/strong&gt; para clusters con PD.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instancias no-Nitro&lt;/strong&gt;: no es compatible. Solo Nitro (m5, c5, r5+, t3, m6i, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnets fragmentadas&lt;/strong&gt;: si la subnet ya tiene muchas IPs sueltas dispersas, EC2 puede no encontrar un /28 contiguo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La regla práctica: PD es palanca para &lt;strong&gt;instancias chicas con pods chicos&lt;/strong&gt;. Para instancias grandes con pods pesados, el problema ya es otro.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pensando en costos:
&lt;/h2&gt;

&lt;p&gt;Caso de analisis: cluster con ~200 pods de microservicios livianos (100m CPU / 256 MiB RAM cada uno).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sin Prefix Delegation, con m5.large:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;24 pods de app por nodo (descontando 5 de sistema)&lt;/li&gt;
&lt;li&gt;200 / 24 = &lt;strong&gt;9 nodos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;9 × US$ 0.096/h × 730 h = &lt;strong&gt;US$ 631/mes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Con Prefix Delegation, con m5.xlarge y maxPods=110:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~104 pods de app por nodo&lt;/li&gt;
&lt;li&gt;200 / 104 = &lt;strong&gt;2 nodos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;2 × US$ 0.192/h × 730 h = &lt;strong&gt;US$ 280/mes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ahorro: ~55% sobre el costo de cómputo&lt;/strong&gt;, siendo conservador. Se pueden disminuir más los costos usando instancias SPOT.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;El networking de EKS tiene un techo que es invisible hasta que se analizan los costos. Prefix Delegation no es un cambio gigante, es una variable de entorno que te baja el costo de cómputo en ciertos casos de usos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Material de referencia
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/best-practices/vpc-cni.html" rel="noopener noreferrer"&gt;Amazon VPC CNI — EKS Best Practices Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/best-practices/prefix-mode-linux.html" rel="noopener noreferrer"&gt;Prefix Mode for Linux — EKS Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/cni-increase-ip-addresses.html" rel="noopener noreferrer"&gt;Assign more IP addresses to EKS nodes with prefixes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/eks/latest/userguide/auto-networking.html" rel="noopener noreferrer"&gt;EKS Auto Mode — VPC Networking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karpenter.sh/docs/concepts/nodeclasses/#speckubelet" rel="noopener noreferrer"&gt;Karpenter NodeClass / kubelet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kubernetes/community/blob/master/sig-scalability/configs-and-limits/thresholds.md" rel="noopener noreferrer"&gt;Kubernetes Scalability Thresholds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/awslabs/amazon-eks-ami/blob/main/templates/shared/runtime/eni-max-pods.txt" rel="noopener noreferrer"&gt;&lt;code&gt;eni-max-pods.txt&lt;/code&gt; — tabla canónica de max pods por instancia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Este post nace de mi charla en AWS Community Day Argentina 2025. Si tenés dudas sobre cómo aplicar esto a tu cluster contactame en &lt;a href="https://www.linkedin.com/in/blanco-lucas/" rel="noopener noreferrer"&gt;/in/blanco-lucas&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>networking</category>
    </item>
  </channel>
</rss>
