Controlar la comunicación en todo el clúster mediante políticas de red

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

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

Como administrador de clústeres, 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 gestionar 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 a todas las cargas de trabajo de todo el clúster, 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 ámbito de clúster que especifica las políticas aplicadas por GKE. Si habilitas la política de red de todo el clúster de Cilium en GKE, puedes gestionar de forma centralizada las reglas de red de todo el clúster. Puedes controlar el acceso básico de capa 3 (a nivel de IP) y de capa 4 (a 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 una 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 que pueda entrar en conflicto a nivel de espacio de nombres.
  • Protege la arquitectura multiinquilino: si tu clúster aloja varios equipos o inquilinos, puedes proteger el aislamiento en un clúster compartido implementando reglas de CCNP, que se centran en el control del tráfico de red. Puedes aplicar la separación a nivel de red asignando espacios de nombres o grupos de espacios de nombres a equipos específicos.
  • Definir 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 de tu clúster.

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

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Requisitos

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

  • Tener instalada la versión 465.0.0 o una 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 posterior
    • 1.29.1-gke.1016000 o posterior
  • 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 selectores de nodos.
  • El número máximo de CiliumClusterwideNetworkPolicy por clúster es 1000.

Habilitar 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 la CLI de Google Cloud 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 con la marca --enable-cilium-clusterwide-network-policy.

Autopilot

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

Haz los cambios siguientes:

  • CLUSTER_NAME por el nombre de tu clúster.
  • COMPUTE_LOCATION con la ubicación de tu clúster.

Estándar

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

Haz los cambios siguientes:

  • CLUSTER_NAME por el nombre de tu clúster.
  • COMPUTE_LOCATION con la ubicación de tu clúster.

API

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

Campo datapathProvider del 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

La salida debería ser similar a la siguiente:

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

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

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

gcloud

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

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

    Haz los cambios siguientes:

    • CLUSTER_NAME por el nombre de tu clúster.
    • COMPUTE_LOCATION con la ubicación de tu 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 tiene habilitado 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 la salida del siguiente comando:

kubectl get crds ciliumclusterwidenetworkpolicies.cilium.io

La salida debería ser similar a la siguiente:

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

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

En esta sección se muestran ejemplos de configuración de la política de red de todo el clúster de Cilium.

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

En el siguiente ejemplo, se habilitan todos los endpoints con la etiqueta role=backend para que acepten conexiones entrantes en el puerto 80 de los endpoints con la etiqueta role=frontend. Los endpoints con la etiqueta role=backend rechazarán todas las conexiones entrantes que no estén permitidas por esta política.

  1. Guarda el siguiente archivo de 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 archivo de manifiesto:

    kubectl apply -f l4-rule-ingress.yaml
    

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

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

  1. Guarda el siguiente archivo de 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 archivo de manifiesto:

    kubectl apply -f l4-rule-egress.yaml
    

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

En el siguiente ejemplo, se limita el acceso de todos los endpoints 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 archivo de 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 archivo de manifiesto:

    kubectl apply -f cidr-l4-rule.yaml
    

Monitorizar y solucionar problemas de tráfico de red

Puedes monitorizar y solucionar los 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.

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

Síntoma

Si usas GKE con GKE Dataplane V2 e intentas definir políticas de CCNP que incluyan reglas de 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 CCNPs. Las políticas de capa 7, que permiten filtrar en función de datos a nivel de aplicación (como los encabezados HTTP) y los selectores de nodos, no se admiten en la integración de Cilium de GKE.

Resolución

Si necesitas funciones avanzadas de filtrado de capa 7 en tu clúster de GKE, te recomendamos que uses Cloud Service Mesh. De esta forma, tendrás un control más detallado del tráfico a nivel de aplicación.

Política de red de todo el clúster de Cilium no habilitada

Síntoma

Cuando intentes configurar políticas de red de todo el clúster de Cilium (CCNP) en un clúster en el que la función no se haya habilitado explícitamente, 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 se basan en una definición de recurso personalizado (CRD). El mensaje de error indica que falta el CRD en el clúster.

Resolución

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

Siguientes pasos