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 de clúster, puedes configurar las políticas de red de todo el clúster (CCNP) de Cilium, que superan las limitaciones de la política 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, en todos los espacios de nombres, anulando 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) centrada en el 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 aplican a toda tu red. Estas reglas de CCNP actúan como una capa de seguridad de nivel superior, 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. Para aplicar la separación a nivel de la red, asigna 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 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 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:

  • No se admiten las políticas de la capa 7.
  • 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 cuando crees un clúster nuevo:

El 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 habilita 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 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 la 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 de 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 las políticas de red del 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:

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 recursos personalizados (CRD). El mensaje de error indica que falta el 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 las CCNPs.

¿Qué sigue?