Controla la comunicación en todo el clúster a través de políticas de red


En esta página, se explica cómo configurar las políticas de red de todo el clúster de para Google Kubernetes Engine (GKE).

Las políticas de red y las políticas de red FQDN te ayudan a definir reglas de tráfico de comunicación entre Pods. Las políticas de red controlan cómo los Pods se comunican entre sí dentro de sus aplicaciones y con extremos externos.

Como administrador de clústeres, puedes configurar las políticas de red de todo el clúster de Cilium (CCNP), que superan las limitaciones de las políticas de red para administrar el tráfico administrativo de todo el clúster. Las políticas de red en todo el clúster de Cilium aplican reglas de red estrictas para todas las cargas de trabajo en todo el clúster, en los espacios de nombres, lo que anula cualquier regla específica de la aplicación.

La política de red de todo el clúster de Cilium para GKE es una CustomResourceDefinition (CRD) con alcance de clúster que especifica las políticas que aplica GKE. Si habilitas la política de red de todo el clúster de Cilium en GKE, puedes administrar de forma centralizada las reglas de red para todo el clúster. Puedes controlar el acceso básico a la capa 3 (nivel de IP) y la capa 4 (nivel de puerto) para el tráfico que entra y sale del clúster.

Ventajas

Con la política de red de todo el clúster de Cilium, puedes hacer lo siguiente:

  • Aplica la seguridad centralizada: Con CCNP, puedes definir reglas de acceso a la red que se apliquen a toda tu red. Estas reglas de CCNP actúan como una capa de seguridad de nivel superior, lo que anula cualquier política potencialmente conflictiva a nivel del espacio de nombres.
  • Protege multiusuarios: Si tu clúster aloja varios equipos o usuarios, puedes proteger el aislamiento dentro de un clúster compartido mediante la implementación de reglas CCNP, que se enfocan en el control del tráfico de red. Puedes aplicar la separación a nivel de la red mediante la asignación de espacios de nombres o grupos de espacios de nombres a equipos específicos.
  • Define políticas predeterminadas flexibles: Con CCNP, puedes definir reglas de red predeterminadas para todo el clúster. Puedes personalizar estas reglas cuando sea necesario sin comprometer la seguridad general del clúster.

Para implementar CCNP, habilita GKE Dataplane V2 en tu clúster. Asegúrate de que la CRD de CCNP esté habilitada y, luego, crea políticas que definan reglas de acceso a la red para tu clúster.

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Kubernetes Engine de Google.
  • Habilitar la API de Kubernetes Engine de Google
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta gcloud components update para obtener la versión más reciente.

Requisitos

Las políticas de red de todo el clúster de Cilium tienen los siguientes requisitos:

  • Versión 465.0.0 o posterior de Google Cloud CLI.
  • Debes tener un clúster de GKE que ejecute una de las siguientes versiones:
    • 1.28.6-gke.1095000 o superior
    • 1.29.1-gke.1016000 o superior
  • Tu clúster debe usar GKE Dataplane V2.
  • Debes habilitar la CRD de la política de red de todo el clúster de Cilium.

Limitaciones

Las políticas de red de todo el clúster de Cilium tienen las siguientes limitaciones:

  • Las políticas de capa 7 no son compatibles.
  • No se admiten los selectores de nodos.
  • La cantidad máxima de CiliumClusterwideNetworkPolicy por clúster es 1,000.

Habilita la política de red de todo el clúster de Cilium en un clúster nuevo

Puedes habilitar la política de red de todo el clúster de Cilium en un clúster nuevo mediante Google Cloud CLI o la API de Google Kubernetes Engine.

gcloud

Para habilitar la política de red de todo el clúster de Cilium en un clúster nuevo, crea un clúster nuevo con la marca --enable-cilium-clusterwide-network-policy.

Autopilot

gcloud container clusters create-auto CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy

Reemplaza lo siguiente:

  • CLUSTER_NAME por el nombre del clúster.
  • COMPUTE_LOCATION por la ubicación del clúster

Standard

gcloud container clusters create CLUSTER_NAME \
    --location COMPUTE_LOCATION \
    --enable-cilium-clusterwide-network-policy \
    --enable-dataplane-v2

Reemplaza lo siguiente:

  • CLUSTER_NAME por el nombre del clúster.
  • COMPUTE_LOCATION por la ubicación del clúster

API

Para habilitar la política de red de todo el clúster de Cilium, debes especificar las siguientes opciones mientras creas un clúster nuevo:

Campo datapathProvider en el objeto networkConfig.

{
  "cluster": {
    ...
    "networkConfig": {
      "datapathProvider": "ADVANCED_DATAPATH",
      "enableCiliumClusterwideNetworkPolicy": true
    }
  }
}

Verifica que ciliumclusterwidenetworkpolicies.cilium.io esté presente en el resultado del siguiente comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

El resultado debería ser similar al siguiente ejemplo:

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

Habilita la política de red de todo el clúster de Cilium en un clúster existente

Puedes habilitar la política de red de todo el clúster de Cilium en un clúster existente con Google Cloud CLI o la API de Google Kubernetes Engine.

gcloud

  1. Confirma que el clúster tenga GKE Dataplane V2 habilitado.

    gcloud container clusters describe CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --format="value(networkConfig.datapathProvider)" \
    

    Reemplaza lo siguiente:

    • CLUSTER_NAME por el nombre del clúster.
    • COMPUTE_LOCATION por la ubicación del clúster
  2. Actualiza el clúster con la marca --enable-cilium-clusterwide-network-policy.

    gcloud container clusters update CLUSTER_NAME \
        --location COMPUTE_LOCATION \
        --enable-cilium-clusterwide-network-policy
    
  3. Reinicia el DaemonSet anetd.

    kubectl rollout restart ds -n kube-system anetd && \
        kubectl rollout status ds -n kube-system anetd
    

API

Confirma que el clúster esté habilitado para GKE Dataplane V2:

{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  },
  "name": "cluster"
}
To update an existing cluster, run the following update cluster command:
{
  "update": {
    "desiredEnableCiliumClusterwideNetworkPolicy": true
  }
  "name": "cluster"
}

Verifica que ciliumclusterwidenetworkpolicies.cilium.io esté presente en el resultado del siguiente comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

El resultado debería ser similar al siguiente ejemplo:

ciliumclusterwidenetworkpolicies.cilium.io     2023-09-19T16:54:48Z

Usa la política de red de todo el clúster de Cilium

En esta sección, se enumeran ejemplos para configurar la política de red de todo el clúster de Cilium.

Ejemplo 1: Controla el tráfico de entrada a una carga de trabajo

En el siguiente ejemplo, se permite que todos los extremos con la etiqueta role=backend acepten conexiones de entrada en el puerto 80 desde extremos con la etiqueta role=frontend. Los extremos con la etiqueta role=backend rechazarán todas las conexiones de entrada que esta política no permita.

  1. Guarda el siguiente manifiesto como l4-rule-ingress.yaml:

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-ingress"
    spec:
      endpointSelector:
        matchLabels:
          role: backend
      ingress:
        - fromEndpoints:
            - matchLabels:
                role: frontend
          toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. Aplica el manifiesto

    kubectl apply -f l4-rule-ingress.yaml
    

Ejemplo 2: Restringe el tráfico de salida de una carga de trabajo en un puerto determinado

La siguiente regla limita todos los extremos con la etiqueta app=myService para que solo puedan emitir paquetes con TCP en el puerto 80 a cualquier destino de capa 3:

  1. Guarda el siguiente manifiesto como l4-rule-egress.yaml:

    apiVersion: "cilium.io/v2"
    kind: CiliumClusterwideNetworkPolicy
    metadata:
      name: "l4-rule-egress"
    spec:
      endpointSelector:
        matchLabels:
          app: myService
      egress:
        - toPorts:
            - ports:
                - port: "80"
                  protocol: TCP
    
  2. Aplica el manifiesto

    kubectl apply -f l4-rule-egress.yaml
    

Ejemplo 3: Restringe el tráfico de salida de una carga de trabajo en un puerto y CIDR determinados

En el siguiente ejemplo, se limitan todos los extremos con la etiqueta role=crawler para que solo puedan enviar paquetes en el puerto 80, protocolos TCP, a un CIDR de destino 192.10.2.0/24.

  1. Guarda el siguiente manifiesto como cidr-l4-rule.yaml:

     apiVersion: "cilium.io/v2"
     kind: CiliumClusterwideNetworkPolicy
     metadata:
       name: "cidr-l4-rule"
     spec:
       endpointSelector:
         matchLabels:
           role: crawler
       egress:
         - toCIDR:
             - 192.0.2.0/24
           toPorts:
             - ports:
                 - port: "80"
                   protocol: TCP
    
  2. Aplica el manifiesto

    kubectl apply -f cidr-l4-rule.yaml
    

Supervisa y soluciona problemas del tráfico de red

Puedes supervisar y solucionar problemas del tráfico de red afectado por las políticas de red de todo el clúster de cilium mediante el registro de políticas de red y la observabilidad de GKE Dataplane V2.

Intenta usar políticas de capa 7 o selectores de nodos

Síntoma

Si usas GKE con GKE Dataplane V2 y tratas de definir políticas de CCNP que incluyen reglas de la capa 7 (por ejemplo: filtrado HTTP) y selectores de nodos, es posible que veas un mensaje de error similar al siguiente:

Error

Error from server (GKE Warden constraints violations): error when creating
"ccnp.yaml": admission webhook
"warden-validating.common-webhooks.networking.gke.io" denied the request: GKE
Warden rejected the request because it violates one or more constraints.
Violations details: {"[denied by gke-cilium-network-policy-limitation]":["L7
rules are not allowed in CiliumClusterwideNetworkPolicy"]} Requested by user:
'user@example.com', groups: 'system:authenticated'.

Causa posible

GKE tiene limitaciones específicas en los CCNP. Las políticas de capa 7, que permiten el filtrado basado en datos a nivel de la aplicación (como encabezados HTTP) y los selectores de nodos no son compatibles con la integración de Cilium de GKE.

Solución

Si necesitas capacidades avanzadas de filtrado de capa 7 en tu clúster de GKE, considera usar Anthos Service Mesh. Esto proporciona un control del tráfico más detallado a nivel de la aplicación.

La política de red de todo el clúster de Cilium no está habilitada

Síntoma

Cuando intentas configurar las políticas de red de todo el clúster de Cilium (CCNP) en un clúster en el que la función no se habilitó de forma explícita, no podrás configurarla y es posible que veas un mensaje de error similar al siguiente: lo siguiente:

Error

error: resource mapping not found for name: "l4-rule" namespace: "" from
"ccnp.yaml": no matches for kind "CiliumClusterwideNetworkPolicy" in version
"cilium.io/v2" ensure CRDs are installed first

Causa posible

Las políticas de red en todo el clúster de Cilium se basan en una definición de recurso personalizado (CRD). El mensaje de error indica que falta la CRD en el clúster.

Solución

Habilita la CRD de la política de red de todo el clúster de Cilium antes de usar CCNP.

¿Qué sigue?