Saltar al contenido
Roadmap

$ ssh lab-04-k8s-default-deny·M04 · K8s

Redes de Contenedores y CNI en Kubernetes

10.0.4.0/24cni · vxlan:4789 · nodeport:30000+

Objetivo: aislar namespace y permitir sólo frontend→api:8080.

Runtime: kind/k3s, kubectl, CNI con NetworkPolicy

Lee el mecanismo; después interroga la evidencia.

La teoría define qué debe ocurrir. Las figuras y tablas reducen el mecanismo a señales observables; la topología y el inspector de paquete permiten comprobarlo después. Cada lección termina con «Lo entiendo»: márcala cuando puedas explicarla, no cuando la hayas leído.

Conceptos disponibles20

El problema: “el Pod tiene IP” no explica por qué el flujo funciona

En los módulos anteriores seguiste un paquete por Linux y validaste una identidad . Kubernetes añade otra capa de abstracción: un puede cambiar de IP, un puede tener una IP virtual sin endpoints sanos y una NetworkPolicy puede existir sin que el CNI la aplique. Cuando un frontend no llega a una API, “revisa la red de Kubernetes” no es un diagnóstico. [1]

Aquí aprenderás a construir una explicación por planos: “el nombre resolvió el ClusterIP; kube-proxy eligió este endpoint; el CNI llevó el paquete al Pod remoto; la policy permitió o negó este puerto”. Esa secuencia conecta cada objeto de Kubernetes con una evidencia verificable.

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Mapa mínimo: del Pod al Service y de vuelta al Pod

Flujo del mecanismo5 etapas

Un Service conduce a un Pod real

El ClusterIP estabiliza descubrimiento; no es el destino final.

origen

frontend Pod. El workload origina tráfico desde su namespace e IP de Pod.

Ver la figura original
frontend Pod
   │ IP de Pod + namespace de red
   ▼
DNS / Service ── nombre → ClusterIP estable
   │
   ▼
kube-proxy ── DNAT hacia un endpoint real
   │
   ▼
CNI ── ruta directa u overlay VXLAN entre nodos
   │
   ▼
api Pod ── NetworkPolicy/CNI decide el flujo

Un Service ayuda a descubrir y balancear; no cifra, no autentica y no abre una excepción de firewall. Una NetworkPolicy define intención, pero sólo es control efectivo cuando el CNI correspondiente la aplica. [2]

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Ruta de estudio y conexión con el roadmap

  1. Distingue IP de Pod, ClusterIP y NodePort; cada una responde a una necesidad distinta.
  2. Sigue una conexión desde Service hasta EndpointSlice y Pod.
  3. Compara overlay VXLAN con routing directo para entender MTU y rutas.
  4. Empieza con default deny y abre DNS más el flujo de negocio mínimo.

El módulo siguiente desciende otro nivel: si el datapath de Kubernetes no es suficiente para ver o controlar un comportamiento, permite observarlo y aplicar decisiones dentro del kernel.

Referencia técnica: modelo de red Kubernetes

Cada Pod tiene IP alcanzable y sus contenedores comparten network . CNI provisiona interfaz, IP, e IPAM. VXLAN encapsula L3 del Pod sobre underlay y reduce MTU; direct routing instala rutas a Pod y exige underlay alcanzable. [3]

ClusterIP es VIP estable; kube-proxy la redirige a Endpoints/EndpointSlices por /IPVS. NodePort abre puerto por nodo. Service no es identidad, cifrado ni autorización. [2]

NetworkPolicy exige CNI con enforcement. policyTypes Ingress+Egress sin reglas es default deny de pods seleccionados; añada selector+puerto+protocolo. DNS necesita egress UDP/TCP 53. Selector vacío cubre namespace completo. [4]

PlanoIdentificadorRiesgo
PodIP efímera + labelspolicy IP mutable
ServiceClusterIP/puertoVIP no firewall
NodeNodePortexposición por nodo
CNIrutas/enforcementasumir policy activa

Pulsa una fila para fijarla.

Referencia: no cuenta para tu progreso. Vuelve aquí cuando necesites un campo o un estado concreto.

La IP del Pod no es una abstracción decorativa

Cada Pod tiene IP alcanzable y CNI provisiona , dirección, ruta e IPAM. VXLAN encapsula IP-pod/TCP dentro de IP-nodo/UDP/VXLAN y reduce MTU; direct routing evita overhead pero exige rutas y anti-spoofing correctos en underlay. [3]

Flujo del mecanismo5 etapas

VXLAN mete un paquete dentro de otro

Lee de fuera hacia dentro: la red física solo ve la capa exterior.

underlay

eth + IP nodo. Cabeceras exteriores: la red física transporta el paquete de nodo a nodo, sin conocer los Pods.

Ver la figura original
[eth][IP nodo A][UDP 4789][VXLAN][eth][IP pod A][TCP][payload]
                                    └─ MTU útil para payload disminuye
ElecciónVentajaCoste a observar
VXLAN overlayunderlay ignora Pod CIDRMTU, CPU, encapsulación
direct routingmenos overheadrutas del underlay
eBPF datapathevita cadenas iptables largasnuevo punto de policy
IPVSselección eficiente Serviceinspección IPVS/

Pulsa una fila para fijarla.

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Service no equivale a conexión directa

ClusterIP estabiliza descubrimiento. Frontend usa 10.96.12.34:80; kube-proxy selecciona endpoint y hacia 10.244.2.20:8080. Service con selector correcto pero endpoints vacíos parece fallo de red, pero es descubrimiento/readiness. [2]

Figura
frontend → ClusterIP:80 → kube-proxy DNAT → api Pod:8080
                                          └─ CNI ruta/overlay/direct

NetworkPolicy es aditiva: conjunto permitido es unión de reglas que seleccionan Pod; no hay deny de prioridad superior. Empiece con aislamiento y abra selector+puerto+protocolo. [4]

SíntomaPlano primeroEvidencia
Service resuelve, timeoutendpoints/policyEndpointSlice, labels, contador CNI
local funciona, remoto fallaCNI/MTU/rutaPod CIDR, VXLAN, capture nodo
NodePort expuestoborde nodoreglas/listener/firewall cloud
Pod no entra a Serviceprobe/readiness/selector

Pulsa una fila para fijarla.

¿La entiendes?

Márcala sólo si puedes explicarla con tus palabras y decir por qué importa en producción.

Checkpoint 04 · predice antes de revelar

Default deny sin DNS rompe antes de tocar la API

Aplicaste una NetworkPolicy con Ingress y Egress sin reglas al Pod frontend. El Service api existe y tiene endpoints sanos, pero frontend ya no puede resolver api.default.svc.cluster.local.

kubectl get endpoints api: 10.244.2.20:8080
frontend: lookup api.default.svc.cluster.local: i/o timeout
NetworkPolicy frontend: policyTypes [Ingress, Egress], egress: []
¿Cuál es el cambio mínimo y verificable?

Inspector de paquete

frontend→ClusterIP→kube-proxy DNAT→api; VXLAN/direct route

10.244.1.10:49152 → 10.96.12.34:8080

IPv4TCP

IPv4 · bits 64–71 · 8 bits

TTL

64

Saltos restantes. Cada router lo decrementa; en 0 descarta y emite ICMP Time Exceeded.

Cambia en cada salto: por eso el checksum IP se recalcula en cada router.

40 bytes · hex

Supuestos de la síntesis
  • Protocolo TCP deducido del puerto declarado en service.
  • Puerto origen 49152: primer puerto efímero IANA, ilustrativo.
  • TTL inicial 64 (valor por defecto de Linux); Identification 0x1c46 ilustrativo.
  • SYN sin opciones TCP para que la cabecera quepa en 20 bytes; un SYN real de Linux añade MSS, SACK, timestamps y window scale. ISN ilustrativo.