Soluciona problemas relacionados con la creación o actualización de clústeres

En esta página, se muestra cómo resolver problemas relacionados con la instalación o la actualización de los clústeres de Google Distributed Cloud.

Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.

Problemas de instalación

Las siguientes secciones pueden ayudarte a solucionar problemas relacionados con la instalación de Google Distributed Cloud.

Mensajes de error transitorios

El proceso de instalación de Google Distributed Cloud es un bucle de conciliación continuo. Como resultado, es posible que veas mensajes de error transitorios en el registro durante la instalación.

Siempre que la instalación se complete con éxito, estos errores pueden ignorarse sin problemas. La siguiente es una lista de mensajes de registro de errores transitorios típicos:

  Internal error occurred: failed calling webhook "webhook.cert-manager.io": Post
  https://cert-manager-webhook.cert-manager.svc:443/mutate?timeout=10s:
  dial tcp IP_ADDRESS:443: connect: connection refused
  Internal error occurred: failed calling webhook "vcluster.kb.io": Post
  https://webhook-service.kube-system.svc:443/validate-baremetal-cluster-gke-io-v1-cluster?timeout=30s:
  dial tcp IP_ADDRESS:443: connect: connection refused
  Failed to register cluster with GKE Hub; gcloud output: error running command
  'gcloud container fleet memberships register CLUSTER_NAME  --verbosity=error --quiet':
  error: exit status 1, stderr: 'ERROR: (gcloud.container.hub.memberships.register)
  Failed to check if the user is a cluster-admin: Unable to connect to the server: EOF
  Get
  https://127.0.0.1:34483/apis/infrastructure.baremetal.cluster.gke.io/v1/namespaces/cluster-
  cluster1/baremetalmachines: dial tcp 127.0.0.1:34483: connect: connection refused"
  Create Kind Cluster "msg"="apply run failed" "error"="unable to recognize \"/tmp/kout088683152\": no matches for kind \"NetworkLogging\" in version \"networking.gke.io/v1alpha1\""
  Create Kind Cluster "msg"="apply run failed" "error"="unable to recognize \"/tmp/kout869681888\": no matches for kind \"Provider\" in version \"clusterctl.cluster.x-k8s.io/v1alpha3\""

Si la clave de tu cuenta de servicio de Google Cloud venció, verás los siguientes mensajes de error de bmctl:

Error validating cluster config: 3 errors occurred:
        * GKEConnect check failed: Get https://gkehub.googleapis.com/v1beta1/projects/project/locations/global/memberships/admin: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
        * ClusterOperations check failed: Post https://cloudresourcemanager.googleapis.com/v1/projects/project:testIamPermissions?alt=json&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}
        * GCR pull permission for bucket: artifacts.anthos-baremetal-release.appspot.com failed: Get https://storage.googleapis.com/storage/v1/b/artifacts.anthos-baremetal-release.appspot.com/iam/testPermissions?alt=json&permissions=storage.objects.get&permissions=storage.objects.list&prettyPrint=false: oauth2: cannot fetch token: 400 Bad Request
Response: {"error":"invalid_grant","error_description":"Invalid JWT Signature."}

Debes generar una nueva clave de cuenta de servicio.

Usa el clúster de arranque para depurar problemas

Cuando Google Distributed Cloud crea clústeres autoadministrados (de administrador, híbridos o independientes), implementa un clúster de Kubernetes en Docker (tipo) con el objetivo de alojar de forma temporal los controladores de Kubernetes necesarios para crear clústeres. Este clúster transitorio se llama clúster de arranque. Los clústeres de administrador o híbridos crean y actualizan los clústeres de usuario sin usar un clúster de arranque.

Si ya existe un clúster de tipo en tu implementación cuando intentas realizar la instalación, Google Distributed Cloud borra el clúster de tipo existente. La eliminación solo ocurre después de que la instalación o actualización se realiza de forma correcta. Para conservar el clúster de tipo existente, incluso después de completar correctamente, usa la marca --keep-bootstrap-cluster de bmctl.

Google Distributed Cloud crea un archivo de configuración para el clúster de arranque en WORKSPACE_DIR/.kindkubeconfig. Solo puedes conectarte al clúster de arranque durante la creación y actualización del clúster.

El clúster de arranque necesita acceder a un repositorio de Docker para extraer imágenes. El registro se establece de forma predeterminada en Container Registry, a menos que uses un registro privado. Durante la creación del clúster, bmctl crea los siguientes archivos:

  • bmctl-workspace/config.json: Contiene las credenciales de la cuenta de servicio de Google Cloud para el acceso al registro. Las credenciales se obtienen del campo gcrKeyPath en el archivo de configuración del clúster.

  • bmctl-workspace/config.toml: Contiene la configuración en containerd en el clúster de tipo.

Examina los registros del clúster de arranque

Para depurar el clúster de arranque, puedes realizar los siguientes pasos:

  • Conectarse al clúster de arranque durante la creación y actualización del clúster
  • Obtén los registros del clúster de arranque.

Puedes encontrar los registros en la máquina que usas para ejecutar bmctl en las siguientes carpetas:

  • bmctl-workspace/CLUSTER_NAME/log/create-cluster-TIMESTAMP/bootstrap-cluster/
  • bmctl-workspace/CLUSTER_NAME/log/upgrade-cluster-TIMESTAMP/bootstrap-cluster/

Reemplaza CLUSTER_NAME y TIMESTAMP por el nombre de tu clúster y la hora del sistema correspondiente.

Para obtener los registros directamente del clúster de arranque, puedes ejecutar el siguiente comando durante la creación y la actualización del clúster:

docker exec -it bmctl-control-plane bash

El comando abre una terminal dentro del contenedor del plano de control de bmctl que se ejecuta en el clúster de arranque.

Para inspeccionar los registros kubelet y containerd, usa los siguientes comandos y busca errores o advertencias en el resultado:

journalctl -u kubelet
journalctl -u containerd

Problemas de actualización del clúster

Cuando actualizas clústeres de Google Distributed Cloud, puedes supervisar el progreso y verificar el estado de tus clústeres y nodos.

La siguiente guía puede ayudarte a determinar si la actualización continúa con normalidad o si hay un problema.

Cómo supervisar el progreso de la actualización

Usa el comando kubectl describe cluster para ver el estado de un clúster durante el proceso de actualización:

kubectl describe cluster CLUSTER_NAME \
    --namespace CLUSTER_NAMESPACE \
    --kubeconfig ADMIN_KUBECONFIG

Reemplaza los siguientes valores:

  • CLUSTER_NAME: Es el nombre del clúster.
  • CLUSTER_NAMESPACE: Es el espacio de nombres de tu clúster.
  • ADMIN_KUBECONFIG: Es el archivo de administrador kubeconfig.
    • De forma predeterminada, los clústeres independientes, híbridos y de administrador usan una actualización local. Si usas la marca --use-bootstrap=true con el comando bmctl upgrade, la operación de actualización usa un clúster de arranque. Para supervisar el progreso de la actualización cuando se usa un clúster de arranque, especifica la ruta de acceso al archivo kubeconfig del clúster de arranque, .kindkubeconfig. Este archivo se encuentra en el directorio del lugar de trabajo.

Observa la sección Status del resultado, en la que se muestra una agregación del estado de actualización del clúster. Si el clúster informa un error, usa las siguientes secciones para solucionar dónde se encuentra el problema.

Verifica si los nodos están listos

Usa el comando kubectl get nodes para ver el estado de los nodos de un clúster durante el proceso de actualización:

kubectl get nodes --kubeconfig KUBECONFIG

Para verificar si un nodo completó correctamente el proceso de actualización, consulta las columnas VERSION y AGE en la respuesta del comando. VERSION es la versión de Kubernetes para el clúster. Para ver la versión de Kubernetes de una versión determinada de Google Distributed Cloud, consulta el Historial de versiones.

Si el nodo muestra NOT READY, intenta conectarlo y verificar el estado de kubelet:

systemctl status kubelet

También puedes revisar los registros de kubelet:

journalctl -u kubelet

Revisa el resultado del estado y los registros de kubelet en los mensajes que indican por qué el nodo tiene un problema.

Verifica qué nodo se está actualizando

Para verificar qué nodo del clúster está en proceso de actualización, usa el comando kubectl get baremetalmachines:

kubectl get baremetalmachines --namespace CLUSTER_NAMESPACE \
    --kubeconfig ADMIN_KUBECONFIG

Reemplaza los siguientes valores:

  • CLUSTER_NAMESPACE: Es el espacio de nombres de tu clúster.
  • ADMIN_KUBECONFIG: Es el archivo de administrador kubeconfig.
    • Si un clúster de arranque se usa para una actualización de administrador, híbrida o independiente, especifica el archivo kubeconfig del clúster de arranque (bmctl-workspace/.kindkubeconfig).

En el siguiente resultado de ejemplo, se muestra que el nodo que se actualiza tiene un ABM VERSION diferente al DESIRED ABM VERSION:

NAME         CLUSTER    READY   INSTANCEID               MACHINE      ABM VERSION   DESIRED ABM VERSION
10.200.0.2   cluster1   true    baremetal://10.200.0.2   10.200.0.2   1.13.0        1.14.0
10.200.0.3   cluster1   true    baremetal://10.200.0.3   10.200.0.3   1.13.0        1.13.0

Verifica qué nodos están en proceso de desvío

Durante el proceso de actualización, los nodos se desvían de los Pods y la programación se inhabilita hasta que el nodo se actualice de forma correcta. Para ver qué nodos se están vaciando, usa el comando kubectl get nodes:

kubectl get nodes --kubeconfig USER_CLUSTER_KUBECONFIG | grep "SchedulingDisabled"

Reemplaza USER_CLUSTER_KUBECONFIG por la ruta de acceso al archivo kubeconfig del clúster de usuario.

La columna STATUS se filtra con grep para mostrar solo los nodos que informan SchedulingDisabled. Este estado indica que se están vaciando los nodos.

También puedes verificar el estado del nodo desde el clúster de administrador:

kubectl get baremetalmachines -n CLUSTER_NAMESPACE \
  --kubeconfig ADMIN_KUBECONFIG

Reemplaza los siguientes valores:

  • CLUSTER_NAMESPACE: Es el espacio de nombres de tu clúster.
  • ADMIN_KUBECONFIG: Es el archivo de administrador kubeconfig.
    • Si un clúster de arranque se usa para una actualización de administrador, híbrida o independiente, especifica el archivo kubeconfig del clúster de arranque (bmctl-workspace/.kindkubeconfig).

El nodo que se vaciará muestra el estado en la columna MAINTENANCE.

Verifica por qué un nodo ha estado vaciado durante mucho tiempo

Utiliza uno de los métodos de la sección anterior para identificar el nodo que se está agotando con el comando kubectl get nodes. Usa el comando kubectl get pods y filtra en el nombre de este nodo para ver detalles adicionales:

kubectl get pods --all-namespaces -o wide --field-selector spec.nodeName=NODE_NAME

Reemplaza NODE_NAME por el nombre del nodo que se vaciará. El resultado muestra una lista de Pods que están atascados o que tardan en agotarse. La actualización continúa, incluso con Pods atascados, cuando el proceso de desvío en un nodo tarda más de 20 minutos.

A partir de la versión 1.29, el proceso de vaciado de nodos usa la API de expulsión, que respeta a PodDisruptionBudgets (PDB).

La siguiente configuración de PDB puede causar problemas de vaciado de nodos:

  • Pods administrados por varios PDB

  • Configuraciones estáticas de PDB como la siguiente:

    • maxUnavailable == 0
    • minUnavailable >= total de réplicas

    El recuento total de réplicas es difícil de determinar desde el recurso de PDB, ya que se define en un recurso de nivel superior, como Deployment, ReplicaSet o StatefulSet. Los PDB coinciden con los Pods según el selector solo en su configuración. Un buen enfoque para diagnosticar si una configuración de PDB estática está causando un problema consiste en observar si pdb.Status.ExpectPods <= pdb.Status.DesiredHealthy primero y ver si una de las configuraciones estáticas mencionadas lo permite.

Los incumplimientos en el entorno de ejecución, como el valor de DisruptionsAllowed calculado para un recurso de PDB que es 0, también pueden bloquear el vaciado de nodos. Si tienes objetos PodDisruptionBudget configurados que no pueden permitir interrupciones adicionales, es posible que las actualizaciones de nodos no se actualicen a la versión del plano de control después de varios intentos. Para evitar este error, te recomendamos que escales verticalmente Deployment o HorizontalPodAutoscaler para permitir que el nodo se desvíe sin dejar de respetar la configuración de PodDisruptionBudget.

Para ver todos los objetos PodDisruptionBudget que no permiten ninguna interrupción, usa el siguiente comando:

kubectl get poddisruptionbudget --all-namespaces \
    -o jsonpath='{range .items[?(@.status.disruptionsAllowed==0)]}{.metadata.name}/{.metadata.namespace}{"\n"}{end}'

Comprueba por qué los Pods están en mal estado

Las actualizaciones pueden fallar si un Pod contiene direcciones IP del plano de control upgrade-first-node o upgrade-node. Por lo general, este comportamiento se debe a que los Pods estáticos no están en buen estado.

  1. Verifica los Pods estáticos con el comando crictl ps -a y busca Pods de Kubernetes o etcd con fallas. Si tienes Pods con errores, revisa los registros de los Pods para ver por qué fallan.

    Estas son algunas de las posibilidades del comportamiento de un bucle de fallas:

    • Los permisos o el propietario de los archivos activados en Pods estáticos no son correctos.
    • La conectividad con la dirección IP virtual no funciona.
    • Problemas con etcd.
  2. Si el comando crictl ps no funciona o no muestra nada, verifica el estado de kubelet y containerd. Usa los comandos systemctl status SERVICE y journalctl -u SERVICE para ver los registros.

¿Qué sigue?