Diagnostica problemas de clústeres

En este documento se muestra cómo usar gkectl diagnose para diagnosticar problemas en tus clústeres.

Descripción general

La herramienta de gkectl tiene dos comandos para solucionar problemas con clústeres: gkectl diagnose cluster y gkectl diagnose snapshot. Los comandos funcionan con clústeres de administrador y de usuario.

gkectl diagnose cluster

Realiza verificaciones de estado en el clúster e informa errores. Ejecuta verificaciones de estado en los siguientes componentes:

  • VCenter
    • Credencial
    • DRS
    • Grupos antiafinidad
    • Red
    • Versión
    • Centro de datos
    • Datastore
    • ResourcePool
    • Carpeta
    • Red
  • Balanceador de cargas (F5, Seesaw, Manual)
  • Clúster de usuario y grupos de nodos
  • Objetos de clúster
  • Preparación del servidor de Konnectivity del clúster de usuario
  • Objetos de máquina y los nodos de clústeres correspondientes
  • Pods en los espacios de nombres de kube-system y gke-system
  • Plano de control
  • Volúmenes persistentes de vSphere en el clúster
  • Indicadores de CPU virtual del clúster de usuario y administrador y contención de memoria
  • Alarmas preconfiguradas de uso de CPU del host y de uso de memoria de ESXi del clúster de usuario y administrador
  • Hora del día (TOD)
  • Política de red de nodos para un clúster con Dataplane V2 habilitado
  • Estado general del agente de nodo de Dataplane V2

gkectl diagnose snapshot

Este comando comprime el estado, la configuración y los registros de un clúster en un archivo comprimido. Si ejecutas gkectl diagnose snapshot, ese comando ejecuta gkectl diagnose cluster de forma automática como parte del proceso, y los archivos de salida se colocan en una carpeta nueva en la instantánea llamada /diagnose-report.

La configuración predeterminada del comando gkectl diagnose snapshot también captura la siguiente información sobre el clúster:

  • Versión de Kubernetes

  • Estado de los recursos de Kubernetes en los espacios de nombres de kube-system y gke-system: clúster, máquina, nodos, Services, Endpoints, ConfigMaps, ReplicaSets, CronJobs, Pods y los propietarios de esos Pods, incluidos Deployments, DaemonSets y StatefulSets

  • Estado del plano de control

  • Los detalles sobre la configuración de cada nodo, incluidas las direcciones IP, las reglas de iptables, los puntos de activación, el sistema de archivos, las conexiones de red y los procesos en ejecución

  • Registros de contenedores del nodo del plano de control del clúster de administrador, cuando el servidor de la API de Kubernetes no está disponible

  • Información de vSphere, incluidos los objetos de VM y sus eventos basados en el grupo de recursos También objetos de centro de datos, clúster, red y Datastore asociados con las VM

  • Información del balanceador de cargas BIG-IP de F5, que incluye el servidor virtual, la dirección virtual, el grupo, los nodos y la supervisión

  • Registros del comando gkectl diagnose snapshot

  • Registros de trabajos de solicitud preliminar

  • Registros de contenedores en espacios de nombres según las situaciones

  • Información sobre el vencimiento del certificado de Kubernetes del clúster de administrador en el archivo de instantánea /nodes/<admin_master_node_name>/sudo_kubeadm_certs_check-expiration

  • Un archivo de índice HTML para todos los archivos en la instantánea

  • De manera opcional, el archivo de configuración del clúster de administrador que se usa para instalar y actualizar el clúster con la marca --config.

Las credenciales, incluidas las credenciales de vSphere y F5, se quitan antes de crear el archivo comprimido.

Obtener ayuda

Para obtener ayuda sobre los comandos disponibles, haz lo siguiente:

gkectl diagnose --help

Diagnostica un clúster de administrador

Para diagnosticar un clúster de administrador, haz lo siguiente:

gkectl diagnose cluster --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

Reemplaza ADMIN_CLUSTER_KUBECONFIG por la ruta de acceso del archivo kubeconfig del clúster de administrador.

Resultado del examen:

Preparing for the diagnose tool...
Diagnosing the cluster......DONE

- Validation Category: Admin Cluster Connectivity
Checking VMs TOD (availability)...SUCCESS
Checking Konnectivity Server (readiness)...SUCCESS

- Validation Category: Admin Cluster F5 BIG-IP
Checking f5 (credentials, partition)...SUCCESS

- Validation Category: Admin Cluster VCenter
Checking Credentials...SUCCESS
Checking DRS enabled...SUCCESS
Checking Hosts for AntiAffinityGroups...SUCCESS
Checking Version...SUCCESS
Checking Datacenter...SUCCESS
Checking Datastore...SUCCESS
Checking Resource pool...SUCCESS
Checking Folder...SUCCESS
Checking Network...SUCCESS

- Validation Category: Admin Cluster
Checking cluster object...SUCCESS
Checking machine deployment...SUCCESS
Checking machineset...SUCCESS
Checking machine objects...SUCCESS
Checking kube-system pods...SUCCESS
Checking anthos-identity-service pods...SUCCESS
Checking storage...SUCCESS
Checking resource...SUCCESS
Checking virtual machine resource contention...SUCCESS
Checking host resource contention...SUCCESS
All validation results were SUCCESS.
Cluster is healthy!

Si hay un problema con una dirección IP virtual (VIP) en el clúster de destino, usa la marca --config para proporcionar el archivo de configuración del clúster de administrador. Eso te brinda más información de depuración.

gkectl diagnose cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config CLUSTER_CONFIG

Reemplaza CLUSTER_CONFIG por la ruta de acceso del archivo de configuración del clúster de usuario o de administrador.

Resultado de ejemplo:

Failed to access the api server via LB VIP "...": ...
Try to use the admin master IP instead of problematic VIP...
Reading config with version "[CONFIG_VERSION]"
Finding the admin master VM...
Fetching the VMs in the resource pool "[RESOURCE_POOL_NAME]"...
Found the "[ADMIN_MASTER_VM_NAME]" is the admin master VM.
Diagnosing admin|user cluster "[TARGET_CLUSTER_NAME]"...
...

Diagnostica un clúster de usuario

Para obtener el nombre de un clúster de usuario, haz lo siguiente:

kubectl get cluster --kubeconfig=USER_CLUSTER_KUBECONFIG

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

Para diagnosticar un clúster de usuario, sigue estos pasos:

gkectl diagnose cluster --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME

Reemplaza USER_CLUSTER_NAME por el nombre del clúster de usuario.

Resultado de ejemplo:

Preparing for the diagnose tool...
Diagnosing the cluster......DONE

Diagnose result is saved successfully in 

- Validation Category: User Cluster Connectivity
Checking Node Network Policy...SUCCESS
Checking VMs TOD (availability)...SUCCESS
Checking Dataplane-V2...Success

- Validation Category: User Cluster F5 BIG-IP
Checking f5 (credentials, partition)...SUCCESS

- Validation Category: User Cluster VCenter
Checking Credentials...SUCCESS
Checking DRS enabled...SUCCESS
Checking Hosts for AntiAffinityGroups...SUCCESS
Checking VSphere CSI Driver...SUCCESS
Checking Version...SUCCESS
Checking Datacenter...SUCCESS
Checking Datastore...SUCCESS
Checking Resource pool...SUCCESS
Checking Folder...SUCCESS
Checking Network...SUCCESS

- Validation Category: User Cluster
Checking user cluster and node pools...SUCCESS
Checking cluster object...SUCCESS
Checking machine deployment...SUCCESS
Checking machineset...SUCCESS
Checking machine objects...SUCCESS
Checking control plane pods...SUCCESS
Checking kube-system pods...SUCCESS
Checking gke-system pods...SUCCESS
Checking gke-connect pods...SUCCESS
Checeking anthos-identity-service pods...SUCCESS
Checking storage...SUCCESS
Checking resource...SUCCESS
Checking virtual machine resource contention...SUCCESS
Checking host resource contention...SUCCESS
All validation results were SUCCESS.
Cluster is healthy!

Soluciona problemas de clústeres diagnosticados

Si tienes los siguientes problemas cuando ejecutas gkectl diagnose cluster, estas son algunas soluciones posibles.

.
ProblemaCausas posiblesSolución
No se puede acceder al servidor de la API de Kubernetes, ya sea para el clúster de administrador o los clústeres de usuario. Revisa los grafos de latencia de memoria OOB (listo para usar) del estado de la máquina virtual, que idealmente deben tener una latencia de memoria cercana a cero. La contención de memoria también puede aumentar la contención de la CPU, y los gráficos de preparación de la CPU pueden tener un aumento repentino, ya que habrá un intercambio involucrado. Aumenta la memoria física. A fin de ver otras opciones, consulta las sugerencias para solucionar problemas de VMware.
Se agota el tiempo de espera de la creación del grupo de nodos. Latencia alta de lectura y escritura de VMDK. Verifica el estado de VM de OOB para la latencia de lectura y escritura del disco virtual. Según VMware, una latencia total superior a 20 ms indica un problema. Consulta soluciones de VMware para problemas de rendimiento del disco.

Captura el estado del clúster

Si gkectl diagnose cluster encuentra errores, debes capturar el estado del clúster y proporcionar la información a Google. Puedes hacerlo mediante el comando gkectl diagnose snapshot.

gkectl diagnose snapshot tiene una marca opcional, --config. Además de recopilar información sobre el clúster, esta marca recopila el archivo de configuración de GKE en VMware que se usó para crear o actualizar el clúster.

Captura el estado del clúster de administrador

Para capturar el estado de un clúster de administrador, ejecuta el siguiente comando, en el que --config es opcional:

gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] --config

El resultado incluye una lista de archivos y el nombre de un archivo comprimido:

Taking snapshot of admin cluster "[ADMIN_CLUSTER_NAME]"...
   Using default snapshot configuration...
   Setting up "[ADMIN_CLUSTER_NAME]" ssh key file...DONE
   Taking snapshots...
       commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       ...
       nodes/[ADMIN_CLUSTER_NODE]/commands/journalctl_-u_kubelet
       nodes/[ADMIN_CLUSTER_NODE]/files/var/log/startup.log
       ...
   Snapshot succeeded. Output saved in [TARBALL_FILE_NAME].tar.gz.
Para extraer el archivo comprimido en un directorio, ejecuta el siguiente comando:
tar -zxf TARBALL_FILE_NAME --directory EXTRACTION_DIRECTORY_NAME

Para ver la lista de archivos que produjo la instantánea, ejecuta los siguientes comandos:

cd EXTRACTION_DIRECTORY_NAME/EXTRACTED_SNAPSHOT_DIRECTORY
ls kubectlCommands
ls nodes/NODE_NAME/commands
ls nodes/NODE_NAME/files

Para ver los detalles de una operación en particular, abre uno de los archivos.

Especifica la clave SSH para el clúster de administrador

Cuando obtienes una instantánea del clúster de administrador, gkectl busca la clave SSH privada para este clúster de forma automática. También puedes especificar la clave de forma explícita mediante el parámetro --admin-ssh-key-path.

Sigue las instrucciones para usar SSH a fin de conectarte a un nodo del clúster y descargar las claves SSH.

Luego, en el comando gkectl diagnose snapshot, configura --admin-ssh-key-path como la ruta de acceso del archivo de claves decodificado:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --admin-ssh-key-path=PATH_TO_DECODED_KEY

Captura el estado del clúster de usuario

Para capturar el estado de un clúster de usuario, ejecuta el siguiente comando:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME

El resultado incluye una lista de archivos y el nombre de un archivo comprimido:

Taking snapshot of user cluster "[USER_CLUSTER_NAME]"...
Using default snapshot configuration...
Setting up "[USER_CLUSTER_NAME]" ssh key file...DONE
    commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    ...
    commands/kubectl_get_pods_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    commands/kubectl_get_deployments_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    ...
    nodes/[USER_CLUSTER_NODE]/commands/journalctl_-u_kubelet
    nodes/[USER_CLUSTER_NODE]/files/var/log/startup.log
    ...
Snapshot succeeded. Output saved in [FILENAME].tar.gz.

Situaciones de instantáneas

El comando gkectl diagnose snapshot admite dos situaciones para el clúster de usuario. Para especificar una situación, usa la marca --scenario. En la siguiente lista, se muestran los valores posibles:

  • Sistema(predeterminado): Recopila instantáneas con registros en los espacios de nombres del sistema compatibles.

  • Todos: Recopila instantáneas con registros en todos los espacios de nombres, incluidos los que define el usuario

En los siguientes ejemplos, se muestran algunas de las posibilidades.

Para crear una instantánea del clúster de administrador, no es necesario que especifiques una situación:

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

Para crear una instantánea de un clúster de usuario mediante la situación system, ejecuta lo siguiente:

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=system

Para crear una instantánea de un clúster de usuario mediante la situación all, ejecuta lo siguiente:

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=all

Usa --log-since para limitar una instantánea

Puedes usar la marca --log-since para limitar la recopilación de registros a un período reciente. Por ejemplo, puedes recopilar solo los registros de los últimos dos días o de las últimas tres horas. De forma predeterminada, diagnose snapshot recopila todos los registros.

Para limitar el período de recopilación de registros, sigue estos pasos:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=CLUSTER_NAME \
    --scenario=system \
    --log-since=DURATION

Reemplaza DURATION por un valor de tiempo como 120m48h.

Notas:

  • La marca --log-since solo es compatible con los registros kubectl y journalctl.
  • No se permiten marcas de comando como --log-since en la configuración de instantánea personalizada.

Realiza una ejecución de prueba de una instantánea

Puedes usar la marca --dry-run para mostrar las acciones que se realizarán y la configuración de la instantánea.

Para realizar una ejecución de prueba en el clúster de administrador, ingresa el siguiente comando:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=ADMIN_CLUSTER_NAME \
    --dry-run

Para realizar una ejecución de prueba en un clúster de usuario, ingresa el siguiente comando:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --dry-run

Usa una configuración de una instantánea

Si estas dos situaciones (--scenario system o all) no satisfacen tus necesidades, puedes pasar un archivo de configuración de instantánea con la marca --snapshot-config para crear una instantánea personalizada:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --snapshot-config=SNAPSHOT_CONFIG_FILE

Genera una configuración de una instantánea

Puedes generar una configuración de una instantánea para una situación determinada si pasas las marcas --scenario y --dry-run. Por ejemplo, a fin de ver la configuración de la instantánea para la situación predeterminada (system) de un clúster de usuario, ingresa el siguiente comando:

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=system
    --dry-run

El resultado es similar al siguiente:

numOfParallelThreads: 10
excludeWords:
- password
kubectlCommands:
- commands:
  - kubectl get clusters -o wide
  - kubectl get machines -o wide
  - kubectl get clusters -o yaml
  - kubectl get machines -o yaml
  - kubectl describe clusters
  - kubectl describe machines
  namespaces:
  - default
- commands:
  - kubectl version
  - kubectl cluster-info
  - kubectl get nodes -o wide
  - kubectl get nodes -o yaml
  - kubectl describe nodes
  namespaces: []
- commands:
  - kubectl get pods -o wide
  - kubectl get deployments -o wide
  - kubectl get daemonsets -o wide
  - kubectl get statefulsets -o wide
  - kubectl get replicasets -o wide
  - kubectl get services -o wide
  - kubectl get jobs -o wide
  - kubectl get cronjobs -o wide
  - kubectl get endpoints -o wide
  - kubectl get configmaps -o wide
  - kubectl get pods -o yaml
  - kubectl get deployments -o yaml
  - kubectl get daemonsets -o yaml
  - kubectl get statefulsets -o yaml
  - kubectl get replicasets -o yaml
  - kubectl get services -o yaml
  - kubectl get jobs -o yaml
  - kubectl get cronjobs -o yaml
  - kubectl get endpoints -o yaml
  - kubectl get configmaps -o yaml
  - kubectl describe pods
  - kubectl describe deployments
  - kubectl describe daemonsets
  - kubectl describe statefulsets
  - kubectl describe replicasets
  - kubectl describe services
  - kubectl describe jobs
  - kubectl describe cronjobs
  - kubectl describe endpoints
  - kubectl describe configmaps
  namespaces:
  - kube-system
  - gke-system
  - gke-connect.*
prometheusRequests: []
nodeCommands:
- nodes: []
  commands:
  - uptime
  - df --all --inodes
  - ip addr
  - sudo iptables-save --counters
  - mount
  - ip route list table all
  - top -bn1
  - sudo docker ps -a
  - ps -edF
  - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup
  - sudo conntrack --count
nodeFiles:
- nodes: []
  files:
  - /proc/sys/fs/file-nr
  - /proc/sys/net/nf_conntrack_max
seesawCommands: []
seesawFiles: []
nodeCollectors:
- nodes: []
f5:
  enabled: true
vCenter:
  enabled: true
  • numOfParallelThreads: Cantidad de subprocesos paralelos que se usan para tomar instantáneas.

  • excludeWords: Lista de palabras que se excluirán de la instantánea (no distingue entre mayúsculas y minúsculas). Las líneas que contienen estas palabras se quitan de los resultados de la instantánea. “Password” siempre se excluye, ya sea que lo especifiques o no.

  • kubectlCommands: Lista de comandos de kubectl que se ejecutarán. Los resultados se guardan. Los comandos se ejecutan en los espacios de nombres correspondientes. En los comandos kubectl logs, todos los Pods y los contenedores de los espacios de nombres correspondientes se agregan de forma automática. Las expresiones regulares son compatibles con la especificación de espacios de nombres. Si no especificas un espacio de nombres, se supone que usas el espacio de nombres default.

  • nodeCommands: Lista de comandos que se ejecutarán en los nodos correspondientes. Los resultados se guardan. Cuando no se especifica ningún nodo, se consideran todos los nodos del clúster de destino.

  • nodeFiles: Lista de archivos que se recopilarán de los nodos correspondientes. Se guardan los archivos. Cuando no se especifica ningún nodo, se consideran todos los nodos del clúster de destino.

  • seesawCommands: lista de comandos que se deben ejecutar para recopilar información del balanceador de cargas de Seesaw Los resultados se guardan si el clúster usa el balanceador de cargas de Seesaw.

  • seesawFiles: lista de archivos que se recopilarán para el balanceador de cargas de Seesaw.

  • nodeCollectors: un colector que se ejecuta para que los nodos de Cilium recopilen información de eBPF.

  • f5: una marca para habilitar la recopilación de información relacionada con el balanceador de cargas BIG-IP de F5.

  • vCenter: una marca para habilitar la recopilación de información relacionada con vCenter

  • prometheusRequests: Lista de solicitudes de Prometheus. Los resultados se guardan.

Sube instantáneas a un bucket de Cloud Storage

Para facilitar el mantenimiento de registros, el análisis y el almacenamiento, puedes subir todas las instantáneas de un clúster específico a un bucket de Cloud Storage. Esto es muy útil si necesitas asistencia del equipo de Atención al cliente de Cloud.

Antes de ejecutar ese comando, asegúrate de haber cumplido estos requisitos de configuración.

  • Habilita storage.googleapis.com en el proyecto host de flota. Aunque puedes usar un proyecto diferente, se recomienda el proyecto host de la flota.

    gcloud services enable --project=FLEET_HOST_PROJECT_ID storage.googleapis.com
    
  • Otorga el roles/storage.admin a la cuenta de servicio en su proyecto superior y pasa el archivo de claves JSON de la cuenta de servicio con el parámetro --service-account-key-file. Puedes usar cualquier cuenta de servicio, pero se recomienda la cuenta de servicio de registro de conexión. Consulta Cuentas de servicio para obtener más información.

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
      --member "serviceAccount:CONNECT_REGISTER_SERVICE_ACCOUNT" \
      --role "roles/storage.admin"
    

    Reemplaza CONNECT_REGISTER_SERVICE_ACCOUNT por la cuenta de servicio del registro de Connect.

Una vez que se cumplan estos requisitos, puedes subir la instantánea con este comando:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name CLUSTER_NAME \
    --upload \
    --share-with GOOGLE_SUPPORT_SERVICE_ACCOUNT

La marca --share-with puede aceptar una lista de nombres de cuentas de servicio. Reemplaza GOOGLE_SUPPORT_SERVICE_ACCOUNT por la cuenta de servicio de Atención al cliente de Google proporcionada por el equipo de Atención al cliente de Google, junto con cualquier otra cuenta de servicio proporcionada por este equipo. Cuando usas la marca --upload, el comando busca en tu proyecto un bucket de almacenamiento que tenga un nombre que comience con “anthos-snapshot-”. Si ese bucket se cierra, el comando sube la instantánea a ese bucket. Si el comando no encuentra un bucket con un nombre coincidente, crea un bucket nuevo con el nombre anthos-snapshot-UUID, en el que UUID es un identificador único universal de 32 dígitos.

Cuando usas la marca --share-with, no necesitas compartir acceso al bucket de forma manual con la asistencia de Google Cloud.

Resultado de ejemplo:

Using "system" snapshot configuration...
Taking snapshot of user cluster CLUSTER_NAME...
Setting up CLUSTER_NAME ssh key...DONE
Using the gke-connect register service account key...
Setting up Google Cloud Storage bucket for uploading the snapshot...DONE
Taking snapshots in 10 thread(s)...
   ...
Snapshot succeeded.
Snapshots saved in "SNAPSHOT_FILE_PATH".
Uploading snapshot to Google Cloud Storage......  DONE
Uploaded the snapshot successfully to gs://anthos-snapshot-a4b17874-7979-4b6a-a76d-e49446290282/xSNAPSHOT_FILE_NAME.
Shared successfully with service accounts:
GOOGLE_SUPPORT_SERVICE_ACCOUNT

Problemas conocidos

BundleUnexpectedDiff error

El recurso de la API de clúster de Kubernetes administrado por un paquete de GKE en VMware puede modificarse de forma accidental, lo que puede causar fallas en los componentes del sistema o la actualización o la actualización del clúster.

A partir de la versión 1.13 de GKE on VMware, onprem-user-cluster-controller verificará de forma periódica el estado de los objetos y también informará cualquier diferencia inesperada del estado deseado a través de registros y eventos. Estos objetos incluyen el plano de control del clúster de usuario y los complementos, como los objetos Service y DaemonSets.

Aquí tienes un ejemplo de un evento:

 Type     Reason                 Age    From                              Message
 ----     ------                 ----   ----                              -------
 Warning  BundleUnexpectedDiff   13m    onpremusercluster/ci-bundle-diff  Detected unexpected difference of user control plane objects: [ConfigMap/istio], please check onprem-user-cluster-controller logs for more details.

Este es un ejemplo de registros que genera onprem-user-cluster-controller:

2022-08-06T02:54:42.701352295Z W0806 02:54:42.701252       1 update.go:206] Detected unexpected difference of user addon object(ConfigMap/istio), Diff:   map[string]string{
2022-08-06T02:54:42.701376406Z -    "mesh": (
2022-08-06T02:54:42.701381190Z -        """
2022-08-06T02:54:42.701385438Z -        defaultConfig:
2022-08-06T02:54:42.701389350Z -          discoveryAddress: istiod.gke-system.svc:15012
...
2022-08-06T02:54:42.701449954Z -        """
2022-08-06T02:54:42.701453099Z -    ),
2022-08-06T02:54:42.701456286Z -    "meshNetworks": "networks: {}",
2022-08-06T02:54:42.701459304Z +    "test-key":     "test-data",
2022-08-06T02:54:42.701462434Z   }

Los eventos y registros no bloquearán la operación del clúster. Los objetos que tengan diferencias inesperadas con respecto al estado deseado se reemplazarán en la próxima actualización del clúster.