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 de 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 del clúster, puedes configurar 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 de todo el clúster de Cilium aplican reglas de red estrictas para todas las cargas de trabajo en todo el clúster y en todos los espacios de nombres, y anulan 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:

  • Aplicar 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, que anula cualquier política potencialmente conflictiva a nivel del espacio de nombres.
  • Protege múltiples usuarios: Si tu clúster aloja varios equipos o usuarios, puedes proteger el aislamiento dentro de un clúster compartido implementando reglas de CCNP, que se enfocan en el control del tráfico de red. Puedes aplicar la separación a nivel de la red asignando 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 el CRD de CCNP esté habilitado y, luego, crea políticas que definan las 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 Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.

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 el 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:

  • No se admiten las políticas de capa 7.
  • No se admiten los selectores de nodos.
  • La cantidad máxima de CiliumClusterwideNetworkPolicy por clúster es de 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 cuando crees 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 de 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 los extremos con la etiqueta role=frontend. Los extremos con la etiqueta role=backend rechazarán todas las conexiones de entrada que no estén permitidas por esta política.

  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 limita 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
    

Supervisión y solución de 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'.

Posible causa:

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 Cloud Service Mesh. Esto proporciona un control del tráfico más detallado a nivel de la aplicación.

No se habilitó la política de red de todo el clúster de Cilium

Síntoma

Cuando intentes configurar políticas de red en todo el clúster (CCNP) de Cilium en un clúster en el que la función no se haya habilitado de forma explícita, no podrás configurarla y es posible que veas un mensaje de error similar al 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

Posible causa:

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

Solución

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

¿Qué sigue?