Problemas conocidos de Google Distributed Cloud aislado 1.12.x

Categoría Versiones identificadas Problema y solución
Copia de seguridad y restablecimiento 1.12.1

La copia de seguridad del volumen no resuelve los extremos de almacenamiento de objetos a nivel de la organización

El clúster de almacenamiento para la copia de seguridad del volumen usa el servidor DNS externo en lugar del reenviador, lo que impide que la copia de seguridad del volumen resuelva los extremos de almacenamiento de objetos a nivel de la organización. En la versión 1.12, el tráfico de respaldo requiere rutas nuevas para cada organización.

Solución alternativa:

Los IO deben actualizar el clúster de almacenamiento para habilitar la resolución de DNS a nivel de la organización y crear una ruta desde las interfaces lógicas (LIF) de replicación hasta los extremos de almacenamiento de objetos en cada organización. Copia y pega los siguientes comandos del programa de arranque.

  1. Establece la variable de entorno KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Busca el clúster de almacenamiento:
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. Busca el CIDR externo de la instancia:
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. Actualiza el clúster de almacenamiento para que use un reenvío y con una ruta al CIDR externo de la instancia:
    kubectl patch storagecluster "${storage_cluster}" -n gpc-system --type='json' -p='[{"op": "replace", "path": "/spec/additionalNetworks/0/destinationSubnets", "value": '"${instance_external_cidr}"'}, {"op": "replace", "path": "/spec/dnsConfig/serviceRef/name", "value": "gpc-coredns-forwarder-udp"}]'
  5. Reinicia el controlador para asegurarte de que se implemente el cambio:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Copia de seguridad y restablecimiento 1.12.1

Falla en la ruta de copia de seguridad a las organizaciones

Síntomas:

Falla la ejecución de curl en la puerta de enlace de entrada del administrador de la organización desde los nodos de ONTAP porque no hay una ruta desde la subred de copia de seguridad a los planos de control de la organización.

Solución alternativa:

Los IO deben actualizar el clúster de almacenamiento para habilitar la resolución de DNS a nivel de la organización y crear una ruta desde las interfaces lógicas (LIF) de replicación hasta los extremos de almacenamiento de objetos en cada organización. Copia y pega los siguientes comandos del programa de arranque.

  1. Establece la variable de entorno KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Busca el clúster de almacenamiento:
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. Busca el CIDR externo de la instancia:
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. Actualiza el clúster de almacenamiento para que use un reenvío y con una ruta al CIDR externo de la instancia:
    kubectl patch storagecluster "${storage_cluster}" -n gpc-system --type='json' -p='[{"op": "replace", "path": "/spec/additionalNetworks/0/destinationSubnets", "value": '"${instance_external_cidr}"'}, {"op": "replace", "path": "/spec/dnsConfig/serviceRef/name", "value": "gpc-coredns-forwarder-udp"}]'
  5. Reinicia el controlador para asegurarte de que se implemente el cambio:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Copia de seguridad y restablecimiento 1.12.4

No se pueden borrar los volúmenes persistentes de los que se crearon copias de seguridad

Síntomas:

No se puede borrar un volumen persistente si está en una relación de SnapMirror.

Solución alternativa:

Un IO borra las relaciones de SnapMirror con el volumen como destino.

  1. Establece la variable de entorno KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Almacena el nombre del PV problemático en una variable:
    PV_NAME={ PV_NAME }
  3. Obtén el nombre interno del volumen:
    volume_name=$(kubectl get pv ${PV_NAME?} -o jsonpath='{.spec.csi.volumeAttributes.internalName}')
  4. Para acceder a ONTAP, sigue los pasos del manual FILE-A0006.
  5. Borra las relaciones con este volumen como fuente, usando la contraseña recopilada anteriormente:
    ssh ${username?}@${mgmt_ip?} snapmirror delete -source-volume ${volume_name?} -destination-path "*"
    # enter the password collected from the breakglass secret
Copia de seguridad y restablecimiento 1.12.0
1.12.1
1.12.2

El repositorio de copias de seguridad está en buen estado

Si el repositorio de copias de seguridad no tiene ningún tipo de estado de error, pero se genera una alerta para él, es posible que la métrica de alerta del repositorio se haya generado por error. Este es un problema conocido en la versión 1.12.0 y se corrigió en la versión 1.12.4. La causa de este problema es que el repositorio de copias de seguridad intenta conectarse periódicamente al almacenamiento de objetos como una verificación de estado y entra en un estado no saludable si no logra conectarse. Sin embargo, si el repositorio de copias de seguridad se recupera, la métrica para indicar su estado no volverá a cambiar correctamente, lo que provocará que la alerta permanezca atascada en un estado de activación indefinida. Para resolver este problema, puedes borrar y volver a crear manualmente el repositorio de copias de seguridad para restablecer su métrica de estado. Sigue los pasos del manual de ejecución BACK-R0003 para volver a crear el repositorio de copias de seguridad.

Facturación 1.12.4

Falla del subcomponente bil-storage-system-cluster - Reconciliation error: E0121

Síntomas:

Mensaje de error: bil-storage-system-cluster - Reconciliation error: E0121- rollback chart: no Job with the name "billing-storage-system-init-job-628" found

El subcomponente bil-storage-system-cluster no se puede conciliar debido a trabajos obsoletos. billing-storage-system-init-job-628 y billing-storage-system-init-job-629 permanecen después de una finalización exitosa.

Solución alternativa:

Completa los siguientes pasos:

  1. Realiza copias de seguridad de los trabajos de facturación inactivos:
    cd /root/USERNAME
    kubectl --kubeconfig /root/release/gdchservices/gdchservices-system-kubeconfig get jobs billing-storage-system-init-job-628 -n billing-system -o yaml > billing-storage-system-init-job-628.yaml
    kubectl --kubeconfig /root/release/gdchservices/gdchservices-system-kubeconfig get jobs billing-storage-system-init-job-629 -n billing-system -o yaml > billing-storage-system-init-job-629.yaml
  2. Pausa el subcomponente:
    export SUBCOMPONENT_NAME=bil-storage-system-cluster
    export SUBCOMPONENT_NAMESPACE=gdchservices-system-cluster
    
    kubectl annotate subcomponent "${SUBCOMPONENT_NAME:?}" -n "${SUBCOMPONENT_NAMESPACE:?}" lcm.private.gdc.goog/paused=true
  3. Borra los trabajos inactivos.
  4. Reinicia oclcm-backend-controller.
  5. Reanuda el subcomponente.
Almacenamiento en bloque 1.12.4

Los Pods de Grafana están atascados en el estado Init debido a errores de activación de volúmenes.

Síntomas:

Los Pods de Grafana en los espacios de nombres anthos-identity-service-obs-system y platform-obs-obs-system están atascados en el estado Init debido a errores de montaje de volumen. El mensaje de error en los registros de kubelet indica un problema de conexión múltiple. El problema se debe a un error en Trident, en el que no se puede identificar y verificar correctamente el dispositivo subyacente para las asignaciones de LUKS, lo que genera un error de conexión múltiple.

Solución alternativa:

Verifica si el PVC tiene un deletionTimestamp. Si no hay ningún deletionTimestamp (migración de Pod), sigue estos pasos:

  1. Verifica el VolumeAttachment del PVC para identificar dónde está conectado actualmente el volumen.
  2. Aísla el Nodes en el clúster que no coincide con este valor.
  3. Borra el Pod que falla. Esto debería hacer que migre de nuevo al Node original.

Después de verificar, si hay un deletionTimestamp (borrado de volumen), sigue estos pasos:

  1. Verifica el VolumeAttachment del PVC para identificar dónde está conectado actualmente el volumen.
  2. En Node, genera el contenido de su archivo de seguimiento:
    cat /var/lib/trident/tracking/PVC_NAME.json
  3. Valida que el dispositivo LUKS que se encuentra en el campo devicePath del resultado del archivo de seguimiento esté realmente cerrado. Esta ruta no debería existir en este punto:
    stat DEVICE_PATH
  4. Valida si el número de serie está asignado actualmente a algún dispositivo de rutas múltiples.
    1. Copia el valor del campo iscsiLunSerial del archivo de seguimiento.
    2. Convierte este valor en el valor hexadecimal esperado:
      echo 'iISCSILUNSERIAL>' | xxd -l 12 -ps
    3. Con este valor nuevo, busca si la entrada de rutas múltiples aún existe:
      multipath -ll | grep SERIAL_HEX
    4. Si no existe, borra el archivo de seguimiento.
    5. Si existe, verás un valor hexadecimal serial un poco más largo que el que buscaste, que se llamará multipathSerial. Ejecuta lo siguiente y busca los dispositivos de bloqueo:
      multipath -ll MULTIPATH_SERIAL
    6. Luego, ejecuta los siguientes comandos, y el último solo para cada dispositivo de almacenamiento en bloques:
                systemctl restart iscsid
                systemctl restart multipathd
                multipath -f MULTIPATH_SERIAL
                echo 1 > /sys/block/BLOCK_DEVICE_NAME/device/delete
                  
Administración de clústeres 1.12.0
1.12.1
1.12.2
1.12.4

El trabajo machine-init falla durante el aprovisionamiento del clúster

Síntomas:

  1. Durante el aprovisionamiento del clúster, el trabajo machine-init del segundo nodo del plano de control falla con el siguiente mensaje:
    FAILED! => {"changed": true, "cmd": "/usr/bin/kubeadm join phase control-plane-prepare certs --config /dev/stdin --v 5".
  2. Consulta los registros:
    kubectl --kubeconfig=ADMIN_KUBECONFIG logs -p kube-apiserver-{first_node_name} -n kube-system | grep "etcdmain: open /etc/kubernetes/pki/etcd/ca.crt: permission denied"

    El resultado muestra un resultado no vacío.

Solución alternativa:

  1. Activa o desactiva el permiso de /etc/kubernetes/pki/etcd/ca.crt. Esta es una operación muy sensible al tiempo. El cambio de permiso debe ocurrir después de la ejecución anterior del trabajo de machine-init, pero antes de la siguiente ejecución del trabajo de machine-init, ya que machine-init sobrescribe el permiso y lo restablece como raíz.
  2. Reinicia etcd en el segundo nodo para recuperar etcd en el primer nodo del bucle de fallas.

    Después de completar estos dos pasos, el kube-apiserver del primer nodo comienza a ejecutarse y el siguiente trabajo de machine-init se completa correctamente.

Administración de clústeres 1.12.2

El PodCIDR IPv4 requerido no está disponible

Síntomas:

El agente de Cilium muestra la siguiente advertencia:

level=warning msg="Waiting for k8s node information" error="required IPv4 PodCIDR not available" subsys=k8s 

Solución alternativa:

  1. Averigua la dirección IP del nodo que deseas quitar.
  2. Quita la dirección IP de spec.nodes en el recurso personalizado NodePool.
  3. Espera a que el nodo se quite por completo de NodePool. Si el nodo no se quita, realiza un force-remove:
    1. Agrega la anotación baremetal.cluster.gke.io/force-remove=true al recurso personalizado Machine:
      kubectl -n org-1-system-cluster annotate machine IP_ADDRESS baremetal.cluster.gke.io/force-remove=true 
  4. Vuelve a agregar la dirección IP a spec.nodes en el recurso personalizado NodePool.
Logging 1.12.0
1.12.1

Los registros del servidor de la API de Kubernetes no se reenvían a un destino de SIEM

Síntomas:

Después de que termines de configurar la exportación a un sistema SIEM externo, la entrada del SIEM no se incluirá en la canalización de procesamiento de Fluent Bit y los registros del servidor de la API de Kubernetes no estarán presentes en este SIEM.

Redes 1.12.4

El trabajo machine-init falla durante la actualización

Síntomas:

Cuando se actualiza de la versión 1.12.2 a la 1.12.4, si se quita un nodo y, luego, se vuelve a agregar, es posible que falle el proceso de machine-init para ese nodo. Esta falla se produce porque la política ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes rechaza el tráfico de red del nodo que se volvió a agregar a los servicios esenciales del plano de control. Este error se destaca en los mensajes de estado de este ejemplo de resultado:
      Feb 17 18:52:52.330: 30.0.0.9:41046 (world) <> 30.0.0.7:2379 (host) policy-verdict:none INGRESS DENIED (TCP Flags: SYN)
      Feb 17 18:52:52.330: 30.0.0.9:41046 (world) <> 30.0.0.7:2379 (host) Policy denied DROPPED (TCP Flags: SYN)

Solución alternativa:

Para mitigar este problema, sigue estos pasos:

  1. Para el clúster de administrador raíz:
    1. Obtén los CIDR de CIDRClaim/org-external-cidr -n root (específicamente el campo .status.ipv4AllocationStatus.allocatedCidrBlocks). Ejecuta el siguiente comando en el clúster de administrador raíz:
      ROOTCIDRs=$(ka get cidrclaim/org-external-cidr -n root -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. Agrega estos CIDR a ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, específicamente al campo .spec.ingress.fromCIDR. Aplica este cambio en el clúster de administrador raíz con el siguiente comando:
      ka get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ROOTCIDRs}"'}]' \
        | ka apply -f -
  2. Para el clúster de administrador de la organización:
    1. Obtén los CIDR de la organización (p.ej., org-1) de CIDRClaim/org-external-cidr -n org-1 (específicamente, el campo .status.ipv4AllocationStatus.allocatedCidrBlocks). Este comando se ejecuta en el clúster de administrador raíz para obtener los CIDR de "org-1":
      ORGCIDRs=$(ka get cidrclaim/org-external-cidr -n org-1 -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. Agrega estos CIDR a ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, específicamente al campo .spec.ingress.fromCIDR. Aplica este cambio en el clúster de administrador de la organización correspondiente con el siguiente comando:
      ko get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ORGCIDRs}"'}]' \
        | ko apply -f -

Este cambio solo debe realizarse una vez antes de iniciar la actualización.

Redes 1.12.0
1.12.1

Problemas con las actualizaciones, la finalización y la programación de VM y contenedores

Síntomas:

En un nodo de Bare Metal del clúster del sistema, no se pueden detener dos contenedores anetd. Después de detener el proceso de forma forzada y reiniciar kubelet y containerd, se vuelve a crear el pod anetd, pero todos los contenedores se atascan en podInit y containerd informa el siguiente mensaje de error:

`failed to create containerd task: failed to create shim task: context deadline exceeded: unknown`.

Esto impide que se inicie la interfaz de red de contenedor (CNI) y que se programen otros pods.

Solución alternativa:

Realiza estas mitigaciones para evitar este estado del nodo:

  • No programes más de 10 PVC a la vez en un solo nodo. Espera a que se monten antes de programar más. Esto se notaba más cuando se intentaba crear VMs.
  • Actualiza el archivo /etc/lvm/lvm.conf en cada nodo para incluir la línea: filter = [ "r|/dev/dm.|", "r|/dev/sg.|" ] en el bloque devices{}.

Si el nodo entra en un estado en el que muestra tiempos de espera para las vinculaciones y los montajes de volúmenes, o no puede borrar un volumen, verifica la cantidad de procesos vgs pendientes en el nodo para identificar si se encuentra en este estado particularmente malo. La forma más confiable de corregir un nodo en este estado es reiniciarlo.

Existe otro modo de falla que se puede experimentar. Ese modo de falla tiene la siguiente firma en el intento de montaje: mount(2) system call failed: No space left on device. Es probable que se deba a la propagación del montaje en el nodo. Para verificarlo, ejecuta cat /proc/mounts | grep devtmpfs | awk '{ print $2 }' | sort -n | uniq -c. Si alguno de estos muestra un valor superior a uno, borra el Pod que lo usa, lo que debería activar el desmontaje. Si eso no funciona, desmonta manualmente esa ruta de acceso. Si sigues teniendo problemas, reinicia el dispositivo.

Redes 1.12.2

GDC no puede crear LCA de conmutación a partir de políticas de tráfico durante el proceso de inicio inicial

En ciertas situaciones, debido a condiciones de carrera, Google Distributed Cloud (GDC) aislado por aire no puede crear los recursos personalizados de Kubernetes de ACL de conmutador necesarios durante el proceso de arranque inicial de Distributed Cloud.

Síntomas:

Enumera los CR de LCA de conmutador:

kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

El resultado de este comando indica que no se crearon ACL de conmutador de administración (mgmt-switch-acl).

No resources found in gpc-system namespace.

Solución alternativa:

  1. Enumera los CR de la política de tráfico:
    kubectl get trafficpolicies -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

    El resultado devuelve dos CR de Kubernetes de la política de tráfico:

    NAME                          AGE     NAME
    default-traffic-policy-data   4d17h   default-traffic-policy-data
    default-traffic-policy-mgmt   4d17h   default-traffic-policy-mgmt
  2. Edita el CR de Kubernetes de la política de tráfico default-traffic-policy-mgmt:
    kubectl edit trafficpolicies default-traffic-policy-mgmt -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  3. Ve a la última regla de política de este archivo, que podría estar al final del archivo.
  4. Identifica el campo de descripción de la última regla de política. El campo podría verse de la siguiente manera:
    Deny All rule for Management Network
  5. Edita esta descripción y agrega The al comienzo de la línea de descripción:
    The Deny All rule for Management Network
  6. Guarda el archivo y cierra.
  7. Vuelve a generar una lista de los CR de LCA de conmutador de Kubernetes:
    kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  8. El resultado muestra la LCA del conmutador de administración (mgmt-switch-acl):
    NAME              AGE   NAME
    mgmt-switch-acl   23h   mgmt-switch-acl
Servidores físicos 1.12.1
1.12.2

NodePool tiene un servidor en estado desconocido durante la creación

Síntomas:

Cuando se aprovisiona Server durante la creación de cualquier clúster, existe la posibilidad de que el servidor se marque como aprovisionado, pero le falte la condición Provision-Ready. Como resultado, NodePool no puede consumir este servidor. Un ejemplo de mensaje de evento de error en NodePool podría verse así:

Events:
  Type     Reason          Age    From    Message
  ----     ------          ----   ----    -------
  Warning  ReconcileError  xxx    Server  policy failure PolicyPreflightCompleted(UnreachableError): {PolicyPreflightCompleted False 3 2023-11-07 22:10:56 +0000 UTC UnreachableError reachability err: Failed to connect to the host via ssh: ssh: connect to host xx.xx.xx.xx port 22: Connection timed out}
      

Solución alternativa:

Restablece ILO ejecutando la siguiente secuencia de comandos:

      SERVER_NAME=
      ROOT_ADMIN_KUBECONFIG=
      ILO_IP=$(kubectl get servers ${SERVER_NAME} -n gpc-system --template={{.spec.bmc.ip}} --kubeconfig=${ROOT_ADMIN_KUBECONFIG})
      SECRET_NAME=$(kubectl get secrets -o go-template='{{range $index,$pod := .items}}{{.metadata.name}}{{"\n"}}{{end}}' -n gpc-system --kubeconfig=${ROOT_ADMIN_KUBECONFIG} | grep bmc | grep ${SERVER_NAME})
      ILO_USER=$(kubectl get secrets ${SECRET_NAME} -n gpc-system --template={{.data.username}} --kubeconfig=${ROOT_ADMIN_KUBECONFIG} | base64 -d)
      ILO_PASS=$(kubectl get secrets ${SECRET_NAME} -n gpc-system --template={{.data.password}} --kubeconfig=${ROOT_ADMIN_KUBECONFIG} | base64 -d)
      # Perform iLO Reset
      
      curl -k -u ${ILO_USER}:${ILO_PASS}  -H "Content-Type: application/json" -H "OData-Version: 4.0" https://${ILO_IP}/redfish/v1/Managers/1/Actions/Manager.Reset --data '{"ResetType":"ForceRestart"}' -X POST | jq
      
      # Perform server power cycle, start with power off target server
       
       curl -k -u ${ILO_USER}:${ILO_PASS} -H "Content-Type: application/json" -H "OData-Version: 4.0" -X POST https://${ILO_IP}/redfish/v1/Systems/1/Actions/ComputerSystem.Reset --data '{"ResetType":"ForceOff"}' | jq .
      
      # Verify target server powered off successfully
      
      curl -kqs -u ${ILO_USER}:${ILO_PASS} https://${ILO_IP}/redfish/v1/Systems/1 | jq '.PowerState'
       
      # Power server back
      
      curl -k -u ${ILO_USER}:${ILO_PASS} -H "Content-Type: application/jsonls " -H "OData-Version: 4.0" -X POST https://${ILO_IP}/redfish/v1/Systems/1/Actions/ComputerSystem.Reset --data '{"ResetType":"On"}' | jq .
       
      

En casos excepcionales, es posible que el procedimiento anterior de restablecimiento de iLO no resuelva el problema por completo, por lo que se requiere un nuevo aprovisionamiento del servidor. Consulta los manuales de procedimientos OS-P0002 y OS-P0003 para conocer los procedimientos detallados.

Servidores físicos 1.12.2

Falla la actualización del firmware del nodo en la organización del arrendatario

Síntomas:

La actualización del nodo de metal desnudo está atascada en un estado in-progress durante más de tres horas.

Solución alternativa:

Sigue los pasos del manual de ejecución SERV-R0005.

Redes 1.12.1

La secuencia de comandos previa a la instalación falla en varios interruptores

Síntomas:

El POAP sigue fallando y su registro muestra un mensaje como el siguiente:

2024 Feb 27 20:20:25 switch %$ VDC-1 %$ %USER-1-SYSTEM_MSG: S/N[FDO26391GHS]-MAC[98:A2:C0:F8:60:6A] - Running: 'nxos.10.3.1.bin' - /script.sh
2024 Feb 27 20:20:25 switch %$ VDC-1 %$ %USER-1-SYSTEM_MSG: S/N[FDO26391GHS]-MAC[98:A2:C0:F8:60:6A] - Target: 'nxos64-cs.10.3.4a.M.bin' - /script.sh

No puedes encontrar nxos.10.3.1.bin, pero sí algo similar, como nxos64-cs.10.3.1.F.bin, en el directorio bootflash del conmutador.

Solución alternativa:

En la máquina de arranque, completa los siguientes pasos. Debes completar estos pasos mientras se lleva a cabo el proceso de instalación previa. Si hay varias carpetas /tmp/preinstall-bootstrap-, aplica los cambios a la carpeta actual que usa el proceso de instalación previa. Para ello, consulta los registros del proceso de instalación previa. Si necesitas reiniciar el comando de preinstalación, esta acción también crea una nueva carpeta /tmp/preinstall-bootstrap-.

  1. Ve a la carpeta /tmp/preinstall-bootstrap-RANDOM_NUMBER .
  2. Dentro de la carpeta, busca el archivo poap.py.
  3. Quita por completo la línea con la suma de verificación md5 en este archivo para que head -n 4 poap.py se vea de la siguiente manera:
    #!/bin/env python3
    import glob
    import os
    import pkgutil
  4. En el mismo archivo, agrega las siguientes líneas a version_to_image_file:
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",

    La sección del archivo actualizado se ve de la siguiente manera:

    version_to_image_file = {
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",
        "nxos.10.3.3.bin": "nxos64-cs.10.3.3.F.bin",
        "nxos.10.3.4a.bin": "nxos64-cs.10.3.4a.M.bin",
    }
  5. Ejecuta md5sum poap.py para obtener la suma de md5 y agrégala a poap.py para que head -n 4 poap.py se vea de la siguiente manera:
    #!/bin/env python3
    #md5sum="396bed5a5f579b80da5fac6edf0b590c"
    import glob
    import os
Redes 1.12.1

La actualización de la versión 1.11.x a la 1.12.1 falla porque el controlador de pnet no genera correctamente el recurso personalizado (CR) hairpinlink.

Solución alternativa:

  1. Después de la actualización, en el clúster de administrador raíz, edita el archivo clusterroles/pnet-core-backend-controllers-role.
  2. Busca hairpinlinks y agrega permisos de create,update,delete al recurso.
  3. Verifica que se generen los CR de hairpinlinks y hairpinbgpsessions.
Servidor NTP 1.12.1

El pod del servidor de retransmisión de NTP falla después de reiniciarse

Síntomas:

  • Es posible que veas el siguiente mensaje cuando ejecutes el comando kubectl get pods:
    ntp-system                      ntp-relay-server-75bbf                                            1/2     CrashLoopBackOff    123 (5m12s ago)   24h
  • Es posible que veas una advertencia del sondeo de funcionamiento en los registros:
    Warning  BackOff    5m55s (x82 over 28m)      kubelet  Back-off restarting failed container ntp-image in pod ntp-relay-server-75bbf_ntp-system(28e4e28f-4f99-4c6e-8c26-d271f0c7995c)
    Warning  Unhealthy  <invalid> (x37 over 35m)  kubelet  Liveness probe failed: Leap status is Not synchronised

Este problema puede hacer que los servidores tengan una hora no sincronizada.

Solución alternativa:

  1. Abre el daemonset de ntp para editarlo:
    kubectl edit daemonset/ntp-relay-server -n ntp-system
  2. Quita la sección livenessProbe: hasta la línea timeoutSeconds: 30.
  3. Agrega la siguiente sección en el contenedor ntp-image:
    securityContext:
      capabilities:
        add:
        - SYS_TIME
  4. Esto genera una configuración similar a la siguiente:

    containers:
      - name: ntp-image
      image: "DOCKER_REGISTRY/DOCKER_REPOSITORY/ntp-relay-server:DOCKER_TAG"
      imagePullPolicy: Always
      securityContext:
        capabilities:
          add:
          - SYS_TIME
  5. Abre la política de NTP del SO para editarla:
    kubectl edit ospolicy/bm-ntp-policy -n gpc-system
  6. Quita todas las direcciones IP del NTP en la sección de políticas. Después, la política se verá así:
    policy:
      installPlaybook:
        extraVars:
          ntp_servers: {}
        name: server-ntp-config
        secrets: {}
          
Servidor NTP 1.12.1

El Pod ntp-relay-job-xxxx falla después de reiniciarse

Síntomas:

Es posible que veas el siguiente mensaje cuando ejecutes el comando kubectl get pods:

NAMESPACE                       NAME                                                              READY   STATUS              RESTARTS         AGE
ntp-system                      ntp-relay-job-1707869137-kd7p4                                    0/1     CrashLoopBackOff    3 (15s ago)      59s

Este problema se debe a la limpieza incorrecta del trabajo de actualización. No se requiere ninguna acción, y el trabajo puede permanecer en el estado de bucle de bloqueo.

Servidor NTP 1.12.2

El SO del nodo tiene una hora no sincronizada

Síntomas:

Es posible que veas el siguiente mensaje en los registros del clúster del sistema:

INFO: task umount:200725 blocked for more than 120 seconds.

Esto es un problema para los servidores que no mantienen la hora sincronizada. La configuración no se aplica correctamente y debe cambiarse a un espacio de nombres diferente para que se aplique correctamente.

Solución alternativa:

Aplica los siguientes pasos a todos los clústeres:

  1. Enumera las políticas de SO existentes:
    kubectl get ospolicies -n ntp-system

    El resultado muestra admin-ntp-policy o worker-ntp-policy.

  2. Según el nombre de la política, guárdala en un archivo .yaml:
    kubectl get ospolicy/admin-ntp-policy -n ntp-system -o yaml > ntp-ospolicy.yaml
    kubectl get ospolicy/worker-ntp-policy -n ntp-system -o yaml > ntp-ospolicy.yaml
  3. Edita el archivo cambiando metadata.namespace de ntp-system a gpc-system y quitando status: line y todo lo que le sigue.
  4. Aplica el archivo editado al clúster:
    kubectl apply -f ntp-ospolicy.yaml
  5. Espera unos minutos para que el controlador aplique la política del SO.
  6. Establece una conexión SSH a uno de los nodos a los que se aplica OSPolicy y ejecuta cat /etc/chrony.conf. El resultado muestra un mensaje al comienzo del archivo que indica que Ansible lo administra y que se quitaron los servidores nist.time.gov o ntp.pool de la configuración.
Copia de seguridad y restablecimiento de VMs 1.12.0

La configuración del webhook de la VM impide que los usuarios inicien procedimientos de copia de seguridad y restablecimiento de la VM

Síntomas:

Los usuarios no pueden iniciar el proceso de copia de seguridad y restablecimiento de la VM debido a una configuración incorrecta del control de acceso basado en roles (RBAC) y del esquema en el administrador de la VM.
Los nombres de los planes de copias de seguridad de VM no pueden contener más de 63 caracteres. Por ejemplo, es posible que veas el siguiente mensaje de error:

Internal error occurred: failed calling webhook
"vvirtualmachinebackupplantemplates.virtualmachine.gdc.goog":
failed to call webhook: Post "https://vmm-vm-controller-webhooks.vm-system.svc:443/validate-virtualmachine-gdc-goog-v1-virtualmachinebackupplantemplate?timeout=10s":
context deadline exceeded

Solución alternativa:

Los nombres de los planes de copias de seguridad de VM son una concatenación del nombre VirtualMachineBackupPlanTemplate, el tipo de recurso (que puede ser vm o vm-disk) y el nombre de ese recurso. Esta cadena concatenada debe tener menos de 63 caracteres.
Para lograr esto, mantén los nombres de estos recursos cortos cuando los crees. Para obtener detalles sobre la creación de estos recursos, consulta Crea y, luego, inicia una instancia de VM y Crea un plan de copias de seguridad para las VMs.

Servicio de base de datos 1.12.0

Las cargas de trabajo del servicio de base de datos operan dentro del clúster del sistema

Síntomas:

Las cargas de trabajo del servicio de bases de datos se aprovisionan y configuran en proyectos separados en el clúster del sistema de Distributed Cloud. Si bien los proyectos se usan para aplicar límites administrativos en Distributed Cloud, no tienen ningún impacto en cómo y dónde se ejecuta una carga de trabajo. Por lo tanto, estas cargas de trabajo podrían compartir la infraestructura de procesamiento subyacente con otras instancias de bases de datos y varios sistemas del plano de control.

Solución alternativa:

Para las cargas de trabajo de bases de datos que requieren aislamiento adicional, los usuarios pueden solicitar la creación de un grupo de nodos en el clúster del sistema. Este grupo de nodos, al que se debe hacer referencia durante la creación del proyecto, garantiza que las cargas de trabajo de la base de datos se aprovisionen y ejecuten en una infraestructura de procesamiento dedicada. El operador de infraestructura debe completar la configuración del grupo de nodos aislado.

Servicio de base de datos 1.12.2

El DBCluster de AlloyDB Omni está atascado en el estado de conciliación

Síntomas:

En la versión 15.2.1 de AlloyDB Omni, cuando se crean varios clústeres de AlloyDB Omni en el mismo nodo, el último clúster creado se queda en estado de conciliación. Obtén registros de PostgreSQL con el comando

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- cat /obs/diagnostic/postgresql.log 
Deberías ver que la base de datos no se puede iniciar con seguimientos de pila similares a los siguientes:

2024-08-19 21:20:15.594 UTC: [9400/walwriter] LOG:  [auxprocess.c:129]  BaseInit started for AuxProcType: walwriter
2024-08-19 21:20:15.595 UTC: [9400/walwriter] LOG:  [auxprocess.c:131]  BaseInit finished for AuxProcType: walwriter
*** SIGABRT received at time=1724102415 on cpu 25 ***
PC: @     0x7f03140a9d3c  (unknown)  (unknown)
2024-08-19 21:20:15.601 UTC: [9399/client backend] alloydbadmin@localhost(33906) [unknown] postgres 66c3b70f.24b7 57P03:FATAL:  [postmaster.c:2601]  the database system is not yet accepting connections
2024-08-19 21:20:15.601 UTC: [9399/client backend] alloydbadmin@localhost(33906) [unknown] postgres 66c3b70f.24b7 57P03:DETAIL:  Consistent recovery state has not been yet reached.
    @     0x5557f3b17e31        208  absl::AbslFailureSignalHandler()
    @     0x7f031405afd0    4677136  (unknown)
    @     0x7f0314e75b20  (unknown)  (unknown)
[PID: 9400] : *** SIGABRT received at time=1724102415 on cpu 25 ***
[PID: 9400] : PC: @     0x7f03140a9d3c  (unknown)  (unknown)
[PID: 9400] :     @     0x5557f3b17f75        208  absl::AbslFailureSignalHandler()
[PID: 9400] :     @     0x7f031405afd0    4677136  (unknown)
[PID: 9400] :     @     0x7f0314e75b20  (unknown)  (unknown)

Solución alternativa:

1. Conéctate a la shell del pod de la base de datos

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- bash 
2. Crea manualmente un archivo de configuración en /mnt/disks/pgsql/data/postgresql.conf.d/
echo "enable_lux_wal_writer = off" > /mnt/disks/pgsql/data/postgresql.conf.d/55user.conf
3. Reinicia la base de datos para cargar el archivo de configuración
supervisorctl restart postgres
4. La base de datos se inicia correctamente con un resultado similar al siguiente:
Chose default config file: /etc/supervisor/supervisord.conf
postgres: ERROR (not running)
postgres: started

Firewall 1.12.0

Firewall bootstrap secret.yaml contiene TO-BE-FILLED

Síntomas:

Durante la implementación del cliente, el nombre de usuario del administrador del archivo secret.yaml debe ser admin. En cambio, el archivo contiene TO-BE-FILLED después de la primera creación. El nombre de usuario admin se debe usar para inicializar la primera configuración en el firewall y en la IP de bucle invertido admin\admin.

Solución alternativa:

Verifica que TO-BE-FILLED no esté presente en las siguientes credenciales de firewall:

  • CELL_ID/CELL_ID-secret.yaml
  • CELL_ID-ab-rack/CELL_ID-secret.yaml
  • CELL_ID-ac-rack/CELL_ID-secret.yaml
  • Verifica que todas las cuentas de administrador de firewall tengan el nombre de usuario admin.

    Firewall 1.12.2

    bm-system-machine-init falla en el primer nodo

    Síntomas:

    Las políticas de firewall de IDPS predeterminadas no admiten las IPs personalizadas de la organización para la interconexión de Direct Connect (DX). Como resultado, falla la creación de la organización con IPs personalizadas porque estas no se pueden conectar a Harbor en el administrador raíz.

    Solución alternativa:

    Para desbloquear el tráfico, crea manualmente un objeto SecurityPolicyRule para las IPs personalizadas de la organización y, luego, implementa los firewalls del IDPS. Sigue los pasos del manual de operaciones FW-G0002 para completar los siguientes pasos:

    1. Crea un SecurityPolicyRule de entrada en el sistema virtual de firewall raíz para permitir que las IPs personalizadas de la organización accedan a Harbor raíz.

        apiVersion: firewall.private.gdc.goog/v1alpha2
        kind: SecurityPolicyRule
        metadata:
          labels:
            firewall.private.gdc.goog/policy-type: idps
          name: root-default-ingress-ORG_NAME-custom
          namespace: root
        spec:
          action: allow
          destination:
            addresses:
            - root-external-group
            zones:
            - vsys1-gpc
          firewallVirtualSystemRef:
            name: vsys1-root
          priority: 150
          profile:
            group: gdch-threat-profile-group
            type: group
          service:
            option: selected
            ports:
            - ports: "123"
              protocol: UDP
            - ports: "1122"
              protocol: TCP
            - ports: "5140"
              protocol: TCP
            - ports: "10443"
              protocol: TCP
          source:
            addresses:
            - org.customIPConfig.externalCIDRs # example: 30.0.0.0/22
            zones:
            - vsys1-cp
        

    2. Crea un objeto SecurityPolicyRule de entrada en el vsys del firewall de la organización para permitir que la raíz acceda al APIServer de la organización.

        apiVersion: firewall.private.gdc.goog/v1alpha2
        kind: SecurityPolicyRule
        metadata:
          labels:
            firewall.private.gdc.goog/policy-type: idps
          name: ORG_NAME-custom-default-ingress-root
          namespace: ORG_NAME # example: gpu-org-1
        spec:
          action: allow
          destination:
            addresses:
            - org.customIPConfig.externalCIDRs # example: 30.0.0.0/22
            zones:
            - ORG_VSYS_ID-gpc # example: vsys3-gpc
          firewallVirtualSystemRef:
             name: ORG_VSYS_ID-ORG_NAME # example: vsys3-gpu-org-1
          priority: 110
          profile:
            group: gdch-threat-profile-group
            type: group
          service:
            option: selected
            ports:
            - ports: "22"
              protocol: TCP
            - ports: "5140"
              protocol: TCP
            - ports: "6443"
              protocol: TCP
            - ports: "10443"
              protocol: TCP
          source:
            addresses:
            - root-external-group
            zones:
            - ORG_VSYS_ID-cp # example: vsys3-cp
        

    3. Activa el reemplazo de la configuración del firewall para implementar SecurityPolicyRules.

    Módulo de seguridad de hardware 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Las licencias de prueba desactivadas por el HSM aún se pueden detectar

    Síntomas:

    Debido a un problema conocido existente en CipherTrust Manager, las licencias de prueba desactivadas aún se pueden detectar y podrían activar advertencias de vencimiento falsas.

    Solución alternativa:

    Consulta HSM-R0003 para verificar las licencias normales activas y borrar las licencias de prueba desactivadas.

    Módulo de seguridad de hardware 1.12.0

    El módulo de seguridad de hardware funciona de forma inesperada cuando se borra un KMS

    Síntomas:

    El módulo de seguridad de hardware (HSM) no funciona como se espera cuando se borra un CTMKey de KMS. Por ejemplo, es posible que el servicio de KMS no se inicie para la organización.

    Solución alternativa:

    Los usuarios pueden destruir criptográficamente los datos borrando las claves de KMS en lugar de la clave raíz de KMS, lo que se manifiesta como un CTMKey.

    Módulo de seguridad de hardware 1.12.0
    1.12.1
    1.12.2

    El secreto rotativo para los módulos de seguridad de hardware se encuentra en un estado desconocido

    Síntomas:

    Obtén una lista de los secretos desconocidos que se pueden rotar:

    kubectl get rotatablesecret -A | grep -i unknown

    El resultado podría verse de la siguiente manera:

    gpc-system     yz-aa-hsm01-kmip-certificate                HSM-0016                                Unknown
    gpc-system     yz-aa-hsm01-nae-certificate                 HSM-0016       3d19h      <invalid>    Unknown
    gpc-system     yz-aa-hsm01-web-certificate                 HSM-0016       2d         <invalid>   Unknown

    Requisitos:

    1. Acceso al clúster de administrador raíz
    2. La herramienta jq
    3. Sigue IAM-R0004 para generar el archivo KUBECONFIG del clúster de administrador raíz.
    4. Sigue IAM-R0005 para obtener clusterrole/hsm-admin en el clúster de administrador raíz.

    Solución alternativa:

    1. Obtén una lista de las direcciones IP de la red de datos del HSM:
      kubectl --kubeconfig ${KUBECONFIG:?} get hsm -A -o json | jq -r '.items[] | "\(.spec.dataNetwork.ip)"'

      El resultado podría verse de la siguiente manera:

      10.89.3.2
      10.89.3.3
      10.89.3.4
    2. Para cada una de las direcciones IP de la red de datos del HSM del paso anterior, haz lo siguiente:
      1. Exporta la dirección IP a una variable llamada HSM_DATA_IP:
        export HSM_DATA_IP=HSM_DATA_IP_ADDRESS
      2. Recupera los certificados del servidor web (puerto 443), nae (puerto 9000) y kmip (puerto 5696) y examina la validez del certificado:
        openssl s_client -showcerts -connect $HSM_DATA_IP:443 2>/dev/null | openssl x509 -text
        openssl s_client -showcerts -connect $HSM_DATA_IP:9000 2>/dev/null | openssl x509 -text
        openssl s_client -showcerts -connect $HSM_DATA_IP:5696 2>/dev/null | openssl x509 -text

        El resultado podría verse de la siguiente manera:

        Validity
                    Not Before: Mar 12 20:36:58 2024 GMT
                    Not After : Jun 16 20:36:58 2026 GMT
    3. Sigue los pasos del manual de ejecución HSM T0016 para renovar los certificados del servidor si la fecha de Not After es dentro de los 30 días a partir de hoy.
    Supervisión 1.12.0

    Es posible que los certificados de Node Exporter no estén listos cuando se cree una organización

    Síntomas:

    Los certificados no se preparan cuando se crea una organización:

    $ kubectl --kubeconfig /root/release/user/org-1-system-user-kubeconfig get certificate -n mon-system
    NAME                                  READY   SECRET                                     AGE
    mon-node-exporter-backend-consumers   False   mon-node-exporter-backend-consumers-cert   20h
    mon-node-exporter-backend-providers   False   mon-node-exporter-backend-providers-cert   20h

    Los secretos aún existen debido a `SecretForwarder`:

    $ kubectl --kubeconfig /root/release/user/org-1-system-user-kubeconfig get secret -n mon-system | grep -E "node-exporter.+cert"
    mon-node-exporter-backend-consumers-cert                                            kubernetes.io/tls                          3      20h
    mon-node-exporter-backend-providers-cert                                            kubernetes.io/tls                          3      20h

    Solución alternativa:

    Pausa Lifecycle Manager para que no vuelva a crear ni borrar certificados:

    kubectl --kubeconfig /root/release/org-admin/org-1-admin-kubeconfig annotate subcomponent mon-node-exporter -n org-1-system-cluster lcm.private.gdc.goog/paused="true"
    kubectl --kubeconfig /root/release/org-admin/org-1-admin-kubeconfig annotate subcomponent mon-node-exporter -n user-vm-1-cluster lcm.private.gdc.goog/paused="true"
    kubectl --kubeconfig /root/release/org-admin/org-1-admin-kubeconfig annotate subcomponent mon-node-exporter -n user-vm-2-cluster lcm.private.gdc.goog/paused="true"
    kubectl --kubeconfig /root/release/user/org-1-system-user-kubeconfig delete certificate -n mon-system mon-node-exporter-backend-consumers mon-node-exporter-backend-providers

    Ten en cuenta que node-exporter no se conciliará en los clústeres de usuarios.

    Supervisión 1.12.0
    1.12.1
    1.12.2

    La configuración del webhook de ServiceNow hace que LCM vuelva a conciliar y revierta los cambios realizados en los objetos ConfigMap y Secret en el espacio de nombres mon-system.

    Síntomas:

    Configurar el webhook de ServiceNow hace que Lifecycle Management (LCM) vuelva a conciliar y revierta los cambios realizados en el objeto ConfigMap mon-alertmanager-servicenow-webhook-backend y el objeto Secret mon-alertmanager-servicenow-webhook-backend en el espacio de nombres mon-system.

    Solución alternativa:

    Pausa el subcomponente LCM para que los cambios se realicen sin revertirse:

    1. Obtén las rutas de acceso a los archivos kubeconfig de los clústeres de administrador raíz y de administrador de la organización. Guarda las rutas de acceso en las variables de entorno ROOT_ADMIN_KUBECONFIG y ORG_ADMIN_KUBECONFIG, respectivamente.
    2. Pausa el subcomponente de LCM en uno de los siguientes clústeres:
      • Pausa el subcomponente de LCM en el clúster de administrador raíz:
        kubectl --kubeconfig $ROOT_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n root lcm.private.gdc.goog/paused="true"
      • Pausa el subcomponente de LCM en el clúster de administrador de la organización:
        kubectl --kubeconfig $ORG_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n org-1-system-cluster lcm.private.gdc.goog/paused="true"
    Supervisión 1.12.0

    No se recopilan las métricas de los clústeres de usuarios.

    Síntomas:

    No se recopilan algunas métricas de los clústeres de usuarios. Este problema afecta a los clústeres de VM del usuario, pero no al clúster del sistema.

    • Puedes ver los siguientes registros del servidor de Prometheus:
      prometheus-server ts=2024-02-21T16:07:42.300Z caller=dedupe.go:112 component=remote level=warn remote_name=cortex-remote-write url=http://cortex-tenant.mon-system.svc:9009/push msg="Failed to send batch, retrying" err="server returned HTTP status 500 Internal Server Error: 2 errors occurred:"
    • Puedes ver los siguientes registros del arrendatario de Cortex:
      cortex-tenant time="2024-02-23T18:03:44Z" level=error msg="proc: src=127.0.0.6:55021 lookup cortex.mon-system.svc on 172.25.38.10:53: no such host"

    Solución alternativa:

    Sigue estos pasos para resolver el problema:

    1. Obtén la ruta de acceso al archivo kubeconfig del clúster. Guarda la ruta de acceso en la variable de entorno KUBECONFIG.
    2. Implementa un servicio de código auxiliar en los clústeres de VM del usuario:
            kubectl --kubeconfig $KUBECONFIG apply -f - &lt&ltEOF
            apiVersion: v1
            kind: Service
            metadata:
              labels:
                app: cortex
              name: cortex
            spec:
              ports:
              - protocol: TCP
                targetPort: 9009
                port: 9009
                name: cortex
              type: ClusterIP
              sessionAffinity: ClientIP
            EOF
            
    3. Reinicia la implementación del arrendatario de Cortex:
      kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n mon-system cortex-tenant
    Supervisión 1.12.0

    El Prometheus principal envía métricas al inquilino de Cortex a través de los límites del clúster

    Síntomas:

    Las métricas destinadas a la instancia de Grafana del operador de infraestructura pueden estar en la instancia de Grafana del administrador de la plataforma y viceversa. El problema se debe a que ASM balancea las solicitudes de carga entre los límites del clúster, que tienen diferentes inquilinos predeterminados.

    Solución alternativa:

    La solución alternativa requiere acceso a la fuente de private-cloud y la capacidad de lanzar una actualización de componente. Debes cambiar la configuración de la malla para restringir el servicio cortex-tenant de modo que solo reciba tráfico del clúster local y, luego, lanzar el componente de ASM.

    1. Abre el archivo manifests/plain/asm/1.19/asm-primary-cluster-operator.yaml.
    2. Introduce el campo serviceSettings en el campo meshConfig.

      Originalmente, el campo meshConfig se ve como en el siguiente ejemplo:

              ...
              profile: minimal
                revision: 1-19
                meshConfig:
                  localityLbSetting:
                      enabled: false
              ...
            

      Por lo tanto, debes cambiar el campo meshConfig para que se vea como el siguiente ejemplo:

              profile: minimal
                revision: 1-19
                meshConfig:
                  serviceSettings:
                    - settings:
                        clusterLocal: true
                      hosts:
                      - 'cortex-tenant.mon-system.svc.cluster.local'
                  localityLbSetting:
                      enabled: false
            
    3. Implementa el componente de ASM en el clúster.
    Actualizar 1.12.0

    Falla la actualización del nodo para NodeOSInPlaceUpgradeCompleted

    Síntomas:

    Cuando se actualiza de la versión 1.11.0 a la 1.11.3, falla la actualización del nodo para NodeOSInPlaceUpgradeCompleted.

    ka logs -n gpc-system os-policy-preflight-os-upgrade-bm-86efcc8en8sh2-6h5cn | grep GDCH-OS-ANSIBLE-CHECK -A 50
    [GDCH-OS-ANSIBLE-CHECK]
    {
      "syntax": {
        "success": true,
        "msg": ""
      },
      "apply": {
        "reachablity": {
          "success": true,
          "msg": ""
        },
        "execution": {
          "success": false,
          "msg": "errors found when simluating play execution on host: 10.3.20.9",
          "tasks": [
            {
              "task": "os/upgrade : Copy GRUB file to BOOT location",
              "error": "Source /boot/efi/EFI/ubuntu/grubx64.efi not found"
            }
          ]
        }
      },
      "diff": null
    } 

    Solución alternativa:

    Accede a la máquina física que se está actualizando. Verifica si fstab tiene /boot/efi y si el directorio está activado:

    # cat /etc/fstab
           LABEL=cloudimg-rootfs   /        ext4   defaults        0 1
           LABEL=UEFI      /boot/efi       vfat    umask=0077      0 1
    lsblk
    NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda       8:0    0  3.5T  0 disk
    ├─sda1    8:1    0  3.5T  0 part /
    ├─sda2    8:2    0 64.3M  0 part
    ├─sda14   8:14   0    4M  0 part
    └─sda15   8:15   0  106M  0 part 

    Pausar nodeupgradetask

    1. Ejecuta mount -a y verifica si el directorio está montado:
      # mount -a
      root@mb-aa-bm04:~# ls /boot/efi/
      EFI
    2. Continúa con las verificaciones aquí. Ejecuta los siguientes comandos:
      C
      # Ensure all three cmds prints `Files are identical`
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/shimx64.efi | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/BOOT/BOOTX64.EFI | awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
      
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/grubx64.efi | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/BOOT/grubx64.efi| awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
      
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/grub.cfg | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/ubuntu/grub.cfg | awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
    3. Si no todos los archivos son idénticos, ejecuta este comando en la máquina y repite las verificaciones.
      /usr/local/update-efi-files.sh
    4. Reanudar nodeupgradetask
    Actualizar 1.12.0

    La actualización del conmutador no ejecuta el comando install add bootflash://..

    Síntomas:

    La actualización del conmutador no puede agregar bootflash:

    Conditions:
      Last Transition Time:  2024-01-10T20:06:30Z
      Message:               exception: add and activate package nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm: nx-api RPC request failed
      with status code 400 and body "{\n\t\"jsonrpc\":\t\"2.0\",\n\t\"error\":\t{\n\t\t\"code\":\t-32602,\n\t\t\"message\":\t\"Invalid params\",\n\t\
      t\"data\":\t{\n\t\t\t\"msg\":\t\"Adding the patch (/nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm)\\n\\n[###                 ]  10%\\n[#│ #                 []  10%\\n[#####               ]  20%\\n[#######             ]  30%\\n[#########           ]  40%\\n[#########           ]  4
      0%\\n[####################] 100%\\n[####################] 100%\\nInstall operation 21 failed because this patch already exists. at Wed Jan 10 2
      1:00:06 2024\\n\\n\"\n\t\t}\n\t},\n\t\"id\":\t1\n}" for requests "install add bootflash:///nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm
      activate forced"   

    Solución alternativa:

    Accede al conmutador que está fallando y ejecuta el comando install activate desde el conmutador en el paquete:

    install activate nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm
    Actualizar 1.12.1, 1.12.2, 1.12.4

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, la actualización del nodo se detiene con el error MaintenanceModeHealthCheckReady de undrain

    Síntomas:

    La actualización del clúster se detuvo durante más de una hora. El estado y las especificaciones del modo de mantenimiento de la máquina de Bare Metal no coinciden. Por ejemplo:

    kubectl get baremetalmachines -A  -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,MaintenanceMode:.spec.maintenanceMode,Status:.status.underMaintenance

    Muestra lo siguiente:

    root        10.252.135.4   false             true

    El trabajo de verificación previa de la máquina física muestra el siguiente mensaje de error:

    The error was: 'dict object' has no attribute 'stdout'\n\nThe error appears to be in '/playbook/roles/machine_check_common/tasks/main.yaml': line 215, column 3, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n\n- name: Check if bypass the time check in node agent mode\n  ^ here\n"}

    Solución alternativa:

    Usa el siguiente comando:

    export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
       kubectl get cluster -A
    kubectl annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE} "baremetal.cluster.gke.io/bypass-check=ntp"
    SO del nodo 1.11.3

    El nodo de VM se bloquea durante el reinicio después de la solución manual para el Pod os-policy

    Síntomas:

    Una tarea de reinicio de VM falla después de la solución manual para el pod os-policy. Se muestra el siguiente mensaje:

    ko logs os-policy-preflight-os-reboot-vm-b1fb94147x8r9-nqmvp -n gpc-system
    
    playbook: server-reboot.yaml
    {
        "custom_stats": {},
        "global_custom_stats": {},
        "plays": [
            {
                "play": {
                    "duration": {
                        "end": "2024-01-12T03:50:52.749714Z",
                        "start": "2024-01-12T03:50:42.694226Z"
                    },
                    "id": "5251f140-5a01-5cce-6150-000000000006",
                    "name": "Run OS Upgrade Tasks"
                },
                "tasks": [
                    {
                        "hosts": {
                            "172.20.128.10": {
                                "action": "setup",
                                "changed": false,
                                "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.20.128.10 port 22: Connection timed out",
                                "unreachable": true
                            }
                        },
                        "task": {
                            "duration": {
                                "end": "2024-01-12T03:50:52.749714Z",
                                "start": "2024-01-12T03:50:42.704562Z"
                            },
                            "id": "5251f140-5a01-5cce-6150-00000000000b",
                            "name": "os/reboot : Gather OS distribution information"
                        }
                    }
                ]
            }
        ],
        "stats": {
            "172.20.128.10": {
                "changed": 0,
                "failures": 0,
                "ignored": 0,
                "ok": 0,
                "rescued": 0,
                "skipped": 0,
                "unreachable": 1
            }
        }
    }
    [GDCH-OS-ANSIBLE-CHECK]
    {
      "syntax": {
        "success": true,
        "msg": ""
      },
      "apply": {
        "reachablity": {
          "success": false,
          "msg": "Failed to connect to the host via ssh: ssh: connect to host 172.20.128.10 port 22: Connection timed out"
        },
        "execution": {
          "success": false,
          "msg": "",
          "tasks": null
        }
      },
      "diff": null
    }
    [GDCH-OS-ANSIBLE-CHECK]
    Error: reachability err: Failed to connect to the host via ssh: ssh: connect to host 172.20.128.10 port 22: Connection timed out

    Solución alternativa:

    Detener y reiniciar la VM resuelve el problema. Sigue las instrucciones para iniciar y detener una VM.

    Conexiones superiores 1.12.0

    Un clúster de VM del usuario se detiene en el estado ContainerCreating con la advertencia FailedCreatePodSandBox

    Síntomas:

    Un clúster de VM de usuario se bloquea. La descripción del pod que tiene el estado ContainerCreating muestra la siguiente advertencia:

    # kubectl --kubeconfig path/to/usercluster_kubeconfig describe pods/bm-system-machine-preflight-check-172.204c807f67d2cab60d5d8q58q -n user-vm-1-cluster
    Events:
      Type     Reason                  Age                  From     Message
      ----     ------                  ----                 ----     -------
      Warning  FailedCreatePodSandBox  108s (x62 over 79m)  kubelet  (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "ec4d2021ae9d76adf49a6d3c88d678b3b5d9
    50990daa6ffee3fcfeed8291dfa8": plugin type="cilium-cni" name="cilium" failed (add): Unable to create endpoint: [PUT /endpoint/{id}][429] putEndpointIdTooManyRequests 

    Solución alternativa:

    Sigue los pasos del manual de ejecución NET-P0001 para reiniciar anetd en el clúster del sistema.

    Registro de artefactos del sistema 1.12.1

    Harbor se bloquea en bucle después de una actualización de ABM

    Síntomas:

    Cuando se actualiza una organización raíz de la versión 1.11.1 a la 1.12.1, es posible que la actualización falle en la etapa del complemento con errores de Helm pull:

    harbor-system                   harbor-harbor-harbor-core-657d86bcf8-zl8d2                        1/1     Running             0                 14h
    harbor-system                   harbor-harbor-harbor-core-7d66b4c7c-7g6t4                         0/1     CrashLoopBackOff    155 (76s ago)     12h

    Solución alternativa:

    Envía una solicitud de asistencia. Consulta Cómo solicitar asistencia para obtener más detalles.

    Actualizar 1.12.0

    Es posible que varios pods de un clúster del sistema se queden atascados en el estado TaintToleration

    Síntomas:

    Durante una actualización, el subcomponente de OPA Gatekeeper no se instala en el clúster del sistema. Sin embargo, las restricciones y el webhook para aplicarlas están instalados.

    Es posible que varios pods de un clúster del sistema se queden en el estado TaintToleration:

    mon-system                              mon-cortex-pre-upgrade-job-mn29x                              0/1     TaintToleration     0                96m    <none>          zb-aa-bm07    <none>           <none>
    mon-system                              mon-kube-state-metrics-backend-d49b868dc-fmp62                0/2     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    mon-system                              primary-prometheus-shard1-replica0-0                          0/3     TaintToleration     0                103m   <none>          zb-aa-bm07    <none>           <none>
    netapp-trident                          netapp-trident-controller-7ffb4c5f89-rvwjj                    0/5     TaintToleration     0                103m   <none>          zb-aa-bm07    <none>           <none>
    obs-system                              alertmanager-0                                                0/2     TaintToleration     0                98m    <none>          zb-aa-bm07    <none>           <none>
    obs-system                              audit-logs-loki-io-0                                          0/3     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    obs-system                              log-audit-backend-failure-detector-6lgsq                      0/1     TaintToleration     0                105m   <none>          zb-aa-bm07    <none>           <none>
    obs-system                              meta-alertmanager-0                                           0/1     TaintToleration     0                102m   <none>          zb-aa-bm07    <none>           <none>
    obs-system                              meta-alertmanager-servicenow-webhook-5679f48895-ggkg6         0/2     TaintToleration     0                102m   <none>          zb-aa-bm07    <none>           <none>
    platform-obs-obs-system                 grafana-proxy-server-7b6b79f787-2x92t                         0/2     TaintToleration     0                103m   <none>          zb-aa-bm07    <none>           <none>
    vm-system                               gdch-rocky-yum-repo-distributor-zfwp6                         0/1     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    vm-system                               gdch-rocky-yum-repo-server-568768c97b-c9hm2                   0/2     TaintToleration     0                97m    <none>          zb-aa-bm07    <none>           <none>
    Istio 1.12.1

    Pods en el estado ImagePullBackOff con el evento Back-off pulling image "auto"

    Síntomas:

    El pod con el nombre de contenedor istio-proxy no está listo y tiene el estado ImagePullBackOff con el evento Back-off pulling image "auto".

    Solución alternativa:

    1. Verifica que el webhook de mutación istio-revision-tag-default esté presente en el clúster. De no ser así, espera aproximadamente 10 minutos para ver si el sistema se recupera automáticamente. Si no es así, deriva el problema.
    2. Si el webhook de mutación está presente, borra el pod problemático y verifica que vuelva a estar en funcionamiento. El .spec.containers[].image no debe ser auto, sino que debe parecer una imagen real similar a la siguiente: gcr.io/gke-release/asm/proxyv2:<image version>.
    Logging 1.12.1

    Es posible que no se puedan actualizar ValidatingWebhookConfigurations, MutatingWebhookConfigurations y MonitoringRules implementados por el componente Log

    Síntomas:

    Cuando se actualiza de la versión 1.11.1 a la 1.12.1, es posible que no se actualicen ValidatingWebhookConfigurations, MutatingWebhookConfigurations y MonitoringRules implementados por el componente Log.

    Solución alternativa:

    1. Asegúrate de tener kubectl y poder acceder al manual IAM-R0004 para obtener el KUBECONFIG del clúster de administrador raíz.

    2. Borra ValidatingWebhookConfiguration root-admin-private-logging-validation-webhook del clúster de administrador raíz:

      kubectl delete validatingwebhookconfiguration root-admin-private-logging-validation-webhook
    3. Borra MutatingWebhookConfiguration root-admin-private-logging-defaulter-webhook del clúster de administrador raíz:

      kubectl delete mutatingwebhookconfiguration root-admin-private-logging-defaulter-webhook
    4. Borra ValidatingWebhookConfiguration root-admin-logging-webhook del clúster de administrador raíz:

      kubectl delete validatingwebhookconfiguration root-admin-logging-webhook
    5. Borra MonitoringRule operational-logs-alerts del espacio de nombres infra-obs en el clúster de administrador raíz:

      kubectl delete monitoringrule operational-logs-alerts -n infra-obs
    6. Borra MonitoringRules audit-logs-alerts, audit-logs-sli-syslog-prober, audit-logs-sli-filelog-prober, audit-logs-sli-fluentbit-to-loki, audit-logs-sli-fluentbit-to-splunk, audit-logs-sli-fluentbit-backlog, audit-logs-sli-loki-ingester-failed-rate, audit-logs-sli-loki-io-up y audit-logs-sli-loki-pa-up de infra-obs namespace en el clúster de administrador raíz:

      kubectl delete monitoringrule audit-logs-alerts audit-logs-sli-syslog-prober audit-logs-sli-filelog-prober audit-logs-sli-fluentbit-to-loki audit-logs-sli-fluentbit-to-splunk audit-logs-sli-fluentbit-backlog audit-logs-sli-loki-ingester-failed-rate audit-logs-sli-loki-io-up audit-logs-sli-loki-pa-up -n infra-obs
    7. Confirma que el subcomponente log-admin esté listo en el clúster de administrador raíz:

      export RECONCILING="`kubectl get subcomponent log-audit -n root -o json | jq '.status.conditions | .[] | select(.type == "Reconciling") | .status'`" ; if [[ $RECONCILING =~ "False" ]]; then echo "log-audit is ready"; else echo "log-audit is not ready"; fi

      Si se ejecuta correctamente, el comando imprime log-audit is ready. De lo contrario, el resultado es log-audit is not ready.

    8. Confirma que el subcomponente log-admin esté listo en el clúster de administrador raíz:

      export RECONCILING="`kubectl get subcomponent log-operational -n root -o json | jq '.status.conditions | .[] | select(.type == "Reconciling") | .status'`" ; if [[ $RECONCILING =~ "False" ]]; then echo "log-operational is ready"; else echo "log-operational is not ready"; fi

      Si se ejecuta correctamente, el comando imprime log-operational is ready. De lo contrario, el resultado es log-operational is not ready.

    Logging 1.12.1

    No se recopilan los registros de auditoría ni los registros operativos

    Debido a un problema en el trabajo log-infra-backend-preinstall, no se instalan los registros de auditoría ni los registros operativos de Loki, y no se recopilan registros.

    Síntomas:

    Es posible que veas un CrashLoopBackoff en el clúster del sistema:

    obs-system                      anthos-log-forwarder-5ghbm                                        2/3     CrashLoopBackOff              135 (3m52s ago)   15h
    Logging 1.12.1

    El pod cortex-ingester muestra un estado OOMKilled

    Síntomas:

    Es posible que veas el estado OOMKilled para el Pod en el espacio de nombres mon-system:

    NAMESPACE          NAME                           READY   STATUS      RESTARTS         AGE
    mon-system         cortex-ingester-0              1/2     OOMKilled   6 (3h5m ago)     11h
          

    Solución alternativa:

    Aumenta la memoria de cada ingester, incrementa la cantidad de ingesters o ambas. Para ello, implementa un SubcomponentOverride en el clúster de administrador de la organización, como se muestra en el siguiente ejemplo:

    apiVersion: lcm.private.gdc.goog/v1
    kind: SubcomponentOverride
    metadata:
      name: mon-cortex-ingester-override
      namespace: org-1-system-cluster
    spec:
      backend:
        operableParameters:
          ingester:
            resourcesLimit:
              memory: "6Gi" # 6Gi is the default, increase to add more memory to each ingester
            replicas: 4     # 4 is the default, increase to create more ingester instances.
      subComponentRef: mon-cortex
          
    Actualizar 1.12.1

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, es posible que un nodo del clúster no salga del modo de mantenimiento debido a una falla en la verificación de estado de registy_mirror

    Síntomas:

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, la actualización del nodo falla con el siguiente mensaje de error:

    {
        "lastTransitionTime": "2024-02-13T22:53:36Z",
        "message": "following checks failed, ['check_registry_mirror_reachability_pass']",
        "observedGeneration": 3,
        "reason": "JobStatus",
        "status": "False", <----
        "type": "MaintenanceModeHealthCheckReady"
      },
      

    Solución alternativa:

    Usa el siguiente comando:

    kubectl --kubeconfig=${ROOT_OR_ORG_ADMIN_KUBECONFIG} annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE}  "baremetal.cluster.gke.io/maintenance-mode-ignore-healthcheck=true"
    Actualizar 1.12.1, 1.12.2, 1.12.4

    OrganizationUpgrade se detiene en las etapas anthosBareMetal, addOn o node con una falla en la verificación check_registry_mirror_reachability_pass.

    Síntomas:

    1. OrganizationUpgrade se detiene en las etapas anthosBareMetal, addOn o node y muestra el estado Unknown para la condición Succeeded.

    kubectl --kubeconfig=${ROOT_ADMIN_KUBECONFIG} get organizationupgrade -n gpc-system ${ORG_NAME} -o yaml
        addOn: {}
        anthosBareMetal:
          conditions:
          - lastTransitionTime: "2024-09-12T12:10:55Z"
            message: 'UPG1300: ABM upgrade expected to finish within 2h0m0s but hasn''t
              after 39h18m50.606521473s, last message was: Cluster upgrade for root-admin
              cluster: in-progress'
            observedGeneration: 1
            reason: ABMUpgradeTimeout
            status: Unknown
            type: Succeeded
          startTime: "2024-09-12T12:10:55Z"
        node:{}
      
    2. El estado de Baremetalmachine muestra un error en la verificación de check_registry_mirror_reachability_pass.
    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} get baremetalmachines -A -o json | jq '.items[] | select(.status.underMaintenace != .spec.maintenanceMode) | .metadata.name as $name | .status.underMaintenace as $statm | .spec.maintenanceMode as $specm | .status.conditions[] | select(.status == "False") | select(.type == "MaintenaceModeHealthCheckReady")'
        {
          "lastTransitionTime": "2024-02-13T19:17:27Z",
          "message": "following checks failed, ['check_registry_mirror_reachability_pass']",
          "observedGeneration": 3,
          "reason": "JobStatus",
          "status": "False",
          "type": "MaintenaceModeHealthCheckReady" 
        },

    Solución alternativa:

    Usa el siguiente comando:

    export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    kubectl get cluster -A
    kubectl annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE}  "baremetal.cluster.gke.io/maintenance-mode-ignore-healthcheck=true"
    Actualizar 1.12.1, 1.12.2, 1.12.4

    OrganizationUpgrade se detiene en las etapas anthosBareMetal, addOn o node con el error de verificación de estado netutil.

    Síntomas:

    1. OrganizationUpgrade se detiene en las etapas anthosBareMetal, addOn o node y muestra el estado Unknown para la condición Succeeded.

    kubectl --kubeconfig=${ROOT_ADMIN_KUBECONFIG} get organizationupgrade -n gpc-system ${ORG_NAME} -o yaml
        addOn: {}
        anthosBareMetal:
          conditions:
          - lastTransitionTime: "2024-09-12T12:10:55Z"
            message: 'UPG1300: ABM upgrade expected to finish within 2h0m0s but hasn''t
              after 39h18m50.606521473s, last message was: Cluster upgrade for root-admin
              cluster: in-progress'
            observedGeneration: 1
            reason: ABMUpgradeTimeout
            status: Unknown
            type: Succeeded
          startTime: "2024-09-12T12:10:55Z"
        node:{}
      
    2. HealthChecks muestra el error que falta netutil.
    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} get healthchecks -n kube-system -o json | jq '.items[].status | select(.lastHealthcheck.lastStatus == "Error")'
    {
      "lastHealthcheck": {
        "error": {
          "code": "500",
          "reason":  "[Errno 2] No such file or directory: /usr/local/bin/abm-tools10.5.23.4/netutil"
        },
        "lastCompletedTime": "2024-09-14T05:11:39Z",
        "lastStatus": "Error",
        "monitoredComponentVersion": "1.28.900-gke.112",
        "version": "1.28.900-gke.112"
      },
      "lastScheduledTime": "2024-09-14T05:26:00Z"
      }

    Solución alternativa:

    Borra el trabajo de Kubernetes correspondiente a la verificación de estado fallida

    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} get job -A -l Command=machine-health-check --field-selector status.successful=0
    NAMESPACE   NAME                                    COMPLETIONS   DURATION   AGE
    root        bm-system-10.200.0.2-machine-28771464   0/1           67m        67m
    root        bm-system-10.200.0.2-machine-28771524   0/1           7m33s      7m33s
    kubectl --kubeconfig=${ROOT_ADMIN_OR_ORG_ADMIN_KUBECONFIG} delete job -A -l Command=machine-health-check --field-selector status.successful=0
    job.batch "bm-system-10.200.0.2-machine-28771464" deleted
    job.batch "bm-system-10.200.0.2-machine-28771524" deleted
    VM Manager 1.12.1

    Cuando se actualiza de la versión 1.11.x a la 1.12.x, es posible que una VM no esté lista debido a que hay demasiados Pods

    Síntomas:

    Cuando se actualiza de la versión 1.11.x a la 1.12.x, es posible que una VM no esté lista debido a que hay demasiados Pods, lo que bloquea el vaciado de un nodo de metal desnudo.

    Solución alternativa:

    Reinicia la VM.

    Servidores físicos 1.12.1

    NodeUpgrade contiene varias versiones para el mismo modelo de hardware, lo que bloquea la verificación de la actualización del firmware

    Síntomas:

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, NodeUpgrade contiene varias versiones para el mismo modelo de hardware, lo que bloquea la verificación de la actualización del firmware.

    Solución alternativa:

    Sigue estos pasos para modificar el CR NodeUpgrade spec:

    1. Si la actualización es para servidores HPE Gen10 (GDC-4D), quita el firmware del modelo ilo6. De lo contrario, quita el firmware del modelo ilo5.
    2. Sección para conservar la entrada con el redfishVersion más reciente para cada descripción.
      Por ejemplo, si existen las dos entradas siguientes, conserva solo la que tiene 2.98 Oct 10 2023:
      - description: SystemBMC
              model: ilo5
              redfishVersion: 2.98 Oct 10 2023
            - description: SystemBMC
              model: ilo5
              redfishVersion: 2.95 Jul 19 2023
    Servidores físicos 1.12.1

    Los servidores están atascados en el estado de aprovisionamiento

    Síntomas:

    Ironic alcanzó el tiempo de espera mientras esperaba que se encendiera un servidor. El estado cambia de cleaning a clean failed y, luego, a available:

    2024-02-23 18:53:00.659 1 DEBUG ironic.api.method [req-3a22ed15-d5cd-4d77-bb0b-0e7a3042e793 - - - - -] Client-side error: Node facc133f-898c-46d4-974b-92e3560892d5 is locked by host 10.128.120.2, please retry after the current operation is completed. format_exception /usr/lib/python3.6/site-packages/ironic/api/method.py:124

    Cómo determinar si el interruptor está encendido:

    curl -kqs -u ${ILO_USER}:${ILO_PASS} https://${ILO_IP}/redfish/v1/Systems/1 | jq '.PowerState'

    Si el interruptor está encendido, el resultado muestra "On".

    Solución alternativa:

    Quita el bloqueo image de los servidores problemáticos y espera hasta que vuelvan al estado disponible. Cuando estén disponibles, vuelve a agregar el bloque image.

    Servidores físicos 1.12.2

    Falla en el arranque del servidor

    Síntomas:

    Es posible que veas un mensaje de depuración como el siguiente:

    [DEBUG] GET https://172.22.240.103/redfish/v1/
                2024/03/22 21:46:46 [DEBUG] GET https://172.22.240.111/redfish/v1/Systems/1/
                panic: runtime error: invalid memory address or nil pointer dereference

    Este problema se produce cuando se ignoran los errores de iLO y se lee la respuesta HTTP en lugar de devolverla de inmediato, lo que genera una desreferencia de puntero nulo.

    Registro de artefactos del sistema 1.12.1

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, es posible que el estado del clúster de Harbor sea unhealthy

    Síntomas:

    Cuando actualizas de la versión 1.11.1 a la 1.12.1, es posible que el estado del clúster de Harbor cambie a unhealthy con el siguiente error:

    root@abc-bootstrapper:/home/ubuntu# ka get harborclusters -A
    NAMESPACE       NAME     PUBLIC URL                    STATUS
    harbor-system   harbor   https://10.252.119.11:10443   unhealthy

    Pasos para diagnosticar el problema:

    1. Verifica el estado de harborclusters:

      root@abc-bootstrapper:/home/ubuntu# ka get harborclusters -A
      NAMESPACE       NAME     PUBLIC URL                    STATUS
      harbor-system   harbor   https://10.252.119.11:10443   unhealthy
    2. Si no está en buen estado, verifica el estado de los componentes de Harbor:

      root@abc-bootstrapper:~# ka get pods -n harbor-system
      NAME                                               READY   STATUS    RESTARTS   AGE
      harbor-harbor-harbor-core-68d9764d8c-rgg4h         0/1     Running   0          3d2h
      harbor-harbor-harbor-exporter-54d559fdb8-nzjk7     1/1     Running   0          3d2h
      harbor-harbor-harbor-jobservice-6f5db4779-sqmlc    1/1     Running   0          3d2h
      harbor-harbor-harbor-portal-8458c847dc-z2l6n       1/1     Running   0          3d4h
      harbor-harbor-harbor-registry-7577f5d9d6-qp45c     3/3     Running   0          3d4h
      harbor-operator-harbor-operator-755b5cfc96-x2bxh   1/1     Running   0          3d4h
      harbor-operator-redisoperator-bf96ffc59-5d457      1/1     Running   0          3d4h
      harbor-operator-redisoperator-bf96ffc59-tbd8j      1/1     Running   0          3h38m
      harbor-operator-redisoperator-bf96ffc59-vlqfl      1/1     Running   0          3h38m
      pg-harbor-db-0                                     0/3     Pending   0          3h37m
      pg-harbor-db-monitor-776b946c74-c7pt9              0/1     Pending   0          3h38m
      rfr-harbor-redis-0                                 1/1     Running   0          3d4h
      rfr-harbor-redis-1                                 1/1     Running   0          3d4h
      rfr-harbor-redis-2                                 1/1     Running   0          3h37m
      rfs-harbor-redis-64d9d8df4f-fds79                  1/1     Running   0          3d4h
      rfs-harbor-redis-64d9d8df4f-p9l9h                  1/1     Running   0          3d3h
      rfs-harbor-redis-64d9d8df4f-x5x8c                  1/1     Running   0          3h38m
    3. Si harbor-core y pg-harbor-db no están listos, verifica el estado de harbor-db:

      root@abc-bootstrapper:~# ka get dbclusters.postgresql.dbadmin.gdc.goog harbor-db -n harbor-system
      NAME        PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE
      harbor-db   172.20.0.146      InProgress     DBClusterReconciling
    4. Si harbor-db está en modo InProgress, verifica si algún nodo root-admin-control-plane está en modo UNDERMAINTENANCE.

      root@abc-bootstrapper:~# ka get nodepool -A
      NAMESPACE   NAME                            READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
      org-1       admin-control-plane-node-pool   0       0             0         0                  0
      root        root-admin-control-plane        3       0             0         1                  0

      Se espera que los nodos estén en modo de mantenimiento durante una actualización. Si un nodo está en mantenimiento, es posible que no tengas suficientes recursos para programar harbor-db.

    Solución alternativa:

    Para solucionar el problema, sigue estos pasos:

    1. Configura KUBECONFIG

      :
      export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    2. Reduce la escala de los controladores de dbs:

      kubectl scale --replicas=0 deployment -n dbs-fleet-system fleet-controller-manager
      kubectl scale --replicas=0 deployment -n dbs-postgres-system pg-controller-manager
    3. Establece el nombre de la clase de prioridad en system-cluster-critical o system-node-critical en la plantilla de Pod:

      kubectl patch statefulset pg-harbor-db -n harbor-system --type='json' \
        -p='[{"op": "add", "path": "/spec/template/spec/priorityClassName", "value": "system-cluster-critical"}]'
    4. Reinicia el Pod pg-harbor-db:

      kubectl delete pods -n harbor-system pg-harbor-db-0
    5. Después de verificar que harborcluster esté en buen estado, vuelve a aumentar la escala de los controladores de dbs:

            kubectl scale --replicas=1 deployment -n dbs-fleet-system fleet-controller-manager
            kubectl scale --replicas=1 deployment -n dbs-postgres-system pg-controller-manager
    Registro de artefactos del sistema 1.12.2

    El pod del servicio de trabajos no está listo

    Síntomas:

    El pod del servicio de trabajos tiene problemas para estar listo:

    Events:
      Type     Reason     Age                       From     Message
      ----     ------     ----                      ----     -------
      Warning  Unhealthy  35m (x8153 over 3d16h)    kubelet  Readiness probe failed: Get "https://172.16.1.142:8443/api/v1/stats": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
      Warning  Unhealthy  10m (x60 over 13h)        kubelet  Readiness probe failed: Get "https://172.16.1.142:8443/api/v1/stats": context deadline exceeded
      Normal   Pulled     5m47s (x1733 over 3d16h)  kubelet  Container image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7" already present on machine
      Warning  BackOff    43s (x21352 over 3d16h)   kubelet  Back-off restarting failed container jobservice in pod harbor-harbor-harbor-jobservice-6f59fbf974-q9h9g_harbor-system(51ab9697-98b9-4315-9ab9-f67b19a28d0a)

    Solución alternativa:

    1. Reinicia el pod del servicio de trabajos.
      kubectl delete pod POD_NAME -n NAMESPACE

      La salida obtenida se verá así:

      Events:
        Type    Reason     Age    From               Message
        ----    ------     ----   ----               -------
        Normal  Scheduled  2m20s  default-scheduler  Successfully assigned harbor-system/harbor-harbor-harbor-jobservice-6f59fbf974-p872s to zx-ab-bm02
        Normal  Pulling    2m15s  kubelet            Pulling image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7"
        Normal  Pulled     2m12s  kubelet            Successfully pulled image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7" in 3.25s (3.25s including waiting)
        Normal  Created    2m12s  kubelet            Created container jobservice
        Normal  Started    2m12s  kubelet            Started container jobservice
    2. En el programa de inicio, obtén el estado de la organización:
      kubectl get org -A

      El resultado podría verse de la siguiente manera:

      NAMESPACE    NAME    CURRENT VERSION   DESIRED VERSION   READY
      gpc-system   org-1   1.12.1-gdch.402   1.12.1-gdch.402   True
      gpc-system   org-2   1.12.1-gdch.402   1.12.1-gdch.402   True
      gpc-system   root    1.12.1-gdch.402   1.12.1-gdch.402   True
    Supervisión 1.12.1

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, es posible que falle el borrado del bucket de Cortex

    Síntomas:

    Cuando actualices de la versión 1.11.1 a la 1.12.1, es posible que falle la eliminación del bucket de Cortex con el siguiente error:

            upgrade_post_root_org_validation.go:74: unable to create cortex client to check metrics creating Cortex client failed: can't make a metrics API because of an error getting the Cortex pod: unable to find any matching cortex pods using list options / label selector: {TypeMeta:{Kind: APIVersion:} LabelSelector:app=cortex FieldSelector: Watch:false AllowWatchBookmarks:false ResourceVersion: ResourceVersionMatch: TimeoutSeconds: Limit:0 Continue: SendInitialEvents:}
            upgrade_post_root_org_validation.go:117: Bucket(s) not ready: 3 errors occurred:
                    * Bucket "obs-system/cortex-metrics-alertmanager" not ready
                    * Bucket "obs-system/cortex-metrics-blocks" not ready
                    * Bucket "obs-system/cortex-metrics-ruler" not ready

    Solución alternativa:

    Sigue estos pasos para borrar buckets de forma forzada:

    1. Completa los pasos de la tarea de toil MON-R0017 para acceder a la IU de StorageGRID.
    2. Navega a los bucket en la IU.
    3. Haz clic en el botón Borrar objetos en el bucket para borrar los datos.
    Supervisión 1.12.0
    1.12.1
    1.12.2

    La clase de almacenamiento de métricas se definió de forma incorrecta en la configuración

    Síntomas:

    El objeto StatefulSet de Prometheus está configurado de forma incorrecta con la clase de almacenamiento standard en lugar de standard-rwo. Este problema provoca que falle el inicio del objeto StatefulSet de Anthos Prometheus desde el componente de supervisión.

    El problema se produce porque el reconciliador ObservabilityPipeline solo establece este valor en la primera instalación, y el reconciliador ObsProjectInfra observa los recursos personalizados del clúster.

    Solución alternativa:

    Reinicia la implementación de fleet-admin-controller en el clúster de administrador de la organización para resolver el problema.

    Supervisión 1.12.2

    El subcomponente mon-common no implementa la telemetría de Istio

    Síntomas:

    El subcomponente mon-common debe implementar un objeto de telemetría de Istio en el clúster de administrador de la organización para evitar que se registren todas las solicitudes de Cortex en el registro de auditoría. Sin embargo, el archivo de manifiesto no se incluye en el archivo de compilación.

    Solución alternativa:

    Sigue estos pasos para implementar el objeto de telemetría de Istio en el clúster de administrador de la organización:

    1. Crea un archivo YAML que defina el recurso personalizado (CR) de telemetría de Istio en el espacio de nombres mon-system del clúster de administrador de la organización:

      # Disable access logging from workloads internal to GDCH.
      # Telemetry CR to disable Istio access logs from obs-system namespace.
      apiVersion: telemetry.istio.io/v1alpha1
      kind: Telemetry
      metadata:
        name: disable-audit-logging
        namespace: mon-system
      spec:
        accessLogging:
          - providers:
            - name: otel
            disabled: true
    2. Aplica el archivo de manifiesto al clúster de administrador de la organización en el espacio de nombres mon-system:

      kubectl apply -f disable-audit-logging.yaml
    Supervisión 1.12.0
    1.12.1
    1.12.2

    Se restablece el ConfigMap mon-prober-backend-prometheus-config

    Síntomas:

    • Se activa la alerta MON-A0001.
    • El ConfigMap mon-prober-backend-prometheus-config se restablece para no incluir trabajos de sondeo, por ejemplo:
            apiVersion: v1
            data:
              prometheus.yaml: |
                remote_write:
                - url: http://cortex-tenant.mon-system.svc:9009/push
                  name: cortex-tenant
            kind: ConfigMap
            metadata:
              creationTimestamp: "2024-06-26T14:55:07Z"
              name: mon-prober-backend-prometheus-config
              namespace: mon-system
              resourceVersion: "6606787"
              uid: 1a495af0-1fdc-40b8-845b-4976e3b0f899
            

    Solución alternativa:

    Sigue estos pasos para resolver el problema:

    1. Configura las siguientes variables de entorno:
      • KUBECONFIG: Es la ruta de acceso al archivo kubeconfig en el clúster.
      • TARGET_CLUSTER: Es el nombre del clúster en el que resolverás el problema.
    2. Pausa el subcomponente mon-prober en todos los clústeres:
            kubectl --kubeconfig $KUBECONFIG annotate subcomponent mon-prober -n $TARGET_CLUSTER lcm.private.gdc.goog/paused=true
            

      Por ejemplo:

            kubectl --kubeconfig ~/root-admin-kubeconfig annotate subcomponent mon-prober -n my-org lcm.private.gdc.goog/paused=true
            
    3. Reinicia el controlador del administrador de MON en cada clúster de administrador:
            kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n obs-system mon-admin-backend-controller
            

      El ConfigMap de Prober se completa a medida que se registra cada sondeo.

    4. Sigue el manual de ejecución MON-R2009 para silenciar la alerta MON-A0001, Blackbox monitoring metrics pipeline down, ya que esta alerta seguirá activándose.
    Plataforma del nodo 1.12.1

    Cuando se actualiza de la versión 1.11.x a la 1.12.x, es posible que un pod de descarga de imágenes de conmutación se detenga en el estado ErrImagePull

    Síntomas:

    Cuando se actualiza de la versión 1.11.x a la 1.12.x, es posible que un Pod de descarga de imágenes de conmutación se detenga en el estado ErrImagePull con la siguiente advertencia:

     Warning  Failed   145m (x4 over 169m)   kubelet  Failed to pull image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to pull and unpack image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to resolve reference "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to do request: Head "https://10.252.119.4:5000/v2/library/private-cloud-staging/switch-image-downloader/manifests/1.12.1-gdch.330?ns=gcr.io": dial tcp 10.252.119.4:5000: connect: no route to host
      Warning  Failed   45m (x262 over 25h)   kubelet  Failed to pull image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to pull and unpack image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": failed to resolve reference "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330": pulling from host 10.252.119.11:10443 failed with status code [manifests 1.12.1-gdch.330]: 401 Unauthorized
      Normal   Pulling  40m (x287 over 26h)   kubelet  Pulling image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330"
      Normal   BackOff  22s (x6504 over 25h)  kubelet  Back-off pulling image "gcr.io/private-cloud-staging/switch-image-downloader:1.12.1-gdch.330"

    Solución alternativa:

    Para solucionar el problema, vuelve a etiquetar la imagen pnet-core-switch-image-downloader como switch-image-downloader.

    Plataforma del nodo 1.12.1

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, el firewall del host bloquea la descarga de la imagen del conmutador

    Síntomas:

    Cuando se actualiza de la versión 1.11.x a la 1.12.1, el firewall del host bloquea la descarga de la imagen del conmutador debido a una falta de coincidencia de las interfaces que usa el firewall del host.

    Solución alternativa:

    Aplica la siguiente solución alternativa antes de actualizar, solo si actualizas de la versión 1.11.x a la 1.12.x.

    1. Actualiza los clústeres de administrador raíz y de administrador de la organización.
      1. Obtén el nombre y el espacio de nombres del grupo de nodos para los nodos de metal desnudo del administrador raíz y los nodos de metal desnudo del administrador de la organización. Para el clúster de administrador raíz, usa el kubeconfig de administrador raíz. El siguiente comando enumera un inventario de las máquinas y filtra la lista por máquinas de metal desnudo:
        kubectl --kubeconfig=KUBECONFIG  get inventorymachines -l cluster.private.gdc.goog/provisioner=baremetal-provisioner.cluster.private.gdc.goog -o json | jq -c -r '.items[].spec.nodePoolRef | [.name, .namespace] | @csv | sub("\"";"";"g")' | sort | uniq
        El resultado muestra el nombre y el espacio de nombres del grupo de nodos:
        admin-control-plane-node-pool,org-1
        root-admin-control-plane,root

        Los valores del resultado corresponden a lo siguiente:

        • ORG_ADMIN_NODEPOOL_NAME: admin-control-plane-node-pool
        • ORG_ADMIN_NODEPOOL_NAMESPACE: org-1
        • ROOT_ADMIN_NODEPOOL_NAME: root-admin-control-plane
        • ROOT_ADMIN_NODEPOOL_NAMESPACE: raíz
      2. Crea los siguientes objetos en el clúster de root-admin y org-admin para cambiar el nombre de eth0 a mgmt0 en los nodos:

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${ORG_ADMIN_NODEPOOL_NAME}
            namespace: ${ORG_ADMIN_NODEPOOL_NAMESPACE}
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${ROOT_ADMIN_NODEPOOL_NAME}
            namespace: ${ROOT_ADMIN_NODEPOOL_NAMESPACE}
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
              
      3. Los campos NODEPOOL_NAME y NODEPOOL_NAMESPACE se propagan con la lista de todos los grupos de nodos del clúster respectivo cuando se implementa el archivo YAML anterior.

        Un ejemplo de un archivo YAML para el clúster de administrador raíz con los nombres reales del grupo de nodos de administrador raíz y del grupo de nodos de administrador de la organización podría verse de la siguiente manera:

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: admin-control-plane-node-pool
            namespace: org-1
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: root-admin-control-plane
            namespace: root
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
      4. Aplica el archivo YAML al clúster de administrador raíz:
        kubectl --kubeconfig=ROOT_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    2. Actualiza el clúster del sistema:
      1. Obtén un inventario de las máquinas y filtra la lista por máquinas físicas:
        kubectl --kubeconfig=_ORG_ADMIN_KUBECONFIG  get inventorymachines -l cluster.private.gdc.goog/provisioner=baremetal-provisioner.cluster.private.gdc.goog -o json | jq -c -r '.items[].spec.nodePoolRef | [.name, .namespace] | @csv | sub("\"";"";"g")' | sort | uniq
        El resultado se verá así:
        worker-node-pool-o1-highgpu1-48-gdc-metal,org-1-system-cluster

        Los valores del resultado corresponden a lo siguiente:

        • SYSTEM_CLUSTER_NODEPOOL_NAME: worker-node-pool-o1-highgpu1-48-gdc-metal
        • SYSTEM_CLUSTER_NODEPOOL_NAMESPACE: org-1-system-cluster
      2. Los campos NODEPOOL_NAME y NODEPOOL_NAMESPACE se completan con la lista del resultado del comando anterior.

      3. Crea los siguientes objetos en el clúster del sistema para cambiar el nombre de eth0 a mgmt0 en los nodos y actualizar la política del SO:
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${SYSTEM_CLUSTER_NODEPOOL_NAME}
            namespace: ${SYSTEM_CLUSTER_NODEPOOL_NAMESPACE}
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename

        Un ejemplo de archivo YAML para el clúster del sistema con los nombres reales de los grupos de nodos podría verse de la siguiente manera:

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: worker-node-pool-o1-highgpu1-48-gdc-metal
            namespace: org-1-system-cluster
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
      4. Aplica el archivo YAML al clúster de administrador de la organización:
        kubectl --kubeconfig=ORG_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    Redes de menor nivel 1.12.2

    Es posible que los conmutadores de red precargados con una versión inferior a la 9.3.10 no puedan arrancar

    Síntomas:

    Los conmutadores de red precargados con una versión inferior a la 9.3.10 no pueden iniciar el proceso de arranque, ya que la versión esperada del conmutador es 10.3(4a).

    Solución alternativa:

    Actualiza manualmente el firmware del conmutador de 9.3.5 a 9.3.10 y, luego, de 9.3.10 a 10.3.4a.

    Redes de menor nivel 1.12.2

    Se agota el tiempo de espera de algunas conexiones al nodo org-admin

    Síntomas:

    Las conexiones se interrumpen en el conmutador porque este no tiene la configuración más reciente debido a que los certificados vencieron.

    Solución alternativa:

    1. Rota los certificados en el conmutador.
    2. Activa los certificados nuevos:
      1. nxapi certificate httpskey keyfile bootflash:api-private-key.pem
      2. nxapi certificate httpscrt certfile bootflash:api-certificate.pem
      3. nxapi certificate enable
    Almacenamiento de archivos y en bloques 1.12.1
    1.12.2
    1.12.4

    Cuando se actualiza de la versión 1.11.1 a la 1.12.1, 1.12.2 o 1.12.4,file-netapp-trident es posible que falle el lanzamiento del subcomponente

    Síntomas:

    El subcomponente de Linux Unified Key Setup (LUKS) no se vuelve a implementar durante la actualización. Para verificar el subcomponente file-netapp-trident, haz lo siguiente:

    1. Establece alias:
      alias ka='kubectl --kubeconfig=/path/to/root-admin/root-admin-kubeconfig' 
      alias ko='kubectl --kubeconfig=/path/to/org-admin/org-admin-kubeconfig'
    2. Obtén el subcomponente:
      ka get subcomponent -n root file-netapp-trident -o yaml
      ko get subcomponent -n root file-netapp-trident -o yaml

    El resultado podría verse de la siguiente manera:

    conditions:
      - lastTransitionTime: "2024-03-28T01:37:20Z"
        message: 'Reconciliation error: E0100 - deploy: failed to install chart: release
          file-netapp-trident-backend failed, and has been uninstalled due to atomic being
          set: cannot patch "standard-rwo" with kind StorageClass: StorageClass.storage.k8s.io
          "standard-rwo" is invalid: parameters: Forbidden: updates to parameters are
          forbidden. && cannot patch "standard-block" with kind StorageClass: StorageClass.storage.k8s.io
          "standard-block" is invalid: parameters: Forbidden: updates to parameters are
          forbidden.'
        observedGeneration: 1
        reason: ReconciliationError
        status: "True"
        type: Reconciling 

    En este ejemplo, fallaron dos clases de almacenamiento: standard-rwo y standard-block.

    Solución alternativa:

    1. Borra el StorageClasses que el trabajo no pudo crear, como standard-rwo, standard-block, standard-rwo-non-luks y standard-block-non-luks.
    2. Reinicia el oclcm-backend-controller de tu clúster para volver a crear el StorageClasses (controlador de administrador raíz para clústeres de administrador raíz y de organización, controlador de administrador de organización para clústeres de sistema y de usuario).
    3. En la versión 1.12.4, confirma que las clases de almacenamiento instaladas tengan la anotación disk.gdc.goog/luks-encrypted: establecida como verdadera (excepto las clases de almacenamiento que no son de LUKS). Si la anotación no está establecida como verdadera, repite los pasos 1 y 2.
    4. Reinicia la implementación de netapp-trident y netapp-trident DaemonSet en el clúster.
    5. Verifica que se haya creado el secreto de LUKS para tus recursos de PersistentVolumeClaim (PVC). Cada PVC debe tener un secreto en el formato g-luks-$pvc_name.
    6. Verifica que el subcomponente file-netapp-trident no tenga errores en el estado.
    Almacenamiento de objetos 1.12.2

    Es posible que los buckets de almacenamiento de objetos no estén listos después de la actualización de la organización raíz

    Síntomas:

    Después de actualizar la organización raíz de la versión 1.12.1 a la 1.12.x, la validación posterior a la actualización falla con el siguiente error:

    upgrade_post_root_org_validation.go:121: Bucket(s) not ready: 8 errors occurred:
                    * Bucket "atat-system/invoice-export-bucket" not ready
                    * Bucket "mon-system/cortex-metrics-alertmanager" not ready
                    * Bucket "mon-system/cortex-metrics-blocks" not ready
                    * Bucket "mon-system/cortex-metrics-ruler" not ready
                    * Bucket "obs-system/audit-logs-loki-io" not ready
                    * Bucket "obs-system/cortex-metrics-alertmanager" not ready
                    * Bucket "obs-system/cortex-metrics-blocks" not ready
                    * Bucket "obs-system/cortex-metrics-ruler" not ready
          

    Solución alternativa:

    Agrega el finalizador de forma manual antes de iniciar la actualización.

    Administración de clústeres 1.12.1 y 1.12.2

    Es posible que los clústeres de usuarios con la versión 1.27.x de Kubernetes tengan grupos de nodos que no se inicialicen

    Síntomas:

    Es posible que no se inicialicen los grupos de nodos dentro de los clústeres de usuario que ejecutan la versión 1.27.x de Kubernetes, lo que provoca que el clúster de usuario no controle las cargas de trabajo de contenedores.

    Solución alternativa:

    No crees un clúster de usuario con la versión 1.27.x de Kubernetes.

    Máquinas virtuales 1.12.0

    La traducción de imágenes no puede recuperar paquetes cuando la imagen de origen tiene valores predeterminados

    Síntomas:

    La importación de imágenes de VM falla en el paso de traducción de imágenes si una imagen de origen de Ubuntu contiene fuentes de APT predeterminadas en sources.list.

    Solución alternativa:

    Asegúrate de que el directorio /var/lib/apt/lists/ esté vacío en la imagen de origen.

    Máquinas virtuales 1.12.2

    Los pods del importador fallan o se atascan

    Síntomas:

    Obtén una lista de los Pods del importador:

    kubectl get pods -A | grep import 

    El resultado podría verse de la siguiente manera:

    user-vm-1-cluster               importer-vm-1b19e25c-disk-8dwzz                                   0/1     ContainerCreating      0                2d9h
    user-vm-1-cluster               importer-vm-72b96d39-disk-frv4f                                   0/1     CreateContainerError   124 (43h ago)    2d9h
    user-vm-1-cluster               importer-vm-c7a7a320-disk-qjgt2                                   0/1     CreateContainerError   124 (43h ago)    2d9h
    user-vm-2-cluster               importer-vm-06ca7e94-disk-b66fz                                   0/1     CreateContainerError   124 (43h ago)    2d9h
    user-vm-2-cluster               importer-vm-7e63b71b-disk-jxqfz                                   0/1     CreateContainerError   116 (43h ago)    2d9h
    user-vm-2-cluster               importer-vm-e0651556-disk-k8scf                                   0/1     CreateContainerError   123 (43h ago)    2d9h

    El registro podría mostrar un evento como el siguiente:

    Events:
      Type     Reason              Age                      From                     Message
      ----     ------              ----                     ----                     -------
      Warning  FailedAttachVolume  2m14s (x1630 over 2d9h)  attachdetach-controller  AttachVolume.Attach failed for volume "pvc-2000efe0-b4a0-4856-899b-7e0c9fd33405" : rpc error: code = Unknown desc = error publishing ontap-san driver: problem mapping LUN /vol/trident_pvc_2000efe0_b4a0_4856_899b_7e0c9fd33405/lun0: results: {http://www.netapp.com/filer/admin results}
    status,attr: failed
    reason,attr: No such LUN exists
    errno,attr: 9017
    lun-id-assigned: nil

    Solución alternativa:

    1. Obtén el nombre de PersistentVolumeClaim (PVC) del mensaje de error, como pvc-2000efe0-b4a0-4856-899b-7e0c9fd33405.
    2. Busca el PersistentVolume (PV) con este nombre y anota el spec.csi.volumeAttributes.internalName para usarlo más adelante.
    3. Establece una conexión SSH con el clúster de almacenamiento siguiendo los pasos del manual de ejecución FILE-A0006.
    4. Muestra el volumen y anota el nombre del servidor virtual que devuelve el comando:
      volume show -volume INTERNAL_NAME
    5. Desconecta el volumen:
      volume offline -volume INTERNAL_NAME -vserver VSERVER_NAME
    6. Borra el volumen:
      volume delete -volume INTERNAL_NAME -vserver VSERVER_NAME
    Máquinas virtuales 1.12.1
    1.12.2

    Es posible que VMRuntime no esté listo debido a una falla en la instalación de network-controller-manager

    Síntomas:

    VMRuntime en el clúster de destino (podría ser un clúster de administrador o del sistema) tiene el estado de VMRuntime.ready = false y network-controller-manager en el espacio de nombres kube-system está pendiente.

    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} get vmruntime vmruntime
    
    apiVersion: virtualmachine.private.gdc.goog/v1
    kind: VMRuntime
    metadata:
      ...
    spec:
      ...
    status:
      ready: false
    
          
    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} describe deploy network-controller-manager -n kube-system
    
    ...
    Events:
      Type     Reason       Age                      From     Message
      ----     ------       ----                     ----     -------
      Warning  FailedMount  3m36s (x122 over 3h55m)  kubelet  MountVolume.SetUp failed for volume "cert" : secret "network-webhook-server-cert" not found
          

    Solución alternativa:

    Borrar la implementación network-controller-manager debería volver a crearla automáticamente con los certificados requeridos por el operador de VMM. La implementación debería alcanzar el estado Running y, luego, el estado de VMRuntime debería cambiar a ready=true.

    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} delete deploy network-controller-manager -n kube-system
    Máquinas virtuales 1.12.2

    Largo tiempo de aprovisionamiento para máquina virtual virtuales

    Síntomas:

    Los Pods del importador de VMs entran en un bucle de fallas y el volumen de datos se atasca en el estado de importación durante más de 90 minutos. El estado de los pods podría verse de la siguiente manera:

    test-vm-project                           importer-disk-ops-test-vm-boot-disk-tbdtz                     0/1     CrashLoopBackOff   14 (47s ago)     90m     172.16.20.94    zb-aa-bm08    <none>           <none>
    test-vm-project                            importer-test-vm-1-boot-disk-plsxk         1/1     Running            1 (2m53s ago)    8m59s   172.16.22.244   zb-ab-bm09   <none>           <none>
    test-vm-project                            importer-test-vm-2-boot-disk-npjc8                          1/1     Running            6 (12m ago)      40m     172.16.22.180   zb-ab-bm09    <none>           <none>

    Todas las importaciones de disco se completan en un plazo de tres horas.

    Actualizar 1.12.2

    Cuando se actualiza de la versión 1.11.1 a la 1.12.2, no se puede conciliar el subcomponente unet-nodenetworkpolicy-infra

    Síntomas:

    El mensaje de error podría verse de la siguiente manera:

         message: 'Reconciliation error: E0111 - upgrade chart: release unet-nodenetworkpolicy-infra-assets
          failed, and has been rolled back due to atomic being set: cannot patch "mgmt-network"
          with kind Network: admission webhook "vnetwork.networking.gke.io" denied the
          request: Network.networking.gke.io "mgmt-network" is invalid: Spec.NodeInterfaceMatcher:
          Forbidden: Field is immutable'
          observedGeneration: 2

    Solución alternativa:

    1. Si el error se produce en el administrador raíz, en los siguientes pasos, reemplaza KUBECONFIG por el kubeconfig del administrador raíz.
    2. Si el error se produce en la organización, en los siguientes pasos, reemplaza KUBECONFIG por el archivo kubeconfig del administrador de la organización.
    3. Ejecuta lo siguiente:
               alias k="kubectl --kubeconfig=KUBECONFIG"
               k get networks mgmt-network -o json | jq '.spec.nodeInterfaceMatcher.interfaceName'
    4. Si el resultado es eth0, ejecuta el siguiente comando:
      k patch network mgmt-network -p '{"metadata":{"finalizers":null}}' --type=merge
    5. Borrar mgmt-network.
      k delete network mgmt-network
    6. Verifica que el estado de unet-nodenetworkpolicy-infra no tenga errores.

      Por ejemplo:

               alias k="kubectl kubeconfig=KUBECONFIG"
               k get subcomponent unet-nodenetworkpolicy-infra -n org-1

      El resultado se verá así:

               NAME                           AGE   STATUS
               unet-nodenetworkpolicy-infra   34d   ReconciliationCompleted

    Actualizaciones 1.12.2

    Falla el clúster del sistema durante la actualización de la versión 1.11.x a la 1.12.2

    Síntomas:

    Durante o después de la actualización de la versión 1.11.x a la 1.12.2, es posible que los trabajos con el nombre bm-system-add-ons-* fallen con el siguiente error:

       E0326 17:04:22.997270       1 main.go:180] configdrift: Config drift health check failed
    
       F0326 17:04:22.997365       1 main.go:184] One or more checks failed.

    Solución alternativa:

    Aplica las siguientes anotaciones a todos los clústeres de Kubernetes antes de comenzar una actualización de la versión 1.11 a la 1.12.2.

          # To bypass preflight check errors:
          baremetal.cluster.gke.io/bypass-check="vip_subnet"

    Por ejemplo, en el clúster de administrador raíz, usa lo siguiente:

       kubectl annotate -n root cluster root-admin baremetal.cluster.gke.io/bypass-check="vip_subnet" --kubeconfig=ROOT_ADMIN_KUBECONFIG
       

    Actualizar 1.12.2

    El subcomponente file-observability falla en el org-1-system-cluster

    Síntomas:

    Este problema ocurre cuando se actualiza de la versión 1.11.1 a la 1.12.2.

    Observa el archivo .yaml del subcomponente file-observability :

    kubectl get subcomponent file-observability -n org-1-system-cluster -o yaml

    Es posible que el archivo tenga el siguiente mensaje en la sección backendStatus.

    message: 'E0100 - deploy: failed to install chart: release file-observability-backend
            failed, and has been uninstalled due to atomic being set: deployments.apps
            "file-observability-backend-controller" not found'

    Solución alternativa:

    1. Verifica el espacio de nombres file-system para asegurarte de que no finalice en org-admin cluster:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG get namespace file-system
    2. Si se está finalizando, borra cualquier destino de supervisión en el espacio de nombres file-system:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG delete monitoringtarget -n file-system --all
    3. Pausa el subcomponente file-observability hasta que se muestre el subcomponente mon-admin. Para ello, agrega las siguientes anotaciones al subcomponente:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused='true'
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused='true'
    4. Quita la anotación para pausar el subcomponente después de que se complete la actualización:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused-
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused-
    Actualizar 1.12.2

    HSMupgrade falla porque hsmcluster no está listo

    Síntomas:

    Este problema ocurre cuando se actualiza de la versión 1.11.1 a la 1.12.2.

    Cuando se completen todos los pasos de actualización para hsmupgraderequest y ctmclusterupgraderequest, aparecerá el siguiente error:

    HSMCluster "hsmcluster" is not ready. 

    Por ejemplo:

     - lastTransitionTime: "2024-04-08T15:18:45Z" message: HSMCluster "hsmcluster" is not ready observedGeneration:
       2 reason: ziabhsm01PostUpgradeCheckFailed status: "False" type: AllComplete

    Solución alternativa:

    1. Verifica que la actualización se haya completado en el HSM y obtén la dirección IP de cada HSM:
      kubectl get hsm -A --kubeconfig=ROOT_ADMIN_KUBECONFIG

      La salida obtenida se verá así:

      NAMESPACE    NAME          AGE   IP              READY   REASON
      gpc-system   zi-aa-hsm01   11d   10.252.96.192   True    ReconcileHSMSuccess
      gpc-system   zi-ab-hsm01   11d   10.252.97.192   True    ReconcileHSMSuccess
      gpc-system   zi-ac-hsm01   11d   10.252.98.192   True    ReconcileHSMSuccess
    2. Descarga y configura ksctl.
    3. Ejecuta ksctl system info get --url=https://HSM_MANAGEMENT_IP para verificar que todas las versiones del HSM se hayan actualizado a .Spec.TargetVersion de ctmclusterupgraderequest:

      La salida obtenida se verá así:

            ksctl system info get
          {
            "name": "zi-aa-hsm01",
            "version": "2.13.1+10196",
            "model": "CipherTrust Manager k570",
            "vendor": "Thales Group",
            "crypto_version": "1.7.0",
            "uptime": "0 days, 1 hours, 20 minutes",
            "system_time": "2024-04-08T19:51:27Z"
          }

    4. Actualiza el campo Status.FirmwareVersion de cada HSM a la versión actualizada que obtuviste en el paso anterior:

      Por ejemplo:

          kubectl edit-status hsm HSM_NAME -n gpc-system
    5. Actualiza el estado de la última condición ctmclusterupgraderequest.status.conditions de False a True. Después, el estado de la última condición hsmupgraderequest.status.conditions también se vuelve verdadero.

      Por ejemplo:

         kubectl edit-status ctmclusterupgraderequest CTM_VERSION -n gpc-system
         kubectl get ctmclusterupgraderequest CTM_VERSION -n gpc-system -o yaml

    Actualizar 1.12.2
    1.12.4

    IP de administración inaccesible

    Durante una actualización, la IP de administración de un servidor no está disponible, en especial después de una actualización del SO del conmutador.

    Con Rocky Linux, cuando se agregan rutas estáticas, se debe poder acceder a la IP de destino que se usa para llegar a las rutas estáticas antes de agregarlas. Si el conmutador se reinicia después de una actualización del SO, es posible que no se pueda acceder a esa IP de administración de forma temporal.

    Solución alternativa:

    Establece una conexión SSH al servidor con la dirección IP de datos y reinicia el servicio de redes para volver a crear las rutas estáticas faltantes:

    systemctl restart NetworkManager.service
    Sistema de tickets 1.12.2

    Falla en la sincronización de la base de conocimiento del sistema de tickets

    Síntomas:

    Durante una sincronización de la base de conocimiento, es posible que veas el siguiente error:

    Error: Article creation request failed status:400, body:map[error:map[detail:Rejected large REST payload with content-length = 10725676 bytes. Max allowed: 10485760 bytes. 

    Solución alternativa:

    Agrega una propiedad del sistema para aumentar la longitud máxima:

    1. En la plataforma de ServiceNow, ingresa sys_properties.list en el filtro de navegación.
    2. Haz clic en Nuevo.
    3. En el campo Nombre, ingresa glide.rest.max_content_length.
    4. En el campo Tipo, selecciona string.
    5. En el campo Valor, ingresa 15.
    6. Haz clic en Enviar.
    7. Vuelve a sincronizar la base de conocimiento.
    Sistema de tickets 1.12.2

    El sistema de tickets no tiene un upstream en buen estado

    Síntomas:

    Cuando se implementa la organización gdchservices de forma manual, el sistema de tickets no tiene un upstream en buen estado, no se crean VMs y el pod de midserver no está en buen estado en el clúster gdchservices-system en el espacio de nombres support.

    Solución alternativa:

    Crea un nuevo recurso personalizado TicketingSystem con la imagen de VM correcta en el clúster gdchservices-admin:

    apiVersion: ticketing.private.gdc.goog/v1
    kind: TicketingSystem
    metadata:
      name: as-replacement
      namespace: support
    spec:
      replicas: 2
      spec:
        image: ts-controller-app-server-2024-02-07-231907
        imagenamespace: vm-system
        memory: 12G
        size: 100G
        vcpus: 8
      version:
        name: glide-vancouver-07-06-2023__patch5-12-01-2023_12-11-2023_2006.zip
    Actualizar 1.12.2

    Falla la conexión SSH a una VM con IP de administración y los registros de Cilium

    Síntomas:

    El acceso no funciona en una VM con IP de administración. Es posible que veas un error similar a este en los registros del pod de anetd:

    Unable to create endpoint:[PUT /endpoint/{id}][400] putEndpointIdInvalid failed setting up layer2 interface

    Solución alternativa:

    Borra el pod virt-launcher de la VM.

    Actualizar 1.12.2

    El subcomponente mz-etcd actualiza spec.deployTarget y spec.Namespace, lo que provoca que falle la actualización de la versión 1.11.x a la 1.12.x

    Síntomas:

    Durante la actualización de la versión 1.11.x a la 1.12.x, es posible que veas un error como el siguiente:

          kubectl --kubeconfig PATH_TO_ROOT_ADMIN_KUBECONFIG get subcomponent -n root mz-etcd -o yaml
          kubectl --kubeconfig PATH_TO_ROOT_ADMIN_KUBECONFIG get subcomponent -n org-1 mz-etcd -o yaml

    El subcomponente mz-etcd tiene la siguiente especificación antes de una actualización:

                  spec:
              crds:
                helmManifestSpec:
                  chartURL: gcr.io/mz-etcd-crds:1.11.1-gdch.260
                  upgradeHookPolicy: OnVersionChange
              deployTarget: Local
              namespace: ""

    Solución alternativa:

    1. Borra los siguientes subcomponentes en el clúster de administrador raíz:
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n root mz-etcd
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n org-1 mz-etcd
    2. Verifica el subcomponente en los espacios de nombres raíz y de la organización:
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get subcomponent -n root mz-etcd -o yaml
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get subcomponent -n org-1 mz-etcd -o yaml
    3. El nuevo subcomponente debe tener la siguiente especificación, y el chatURL debe mostrar la versión a la que ya se actualizaron los clústeres:
                backend:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-backend:1.12.2-gdch.785
          ...
            dash:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-dash:1.12.2-gdch.785
          ...
            deployTarget: Remote
            namespace: mz-system
            mon:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-mon:1.12.2-gdch.785
                upgradeHookPolicy: OnVersionChange
          ...
            targetClusterName: root-admin
            targetClusterNamespace: root
            webhooks:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-webhooks:1.12.2-gdch.785
                upgradeHookPolicy: OnVersionChange
    Actualizar 1.12.2

    La actualización del almacenamiento de objetos muestra un error durante la verificación previa o posterior al vuelo

    Síntomas:

    Las comprobaciones previas o posteriores a la implementación fallan con un error. Verifica los registros:

    kubectl logs -n gpc-system upgrade-managed-check-objectstorageupgrade-87698-rrjhrW0410

    El error podría verse de la siguiente manera:

     03:42:05.701163       1 upgrade_check.go:276] 1 error occurred:
          * Group "/rbac.sysstd.role.vm-system.wtwf7txfmbhvujhpxrfampnrkdwqsvzro6i7rmo5tsfst4wbxldq" not ready for RBAC resource {Role vm-system g-vm-image-bucket-reader    }
    
       Error: check "ObjectStorageUpgrade" preflight check failed: 1 error occurred:
          * Bucket "gpc-system/range-read-internal" not ready
    
      F0410 03:42:05.701901       1 main.go:80] check "ObjectStorageUpgrade" preflight check failed: 1 error occurred:
          * Bucket "gpc-system/range-read-internal" not ready

    Solución alternativa:

    Si el error se produce durante las verificaciones posteriores al vuelo y todas las demás verificaciones se completan sin errores, omite las verificaciones posteriores al vuelo. Cuando se reinicie la actualización, también debes omitir las verificaciones previas con el kubeconfig de administrador raíz:

     kubectl delete organizationupgrade -n gpc-system ORG_NAME && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-postflight-check=ok && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-preflight-check=ok

    Por ejemplo, si el error se produce en org-1, el comando se verá de la siguiente manera:

     kubectl delete organizationupgrade -n gpc-system org1 && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-postflight-check=ok && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-preflight-check=ok

    Si el error se produce durante las comprobaciones previas y todas las demás comprobaciones previas se completan sin errores, omite las comprobaciones previas:

    kubectl delete organizationupgrade -n gpc-system ORG_NAME && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-preflight-check=ok

    Por ejemplo, si el error se produce en org-1, el comando se verá de la siguiente manera:

    kubectl delete organizationupgrade -n gpc-system org-1 && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-preflight-check=ok

    Es posible que debas aplicar esta solución alternativa más de una vez si no se aplica.

    Cartera de ATAT 1.12.0
    1.12.1
    1.12.2
    1.12.4

    No se sincroniza la cartera

    Síntomas:

    ConfigSync genera un error con el siguiente mensaje:

     KNV2009: failed to apply Portfolio.atat.config.google.com, atat-system/***: failed to create typed patch object (atat-system/***; atat.config. ││ google.com/v1alpha1, Kind=Portfolio): .spec.portfolioName: field not declared in schema. 

    Solución alternativa:

    El esquema de Portfolio cambió en la versión 1.12 de GDC. Se refactorizó el campo portfolioName a portfolioID. Busca el archivo YAML que contiene el recurso personalizado de la cartera mencionado en el mensaje de error. Cambia el nombre del campo portfolioName a portfolioID.

    Actualizar 1.12.2

    La falla de NTP OSPolicy impide que se ejecuten todos los demás OSPolicies

    Síntomas:

    Estos son los posibles motivos por los que no se crea un trabajo en ejecución para un trabajo de parche que solo completó trabajos de verificación previa:

    1. Si falla el NTP, no se ejecutarán los demás trabajos de parches.
    2. El nodo se encuentra en mal estado.
    3. El agente de configuración del SO no se está ejecutando.
    4. El agente de OS Config no puede comunicarse con el servicio de OS Config.
    5. Hay un problema con el servicio de OS Config.

    Solución alternativa:

    1. Verifica el CR de `NodeTargetPolicy` del nodo.
    2. Busca `.spec.osPolicies` del CR de `NodeTargetPolicy` que tiene `ref.name=admin-ntp-policy` y `type: Ready` con el estado falso:
            # Enter the node InventoryMachine name.
            NAME=
            kubectl get nodetargetpolicy -n gpc-system $NAME -ojsonpath="{.spec.osPolicies}" | jq
    3. La salida obtenida se verá así:
       - conditions:
                - lastTransitionTime: "2024-04-19T19:12:01Z"
                  message: ""
                  observedGeneration: 7
                  reason: Complete
                  status: "True"
                  type: PolicyPreflightCompleted
                - lastTransitionTime: "2024-04-19T19:12:01Z"
                  message: ""
                  observedGeneration: 7
                  reason: None
                  status: "True"
                  type: PolicyConflictNone
                - lastTransitionTime: "2024-04-19T19:56:35Z"
                  message: ""
                  observedGeneration: 7
                  reason: Reconciled
                  status: "True"
                  type: Ready
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    4. Borra todas las condiciones de estos `osPolicies` y conserva solo la siguiente parte:
      - conditions:
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    Actualizar 1.12.3
    1.12.4

    NodeUpgrade muestra Rocky Linux

    Síntomas:

    El CR NodeUpgrade menciona version: rocky-86-xyz en su especificación, aunque el nodo que se está actualizando sea Ubuntu.

    Solución alternativa:

    No necesitas una solución alternativa porque esta información es benigna. El nodo se actualiza correctamente a una versión más reciente de Ubuntu.

    SIEM 1.12.0
    1.12.1
    1.12.2
    1.12.3
    1.12.4

    Falla en los trabajos previos a la instalación del SIEM

    Síntomas:

    Los trabajos siem-*-preinstall en el espacio de nombres raíz y org-1 del clúster de administrador raíz fallan de forma reiterada.

    Solución alternativa:

    Se espera que los trabajos fallen cuando la puerta de la función SIEMComponent esté inhabilitada. Las fallas no indican que el componente esté roto. La reconciliación del componente del SIEM se puede pausar si el ruido es perjudicial, pero, en general, se recomienda dejar el componente habilitado si es posible. Si se pausa la conciliación de componentes, se debe volver a habilitar manualmente cuando la instalación del componente del SIEM ya no esté restringida en futuras actualizaciones.

    Actualización de nodos 1.12.0
    1.12.1
    1.12.2

    Falla la actualización del nodo debido a un archivo lvm.conf desactualizado

    Síntomas:

    Es posible que haya problemas con vgs, blkid y gather_facts de Ansible que no responden. Este problema afecta a los SO Rocky y Ubuntu.

    Realiza estos pasos si los nodos ya se actualizaron. El proceso para actualizar el archivo lvm.conf consta de los siguientes pasos:

    1. Obtén una lista de todos los nodos para que se pueda aplicar esta corrección a todos ellos.
    2. Crea un archivo de política de SO y un playbook de Ansible.
    3. Aplica la corrección a los nodos.
    4. Comprueba si se aplicó la corrección.

    Requisitos previos:

    1. Sigue los pasos del manual IAM-R0004 para generar el ROOTCONFIG del clúster de administrador raíz y el ORGCONFIG del clúster de administrador de la organización.
    2. Sigue los pasos del manual IAM-R0005 para obtener los siguientes roles de la organización.

    Solución alternativa:

    1. Identifica los InventoryMachines que corresponden a los clústeres:
      kubectl --kubeconfig=$ROOTCONFIG get inventorymachines
          kubectl --kubeconfig=$ORGCONFIG get inventorymachines

      Mantén la salida separada. Corrige un clúster a la vez. El resultado podría verse de la siguiente manera:

          NAME
          bm-2bca8e3f
          bm-4caa4f4e
    2. Crea un archivo de política y una guía:
      apiVersion: system.private.gdc.goog/v1alpha1
          kind: AnsiblePlaybook
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            playbook: |
              - name: Add a device filter to /etc/lvm/lvm.conf
                hosts: all
                gather_facts: no
                tasks:
                  # Change lvm.conf
                  - name: Configure lvm for filtering out "dm" and "sg" devices
                    ansible.builtin.lineinfile:
                      path: /etc/lvm/lvm.conf
                      insertafter: '^(\s+|)devices(\s+|)\{'
                      line: '  filter = [ \"r|/dev/dm.|\", \"r|/dev/sg.|\" ]'
      
          ---
          apiVersion: system.private.gdc.goog/v1alpha1
          kind: OSPolicy
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            interval:
              period: 1m
            inventory:
               # this is the inventory from step 1 above,
               # see the syntex below
            policy:
              installPlaybook:
                name: lvm-conf-device-filter-node-update
    3. La sección de inventario anterior debe completarse como en este ejemplo. Agrega un párrafo por cada nodo que se encuentre en el paso 1. Harás un clúster a la vez, así que completa la sección de inventario con nodos para un clúster.
      inventory:
            # Node: bm-2bca8e3f
            - apiVersion: baremetal.cluster.gke.io/v1
              kind: InventoryMachine
              name: bm-2bca8e3f
      
            # Node: bm-4caa4f4e
            - apiVersion: baremetal.cluster.gke.io/v1
              kind: InventoryMachine
              name: bm-4caa4f4e
    4. Aplica la corrección al clúster de administrador raíz:
      kubectl --kubeconfig=$ROOTCONFIG apply -f PRECEDING_FILENAME_WITH_ROOT_NODES
    5. Aplica la corrección al clúster de administrador de la organización:
      kubectl --kubeconfig=$ORGCONFIG  apply -f PRECEDING_FILENAME_WITH_ORG_NODES
    6. Reinicia el servidor para que se aplique el nuevo parámetro de configuración.
    7. Sigue los pasos del manual de ejecución OS-P0005 para validar que los nodos se hayan actualizado.
    8. Después de confirmar que la política se completó correctamente, bórrala con la herramienta k9s:
      1. Navega a las políticas del SO, como :ospolicies.
      2. Busca y selecciona la política de lvm-conf-device-filter-node-update.
      3. Presiona Ctrl + D.
      4. Confirma la eliminación.

    Para derivar este problema, presenta un ticket con el manual SUPP-G0008. El ticket debe incluir la siguiente información:

    1. Comandos ejecutados y sus mensajes de salida
    2. Detalles como InventoryMachineName y clústeres
    3. Mensajes de registro
    Sistema operativo (SO) 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Se seleccionó incorrectamente Rocky OS para organizaciones o clústeres nuevos

    Síntomas:

    Este problema ocurre si el entorno se implementó anteriormente con la versión 1.11 y, luego, se actualizó a la versión 1.12. Cuando se crea un clúster o una organización nuevos en una versión 1.12.x, se selecciona el SO Rocky en lugar del SO Ubuntu para el aprovisionamiento de nodos de máquina virtual y equipos físicos debido a la versión del SO Rocky especificada en los CR ReleaseMetadata y Userclustermetadata.

    Solución alternativa:

    Aplica la siguiente solución alternativa antes de crear una organización nueva:

    1. Comprueba si hay CR OrganizationUpgrade que no estén en el estado Succeeded: true:
      for item in $(kubectl --kubeconfig=KUBECONFIG get OrganizationUpgrade -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace --no-headers); do
        NAME=$(echo $item | awk '{print $1}')
        NAMESPACE=$(echo $item | awk '{print $2}')
        STATUS=$(kubectl --kubeconfig=KUBECONFIG get organizationupgrade ${NAME} -n ${NAMESPACE} -o json | jq '.status.conditions[] |  select(.type=="Succeeded") | .status')
        if [[ "$STATUS" != "True" ]]; then
           echo "Not in Succeeded: true state, stop following operations"
        fi
      done

      Si es así, deriva el caso al equipo de ingeniería antes de continuar con los siguientes pasos.

    2. Quita todos los CR de OrganizationUpgrade existentes para evitar actualizaciones accidentales del SO del nodo:
      for item in $(kubectl --kubeconfig=KUBECONFIG get OrganizationUpgrade -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace --no-headers); do
        NAME=$(echo $item | awk '{print $1}')
        NAMESPACE=$(echo $item | awk '{print $2}')
        echo "Deleting OrganizationUpgrade $NAME in namespace $NAMESPACE"
        kubectl --kubeconfig=KUBECONFIG delete OrganizationUpgrade $NAME -n $NAMESPACE
      done
    3. Define la versión de GDC de destino para la creación de la organización nueva. Debe haber un objeto ReleaseMetadata correspondiente a esta versión de destino:
      TARGET_RELEASE=
    4. Identifica la CR de OSImageMetadata más reciente para el SO Ubuntu de destino en el clúster de administrador raíz y define la variable OS_VERSION:
      OS_VERSION=$(kubectl --kubeconfig=KUBECONFIG get osimagemetadata --sort-by=.metadata.creationTimestamp | grep -wv rocky | tail -1 |  awk '{print $1}' |  sed 's/gdch-node-os-//g')
      
      echo $OS_VERSION

      El resultado podría verse de la siguiente manera:

      1.12.4-gdch.4

      Asegúrate de que la variable use la misma versión principal.secundaria.parche, como 1.12.4, que TARGET_RELEASE. De lo contrario, deriva el caso al equipo de ingeniería antes de continuar con los próximos pasos.

    5. Actualiza el ReleaseMetadata de destino para usar el OS_VERSION de Ubuntu en el clúster de administrador raíz:
      kubectl --kubeconfig=KUBECONFIG patch releasemetadata "${TARGET_RELEASE}" --type='json' -p='[{"op": "replace", "path": "/spec/adminCluster/bmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/adminCluster/vmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/systemCluster/bmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/systemCluster/vmNodeImage", "value": '"${OS_VERSION}"'}]'
    6. Identifica la lista de UserclusterMetadata asignados para el ReleaseMetadata objetivo:
      UCMS=$(kubectl --kubeconfig=KUBECONFIG get releasemetadata  "${TARGET_RELEASE}" -o json | jq -r '.spec.userClusters[].name')
    7. Actualiza el UserclusterMetadata de destino para usar el OS_VERSION de Ubuntu en el clúster de administrador raíz y en el clúster de administrador de la organización para cada organización. Ejecuta el siguiente comando para cada clúster:
      for UCM in ${UCMS}; do
        echo "Updating UserclusterMetadata $UCM"
        kubectl --kubeconfig=KUBECONFIG patch userclustermetadata.upgrade.private.gdc.goog "${UCM}" --type='json' -p='[{"op": "replace", "path": "/spec/vmNodeImage", "value": '"${OS_VERSION}"'}]'
      done
    Máquinas virtuales 1.12.1
    1.12.2
    1.12.4

    Falla la importación de imágenes de BYO para imágenes qcow2 y sin procesar

    Síntomas:

    Cuando se importan imágenes de VM locales con la CLI de gdcloud compute images import, el estado de importación se queda atascado en WaitingForTranslationVM o ImportJobNotCreated. Esto se debe a que el disco temporal creado para la traducción o la importación usa el tamaño exacto que la imagen qcow2 o sin procesar, pero LUKS agrega una sobrecarga de algunos MiB que provoca que falle el aprovisionamiento del disco.

    Solución alternativa:

    Crea un nuevo VirtualMachineImageImport de forma manual con el mismo nombre de imagen, pero con un spec.minimumDiskSize más grande. Por ejemplo, si este fue el comando que se usó para importar la imagen:

    gdcloud compute images import $IMPORT_NAME --project $PROJECT --source-file=$LOCAL_FILENAME --os=$OS

    Si el VirtualMachineImageImport original creado automáticamente por la CLI tiene minimumDiskSize como X Gi, crea uno nuevo con X + 1 Gi. El valor se basa en el tamaño de la imagen que se importa. En el caso de qcow2, sería el tamaño virtual, por ejemplo, 20 Gi debería reemplazarse por 21 Gi.

    Reemplaza los valores de marcador de posición según la forma en que se llamó a la CLI.

    1. Busca el VirtualMachineImageImport:
      kubectl get virtualmachineimageimport $IMPORT_NAME -n $PROJECT -o yaml

      Si el objeto no está presente, vuelve a activar el comando gdcloud compute images import .... Después de que la salida de la consola cambie de Uploading image to ... a Image import has started for ..., presiona CTRL + C para que la imagen local se suba al almacenamiento de objetos y se conserve el VirtualMachineImageImport para crear uno nuevo.

    2. Crea un nuevo VirtualMachineImageImport con un minimumDiskSize más grande:
      apiVersion: virtualmachine.gdc.goog/v1
      kind: VirtualMachineImageImport
      metadata:
        name: $IMPORT_NAME_NEW
        namespace: $NAMESPACE
      spec:
        imageMetadata:
          minimumDiskSize: $NEW_SIZE
          name: $IMAGE_NAME
          operatingSystem: $OS
        source:
           objectStorage:
            bucketRef:
              name: vm-images-bucket
            objectName: $LOCAL_FILENAME
    Máquinas virtuales 1.12.0
    1.12.1
    1.12.2
    1.12.3

    La importación de imágenes está atascada en TranslationInProgress

    Síntomas:

    El Pod importer-image-import-$VMII en el espacio de nombres del proyecto del clúster del sistema falla con el siguiente error: Unable to process data: Unable to transfer source data to target file: unable to write to file: stream error: stream ID 1; NO_ERROR; received from peer`). El objeto VirtualMachineImageImport de VMII tiene el tipo de condición Ready con el estado False y el motivo TranslationInProgress después de 2 h de iniciar la importación.

    Solución alternativa:

    Para mejorar la velocidad, modifica el tamaño mínimo del disco de la imagen a 200 Gi de la siguiente manera:

    kubectl get validatingwebhookconfiguration vmm-image-controller-v1-webhook -oyaml > /tmp/vmm-image-controller-v1-webhook.yaml
    kubectl delete validatingwebhookconfiguration vmm-image-controller-v1-webhook
    kubectl patch virtualmachineimageimport $VMII -n $PROJECT -p '{"spec": {"imageMetadata": {"minimumDiskSize": "200Gi"}}}'
    kubectl apply -f /tmp/vmm-image-controller-v1-webhook.yaml

    Ten en cuenta que, para borrar y aplicar el ValidatingWebhookConfiguration, necesitas el kubeconfig del administrador del clúster para el clúster de administrador de la organización. Puedes obtener el siguiente manual de ejecución IAM-R0004.

    Si usas gdcloud para iniciar la importación, ten en cuenta que no hay forma de proporcionar el parámetro minimumDiskSize. Debes crear un objeto VMII y modificarlo como se muestra en el comando anterior.

    El proceso de VirtualMachineImageImport continúa, pero se vuelve a detener en un paso posterior. En el espacio de nombres del proyecto en el clúster del sistema, verás que el trabajo image-import-$VMII falla continuamente con el error error: stream error: stream ID x; NO_ERROR; received from peer. En este punto, se completa la importación de imágenes. La imagen final se sube al almacenamiento de objetos, pero falta el VirtualMachineImage. Puedes crear un objeto VirtualMachineImage de forma manual de la siguiente manera:

    kubectl apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineImage
    metadata:
      name: $NAME
      namespace: $PROJECT
    spec:
      minimumDiskSize: 200Gi
      operatingSystem:
        name: $OS_NAME
    EOF

    "$NAME" debe coincidir con "VMII.ImageMetadata.Name", y "$OS_NAME" puede ser uno de los siguientes valores: "ubuntu-2004", "ubuntu-2204", "windows-2019" o "rhel-8", y debe coincidir con el tipo de imagen importada.

    Istio 1.12.4

    La implementación de istio-eastwestgateway en el espacio de nombres istio-system está atascada

    Síntomas:

    La implementación de istio-eastwestgateway en el espacio de nombres istio-system está bloqueada, y los eventos del Pod muestran un error Back-off pulling image "auto" de kubelet.

    Para diagnosticar el problema, verifica si el mutatingwebhookconfiguration llamado istio-revision-tag-default existe en el mismo clúster que la implementación de la puerta de enlace atascada.

    kubectl --kubeconfig=KUBECONFIG get mutatingwebhookconfiguration istio-revision-tag-default

    Solución alternativa:

    • Si la configuración existe, reinicia la implementación istio-eastwestgateway en el espacio de nombres istio-system.
      kubectl --kubeconfig=KUBECONFIG rollout restart deployment/istio-eastwestgateway -n istio-system
    • Si la configuración no existe, espera hasta que el webhook exista, lo que debería suceder en breve, ya que está en un bucle de reconciliación.
    Supervisión 1.12.2

    cortex-store-gateway se reinicia con un error de límites de segmentos fuera de rango

    Síntomas:

    Los Pods de cortex-store-gateway se reinician con el siguiente mensaje de error en los registros:

    panic: runtime error: slice bounds out of range

    Solución alternativa:

    1. Pausa el subcomponente mon-cortex en el clúster del sistema.
      kubectl --kubeconfig $ORG_ADMIN_CONFIG annotate subcomponent mon-cortex -n $SYSTEM_CLUSTER_NAMESPACE lcm.private.gdc.goog/paused=true
    2. Modifica el configMap cortex-config en el clúster del sistema y configura el tiempo de espera para memcached dentro de index_cache en dos segundos, de modo que la configuración de index_cache se vea de la siguiente manera:
       index_cache:
            backend: memcached
            memcached:
              addresses: dnssrvnoa+_memcached._tcp.cortex-index-memcached.mon-system.svc.cluster.local
              timeout: 2s
    3. Reinicia los Pods de cortex-store-gateway en el clúster del sistema para que usen la configuración actualizada.
    Actualizar 1.12.4

    El reinicio del nodo de administrador raíz durante la actualización causa una falla en un subcomponente

    Síntomas:

    El nodo de metal desnudo aparece como NotReady y el servidor se queda atascado en la pantalla de inicio con el último mensaje que dice Retrieving encryption keys.

    Solución alternativa:

    1. Reinicia iLO.
    2. Una vez que iLO vuelva a estar en funcionamiento, reinicia el servidor.
    Actualizar 1.12.4

    El número de versión de storagecluster no se muestra durante la actualización

    Síntomas:

    Después de la actualización, el CR StorageCluster no muestra ningún valor para el campo de estado StorageVersion. Verifica la versión:

    kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get StorageCluster -n gpc-system
    Si el campo de versión está vacío, sigue los pasos de la solución alternativa.

    Solución alternativa:

    Reinicia la implementación de file-storage-backend-controller:

    kubectl --kubeconfig  ROOT_ADMIN_KUBECONFIG rollout restart deployment -n file-system file-storage-backend-controller

    Infraestructura de Operations Suite (OI) 1.12.4

    La ruta del instalador de Fluent Bit es incorrecta

    Síntomas:

    La ubicación del instalador de fluent-bit cambió a operations_center\bin\fluent-bit-win64.msi. El Copy-ConfigHostFiles.ps1 espera que el instalador del cliente fluent-bit coincida con el patrón fluent-bit-*-win64.*. El instalador no encuentra el instalador, ya que ese patrón ya no coincide.

    Solución alternativa:

    1. Abre el archivo Copy-ConfigHostFiles.ps1.
    2. Busca la siguiente línea:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-*-win64.*').FullName
    3. Edita la línea anterior para agregar la ubicación correcta del instalador:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-win64.*').Name
    Infraestructura de Operations Suite (OI) 1.12.4

    La ruta del instalador de Nessus es incorrecta

    Síntomas:

    La ubicación del instalador de Nessus se cambió a operations_center\bin\NessusAgent-x64.msi. Copy-ConfigHostFiles.ps1 espera que el instalador del cliente coincida con el nombre de archivo /NessusAgent-10.4.1-x64.msi. El instalador no encuentra el instalador, ya que ese patrón ya no coincide.

    Solución alternativa:

    1. Abre el archivo Copy-ConfigHostFiles.ps1.
    2. Busca las siguientes líneas:
      [pscustomobject]@{source = "H:\operations_center\bin\Nessus-10.4.1-x64.msi"; destination = "C:\config\nessus_mgr\Nessus-10.4.1-x64.msi" }
      [pscustomobject]@{source = "H:\operations_center\bin\Nessus-10.4.1-x64.msi"; destination = "C:\config\nessus_oob\Nessus-10.4.1-x64.msi" }
    3. Edita las líneas anteriores para agregar la ubicación correcta del instalador y cambia Nessus-10.4.1-x64.msi por NessusAgent-x64.msi:
      [pscustomobject]@{source = "H:\operations_center\bin\NessusAgent-x64.msi"; destination = "C:\config\nessus_mgr\NessusAgent-x64.msi" }
      [pscustomobject]@{source = "H:\operations_center\bin\NessusAgent-x64.msi"; destination = "C:\config\nessus_oob\NessusAgent-x64.msi" }
    Almacenamiento de objetos 1.12.4

    La creación de una organización nueva se detiene en el estado VMImageDistributing

    Síntomas:

    Es posible que veas un mensaje como este:

    Reason:                NamespaceCreated
    Status:                True
    Type:                  ObjectNamespaceReady
    Last Transition Time:  2024-07-12T00:49:29Z
    Message:               awaiting images distribution to be finished
    Observed Generation:   1
    Reason:                VMImageDistributing
    Status:                Unknown
    Type:                  Ready  

    Este problema se debe a la falta de configuración del extremo de S3 para la organización nueva.

    Solución alternativa:

    Crea manualmente un grupo de HA para la nueva organización.

    1. A través del procedimiento de emergencia, adquiere un kubeconfig del clúster de administrador raíz que tenga acceso de lectura a los siguientes recursos:
      • Organización
      • ObjectStorageAdminNode
      • SubnetClaim
      • ObjectStorageSite
      • Secreto
    2. Toma nota del nombre de la organización:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get Organization -A
    3. Anota las direcciones IP de cliente de los CR de ObjectStorageAdminNode en el clúster de administrador raíz.
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode

      Para cada CR de AdminNode, haz lo siguiente:

      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode NODE_NAME -o jsonpath='{.spec.network.clientIP}'
    4. Toma nota del rango de direcciones IP disponibles y las IPs reservadas en ese rango:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get SubnetClaim -n root external-objectstorage-client-lif-subnet -o jsonpath='{.status.ipv4SubnetStatus}'
    5. Recupera las credenciales de acceso a la IU de administración de StorageGRID del secreto gpc-system/objectstorage-breakglass-root-level1 en el clúster root-admin.
    6. Accede a la IU de administración de StorageGRID con las credenciales del paso anterior. La URL tiene el estado ObjectStorageSite:
      kubectl --kubeconfig /root/release/root-admin/root-admin-kubeconfig get ObjectStorageSite -n gpc-system mb-obj-site-1 -o jsonpath='{.status.managementAPIEndpointURL}'
    7. Ve a la pestaña Configuración y haz clic en Grupos de alta disponibilidad.
    8. Abre la vista de detalles de cada grupo de HA y anota su dirección IP virtual (VIP).
    9. Crea un nuevo grupo de HA:
      1. Nombre del grupo: El patrón de nombres es ORGANIZATION_NAME-ha. En este caso, es org-2-ha.
      2. Descripción del grupo: Usa grupos de HA existentes para el patrón de descripción.
      3. Interfaces: Selecciona todas las eth2.
      4. El orden de prioridad: La interfaz principal debe tener la prioridad más alta.
      5. SubnetCIDR: StorageGRID completa este campo automáticamente. Verifica que la subred coincida con status.ipv4SubnetStatus.cidrBlock en SubnetClaim external-objectstorage-client-lif-cidr.
      6. IP virtual: Es la siguiente IP en el rango de IP disponible. La IP no puede entrar en conflicto con la IP reservada, la IP del cliente del nodo de administrador ni las VIP de los grupos de HA existentes.
    10. Rota las credenciales de emergencia de StorageGRID.
    Actualizar 1.12.4

    Conciliación continua en el subcomponente

    Síntomas:

    Cuando se actualiza la organización raíz de la versión 1.12.2 a la 1.12.4, el subcomponente iac-gitlab tiene un estado de reconciliación en curso. Para diagnosticar el problema, verifica los registros de Prometheus, por ejemplo:

    kubectl logs gitlab-prometheus-server-5d6d9599f-l2l7s -n gitlab-system -c prometheus-server

    Es posible que los registros incluyan un error como el siguiente:

    unexpected fault address 0x7f217cf26000
    fatal error: fault
    [signal SIGBUS: bus error code=0x2 addr=0x7f217cf26000 pc=0x46c302]
    
    goroutine 1 [running]:
    runtime.throw({0x3018bed?, 0x0?})
        /usr/local/go/src/runtime/panic.go:992 +0x71 fp=0xc000a3b098 sp=0xc000a3b068 pc=0x438431

    Solución alternativa:

    1. Por ejemplo, ejecuta sleep 3600 para obtener una shell en el contenedor en ejecución.
      kubectl exec --stdin --tty POD_NAME -n gitlab-system -c prometheus-server -- /bin/sh
      /prometheus $ df -h

      Reemplaza POD_NAME por el nombre del pod, como gitlab-prometheus-server-d7969c968-hppsl.

    2. Verifica el resultado para ver si la carpeta /data está llena:
      Filesystem                Size      Used Available Use% Mounted on
      overlay                 866.4G    147.1G    719.3G  17% /
      tmpfs                    64.0M         0     64.0M   0% /dev
      tmpfs                    94.3G         0     94.3G   0% /sys/fs/cgroup/dev/mapper/luks-trident_pvc_6fb4dc48_72df_4bf1_825f_267818e3fefd
                                7.8G      7.3G         0 100% /data
    3. Si este problema ocurre durante la actualización, borra el trabajo de migración, ya que tiene un tiempo de espera de 3,600 s, y, luego, continúa con la actualización:
      kubectl delete job gitlab-migrations-1-fe7-2 -n gitlab-system
    Actualizar 1.12.4

    Falla la verificación previa de IAM

    Síntomas:

    Para diagnosticar el problema, revisa los registros de actualización de IAM, por ejemplo:

    kubectl logs -n gpc-system upgrade-managed-check-iamupgrade-qbdm5-tl264 

    El resultado podría verse de la siguiente manera:

    I0724 21:57:20.456782       1 upgrade_check.go:39] IAM preflight check failed after 60000000000: Org iam-system deployments not ready: Deployment iam-authzpdp-backend-server is not ready; ready replicas 2,replicas 3

    Solución alternativa:

    1. Consulta el mensaje de error anterior y anota el espacio de nombres y el nombre de la implementación. En este ejemplo, NAME es iam-authzpdp-backend-server y NAMESPACE es iam-system.
    2. Obtén la lista de pods:
      kubectl get pods -n NAMESPACE | grep NAME
    3. Observa el resultado en el siguiente formato:
      iam-authzpdp-backend-server-6875654c4b-64h4t            2/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-pvscg            1/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-v7jnl            2/2     Running   0             29h

      Observa el Pod que no tiene todos los contenedores listos. En este caso, POD_NAME es iam-authzpdp-backend-server-6875654c4b-pvscg, que tiene uno de los dos contenedores no listos, como se muestra en el estado 1/2. Si hay más de un pod como este, repite el siguiente paso para cada pod afectado.

    4. Borra el pod que no está completamente en buen estado:
      kubectl delete pod -n NAMESPACE POD_NAME>
    5. Vuelve a ejecutar el comando del paso 2. Observa que todos los Pods deberían estar en buen estado ahora. Este paso puede tardar unos minutos.
    6. Si el pod borrado no se reemplaza por uno en buen estado, abre un ticket de asistencia.
    Actualizar 1.12.1
    1.12.2
    1.12.4

    El estado de OrganizationUpgrade es Unknown

    Síntomas:

    El estado OrganizationUpgrade es Unknown después de que se completa una actualización.

    Solución alternativa:

    Si el campo de versión en Organization coincide con el campo targetVersion, puedes ignorar el estado Desconocido.

    Actualizar 1.12.4

    Error en la actualización del subcomponente opa gatekeeper

    Síntomas:

    Durante la actualización de la organización del arrendatario de la versión 1.12.2 a la 1.12.4, la actualización del subcomponente opa gatekeeper falla con un ReconciliationError.

    Solución alternativa:

    1. Edita el objeto mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg del clúster de usuario afectado. Si hay más de un clúster de usuario afectado, repite los pasos para cada uno de ellos:
           kubectl edit mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg
    2. Edita la sección webhooks > (edr-sidecar-injector.gpc-system.internal) > namespaceSelector > matchExpressions > (key: kubernetes.io/metadata.name) > values para agregarle los siguientes dos valores:
      • opa-system
      • cert-manager

      El objeto actualizado debería verse de la siguiente manera:

                  apiVersion: admissionregistration.k8s.io/v1
              kind: MutatingWebhookConfiguration
              ...
              webhooks:
              - admissionReviewVersions:
                name: edr-sidecar-injector.gpc-system.internal
                namespaceSelector:
                  matchExpressions:
                  - key: kubernetes.io/metadata.name
                    operator: NotIn
                    values:
                    - kube-system
                    - opa-system
                    - cert-manager
              ...

    3. Los cambios pueden tardar hasta una hora en resolver el problema.
    Actualizar 1.12.4

    ansibleplaybook no se actualiza como parte de la actualización del clúster

    Síntomas:

    Cuando se actualiza de la versión 1.12.2 a la 1.12.4, ansibleplaybook no se actualiza como parte de la actualización del clúster. Las correcciones actualizadas en ansibleplaybook no se aplican y bloquean la política del SO que ejecuta la versión anterior de ansibleplaybook.

    Solución alternativa:

    1. Borra el trabajo de Kubernetes create-ansible-playbooks:
            JOB_NAME=create-ansible-playbooks-xxx
            JOB_NAMESPACE=xxx
            kubectl delete job $JOB_NAME -n JOB_NAMESPACE --kubeconfig=/path/to/admin-cluster-config 
    2. Reinicia la implementación de os-core-controller.
    3. Esta acción vuelve a activar los trabajos y actualiza las guías.
    DNS 1.12.4

    Falla la creación de la organización porque el tráfico de DNS al nodo de administrador raíz vence

    Síntomas:

    Cuando crees una organización nueva, es posible que veas que el subcomponente core-dns agota el tiempo de espera en los registros:

    [INFO] 192.0.2.0:60741 - 40400 "A IN objectstorage-tenant-mgmt.gdch.example.com. udp 72 false 1232" - - 0 2.000828817s
    [ERROR] plugin/errors: 2 objectstorage-tenant-mgmt.gdch.example.com. A: read udp 10.244.4.184:59927->192.0.2.1:53: i/o timeout
    [INFO] 192.0.2.0:51401 - 5813 "AAAA IN objectstorage-tenant-mgmt.gdch.example.com. udp 72 false 1232" - - 0 2.000585231s
    [ERROR] plugin/errors: 2 objectstorage-tenant-mgmt.gdch.example.com. AAAA: read udp 10.244.4.184:48542->192.0.2.1:53: i/o timeout

    Solución alternativa:

    1. Actualiza los servicios gpc-coredns-forwarder-udp y gpc-coredns-forwarder-tcp del clúster de administrador raíz, y agrega tus nuevos rangos de IP en los rangos de origen del balanceador de cargas.
    2. Si se anulan los cambios de CR, detén el subcomponente dns-core con la anotación lcm.private.gdc.goog/paused="true".
    Almacenamiento de archivos y en bloques 1.12.4

    Falla el subcomponente file-netapp-trident en el clúster raíz

    Síntomas:

    Cuando se actualiza de la versión 1.12.2 a la 1.12.4, el subcomponente file-netapp-trident se detiene en el borrado de StorageClasses. Se muestra el siguiente estado:

          status:
      backendStatus:
        conditions:
        - lastTransitionTime: "2024-05-02T06:04:14Z"
          message: 'E0121 - rollback chart: no StorageClass with the name "standard-rwo-non-luks"
            found'
          observedGeneration: 2
          reason: ReconciliationError
          status: "True"
          type: Reconciling
        - lastTransitionTime: "2024-04-08T00:12:53Z"
          message: Successfully pulled chart
          observedGeneration: 2
          reason: ChartPullDone
          status: "True"
          type: ChartPull
        - lastTransitionTime: "2024-05-01T10:10:08Z"
          message: Fetched parameters from default, runtime
          observedGeneration: 2
          reason: ParametersDone
          status: "True"
          type: Parameters
        - lastTransitionTime: "2024-05-02T06:04:04Z"
          message: 'E0121 - rollback chart: no StorageClass with the name "standard-rwo-non-luks"
            found'
          observedGeneration: 2
          reason: DeployError
          status: "False"
          type: Deployed
        - lastTransitionTime: "2024-04-23T06:50:12Z"
          message: Readiness check job passed
          observedGeneration: 1
          reason: ReadinessCheckDone
          status: "True"
          type: Ready
        deploymentFinished: false
        lastDeployTimestamp: "2024-05-02T06:03:16Z"
        readyAfterDeploy: true
        version: ""
      conditions:
      - lastTransitionTime: "2024-05-02T06:04:14Z"
        message: 'Reconciliation error: E0121 - rollback chart: no StorageClass with the
          name "standard-rwo-non-luks" found'
        observedGeneration: 2
        reason: ReconciliationError
        status: "True"
        type: Reconciling
      crdsStatus:
        conditions:
        - lastTransitionTime: "2024-04-07T08:02:33Z"
          message: Successfully pulled chart
          observedGeneration: 2
          reason: ChartPullDone
          status: "True"
          type: ChartPull
        - lastTransitionTime: "2024-04-07T08:02:33Z"
          message: No parameters to fetch
          observedGeneration: 2
          reason: ParametersDone
          status: "True"
          type: Parameters
        - lastTransitionTime: "2024-04-07T08:02:34Z"
          message: Readiness source is empty
          observedGeneration: 2
          reason: ReadinessCheckSkipped
          status: "True"
          type: Ready
        - lastTransitionTime: "2024-05-01T18:37:52Z"
          message: Ready
          observedGeneration: 2
          reason: ReconciliationCompleted
          status: "False"
          type: Reconciling
        deploymentFinished: true
        lastDeployTimestamp: "2024-05-02T06:04:03Z"
        readyAfterDeploy: true
        version: 1.12.3-gdch.312

    Solución alternativa:

    1. Pausa el subcomponente file-netapp-trident:
            ## Set KUBECONFIG to root-admin KUBECONFIG
            export KUBECONFIG=ROOT_ADMIN_KUBECONFIG
            kubectl annotate subcomponent file-netapp-trident -n $cluster_namespace lcm.private.gdc.goog/paused=true
    2. Borra el StorageClasses que el trabajo no pudo crear, como standard-rwo, standard-block, standard-rwo-non-luks y standard-block-non-luks:
            kubectl delete storageclass $(kubectl get storageclasses -o jsonpath='{.items[?(@.provisioner=="csi.trident.netapp.io")].metadata.name}
    3. Para activar la recreación de StorageClasses, reinicia el oclcm-backend-controller de tu clúster (controlador root-admin para clústeres de administrador raíz y de organización, controlador org-admin para clústeres de sistema y de usuario):
            kubectl rollout restart deployment oclcm-cm-backend-controller -n oclcm-system
    4. Reinicia la implementación de netapp-trident y netapp-trident DaemonSet en el clúster:
            kubectl rollout restart deployment netapp-trident-controller -n netapp-trident
            kubectl rollout restart daemonset netapp-trident-node-linux -n netapp-trident
    5. Verifica que se haya creado el secreto de LUKS para tus recursos de PersistentVolumeClaim (PVC). Cada PVC debe tener un secreto en el formato g-luks-$pvc_name.
            kubectl get secret -n $pvc_namespace g-luks-$pvc_name
    6. Verifica que el subcomponente file-netapp-trident no tenga errores en el estado:
            kubectl get subcomponent -n $cluster_namespace file-netapp-trident -o jsonpath='{.status}' | jq
      Nota: No debe haber errores en los mensajes ni en el campo `backendStatus`. El campo `crdStatus` debe mostrar `deploymentFinished: true`.
    7. Anula la pausa del subcomponente para que se apliquen los reemplazos.
    Servidores físicos 1.12.4

    Falla en el arranque del servidor

    Síntomas:

    Cuando se inicie el servidor, es posible que veas un mensaje como este en los registros de Bare Metal:

    Conditions:
        Last Transition Time:  2024-08-12T17:10:23Z
        Message:               Introspection timeout
        Observed Generation:   2
        Reason:                FailedProvision
        Status:                True
        Type:                  BaremetalFailure
        Last Transition Time:  2024-08-10T12:23:30Z
        Message:
        Observed Generation:   2
        Reason:                KeyManagerConfigurationSucceeded
        Status:                True
        Type:                  KeyManagerConfigured
        Last Transition Time:  2024-08-10T12:11:17Z
        Message:               The server is powered off or unknown
        Observed Generation:   2
        Reason:                NotPoweredOn
        Status:                False
        Type:                  Ready

    Solución alternativa:

    1. Para cada fase atascada, sigue las instrucciones de los siguientes manuales de ejecución:
      1. SERV-R0006
      2. SERV-R0007
      3. SERV-R0008
    2. Si el problema persiste, sigue los pasos del manual de ejecución SERV-R0001.
    3. Si el problema persiste, abre un ticket de asistencia.
    Actualizar 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Los Pods de Prometheus principales no se limpian durante la actualización

    Síntomas:

    Los Pods primary-prometheus-shardX-replicaX son visibles en los espacios de nombres obs-system y mon-system. Si primary-prometheus-shardX-replicaX solo existe en el espacio de nombres obs-system después de una actualización a la versión 1.12, se trata de un problema desconocido diferente y no se debe realizar la solución alternativa.

    El comportamiento previsto es que primary-prometheus-shardX-replicaX solo exista en el espacio de nombres mon-system después de que se complete la actualización a la versión 1.12.

    Solución alternativa:

    1. Borra manualmente los StatefulSets de primary-prometheus-shardX-replicaX en el espacio de nombres obs-system.
    2. No borres los StatefulSets primary-prometheus-shardX-replicaX en el espacio de nombres mon-system.
    Redes 1.12.4

    PodCIDR no se asigna a los nodos, aunque se cree ClusterCIDRConfig

    Síntomas:

    Un objeto ClusterCIDRConfig es obligatorio para asignar PodCIDRs. A pesar de que se creó el ClusterCIDRConfig, no se asignó el PodCIDRs. Este problema ocurre si se crea un ClusterCIDRConfig al mismo tiempo que se inicializan los Pods de ipam-controller. La creación del clúster está atascada en el estado de conciliación:

    1. Verifica si se creó el objeto ClusterCIDRConfig en el clúster:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get clustercidrconfigs -oyaml

      El resultado podría verse de la siguiente manera:

      apiVersion: v1
          items:
          - apiVersion: networking.gke.io/v1alpha1
            kind: ClusterCIDRConfig
            metadata:
              annotations:
                baremetal.cluster.gke.io/managed: "true"
                kubectl.kubernetes.io/last-applied-configuration: |
                  {"apiVersion":"networking.gke.io/v1alpha1","kind":"ClusterCIDRConfig","metadata":{"annotations":{"baremetal.cluster.gke.io/managed":"true"},"creationTimestamp":null,"name":"root-admin-control-plane"},"spec":{"ipv4":{"cidr":"172.24.0.0/21","perNodeMaskSize":23},"ipv6":{"cidr":"fd00:1::2:0/112","perNodeMaskSize":119}},"status":{}}
              creationTimestamp: "2024-06-17T05:27:55Z"
              finalizers:
              - networking.kubernetes.io/cluster-cidr-config-finalizer
              generation: 1
              name: root-admin-control-plane
              resourceVersion: "2172"
              uid: d1216fe3-04ed-4356-a105-170d72d56c90
            spec:
              ipv4:
                cidr: 172.24.0.0/21
                perNodeMaskSize: 23
              ipv6:
                cidr: fd00:1::2:0/112
                perNodeMaskSize: 119
          kind: List
          metadata:
            resourceVersion: ""
    2. Ejecuta la descripción de uno de los objetos de nodo del clúster que está atascado en la reconciliación y verifica si hay un evento CIDRNotAvailable en el objeto de nodo:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG describe node NODE_NAME

      Los eventos de salida podrían verse de la siguiente manera:

      Type     Reason            Age                   From             Message
            ----     ------            ----                  ----             -------
            Normal   CIDRNotAvailable  3m22s (x96 over 21h)  cidrAllocator    Node gpc-adhoc-4f533d50vm-worker-node2-zone1 status is now: CIDRNotAvailable
            Warning  ReconcileError    3m22s (x96 over 21h)  ipam-controller  CIDRAssignmentFailed, retrying: failed to get cidrs for node gpc-adhoc-4f533d50vm-worker-node2-zone1, unable to get clusterCIDRs for node gpc-adhoc-4f533d50vm-worker-node2-zone1, no available CIDRs

    Solución alternativa:

    1. Reinicia los Pods ipam-controller-manager:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG -n kube-system rollout restart ds ipam-controller-manager
    2. Después de que los Pods de ipam-controller-manager estén en estado de ejecución, verifica si podCIDR está asignado a los nodos:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get nodes -oyaml | grep podCIDR

      El resultado podría verse de la siguiente manera:

      podCIDR: 172.24.4.0/23
          podCIDRs:
          podCIDR: 172.24.2.0/23
          podCIDRs:
          podCIDR: 172.24.0.0/23
          podCIDRs:
    Vertex AI 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Las APIs entrenadas previamente muestran un estado de Enabling en la interfaz de usuario

    El MonitoringTarget muestra un estado Not Ready cuando se crean clústeres de usuarios, lo que hace que las APIs previamente entrenadas muestren continuamente un estado Enabling en la interfaz de usuario.

    Solución alternativa:

    1. Abre el menú en tu navegador Chrome (ícono de tres puntos).
    2. Haz clic en Más herramientas > Herramientas para desarrolladores para abrir la consola.
    3. Haz clic en la pestaña Red de la consola.
    4. Busca las solicitudes de ai-service-status.
    5. Haz clic en la pestaña Response en una solicitud ai-service-status para mostrar el contenido de esa solicitud.
    6. Verifica que todo se vea listo, excepto los componentes MonitoringTarget y LoggingTarget.
    Almacenamiento de objetos 1.12.4

    Se pueden ignorar algunas advertencias de actualización del almacenamiento de objetos

    Síntomas:

    Cuando actualices el almacenamiento de objetos, es posible que veas una advertencia como esta:

     Type     Reason          Age                From                              Message
      ----     ------          ----               ----                              -------
      Warning  ReconcileError  55m (x2 over 55m)  ObjectStorageAdminNodeReconciler  Reconcile error, retrying: error storing the ssh creds: 500 Internal Server Error:ErrorMessage: {"text":"The GDU service is currently busy. Try again later. Contact technical support if the issue persists.","key":"maintenance.gdu.gdu_server_locked

    Solución alternativa:

    1. Verifica que cada nodo tenga las credenciales de SSH correspondientes almacenadas en un secreto.
      1. Verifica los nodos de administrador:
        kubectl get objectstorageadminnodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done
      2. Verifica los nodos de almacenamiento:
        kubectl get objectstoragestoragenodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done

      El resultado correcto se ve como este ejemplo para los nodos de almacenamiento:

      NAME                                      TYPE     DATA   AGE
      gpcstgecn01-gce-gpcstgesite01-ssh-creds   Opaque   2      3d23h
      NAME                                      TYPE     DATA   AGE
      gpcstgecn02-gce-gpcstgesite01-ssh-creds   Opaque   2      3d23h
      NAME                                      TYPE     DATA   AGE
      gpcstgecn03-gce-gpcstgesite01-ssh-creds   Opaque   2      3d23h

      Si no se encuentra un secreto, el error se verá de la siguiente manera:

      Error from server (NotFound): secrets "gpcstgeadm02-gce-gpcstgesite01-ssh-creds" not found
    2. Si el comando no devuelve ningún error, puedes ignorar de forma segura los errores que informan los reconciliadores.
    Vertex AI 1.11.x
    1.12.x

    No se pueden inicializar el pod y el servicio de frontend de Translation

    Síntomas:

    Durante las actualizaciones, se vuelve a crear el clúster de la base de datos de Translation, lo que provoca que la clave secreta secret-store del clúster del sistema de ODS quede desactualizada y sin sincronizar. Por este motivo, fallan la inicialización del servicio y el pod de frontend de Translation.

    Solución alternativa:

    Borra el secreto en el clúster del sistema:

    kubectl --kubeconfig SYSTEM_CLUSTER_KUBECONFIG delete secret postgres-secret-store -n ai-translation-system

    Reemplaza SYSTEM_CLUSTER_KUBECONFIG por la ruta de acceso al archivo kubeconfig en el clúster del sistema.

    Un controlador recrea el secreto automáticamente y lo vuelve a sincronizar con el clúster de la BD.

    Servidores físicos 1.12.4

    El servidor no se puede conectar al administrador de claves

    Síntomas:

    El servidor no se puede conectar al administrador de claves, lo que impide que el estado del servidor esté disponible. Este problema provoca que falle el trabajo server-encrypt-and-create-logical-drive y que el clúster de administrador no esté listo. Es posible que veas un error en los registros de trabajo como el siguiente:

    Error: Error during command execution: ansible-playbook error: one or more host failed
    Command executed: /usr/local/bin/ansible-playbook --extra-vars {"server_generation":"gen10","ssa_crypto_pwd":"vf{kXgbL?VFcV]%0","ssa_master_key":"ten-admin-org-2"} --inventory 192.0.2.0, --private-key /etc/ssh-key/id_rsa --become serve
    r/encrypt_and_create_logical_drive.yaml
    exit status 2   

    Solución alternativa:

    Realiza un AuxCycle y verifica que iLO pueda conectarse al administrador de claves.

    Logging 1.12.4

    El registro de escritura anticipada llena el volumen persistente

    Síntomas:

    Loki tiene solo un volumen persistente (PV) para los registros de escritura anticipada (WAL) y los índices. El WAL puede llenar el PV si un pod de Loki no se puede conectar al bucket de almacenamiento durante horas. Si el PV no tiene espacio disponible, Loki no puede recuperarse, a menos que borres el PV y reinicies el StatefulSet.

    Solución alternativa:

    Para recuperar un Pod de Loki de este estado, debes reducir la escala del StatefulSet correspondiente y borrar el PV sin espacio restante.

    Sigue estos pasos para recuperar el pod de Loki:

    1. Asegúrate de que el contenedor de IO Tool esté instalado en la estación de trabajo. Para obtener más detalles, consulta el manual de operaciones OOPS-P0065.
    2. Para obtener los permisos que necesitas para editar recursos, pídele a tu administrador de seguridad que te otorgue los siguientes roles:
      • observability-viewer
      • observability-admin
    3. Configura la variable de entorno KUBECONFIG con la ruta de acceso al archivo kubeconfig en el clúster de administrador raíz. Para obtener más detalles, consulta el manual IAM-R0004.
    4. Establece la variable de entorno ORG_NAME con el nombre de la organización afectada.
    5. Guarda el siguiente contenido en un archivo YAML llamado log-admin-overrides.yaml:
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: "LoggingPipelineReconciler"
    6. Inhabilita el LoggingPipelineReconciler:
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    7. Establece la variable de entorno KUBECONFIG con la ruta de acceso al archivo kubeconfig en el clúster en el que se ejecuta el pod de Loki afectado. Para obtener más detalles, consulta el manual IAM-R0004.
    8. Establece la variable de entorno LOKI_POD_NAME con el nombre del pod de Loki afectado.
    9. Obtén el nombre de Loki StatefulSet:
      export LOKI_STATEFULSET_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.metadata.labels.app')
    10. Obtén el nombre del PVC de Loki:
      export LOKI_PVC_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.spec.volumes[] | select(.persistentVolumeClaim != null) | .persistentVolumeClaim.claimName')
    11. Obtén las réplicas de Loki StatefulSet:
      export LOKI_STATEFULSET_REPLICAS=$(kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system -o json | jq -r '.status.replicas')
    12. Reduce verticalmente la escala de Loki StatefulSet:
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=0
    13. Verifica que no se estén ejecutando pods de StatefulSet:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      El resultado debe verse como el siguiente ejemplo:

      NAME                      READY   AGE
      audit-logs-loki-io        0/0     4d3h
    14. Borra el PVC afectado:
      kubectl delete pvc $LOKI_PVC_NAME -n obs-system
    15. Aumenta la escala vertical de Loki StatefulSet:
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=${LOKI_STATEFULSET_REPLICAS}
    16. Configura la variable de entorno KUBECONFIG con la ruta de acceso al archivo kubeconfig en el clúster de administrador de la organización afectada. Para obtener más detalles, consulta el manual IAM-R0004.
    17. Edita el contenido del archivo YAML log-admin-overrides.yaml de la siguiente manera:
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
        namespace: root
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: ""
    18. Habilita el LoggingPipelineReconciler:
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    19. Verifica que todos los Pods StatefulSet se estén ejecutando y estén en buen estado:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      El resultado debe verse como el siguiente ejemplo:

      NAME                 READY   AGE
      audit-logs-loki-io   5/5     2d5h

      En este caso, el StatefulSet tiene cinco de cinco (5/5) réplicas disponibles.

    Actualizar 1.12.4

    Los trabajos se programan de forma continua

    Síntomas:

    Los trabajos se programan de forma continua. En cuanto finaliza un trabajo, se programa uno nuevo. Los trabajos que se programan de forma continua son los siguientes:

    • unet-networkpolicy-assets-parameter
    • unet-nodenetworkpolicy-assets-parameter
    • unet-nodenetworkpolicy-assets-readiness
    • unet-userclusterpolicy-assets-parameter
    • unet-clustermesh-backend-parameter
    • unet-clustermesh-backend-readiness

    Solución alternativa:

    1. Pausa los siguientes subcomponentes:
      • unet-networkpolicy
      • unet-nodenetworkpolicy
      • unet-nodenetworkpolicy
      • unet-userclusterpolicy
      • unet-clustermesh
    2. Reanuda los subcomponentes cada vez que haya un cambio en el secreto de fleet-info en el clúster de administrador raíz. Este problema se produce cuando hay un cambio en los conmutadores de administración de la instancia, como kr get managementswitches -A, o un cambio en cualquier cidrclaim en el espacio de nombres de la organización.
    3. Reanuda los subcomponentes cada vez que haya un cambio en algún recurso de NodePool en el clúster de administrador de la organización. Quita la pausa de los subcomponentes antes de comenzar.
    Actualizar 1.12.4

    No hay upstream en buen estado para ServiceNow

    Síntomas:

    1. Cuando se actualiza de 1.12.2 a 1.12.4, no hay disponible un upstream en buen estado para ServiceNow. Es posible que veas el siguiente mensaje: failed to stage volume: LUKS passphrase cannot be empty.
    2. La clase de almacenamiento system-performance-rwo no está habilitada para LUKS. La asociación de volumen indica que el PVC está habilitado para LUKS.
    3. El reconciliador busca un secreto con las contraseñas de LUKS. Dado que la conexión de volumen indica que LUKS está habilitado y la clase de almacenamiento no lo está, no se crea la contraseña secreta.

    Solución alternativa:

    1. Obtén el valor de Kubeconfig para el clúster raíz o de administrador de la organización en el que aparece el problema:
            export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    2. Borra la clase de almacenamiento system-performance-rwo y vuelve a crearla:
            kubectl delete storageclass system-performance-rwo
            kubectl apply -f system-performance-rwo.yaml
    3. Crea un nuevo archivo YAML para la clase de almacenamiento system-performance-rwo y habilita LUKS:
                 # kubectl get sc system-performance-rwo -o yaml
           allowVolumeExpansion: true
           apiVersion: storage.k8s.io/v1
           kind: StorageClass
           metadata:
             annotations:
               disk.gdc.goog/luks-encrypted: "true"
               helm.sh/resource-policy: keep
               lcm.private.gdc.goog/claim-by-force: "true"
               meta.helm.sh/release-name: file-netapp-trident-backend
               meta.helm.sh/release-namespace: netapp-trident
               storageclass.kubernetes.io/is-default-class: "false"
             labels:
               app.kubernetes.io/managed-by: Helm
             name: system-performance-rwo
           parameters:
             backendType: ontap-san
             csi.storage.k8s.io/node-expand-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-expand-secret-namespace: ${pvc.namespace}
             csi.storage.k8s.io/node-publish-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-publish-secret-namespace: ${pvc.namespace}
             csi.storage.k8s.io/node-stage-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
             fsType: ext4
             selector: tier=performance
           provisioner: csi.trident.netapp.io
           reclaimPolicy: Delete
           volumeBindingMode: Immediate
    Actualizar 1.12.4

    La actualización del subcomponente file-netapp-trident tiene el estado Reconciliation ongoing

    Síntomas:

    Es posible que veas el estado del subcomponente file-netapp-trident cambiar de Reconciling a ReconciliationCompleted y viceversa.

    Solución alternativa:

    Se puede ignorar la conciliación en curso si se cumplen las siguientes condiciones:

    1. El TridentBackend es online.
    2. La configuración de TridentBackend es bound.
    3. La implementación de netapp-trident-controller está en buen estado.
    4. El DaemonSet netapp-trident-node-linux está en buen estado.
    Actualizar 1.12.4

    No se pudo generar el delta entre manifest y snapshot durante la actualización del nodo trabajador del clúster del sistema

    Síntomas:

    Cuando se actualiza de la versión 1.12.2 a la 1.12.4, la actualización de la organización se detiene en la etapa NodeUpgrade y la tarea de actualización del nodo muestra el siguiente error:

          Message: failed to generate delta between manifest and snapshot: failed to create or update delta configmap: failed to calculate delta between snapshot and manifest: failed to get valid OS distribution for delta comparison, distribution:

    Para confirmar el problema, sigue estos pasos:

    1. Obtén el Kubeconfig para el clúster raíz o de administrador de la organización en el que falla la actualización del nodo y verifica si falló nodeupgradetask:
           export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
           kubectl get nodeupgradetask -A -ojsonpath='{.items[*].status.conditions[?(@.status != "True")]}' | jq 
    2. Verifica que el mensaje coincida con el mensaje de error anterior:
            Message: failed to generate delta between manifest and snapshot: failed to create or update delta configmap: failed to calculate delta between snapshot and manifest: failed to get valid OS distribution for delta comparison, distribution:
    3. Comprueba que un osartifactsnapshot no tenga una distribución:
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    4. Comprueba que haya al menos una instantánea impresa que no tenga establecida la distribución.

    Solución alternativa:

    1. Obtén el archivo kubeconfig del clúster al que pertenece el nodo:
           export KUBECONFIG=${CLUSTER_KUBECONFIG}
           kubectl rollout restart -n os-system os-core-controller 
    2. Verifica que la instantánea ahora tenga una distribución. (Este comando puede tardar unos minutos):
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    3. Este comando no debería devolver ningún resultado. Si sigues viendo que falta una distribución, abre una solicitud de asistencia.
    Actualizar 1.12.4

    kubelet no puede quitar cgroup para los pods con registros de spam

    Síntomas:

    1. kubelet sigue imprimiendo el siguiente registro de spam:
      May 22 23:08:00 control-1--f1c6edcdeaa9e08-e387c07294a9d3ab.lab.anthos kubelet[3751]: time="2024-05-22T23:08:00Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/freezer/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
      ……
      May 22 23:09:04 control-1 kubelet[3751]: time="2024-05-22T23:09:04Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/net_cls,net_prio/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
    2. El proceso runc init está inactivo, lo que impide que kubelet borre el pod cgroup.

    Solución alternativa:

    1. Usa la siguiente secuencia de comandos para encontrar el proceso que bloquea el borrado de cgroup:
           # Find matching cgroup directories
      MATCHING_CGROUPS=$(find /sys/fs/cgroup -type d -name "*74353c*")
      
      
      if [ -z "$MATCHING_CGROUPS" ]; then
       echo "No cgroups found containing 'd06aac'."
       exit 0
      fi
      
      
      echo "Matching cgroups:"
      
      
      for cgroup in $MATCHING_CGROUPS; do
       echo "- $cgroup"  # Print cgroup path
      
      
       # Check if cgroup.procs exists
       if [ -f "$cgroup/cgroup.procs" ]; then
         echo "  Processes:"
      
      
         # List PIDs in cgroup.procs
         for pid in $(cat "$cgroup/cgroup.procs"); do
           # Get process details
           ps -o pid,comm,cmd --no-headers $pid 2>/dev/null  # Suppress errors if process doesn't exist
         done
       else
         echo "  No cgroup.procs file found."  # Handle cases where cgroup.procs is missing
       fi
      
      
       echo  # Add a newline for better readability
       done
    2. Verifica el estado del congelador con cat freezer.state. El estado debe ser FROZEN.
    3. Echo "THAWED" > freezer.state
    4. Se borró correctamente el cgroup. Kubelet deja de enviar spam al registro.
    Rendimiento 1.12.4

    Subcomponente perf-ptaas con error de conciliación

    Síntomas:

    El subcomponente perf-ptaas muestra el siguiente código de error, lo que impide la implementación de PTaaS:

    Reconciliation error: E0100 - deploy: failed to transfer ownership of conflicting resources for install: these resources need to be force claimed, but they are not annotated: [Resource: "resourcemanager.gdc.goog/v1, Resource=projects", GroupVersionKind: "resourcemanager.gdc.goog/v1, Kind=Project"

    Solución alternativa:

    PTaaS se implementa en la organización gdchservices.

    1. Inspecciona las anotaciones y las etiquetas del proyecto gdch-perftest y el bucket perftest-bucket-reports de PTaaS en el espacio de nombres gdch-perftest de perftest. Es posible que falte la etiqueta del bucket: app.kubernetes.io/managed-by=Helm y las anotaciones: meta.helm.sh/release-name=perf-ptaas-assets y meta.helm.sh/release-namespace=gdch-perftest. Agrega estas etiquetas y anotaciones de forma manual:
      kubectl --kubeconfig gdchservices-admin-kubeconfig label buckets -n gdch-perftest perftest-bucket-reports app.kubernetes.io/managed-by=Helm
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-name=perf-ptaas-assets
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-namespace=gdch-perftest
      Asegúrate de que OCLCM reclame el bucket por la fuerza:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports lcm.private.gdc.goog/claim-by-force=true
    2. Inspecciona las anotaciones del proyecto de PTaaS gdch-perftest. Es posible que el proyecto esté mal configurado con la anotación meta.helm.sh/release-name=perf-ptaas-assets. Cambia esta anotación a meta.helm.sh/release-name=perf-ptaas-backend:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest meta.helm.sh/release-name=perf-ptaas-backend --overwrite=true
      Asegúrate de que OCLCM reclame el proyecto por la fuerza:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest lcm.private.gdc.goog/claim-by-force=true
    3. Verifica que el subcomponente se reconcilie en el clúster de administrador raíz:
      kubectl get subcomponent -n gdchservices perf-ptaas