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