Problemas conocidos de las herramientas de redes de GKE

En esta página, se enumeran los problemas conocidos de las redes de GKE. Esta página está destinada a administradores y arquitectos que administran el ciclo de vida de la infraestructura tecnológica subyacente y responden a alertas y páginas cuando no se cumplen los objetivos de nivel de servicio (SLO) o fallan las aplicaciones.

Para filtrar los problemas conocidos por versión del producto, selecciona los filtros en los siguientes menús desplegables.

Selecciona tu versión de GKE:

O bien, busca tu problema:

Versiones identificadas Versiones corregidas Problema y solución
1.28, 1.29, 1.30, 1.31, 1.32, 1.33

Filtración de direcciones IP de Pods en nodos con GKE Dataplane V2

Los clústeres con GKE Dataplane V2 habilitado pueden experimentar el agotamiento de las direcciones IP de Pods en los nodos. Este problema se debe a un error del entorno de ejecución del contenedor que puede filtrar direcciones IP asignadas cuando los Pods experimentan errores transitorios de CNI durante la creación.

El problema se activa cuando el nodo del clúster de GKE se actualiza o se crea con una de las siguientes versiones de GKE:

  • 1.33 y versiones posteriores
  • 1.32 y versiones posteriores
  • 1.31.2-gke.1115000 o versiones posteriores
  • 1.30.8-gke.1051001 o versiones posteriores
  • 1.29.10-gke.1059000 o versiones posteriores
  • 1.28.15-gke.1024000 o versiones posteriores

Cuando ocurre este problema, los Pods nuevos que se programan en el nodo afectado no se inician y muestran un mensaje de error similar al siguiente: failed to assign an IP address to container.


Solución alternativa:

Para mitigar este problema, puedes aplicar el DaemonSet de mitigación al clúster para limpiar los recursos de IP filtrados:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: cleanup-ipam-dir
  namespace: kube-system
spec:
  selector:
    matchLabels:
      name: cleanup-ipam
  template:
    metadata:
      labels:
        name: cleanup-ipam
    spec:
      hostNetwork: true
      securityContext:
        runAsUser: 0
        runAsGroup: 0
        seccompProfile:
          type: RuntimeDefault
      automountServiceAccountToken: false
      containers:
      - name: cleanup-ipam
        image: gcr.io/gke-networking-test-images/ubuntu-test:2022@sha256:6cfbdf42ccaa85ec93146263b6e4c60ebae78951bd732469bca303e7ebddd85e
        command:
        - /bin/bash
        - -c
        - |
          while true; do
          for hash in $(find /hostipam -iregex '/hostipam/[0-9].*' -mmin +10 -exec head -n1 {} \; ); do
          hash="${hash%%[[:space:]]}"
          if [ -z $(ctr -n k8s.io c ls | grep $hash | awk '{print $1}') ]; then
          grep -ilr $hash /hostipam
          fi
          done | xargs -r rm
          echo "Done cleaning up /var/lib/cni/networks/gke-pod-network at $(date)"
          sleep 120s
          done
        volumeMounts:
        - name: host-ipam
          mountPath: /hostipam
        - name: host-ctr
          mountPath: /run/containerd
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
      volumes:
      - name: host-ipam
        hostPath:
          path: /var/lib/cni/networks/gke-pod-network
      - name: host-ctr
        hostPath:
          path: /run/containerd

1.31, 1.32 y 1.33
  • 1.33.1-gke.1107000 y versiones posteriores

Interrupciones de los balanceadores de cargas de entrada y de servicio en clústeres con una red heredada

Una incompatibilidad con las redes heredadas hace que se desconecten los backends de un balanceador de cargas administrado por GKE implementado con Ingress o Service. Esto hace que el balanceador de cargas no tenga backends activos, lo que, a su vez, provoca que se descarten todas las solicitudes entrantes a esos balanceadores de cargas.

El problema afecta a los clústeres de GKE que usan una red heredada y que ejecutan la versión 1.31 o una posterior.

Para identificar los clústeres de GKE con una red heredada, ejecuta el siguiente comando:

    gcloud container clusters describe CLUSTER_NAME --location=LOCATION --format="value(subnetwork)"
  

Un clúster con una red heredada obtendrá un resultado vacío para este comando.

Solución alternativa:

Dado que las redes heredadas están obsoletas desde hace un tiempo, la solución preferida es migrar tu red heredada a una red de VPC. Para ello, convierte una red heredada que contenga clústeres de GKE. Si no puedes realizar esta migración en este momento, comunícate con Atención al cliente de Cloud.

1.30, 1.31 y 1.32
  • 1.30.10-gke.1070000 y versiones posteriores
  • 1.31.5-gke.1068000 y versiones posteriores
  • 1.32.1-gke.1002000 y versiones posteriores

Los nodos recién creados no se agregan a los balanceadores de cargas internos de capa 4

Es posible que los balanceadores de cargas de Google Cloud que se crean para los objetos Service LoadBalancer internos no incluyan los nodos creados recientemente en el grupo de instancias de backend.

El problema será más visible en un clúster que se redujo a cero nodos y, luego, se volvió a aumentar a uno o más nodos.

Soluciones alternativas:

  • Activa la subdivisión de GKE y vuelve a crear el servicio.

    Nota: La subdivisión de GKE no se puede desactivar una vez que se activa.

  • Crea otro servicio de balanceo de cargas interno. Cuando se sincronice, el grupo de instancias también se corregirá para el servicio afectado. El nuevo servicio se puede quitar después de la sincronización.
  • Agrega y, luego, quita la etiqueta node.kubernetes.io/exclude-from-external-load-balancers de uno de los nodos.
  • Agrega un nodo al clúster. Puedes quitar el nodo después de que el servicio comience a funcionar.
1.31 y 1.32
  • 1.31.7-gke.1158000 y versiones posteriores
  • 1.32.3-gke.1499000 y versiones posteriores

Problemas de la API de Gateway debido a que se quitó storedVersions del estado de CRD

Kube-Addon-Manager en GKE quita de forma incorrecta el v1alpha2 storedVersion del estado de los CRD de la API de Gateway, como gateway, httpRoute, gatewayClass y referenceGrant. Este problema ocurre incluso cuando el clúster aún tiene instancias de esos CRD almacenadas en formato v1alpha2. Si la versión del clúster de GKE se actualiza sin storedVersions, las llamadas a la API de Gateway fallarán. Las llamadas fallidas también pueden interrumpir los controladores que implementan la API de Gateway.

Es posible que tu clúster esté en riesgo si cumple con todas las siguientes condiciones:

  • La API de Gateway está habilitada en tu clúster.
  • En algún momento del pasado, instalaste una versión v1alpha2 de una CRD de la API de Gateway.
  • Tu clúster se ejecutó en una versión de GKE afectada.

Solución alternativa:

La solución alternativa recomendada es retrasar las actualizaciones del clúster hasta que se resuelva el problema.

Como alternativa, si necesitas actualizar la versión del clúster, debes actualizar la versión de almacenamiento de todas las CRD de la API de Gateway afectadas a v1beta1. En el siguiente ejemplo, se actualiza el CRD de gatewayClass:

  1. Verifica la presencia de la versión de almacenamiento de v1alpha2:
    kubectl get crd gatewayclasses.gateway.networking.k8s.io -ojsonpath="{.status.storedVersions}"
  2. Ejecuta el siguiente comando en todos los recursos de GatewayClass presentes en el clúster para ajustar la versión de almacenamiento a v1beta1:
    kubectl annotate gatewayclass gateway-class-name bump-storage-version="yes"
  3. Quita la versión de almacenamiento v1alpha2 y establece la versión de almacenamiento en v1beta1:
    kubectl patch customresourcedefinitions gatewayclasses.gateway.networking.k8s.io --subresource='status' --type='merge' -p '{"status":{"storedVersions":["v1beta1"]}}'
  4. Realiza la actualización como de costumbre.
1.32
  • 1.32.3-gke.1170000 y versiones posteriores

Los Pods nuevos no se inicializan y se quedan atascados en ContainerCreating

No se pueden crear Pods nuevos y se quedan en el estado ContainerCreating. Cuando ocurre este problema, el contenedor de servicio registra lo siguiente:

Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "[sandbox-ID]": plugin type="cilium-cni" failed (add): unable to create endpoint: Cilium API client timeout exceeded

El problema afecta a los clústeres de GKE en versiones entre la 1.32 y la anterior a la 1.32.3-gke.1170000, que se crearon en las versiones 1.31 o 1.32 de GKE. La causa raíz es que una estructura de datos en la memoria que mantenía una colección de identidades de Cilium asignadas no se sincronizó correctamente con el estado del servidor de la API de Kubernetes.

Para confirmar la versión de GKE que se usó para crear el clúster, puedes consultar el recurso initialClusterVersion con el siguiente comando:

  gcloud container clusters describe [cluster_name] --location [location] --format='value(initialClusterVersion)'
  

Si el clúster de GKE tiene habilitado el registro, el contenedor cilium-agent registra el mensaje unable to resolve identity: timed out waiting for cilium-operator to allocate CiliumIdentity for key en el Explorador de registros con la siguiente consulta:

   resource.type="k8s_container"
   resource.labels.container_name="cilium-agent"
  

Solución alternativa:

Una solución temporal es reiniciar el plano de control. Para ello, actualiza el plano de control a la misma versión que ya está ejecutando:

  gcloud container clusters upgrade [cluster_name] --location [location] --cluster-version=[version] --master
  
1.27, 1.28, 1.29, 1.30 y 1.31

El controlador de NEG deja de administrar los extremos cuando se quita el puerto del servicio

Cuando el controlador de NEG está configurado para crear un NEG independiente para un servicio y, luego, se quita uno de los puertos configurados del servicio, el controlador de NEG dejará de administrar los extremos del NEG. Además de los Services en los que el usuario crea una anotación de NEG independiente, esto también afecta a los Services a los que hacen referencia GKE Gateway, MCI y GKE Multi Cluster Gateway.

Solución alternativa:

Cuando se quita un puerto de un servicio con una anotación de NEG independiente, también se debe actualizar la anotación para quitar el puerto en cuestión.

1.28

Error de configuración de TLS de la puerta de enlace

Identificamos un problema con la configuración de TLS para las puertas de enlace en clústeres que ejecutan la versión 1.28.4-gke.1083000 de GKE. Esto afecta las configuraciones de TLS que usan un SSLCertificate o un CertificateMap. Si actualizas un clúster con Gateways existentes, fallarán las actualizaciones realizadas en el Gateway. En el caso de las puertas de enlace nuevas, no se aprovisionarán los balanceadores de cargas. Este problema se solucionará en una próxima versión de parche de GKE 1.28.

1.27, 1.28 y 1.29
  • 1.26.13-gke.1052000 y versiones posteriores
  • 1.27.10-gke.1055000 y versiones posteriores
  • 1.28.6-gke.1095000 y versiones posteriores
  • 1.29.1-gke.1016000 y versiones posteriores

Fallas intermitentes en el establecimiento de la conexión

Es posible que los clústeres en versiones del plano de control 1.26.6-gke.1900 y posteriores experimenten fallas intermitentes en el establecimiento de la conexión.

Las probabilidades de fallas son bajas y no afectan a todos los clústeres. Los errores deberían detenerse por completo después de unos días desde el inicio del síntoma.

1.27, 1.28 y 1.29
  • 1.27.11-gke.1118000 o versiones posteriores
  • 1.28.7-gke.1100000 o versiones posteriores
  • 1.29.2-gke.1217000 o versiones posteriores

Problemas de resolución de DNS con Container-Optimized OS

Es posible que las cargas de trabajo que se ejecutan en clústeres de GKE con nodos basados en Container-Optimized OS experimenten problemas de resolución de DNS.

1.28 1.28.3-gke.1090000 o superior

La política de red descarta una conexión debido a una búsqueda de seguimiento de conexión incorrecta

En los clústeres con GKE Dataplane V2 habilitado, 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.

Solución alternativa:

Puedes mitigar este problema si configuras port y containerPort en el manifiesto del servicio para que tengan el mismo valor.

1.27 y 1.28
  • 1.28.3-gke.1090000 o superior
  • 1.27.11-gke.1097000 o superior

Pérdida de paquetes para los flujos de conexión en horquilla

En los clústeres con GKE Dataplane V2 habilitado, cuando un Pod crea una conexión TCP a sí mismo 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.

Solución alternativa:

Aplica una de las siguientes soluciones:

  • Habilita la reutilización de TCP (keep-alive) para una aplicación que se ejecuta en un Pod que puede comunicarse consigo misma 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.
Anterior a la versión 1.31.0-gke.1506000 1.31.0-gke.1506000 y versiones posteriores

La red escrita por el dispositivo en la red múltiple de GKE falla con nombres de red largos

La creación del clúster falla con el siguiente error:

error starting very-long-string-that-exceeds-character-limit-gpu-nic0 device plugin endpoint: listen unix /var/lib/kubelet/plugins_registry/networking.gke.io.networks_very-long-string-that-exceeds-character-limit-gpu-nic0.sock: bind: invalid argument

Solución alternativa:

Limita la longitud de los nombres de objetos de red escritos en el dispositivo a 41 caracteres o menos. Se compone la ruta de acceso completa de cada socket de dominio de UNIX, incluido el nombre de red correspondiente. Linux tiene una limitación en la longitud de las rutas de socket (menos de 107 bytes). Después de tener en cuenta el directorio, el prefijo del nombre de archivo y la extensión .sock, el nombre de la red se limita a un máximo de 41 caracteres.

1.27, 1.28, 1.29 y 1.30
  • 1.30.4-gke.1282000 o versiones posteriores
  • 1.29.8-gke.1157000 o versiones posteriores
  • 1.28.13-gke.1078000 o versiones posteriores
  • 1.27.16-gke.1342000 o versiones posteriores

Problemas de conectividad para los Pods hostPort después de la actualización del plano de control

Los clústeres con la política de red habilitada pueden experimentar problemas de conectividad con los Pods de hostPort. Además, los Pods recién creados pueden tardar entre 30 y 60 segundos adicionales en estar listos.

El problema se activa cuando el plano de control de GKE de un clúster se actualiza a una de las siguientes versiones de GKE

  • 1.30 a 1.30.4-gke.1281999
  • 1.29.1-gke.1545000 a 1.29.8-gke.1156999
  • 1.28.7-gke.1042000 a 1.28.13-gke.1077999
  • 1.27.12-gke.1107000 a 1.27.16-gke.1341999

Solución alternativa:

Actualiza o vuelve a crear los nodos inmediatamente después de la actualización del plano de control de GKE.

1.31 y 1.32
  • 1.32.1-gke.1729000 o versiones posteriores
  • 1.31.6-gke.1020000 o versiones posteriores

Tráfico UDP interrumpido entre Pods que se ejecutan en el mismo nodo

Es posible que los clústeres con la visibilidad dentro de los nodos habilitada experimenten tráfico UDP interrumpido entre los Pods que se ejecutan en el mismo nodo.

El problema se activa cuando el nodo del clúster de GKE se actualiza o se crea con una de las siguientes versiones de GKE:

  • 1.32.1-gke.1729000 o versiones posteriores
  • 1.31.6-gke.1020000 o versiones posteriores

La ruta afectada es el tráfico UDP de Pod a Pod en el mismo nodo a través de Hostport o Service.

Solución

Actualiza el clúster a una de las siguientes versiones corregidas:

  • 1.32.3-gke.1927000 o versiones posteriores
  • 1.31.7-gke.1390000 o versiones posteriores
1.28, 1.29, 1.30 y 1.31

Los Pods de Calico no están en buen estado en clústeres con menos de 3 nodos en total y una cantidad insuficiente de CPUs virtuales

Los Pods calico-typha y calico-node no se pueden programar en clústeres que cumplan con todas las siguientes condiciones: menos de 3 nodos en total, cada nodo con 1 o menos CPU virtuales asignables y política de red habilitada. Esto se debe a que no hay suficientes recursos de CPU.

Soluciones alternativas:

  • Ajusta la escala a un mínimo de 3 grupos de nodos con 1 nodo que use 1 CPU virtual asignable.
  • Cambia el tamaño de un solo grupo de nodos a un mínimo de 3 nodos con 1 CPU virtual asignable.
  • Usa un tipo de máquina con al menos 2 CPU virtuales asignables en un grupo de nodos con un solo nodo.

Interrupciones de Multi-Cluster Gateway (MCG) en clústeres zonales durante las actualizaciones del plano de control

Las implementaciones que usan Multi-Cluster Gateway (MCG) en clústeres zonales de GKE pueden experimentar interrupciones con errores "503" durante los eventos que provocan un reinicio del plano de control, como una actualización del clúster. Esto ocurre porque MCG se basa en un mecanismo heredado para el descubrimiento de grupos de extremos de red (NEG) que informa de forma incorrecta que no hay backends cuando los nodos de un clúster zonal dejan de estar disponibles temporalmente durante el reinicio del plano de control. Esto hace que el balanceador de cargas quite todos los backends, lo que provoca la pérdida de tráfico.

Soluciones alternativas:

  • La solución recomendada es migrar de un clúster de GKE zonal a un clúster de GKE regional. Los clústeres regionales tienen un plano de control de alta disponibilidad, lo que elimina el único punto de falla que activa este problema durante las actualizaciones o los reinicios.