Saltar a contenido

Network Policies

El Concepto: Identidad Multi-Clúster

Cuando habilitas Cilium Cluster Mesh, los clústeres no solo comparten rutas y servicios, sino que también comparten sus identidades de seguridad.

En un solo clúster, tú creas políticas basadas en etiquetas como app: backend. El "peligro" en un Cluster Mesh es que, por defecto, si permites tráfico desde app: backend, Cilium lo permitirá desde cualquier pod con esa etiqueta, sin importar en qué clúster viva (Norteamérica, Europa, Cluster 1, Cluster 2, etc.).

Para aplicar un enfoque verdaderamente Zero Trust (Confianza Cero) y restringir el tráfico a un clúster específico, Cilium inyecta automáticamente una etiqueta especial a cada pod, indicando su origen: io.cilium.k8s.policy.cluster=<nombre-del-cluster>


La Solución al Reto YAML 📜

Volviendo a nuestro escenario: Queríamos permitir que el cluster1 hablara con la base de datos del cluster2, pero bloqueando a cualquier otro.

Así es como se vería exactamente el objeto CiliumNetworkPolicy aplicado en el cluster2 (donde vive la base de datos):

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "db-strict-policy"
  namespace: default
spec:
  # 1. ¿A quién aplica esta política? (El Destino)
  endpointSelector:
    matchLabels:
      app: database

  # 2. ¿Qué tráfico dejamos entrar? (La Regla Ingress)
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: backend
        # 3. ¡La magia multi-clúster!
        io.cilium.k8s.policy.cluster: cluster1 

Desglose de la lógica:

  1. endpointSelector: Le dice al agente de Cilium en el cluster2: "Aplica este escudo protector únicamente a los pods que tengan la etiqueta app: database".
  2. ingress / fromEndpoints: Define la lista blanca (whitelist). Si no estás en esta lista, tu paquete de red será descartado silenciosamente (Drop).
  3. El filtro de Clúster: Al exigir io.cilium.k8s.policy.cluster: cluster1, garantizamos que si un pod "malicioso" en el cluster2 se pone la etiqueta app: backend, la conexión seguirá siendo rechazada porque su etiqueta de clúster dirá cluster2, no cluster1.

También se puede filtrar por Entidades

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "from-world-to-role-public"
spec:
  endpointSelector:
    matchLabels:
      role: public
  ingress:
    - fromEntities:
      - world