En esta página, se explica cómo habilitar y solucionar problemas de GKE Dataplane V2 para clústeres de Google Kubernetes Engine (GKE).
Los clústeres Autopilot nuevos tienen GKE Dataplane V2 habilitado en las versiones 1.22.7-gke.1500 y posteriores, y las versiones 1.23.4-gke.1500 y posteriores. Si tienes problemas para usar GKE Dataplane V2, ve a Solución de problemas.
Crea un clúster de GKE con GKE Dataplane V2
Puedes habilitar GKE Dataplane V2 cuando creas clústeres nuevos con la versión de GKE 1.20.6-gke.700 y versiones posteriores mediante la gcloud CLI o la API de GKE. También puedes habilitar GKE Dataplane V2 en vista previa cuando creas clústeres nuevos con la versión de GKE 1.17.9 y posteriores.
Console
Para crear un clúster nuevo con GKE Dataplane V2, realiza las siguientes tareas:
En la Cloud de Confiance consola de, accede a la página Crear un clúster de Kubernetes.
En la sección Herramientas de redes, selecciona la casilla de verificación Habilitar Dataplane V2. La opción Habilitar la política de red de Kubernetes se inhabilita cuando seleccionas Habilitar Dataplane V2 porque la aplicación de la política de red está integrada en GKE Dataplane V2.
Haz clic en Crear.
gcloud
Para crear un clúster nuevo con GKE Dataplane V2, usa el siguiente comando:
gcloud container clusters create CLUSTER_NAME \
--enable-dataplane-v2 \
--enable-ip-alias \
--release-channel CHANNEL_NAME \
--location COMPUTE_LOCATION
Reemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster nuevo.CHANNEL_NAME: Un canal de versiones que incluye la versión 1.20.6-gke.700 de GKE o una posterior. Si prefieres no usar un canal de versiones, también puedes usar la marca--cluster-versionen lugar de--release-channel, con la especificación de la versión 1.20.6-gke.700 o posterior.COMPUTE_LOCATION: la ubicación de Compute Engine para el clúster nuevo.
API
Para crear un clúster nuevo con GKE Dataplane V2, especifica el campo datapathProvider en el objeto networkConfig, en la solicitud create del clúster.
En el siguiente fragmento de código JSON, se muestra la configuración necesaria para habilitar GKE Dataplane V2:
"cluster":{
"initialClusterVersion":"VERSION",
"ipAllocationPolicy":{
"useIpAliases":true
},
"networkConfig":{
"datapathProvider":"ADVANCED_DATAPATH"
},
"releaseChannel":{
"channel":"CHANNEL_NAME"
}
}
Reemplaza lo siguiente:
- VERSION: Tu versión del clúster, que debe ser GKE 1.20.6-gke.700 o posterior.
- CHANNEL_NAME: Un canal de versiones que incluye la versión 1.20.6-gke.700 de GKE o una posterior.
Soluciona problemas con GKE Dataplane V2
En esta sección, se muestra cómo investigar y resolver problemas con GKE Dataplane V2.
Confirma que GKE Dataplane V2 esté habilitado:
kubectl -n kube-system get pods -l k8s-app=cilium -o wideSi GKE Dataplane V2 está en ejecución, el resultado incluye Pods con el prefijo
anetd-. anetd es el controlador de herramientas de redes para GKE Dataplane V2.Si el problema es con los servicios o la aplicación de la política de red, verifica los registros del Pod
anetd: Usa los siguientes selectores de registros en Cloud Logging:resource.type="k8s_container" labels."k8s-pod/k8s-app"="cilium" resource.labels.cluster_name="CLUSTER_NAME"Si falla la creación de un Pod, revisa los registros de kubelet para obtener pistas. Usa los siguientes selectores de registros en Cloud Logging:
resource.type="k8s_node" log_name=~".*/logs/kubelet" resource.labels.cluster_name="CLUSTER_NAME"Reemplaza
CLUSTER_NAMEpor el nombre del clúster o quítalo por completo para ver los registros de todos los clústeres.Si los Pods
anetdno se están ejecutando, examina el ConfigMap cilium-config para ver si hay modificaciones. Evita modificar los campos existentes dentro de este ConfigMap, ya que esos cambios pueden desestabilizar el clúster y afectar aanetd. El ConfigMap se vuelve a aplicar al estado predeterminado solo si se le agregan campos nuevos. No se vuelven a aplicar los cambios a los campos existentes, y te recomendamos que no cambies ni personalices el ConfigMap.
Problemas conocidos
Cuando usas GKE Dataplane V2, es posible que encuentres los siguientes problemas conocidos.
Tiempos de espera de conexión para Pods no listos
Cuando un Pod no está listo, las conexiones al Service asociado pueden agotarse.
Este es el comportamiento esperado para GKE Dataplane V2 y difiere de kube-proxy, que puede mostrar un error connection refused más rápido.
El filtrado de etiquetas relevantes para la identidad de Cilium no se aplica y los Pods se bloquean en el estado ContainerCreating
Versiones afectadas: 1.34, 1.35
En los clústeres de GKE Dataplane V2, el uso de emergencia del filtrado de etiquetas relevantes para la identidad a través de kube-system/cilium-config-emergency-override ConfigMap no se aplica correctamente en las versiones afectadas.
Este enfoque limita qué etiquetas de Pod se usan para la generación de identidad de Cilium.
Cuando no están disponibles otros mecanismos para evitar o quitar claves o valores de etiquetas de alta cardinalidad de los Pods (por ejemplo, cuando una herramienta o framework aplica etiquetas), se puede usar el filtrado de etiquetas relevantes para la identidad para excluir las claves de etiquetas del cálculo de identidad de Cilium. Para obtener más información sobre la configuración de estas reglas, consulta Etiquetas relevantes para la identidad en la documentación de Cilium.
Para las versiones afectadas de GKE, las identidades de Cilium creadas por el operador continúan incluyendo las etiquetas excluidas.
Síntomas
Es posible que los Pods con etiquetas que se deben filtrar para la generación de identidad de Cilium no se inicien y se bloqueen en el estado
ContainerCreating. Es posible que los eventos de Pod muestren errores de tiempo de espera:{"level":"warning", "msg":"Error changing endpoint identity", "error":"unable to resolve identity: timed out waiting for cilium-operator to allocate CiliumIdentity for key ...;, error: exponential backoff cancelled via context: context canceled", "k8sPodName":"...", "subsys":"endpoint"}En lugar de compartir identidades basadas en etiquetas filtradas, los Pods con valores de etiquetas únicos continúan generando identidades de Cilium únicas. Esto puede provocar un aumento considerable de las identidades, lo que podría agotar las identidades de Cilium disponibles (hasta un límite de 65,536) y causar problemas de escalabilidad.
Versiones fijas
Para solucionar este problema, actualiza tu clúster a una de las siguientes versiones de GKE:
- 1.34.6-gke.1307000 o posterior
- 1.35.2-gke.1962000 o posterior
Solución alternativa
Como solución alternativa, aplica las reglas de filtrado de etiquetas al campo data.labels en
el ConfigMap cilium-config principal y quítalas de
cilium-config-emergency-override. Esta situación persiste a través de las operaciones del plano de control, como las actualizaciones, ya que GKE conserva las modificaciones del usuario en los campos que no administra dentro del ConfigMap cilium-config.
- Quita la clave
labelsde la seccióndatadel ConfigMapcilium-config-emergency-overridesi existe. Edita el ConfigMap
cilium-configagregando o modificando la clavelabelsen la seccióndata. Por ejemplo, para evitar que se usen etiquetas llamadasuuidpara la generación de identidad:apiVersion: v1 kind: ConfigMap metadata: name: cilium-config namespace: kube-system data: # ... other existing keys labels: "!uuid" # ... other existing keysReinicia el
anet-operatoren el plano de control actualizando el plano de control a la misma versión en la que se está ejecutando. Esto obliga al operador a reiniciarse y volver a cargar su configuración:gcloud container clusters upgrade CLUSTER_NAME \ --location CLUSTER_LOCATION \ --project PROJECT_ID \ --cluster-version $(gcloud container clusters describe CLUSTER_NAME --location CLUSTER_LOCATION --project PROJECT_ID --format="value(currentMasterVersion)") \ --masterDespués de que se reinicie el plano de control, reinicia el DaemonSet
anetdpara asegurarte de que los agentes de nodos también seleccionen los cambios necesarios:kubectl rollout restart daemonset anetd -n kube-system
Problemas de conectividad intermitentes relacionados con conflictos de rango de NodePort en clústeres de GKE Dataplane V2
En los clústeres de GKE Dataplane V2, pueden ocurrir problemas de conectividad intermitentes para el tráfico enmascarado o con el uso de puertos efímeros. Estos problemas se deben a posibles conflictos de puertos con el rango de NodePort reservado y, por lo general, ocurren en las siguientes situaciones:
`ip-masq-agent` personalizado: Si usas un
ip-masq-agent(versión 2.10 o posterior), en el que el clúster tiene servicios deNodePorto de balanceador de cargas, es posible que observes problemas de conectividad intermitente debido a su conflicto con el rango deNodePort.ip-masq-agentA partir de la versión 2.10 y versiones posteriores,ip-masq-agenttiene el argumento--random-fullyimplementado internamente de forma predeterminada. Para mitigar esto, configura--random-fully=falsede forma explícita (aplicable desde la versión 2.11) en los argumentos de la configuración deip-masq-agent. Para obtener más información sobre la configuración, consulta Configura un agente de enmascaramiento de IP en clústeres de Standard.Superposición del rango de puertos efímeros: Si el rango de puertos efímeros definido por
net.ipv4.ip_local_port_rangeen tus nodos de GKE se superpone con el rango deNodePort(30000-32767), también puede generar problemas de conectividad. Para evitar este problema, asegúrate de que estos dos rangos no se superpongan.
Revisa la configuración de ip-masq-agent y los parámetros de configuración del rango de puertos efímeros para asegurarte de que no entren en conflicto con el rango de NodePort. Si tienes problemas de conectividad intermitentes, considera estas posibles causas y ajusta tu configuración según corresponda.
Problemas de conectividad con hostPort en clústeres de GKE Dataplane V2
Versiones de GKE afectadas: 1.29 y posteriores
En los clústeres que usan GKE Dataplane V2, es posible que encuentres fallas de conectividad cuando el tráfico se dirige a IP:Puerto de un nodo, en el que puerto es el hostPort definido en el Pod. Estos problemas surgen en dos situaciones principales:
Nodos con
hostPortdetrás de un balanceador de cargas de red de transferencia:hostPortvincula un Pod al puerto de un nodo específico, y un balanceador de cargas de red de transferencia distribuye el tráfico en todos los nodos. Cuando expones Pods a Internet conhostPorty un balanceador de cargas de red de transferencia, el balanceador de cargas puede enviar tráfico a un nodo en el que no se ejecuta el Pod, lo que provoca fallas de conexión. Esto se debe a una limitación conocida en GKE Dataplane V2 en la que el tráfico del balanceador de cargas de red de transferencia no se reenvía de manera coherente a los PodshostPort.Solución alternativa: Cuando expongas
hostPorts de un Pod en el nodo con un balanceador de cargas de red de transferencia, especifica la dirección IP interna o externa del balanceador de cargas de red en el campohostIPdel Pod.ports: - containerPort: 62000 hostPort: 62000 protocol: TCP hostIP: 35.232.62.64 - containerPort: 60000 hostPort: 60000 protocol: TCP hostIP: 35.232.62.64 # Assuming 35.232.62.64 is the external IP address of a passthrough Network Load Balancer.Conflicto de
hostPortcon el rangoNodePortreservado:Si el
hostPortde un Pod entra en conflicto con el rangoNodePortreservado (30000-32767), es posible que Cilium no pueda reenviar el tráfico al Pod. Este comportamiento se observó en las versiones 1.29 y posteriores del clúster, ya que Cilium ahora administra las capacidades dehostPorty reemplaza el método Portmap anterior. Este es un comportamiento esperado para Cilium y se menciona en su documentación pública.
No planeamos corregir estas limitaciones en versiones posteriores. La causa raíz de estos problemas está relacionada con el comportamiento de Cilium y está fuera del control directo de GKE.
Recomendación: Te recomendamos que migres a los servicios NodePort en lugar de hostPort para mejorar la confiabilidad. Los servicios NodePort proporcionan capacidades similares.
Los rangos de puertos de la política de red no se aplican
Si especificas un campo endPort en una política de red en un clúster que tiene habilitado GKE Dataplane V2, no se aplicará.
La API de Kubernetes Network Policy te permite especificar un rango de puertos en los que se aplica la política de red. Esta API es compatible con clústeres con la política de red Calico, pero no es compatible con clústeres con GKE Dataplane V2.
Puedes verificar el comportamiento de tus objetos NetworkPolicy si los vuelves a leer después de escribirlos en el servidor de la API. Si el objeto todavía contiene el campo endPort, la función se aplica. Si falta el campo endPort, la función no se aplica. En todos los casos, el objeto almacenado en el servidor de la API es la fuente de información de la política de red.
Para obtener más información, consulta KEP-2079: Política de red que admite rangos de puertos.
Versiones fijas
Para solucionar este problema, actualiza tu clúster a las versiones 1.32 o posteriores de GKE.
La política de red descarta una conexión debido a una búsqueda de seguimiento de conexión incorrecta
Cuando un Pod de cliente se conecta consigo mismo a través de un Service o la dirección IP virtual de un balanceador de cargas de red de transferencia interno, el paquete de respuesta no se identifica como parte de una conexión existente debido a una búsqueda de conntrack incorrecta en el plano de datos. Esto significa que una política de red que restringe el tráfico de entrada para el Pod se aplica de forma incorrecta en el paquete.
El impacto de este problema depende de la cantidad de Pods configurados para el Service. Por ejemplo, si el Service tiene 1 Pod de backend, la conexión siempre falla. Si el Service tiene 2 Pods de backend, la conexión falla el 50% del tiempo.
Versiones fijas
Para solucionar este problema, actualiza tu clúster a una de las siguientes versiones de GKE:
- 1.28.3-gke.1090000 o superior.
Soluciones alternativas
Puedes mitigar este problema si configuras port y containerPort en el manifiesto del Service para que tengan el mismo valor.
Pérdida de paquetes para los flujos de conexión en horquilla
Cuando un Pod crea una conexión TCP a sí misma usando un Service, de modo que el Pod sea la fuente y el destino de la conexión, el seguimiento de conexión de eBPF de GKE Dataplane V2 realiza un seguimiento incorrecto de los estados de conexión, lo que genera entradas de conntrack filtradas.
Cuando se filtra una tupla de conexión (protocolo, IP de origen/destino y puerto de origen/destino), las conexiones nuevas que usan la misma tupla de conexión pueden provocar que se pierdan paquetes de retorno.
Versiones fijas
Para solucionar este problema, actualiza tu clúster a una de las siguientes versiones de GKE:
- 1.28.3-gke.1090000 o superior
- 1.27.11-gke.1097000 o superior
Soluciones alternativas
Aplica una de las siguientes soluciones:
Habilita la reutilización de TCP (keep-alive) para las aplicaciones que se ejecutan en Pods que pueden comunicarse con sí mismas a través de un Service. Esto evita que se emita la marca TCP FIN y se evite que se filtre la entrada de conntrack.
Cuando uses conexiones de corta duración, expón el Pod con un balanceador de cargas de proxy, como Gateway, para exponer el Service. Esto hace que el destino de la solicitud de conexión se establezca en la dirección IP del balanceador de cargas, lo que evita que GKE Dataplane V2 realice SNAT a la dirección IP de bucle invertido.
La actualización del plano de control de GKE provoca un interbloqueo del Pod anetd
Cuando actualizas un clúster de GKE que tiene habilitado GKE Dataplane V2 (ruta de datos avanzada) de la versión 1.27 a la 1.28, es posible que encuentres una situación de interbloqueo. Las cargas de trabajo pueden experimentar interrupciones debido a la incapacidad de finalizar Pods antiguos o programar componentes necesarios como anetd.
Causa
El proceso de actualización del clúster aumenta el requisito de recursos para los componentes de GKE Dataplane V2. Este aumento puede provocar una contención de recursos, lo que interrumpe la comunicación entre el complemento de la interfaz de red de contenedores (CNI) de Cilium y el daemon de Cilium.
Síntomas
Es posible que veas los siguientes síntomas:
- Los Pods
anetdpermanecen bloqueados en un estadoPending. - Los Pods de carga de trabajo se bloquean en un estado
Terminating. - Errores que indican fallas de comunicación de Cilium, como
failed to connect to Cilium daemon. Errores durante la limpieza de recursos de red para zonas de pruebas de Pods, por ejemplo:
1rpc error: code = Unknown desc = failed to destroy network for sandbox "[sandbox_id]": plugin type="cilium-cni" failed (delete): unable to connect to Cilium daemon... connection refused
Solución alternativa
Clústeres de Standard: Para resolver el problema y permitir que se programe el Pod anetd, aumenta temporalmente los recursos asignables en el nodo afectado.
Para identificar el nodo afectado y verificar su CPU y memoria asignables, ejecuta el siguiente comando:
kubectl get nodes $NODE_NAME -o json | jq '.status.allocatable | {cpu, memory}'Para aumentar temporalmente la CPU y la memoria asignables, ejecuta el siguiente comando:
kubectl patch node $NODE_NAME -p '{"status":{"allocatable":{"cpu":CPU_VALUE, "memory":MEMORY_VALUE}}}'
Clústeres de Autopilot: Para resolver el problema de interbloqueo en los clústeres de Autopilot, libera recursos borrando de forma forzada el Pod afectado:
kubectl delete pod POD_NAME -n NAMESPACE --grace-period=0 --force
Reemplaza lo siguiente:
POD_NAME: el nombre del Pod.NAMESPACE: el espacio de nombres del Pod.
Después de aumentar los recursos asignables en el nodo y cuando se complete la actualización de la versión 1.27 a la 1.28 de GKE, el Pod anetd se ejecutará en la versión más reciente.
Nodos en estado NodeNotReady debido a un error containerID faltante
Cuando los clústeres se actualizan a la versión 1.35.1-gke.1616000 de GKE y versiones posteriores, es posible que los nodos ingresen de inmediato a un estado NodeNotReady si están habilitados GKE Dataplane V2 y Cloud Service Mesh.
Causa
A partir de la versión 1.35.1-gke.1616000 de GKE, los clústeres de GKE Dataplane V2 usan la versión 1.1.0 de CNI en sus archivos de configuración de CNI. Este cambio requiere que los complementos de CNI descendentes, como Google Managed Istio, también admitan la versión 1.1.0 de CNI. Debido a una demora en el lanzamiento de Managed Istio, algunos clústeres aún no recibieron la versión compatible (1.23), lo que provocó la falla de inicialización.
Síntomas
Los nodos afectados se muestran de inmediato como NodeNotReady. El siguiente mensaje de error aparece en los registros de containerd:
NetworkPluginNotReady message:Network plugin returns error: missing containerID
Solución alternativa
Para mitigar el problema, revierte el clúster afectado a una versión de GKE anterior a 1.35.1-gke.1616000.
Interferencia de programas eBPF personalizados
GKE usa programas eBPF para administrar las herramientas de redes de GKE Dataplane V2. Si implementas programas eBPF personalizados en interfaces de red de nodos administradas por GKE, estos programas pueden interferir con los programas eBPF administrados por GKE y causar problemas de redes.
GKE no admite programas eBPF personalizados conectados a las siguientes interfaces de red:
eth*ens4locilium*gke*veth*
La presencia de programas eBPF personalizados en estas interfaces puede interferir con los programas instalados por el agente anetd de GKE Dataplane V2, lo que puede interrumpir las herramientas de redes del clúster. Te recomendamos que quites cualquier programa eBPF personalizado o cargas de trabajo que inserten esos programas de tu clúster.
Descubre programas eBPF personalizados
Para descubrir programas eBPF personalizados que se ejecutan en nodos de clúster, puedes crear
un DaemonSet configurado con el parámetro hostNetwork: true que usa
bpftool
para consultar esos programas eBPF:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: bpftool-logger
labels:
app: bpftool-logger
spec:
selector:
matchLabels:
app: bpftool-logger
template:
metadata:
labels:
app: bpftool-logger
spec:
hostPID: true
hostNetwork: true
containers:
- name: bpftool
image: ubuntu:22.04
securityContext:
privileged: true
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
command:
- /bin/bash
- -c
- |
echo "Installing dependencies..."
apt-get update -y > /dev/null 2>&1
apt-get install -y curl tar > /dev/null 2>&1
echo "Downloading and setting up bpftool..."
curl -sL https://github.com/libbpf/bpftool/releases/download/v7.7.0/bpftool-v7.7.0-amd64.tar.gz | tar xz
chmod +x bpftool
mv bpftool /usr/local/bin/
echo "========== $(date) | Node: ${NODE_NAME} =========="
bpftool net | grep -E '^(eth|ens4|lo|cilium|gke|veth)' | grep -v ' cil_'
sleep infinity
Guarda el manifiesto como
ebpf-discovery.yamly aplica el DaemonSet:kubectl apply -f ebpf-discovery.yamlEspera a que los Pods se estén ejecutando:
kubectl rollout status ds/bpftool-loggerRevisa los registros de los Pods para descubrir programas eBPF:
kubectl logs -l app=bpftool-loggerCuando termines, borra el DaemonSet:
kubectl delete -f ebpf-discovery.yaml
¿Qué sigue?
- Obtén información para usar el registro de políticas de red.
- Obtén información para controlar la comunicación entre Pods y Services mediante las políticas de red.
- Obtén más información sobre GKE Dataplane V2.
- Obtén más información sobre la observabilidad de GKE Dataplane V2.
- Obtén información para configurar la observabilidad de GKE Dataplane V2.