Problemas conocidos de Google Distributed Cloud con air gap 1.12.x

Categoría Versión(es) identificada(s) Problema y solución alternativa
Copia de seguridad y restauración 1.12.1

La copia de seguridad de volúmenes no resuelve los endpoints de almacenamiento de objetos a nivel de organización

El clúster de almacenamiento de 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 endpoints de almacenamiento de objetos a nivel de organización. En la versión 1.12, el tráfico de copia de seguridad requiere nuevas rutas para cada organización.

Solución alternativa:

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

  1. Define 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 reenviador y 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 mando para asegurarte de que el cambio se ha implementado:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Copia de seguridad y restauración 1.12.1

Fallo en la ruta de copia de seguridad a las organizaciones

Síntomas:

No se puede hacer un curl en la puerta de enlace de entrada del administrador de la organización desde los nodos de ONTAP porque no hay ninguna ruta de la subred de copia de seguridad a los planos de control de la organización.

Solución alternativa:

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

  1. Define 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 reenviador y 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 mando para asegurarte de que el cambio se ha implementado:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Copia de seguridad y restauración 1.12.4

No se pueden eliminar los volúmenes persistentes de los que se haya creado una copia de seguridad

Síntomas:

No se puede eliminar un volumen persistente si está en una relación de réplica de instantánea.

Solución alternativa:

Una IO elimina las relaciones de SnapMirror con el volumen como destino.

  1. Define la variable de entorno KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Almacena el nombre de PV problemático en una variable:
    PV_NAME={ PV_NAME }
  3. Obtén el nombre del volumen interno:
    volume_name=$(kubectl get pv ${PV_NAME?} -o jsonpath='{.spec.csi.volumeAttributes.internalName}')
  4. Para acceder a ONTAP, sigue los pasos que se indican en el runbook FILE-A0006.
  5. Elimina las relaciones con este volumen como origen mediante la contraseña recogida 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 restauración 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, es posible que la métrica de alerta del repositorio se genere por error. Se trata de un problema conocido en la versión 1.12.0, que se ha corregido en la 1.12.4. La causa de este problema es que el repositorio de copias de seguridad intenta periódicamente conectarse al almacenamiento de objetos como comprobación de estado y pasa a un estado incorrecto si no consigue conectarse. Sin embargo, si se recupera el repositorio de copias de seguridad, la métrica que indica su estado no volverá a cambiar correctamente, lo que provocará que la alerta se quede en un estado de activación indefinido. Para resolver este problema, puedes eliminar y volver a crear manualmente el repositorio de copias de seguridad para restablecer su métrica de estado. Sigue los pasos que se indican en el runbook BACK-R0003 para volver a crear el repositorio de copias de seguridad.

Facturación 1.12.4

bil-storage-system-cluster - Reconciliation error: E0121 subcomponent fails

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 reconciliar debido a trabajos obsoletos. El billing-storage-system-init-job-628 y el billing-storage-system-init-job-629 permanecen después de completar la tarea correctamente.

Solución alternativa:

Este agente debe seguir estos pasos:

  1. Crea copias de seguridad de las tareas de facturación obsoletas:
    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. Elimina las tareas obsoletas.
  4. Reiniciar oclcm-backend-controller.
  5. Reanuda el subcomponente.
Almacenamiento en bloques 1.12.4

Los pods de Grafana se quedan en el estado Init debido a errores de montaje de volumen.

Síntomas:

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

Solución alternativa:

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

  1. Consulta el VolumeAttachment de PVC para identificar dónde está conectado el volumen.
  2. Aísla los Nodes del clúster que no coincidan con este valor.
  3. Elimina el Pod que falla. De esta forma, debería migrar de nuevo al Node original.

Después de comprobarlo, si hay un valor de deletionTimestamp (eliminación de volumen), sigue estos pasos:

  1. Consulta el VolumeAttachment de PVC para identificar dónde está conectado el volumen.
  2. En Node, muestra 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 de la salida del archivo de seguimiento esté cerrado. Esta ruta no debería existir en este punto:
    stat DEVICE_PATH
  4. Valida si el número de serie está asignado a algún dispositivo de multipath.
    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 nuevo valor, comprueba si la entrada multipath sigue existiendo:
      multipath -ll | grep SERIAL_HEX
    4. Si no existe, elimina el archivo de seguimiento.
    5. Si existe, verás un valor hexadecimal de serie ligeramente más largo que el que has buscado, que se llamará multipathSerial. Ejecuta lo siguiente y busca los dispositivos de bloque:
      multipath -ll MULTIPATH_SERIAL
    6. A continuación, ejecuta los siguientes comandos. El último se ejecuta de forma única para cada dispositivo de bloque:
                systemctl restart iscsid
                systemctl restart multipathd
                multipath -f MULTIPATH_SERIAL
                echo 1 > /sys/block/BLOCK_DEVICE_NAME/device/delete
                  
Gestión de clústeres 1.12.0
1.12.1
1.12.2
1.12.4

Fallo de la tarea machine-init 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 y muestra el siguiente mensaje:
    FAILED! => {"changed": true, "cmd": "/usr/bin/kubeadm join phase control-plane-prepare certs --config /dev/stdin --v 5".
  2. Revisa 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 no está vacío.

Solución alternativa:

  1. Cambia el permiso de /etc/kubernetes/pki/etcd/ca.crt. Esta es una operación que requiere mucho tiempo. El cambio de permiso debe producirse después de la ejecución anterior de la tarea machine-init, pero antes de la siguiente, ya que machine-init sobrescribe el permiso y lo devuelve a la raíz.machine-init
  2. Reinicia etcd en el segundo nodo para recuperar etcd en el primer nodo de un bucle de fallos.

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

Gestión de clústeres 1.12.2

No está disponible el PodCIDR de IPv4 obligatorio

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 quieras eliminar.
  2. Quita la dirección IP de spec.nodes del recurso personalizado NodePool.
  3. Espera a que el nodo se elimine por completo del NodePool. Si el nodo no se elimina, realiza un force-remove:
    1. Añade 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 añadir la dirección IP a spec.nodes en el recurso personalizado NodePool.
Almacenamiento de registros 1.12.0
1.12.1

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

Síntomas:

Una vez que hayas terminado de configurar la exportación a un sistema SIEM externo, la entrada 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:

Al actualizar de la versión 1.12.2 a la 1.12.4, si se elimina un nodo y, posteriormente, se vuelve a añadir, es posible que falle el proceso machine-init de ese nodo. Este error se produce porque la política ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes deniega el tráfico de red del nodo que se ha vuelto a añadir a los servicios esenciales del plano de control. Este error se destaca en los mensajes de estado de este ejemplo de salida:
      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. En el clúster de administrador raíz:
    1. Obtén CIDRs de CIDRClaim/org-external-cidr -n root (en concreto, del 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. Añade estos CIDRs a ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, concretamente 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. En el clúster de administradores de la organización:
    1. Obtener CIDRs de la organización (por ejemplo, org-1) de CIDRClaim/org-external-cidr -n org-1 (en concreto, 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. Añade estos CIDRs a ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, concretamente 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 -

Solo tienes que hacer este cambio 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 máquinas virtuales y contenedores

Síntomas:

En un nodo de hardware desnudo del clúster del sistema, no se pueden terminar 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 quedan bloqueados en podInit y containerd muestra el siguiente mensaje de error:

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

De esta forma, se impide que se inicie la interfaz de red de contenedores (CNI) y que se programen otros pods.

Solución alternativa:

Aplica estas medidas para evitar que se produzca este estado del nodo:

  • No programes más de 10 PVCs a la vez en un solo nodo. Espera a que se monten antes de programar más. Esto se notaba más al intentar crear máquinas virtuales.
  • Actualiza el archivo /etc/lvm/lvm.conf en todos los nodos 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 se muestran tiempos de espera para las conexiones y los montajes de volúmenes, o no puede eliminar un volumen, comprueba el número de procesos vgs colgados en el nodo para identificar si el nodo se encuentra en este estado particularmente incorrecto. La forma más fiable de corregir un nodo en este estado es reiniciarlo.

Puede que se produzca otro tipo de fallo. Este modo de fallo tiene la siguiente firma en el intento de montaje: mount(2) system call failed: No space left on device. Probablemente se deba a la propagación del montaje en el nodo. Para comprobarlo, ejecuta cat /proc/mounts | grep devtmpfs | awk '{ print $2 }' | sort -n | uniq -c. Si alguno de estos valores es superior a uno, elimina el pod que lo esté usando. De esta forma, se debería activar el desmontaje. Si no funciona, desmonta manualmente esa ruta. Si sigues sin poder acceder, reinicia el dispositivo.

Redes 1.12.2

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

En determinadas situaciones, debido a las condiciones de carrera, no se pueden crear los recursos personalizados de Kubernetes de las ACLs de switch necesarias durante el bootstrapping inicial de Distributed Cloud.

Síntomas:

Lista de respuestas predefinidas de LCA de switch:

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

La salida de este comando indica que no se ha creado ninguna LCA de interruptor de gestión (mgmt-switch-acl).

No resources found in gpc-system namespace.

Solución alternativa:

  1. Lista de CRs de políticas de tráfico:
    kubectl get trafficpolicies -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

    La salida devuelve dos CRs 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 la política de este archivo, que puede estar al final del archivo.
  4. Identifica el campo de descripción de la última regla de la política. El campo podría tener este aspecto:
    Deny All rule for Management Network
  5. Edita esta descripción y añade The al principio de la línea descriptiva:
    The Deny All rule for Management Network
  6. Guarda el archivo y sal.
  7. Vuelve a enumerar los CRs de ACL de conmutador de Kubernetes:
    kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  8. En la salida se muestra la LCA del switch de gestió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:

Al aprovisionar Server durante la creación de un clúster, es posible que el servidor se marque como aprovisionado, pero que le falte la condición Provision-Ready. Por lo tanto, el NodePool no puede consumir este servidor. Un ejemplo de mensaje de evento de error en NodePool podría tener este aspecto:

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 contadas ocasiones, es posible que el procedimiento de restablecimiento de iLO anterior no resuelva el problema por completo, por lo que será necesario volver a aprovisionar el servidor. Consulta los manuales de procedimientos OS-P0002 y OS-P0003 para obtener información detallada.

Servidores físicos 1.12.2

No se puede actualizar el firmware del nodo en la organización de inquilinos

Síntomas:

La actualización del nodo de hardware desnudo se ha quedado bloqueada en el estado in-progress durante más de tres horas.

Solución alternativa:

Sigue los pasos que se indican en el runbook SERV-R0005.

Redes 1.12.1

El script de preinstalación falla en varios interruptores

Síntomas:

La POAP sigue fallando y el registro de la POAP muestra un mensaje como este:

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 switch.

Solución alternativa:

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

  1. Ve a la carpeta /tmp/preinstall-bootstrap-RANDOM_NUMBER .
  2. En la carpeta, busca el archivo poap.py.
  3. Elimina por completo la línea con la suma de comprobación md5 de este archivo para que head -n 4 poap.py tenga este aspecto:
    #!/bin/env python3
    import glob
    import os
    import pkgutil
  4. En el mismo archivo, añade 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 tiene este aspecto:

    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 md5 y vuelve a añadirla a poap.py para que head -n 4 poap.py tenga este aspecto:
    #!/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 pnet no genera correctamente el recurso personalizado hairpinlink (CR).

Solución alternativa:

  1. Después de actualizar, en el clúster de administrador raíz, edita el archivo clusterroles/pnet-core-backend-controllers-role.
  2. Busca hairpinlinks y añade permisos de create,update,delete al recurso.
  3. Verifica que se hayan generado los CRs hairpinlinks y hairpinbgpsessions.
Servidor NTP 1.12.1

El pod del servidor de relay NTP falla después de reiniciarse

Síntomas:

  • Es posible que veas el siguiente mensaje al ejecutar el comando kubectl get pods:
    ntp-system                      ntp-relay-server-75bbf                                            1/2     CrashLoopBackOff    123 (5m12s ago)   24h
  • Es posible que veas una advertencia de comprobación de actividad 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 provocar que los servidores tengan una hora no sincronizada.

Solución alternativa:

  1. Abre el daemonset ntp para editarlo:
    kubectl edit daemonset/ntp-relay-server -n ntp-system
  2. Elimina la sección livenessProbe: hasta la línea timeoutSeconds: 30.
  3. Añade la siguiente sección al contenedor ntp-image:
    securityContext:
      capabilities:
        add:
        - SYS_TIME
  4. El resultado es 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 NTP del SO para editarla:
    kubectl edit ospolicy/bm-ntp-policy -n gpc-system
  6. Quita todas las direcciones IP de NTP de la sección de la política. Después, la política tendrá este aspecto:
    policy:
      installPlaybook:
        extraVars:
          ntp_servers: {}
        name: server-ntp-config
        secrets: {}
          
Servidor NTP 1.12.1

ntp-relay-job-xxxx se bloquea después de reiniciar

Síntomas:

Es posible que veas el siguiente mensaje al ejecutar 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 que no se ha limpiado correctamente el trabajo de actualización. No es necesario hacer nada y el trabajo se puede dejar en el estado de bucle de fallos.

Servidor NTP 1.12.2

La hora del SO del nodo no está 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.

Este es un problema para los servidores que no mantienen la hora sincronizada. La configuración no se ha aplicado correctamente y debe cambiarse a otro espacio de nombres para que se aplique correctamente.

Solución alternativa:

Sigue estos pasos en todos los clústeres:

  1. Lista las políticas de SO que ya tienes:
    kubectl get ospolicies -n ntp-system

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

  2. En función del 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 haya después.
  4. Aplica el archivo editado al clúster:
    kubectl apply -f ntp-ospolicy.yaml
  5. Espera unos minutos a que el controlador aplique la política del SO.
  6. Establece una conexión SSH con uno de los nodos a los que se aplica el OSPolicy y ejecuta cat /etc/chrony.conf. El resultado muestra un mensaje al principio del archivo que indica que Ansible lo gestiona y que se han eliminado los servidores nist.time.gov o ntp.pool de la configuración.
Copia de seguridad y restauración de VMs 1.12.0

Los ajustes de webhook de la máquina virtual impiden que los usuarios inicien procedimientos de copia de seguridad y restauración de máquinas virtuales

Síntomas:

Los usuarios no pueden iniciar el proceso de copia de seguridad y restauración de VMs debido a que el control de acceso basado en roles (RBAC) y la configuración del esquema del gestor de VMs no son correctos.
Los nombres de los planes de copia de seguridad de VMs no pueden tener más de 63 caracteres. Por ejemplo, puede que veas este 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 copia de seguridad de VMs son una concatenación del nombre VirtualMachineBackupPlanTemplate, el tipo de recurso (que es vm o vm-disk) y el nombre de ese recurso. Esta cadena concatenada no debe superar los 63 caracteres.
Para ello, pon nombres cortos a estos recursos al crearlos. Para obtener información sobre cómo crear estos recursos, consulta los artículos Crear e iniciar una instancia de VM y Crear un plan de copias de seguridad para VMs.

Servicio de base de datos 1.12.0

Las cargas de trabajo de Database Service operan en el clúster del sistema

Síntomas:

Las cargas de trabajo de Database Service se aprovisionan y configuran en proyectos independientes del clúster del sistema de Distributed Cloud. Aunque los proyectos se usan para aplicar límites administrativos en Distributed Cloud, no influyen en cómo ni dónde se ejecuta una carga de trabajo. Por lo tanto, estas cargas de trabajo pueden compartir la infraestructura de computación subyacente con otras instancias de bases de datos y varios sistemas del plano de control.

Solución alternativa:

En el caso de las cargas de trabajo de bases de datos que requieran 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, asegura que las cargas de trabajo de la base de datos se aprovisionen y se ejecuten en una infraestructura de computación dedicada. El operador de infraestructura debe completar la configuración del grupo de nodos aislado.

Servicio de base de datos 1.12.2

El clúster de base de datos de AlloyDB Omni se queda en 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. Obtener registros de PostgreSQL con un 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. Acceder al pod de la base de datos mediante shell

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

Cortafuegos 1.12.0

El archivo secret.yaml de arranque del cortafuegos contiene TO-BE-FILLED

Síntomas:

Durante la implementación del cliente, el nombre de usuario del administrador de archivos secret.yaml debe ser admin. En su lugar, el archivo contiene TO-BE-FILLED después de la primera creación. El nombre de usuario admin debe usarse para inicializar la primera configuración en el cortafuegos y en la IP de bucle de retorno admin\admin.

Solución alternativa:

Comprueba que TO-BE-FILLED no esté presente en las siguientes credenciales de cortafuegos:

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

    Cortafuegos 1.12.2

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

    Síntomas:

    Las políticas de cortafuegos de IDPS predeterminadas no admiten las IPs personalizadas de la organización para Direct Connect (DX) Interconnect. Por lo tanto, no se pueden crear organizaciones 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 SecurityPolicyRule para las IPs personalizadas de la organización e impleméntalo en los firewalls de IDPS. Sigue los pasos del runbook FW-G0002 para completar los siguientes pasos:

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

        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 SecurityPolicyRule de entrada en el vsys del cortafuegos 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 la sustitución de la configuración del cortafuegos para implementar el SecurityPolicyRules.

    Módulo de seguridad de hardware 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Las licencias de prueba desactivadas de HSM siguen siendo detectables

    Síntomas:

    Debido a un problema conocido de CipherTrust Manager, las licencias de prueba desactivadas siguen siendo detectables y pueden activar falsas advertencias de vencimiento.

    Solución alternativa:

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

    Módulo de seguridad de hardware 1.12.0

    El módulo de seguridad de hardware se comporta de forma inesperada al eliminar un KMS

    Síntomas:

    El módulo de seguridad de hardware (HSM) se comporta de forma inesperada al eliminar un CTMKey de KMS. Por ejemplo, es posible que el servicio KMS no se inicie en la organización.

    Solución alternativa:

    Los usuarios pueden destruir criptográficamente los datos eliminando 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 rotable de los módulos de seguridad de hardware está en un estado desconocido

    Síntomas:

    Obtén una lista de secretos rotables desconocidos:

    kubectl get rotatablesecret -A | grep -i unknown

    La salida podría tener este aspecto:

    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 las instrucciones de IAM-R0004 para generar el archivo KUBECONFIG del clúster de administrador raíz.
    4. Sigue los pasos de 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)"'

      La salida podría tener este aspecto:

      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, haga lo siguiente:
      1. Exporta la dirección IP a una variable llamada HSM_DATA_IP:
        export HSM_DATA_IP=HSM_DATA_IP_ADDRESS
      2. Obtén los certificados de servidor web (puerto 443), nae (puerto 9000) y kmip (puerto 5696) y comprueba su validez:
        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

        La salida podría tener este aspecto:

        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 operaciones HSM T0016 para renovar los certificados del servidor si la fecha Not After es en los próximos 30 días.
    Supervisión 1.12.0

    Es posible que los certificados de Node Exporter no estén listos al crear una organización

    Síntomas:

    Los certificados no se preparan al crear 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 siguen existiendo 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 elimine 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 reconciliará en los clústeres de usuario.

    Supervisión 1.12.0
    1.12.1
    1.12.2

    Si configura el webhook de ServiceNow, LCM volverá a conciliar y revertirá los cambios realizados en los objetos ConfigMap y Secret del espacio de nombres mon-system.

    Síntomas:

    Configurar el webhook de ServiceNow provoca que la gestión del ciclo de vida (LCM) vuelva a conciliar y revierta los cambios realizados en el objeto ConfigMap mon-alertmanager-servicenow-webhook-backend y en 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 apliquen sin revertirse:

    1. Obtén las rutas a los archivos kubeconfig de los clústeres de administrador raíz y de administrador de organización. Guarda las rutas en las variables de entorno ROOT_ADMIN_KUBECONFIG y ORG_ADMIN_KUBECONFIG, respectivamente.
    2. Pausa el subcomponente LCM en uno de los siguientes clústeres:
      • Pausa el subcomponente 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 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 recogen métricas de los clústeres de usuarios.

    Síntomas:

    No se recogen algunas métricas de los clústeres de usuarios. Este problema afecta a los clústeres de VMs de 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:"
    • Puede 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 solucionar el problema:

    1. Obtén la ruta al archivo kubeconfig del clúster. Guarda la ruta en la variable de entorno KUBECONFIG.
    2. Despliega un servicio de stub en los clústeres de VMs de 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 tenant 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 tenant 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 la carga de las solicitudes entre los límites de los clústeres, que tienen diferentes inquilinos predeterminados.

    Solución alternativa:

    Para aplicar la solución alternativa, se necesita acceso a la fuente de private-cloud y poder implementar una actualización de componentes. Debes cambiar la configuración de la malla para restringir el servicio cortex-tenant de forma que solo reciba tráfico del clúster local e implementar el componente ASM.

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

      El campo meshConfig tiene este aspecto:

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

      Por lo tanto, debe cambiar el campo meshConfig para que tenga el siguiente aspecto:

              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 ASM en el clúster.
    Actualizar 1.12.0

    No se puede actualizar el nodo NodeOSInPlaceUpgradeCompleted

    Síntomas:

    Al actualizar de la versión 1.11.0 a la 1.11.3, no se puede actualizar el nodo 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:

    Inicia sesión en el equipo físico que se va a actualizar. Comprueba si fstab tiene /boot/efi y si el directorio está montado:

    # 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 comprueba si el directorio está montado:
      # mount -a
      root@mb-aa-bm04:~# ls /boot/efi/
      EFI
    2. Continúa con las comprobaciones aquí. Ejecuta estos 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 el ordenador y repite las comprobaciones.
      /usr/local/update-efi-files.sh
    4. Reanudar nodeupgradetask
    Actualizar 1.12.0

    La actualización de Switch no puede ejecutar el comando install add bootflash://..

    Síntomas:

    El cambio de licencia no añade 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:

    Inicia sesión en el switch que está fallando y ejecuta el comando de instalación y activación desde el switch del paquete:

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

    Al actualizar de la versión 1.11.x a la 1.12.1, la actualización del nodo se queda atascada con el error MaintenanceModeHealthCheckReady undrain

    Síntomas:

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

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

    Series:

    root        10.252.135.4   false             true

    El trabajo de comprobació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"
    Sistema operativo de nodo 1.11.3

    El nodo de la VM se queda bloqueado al reiniciar después de la solución alternativa manual para el pod os-policy

    Síntomas:

    Una tarea de reinicio de una VM falla después de la solución alternativa 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 e iniciar la VM resuelve el problema. Sigue las instrucciones para iniciar y detener una máquina virtual.

    Redes superiores 1.12.0

    Un clúster de VMs de usuario se queda bloqueado en el estado ContainerCreating con la advertencia FailedCreatePodSandBox

    Síntomas:

    Un clúster de VMs de usuario se bloquea. Al describir el pod que tiene el estado ContainerCreating, se 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 instrucciones NET-P0001 para reiniciar anetd en el clúster del sistema.

    Registro de artefactos del sistema 1.12.1

    Harbor entra en bucles de fallos después de una actualización de ABM

    Síntomas:

    Al actualizar 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 fase de complementos con errores de extracción de Helm:

    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. Para obtener más información, consulta Solicitar asistencia.

    Actualizar 1.12.0

    Es posible que varios pods de un clúster de 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 se instalan y se instala el webhook para aplicarlas.

    Es posible que varios pods de un clúster de sistema se queden atascados 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. Si no es así, espera unos 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, elimina el pod problemático y comprueba que vuelve a estar activo. 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>.
    Almacenamiento de registros 1.12.1

    ValidatingWebhookConfigurations, MutatingWebhookConfigurations y MonitoringRules implementados por el componente de registro no se pueden actualizar

    Síntomas:

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

    Solución alternativa:

    1. Asegúrate de que tienes kubectl y de que puedes acceder al runbook IAM-R0004 para obtener el KUBECONFIG del clúster de administrador raíz.

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

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

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

      kubectl delete validatingwebhookconfiguration root-admin-logging-webhook
    5. Elimina 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. Elimina 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 la acción se realiza 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 la acción se realiza correctamente, el comando imprime log-operational is ready. De lo contrario, el resultado es log-operational is not ready.

    Almacenamiento de registros 1.12.1

    No se recogen registros de auditoría ni registros operativos

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

    Síntomas:

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

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

    El pod cortex-ingester muestra el estado OOMKilled

    Síntomas:

    Es posible que veas el estado OOMKilled del 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 el número de ingesters o ambas cosas. Para ello, puedes implementar 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

    Al actualizar de la versión 1.11.x a la 1.12.1, es posible que un nodo de clúster no salga del modo de mantenimiento debido a un error en la comprobación del estado de registy_mirror

    Síntomas:

    Al actualizar de la versión 1.11.x a la 1.12.1, se produce un error en la actualización del nodo y se muestra el siguiente mensaje:

    {
        "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 y 1.12.4

    OrganizationUpgrade se queda bloqueado en las fases anthosBareMetal, addOn o node con un error en la comprobación check_registry_mirror_reachability_pass.

    Síntomas:

    1. OrganizationUpgrade se queda bloqueado en las fases 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 de comprobación 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 y 1.12.4

    OrganizationUpgrade se ha quedado bloqueado en las fases anthosBareMetal, addOn o node con el error de comprobación del estado netutil.

    Síntomas:

    1. OrganizationUpgrade se queda bloqueado en las fases 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 "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:

    Elimina el trabajo de Kubernetes correspondiente a la comprobació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
    Gestor de VMs 1.12.1

    Al actualizar de la versión 1.11.x a la 1.12.x, es posible que una VM no esté lista debido a que tiene demasiados pods

    Síntomas:

    Al actualizar 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 impide que se vacíe un nodo de Bare Metal.

    Solución alternativa:

    Reinicia la VM.

    Servidores físicos 1.12.1

    NodeUpgrade contiene varias versiones del mismo modelo de hardware, lo que impide verificar la actualización del firmware

    Síntomas:

    Al actualizar de la versión 1.11.x a la 1.12.1, NodeUpgrade contiene varias versiones del mismo modelo de hardware, lo que impide verificar la actualización del firmware.

    Solución alternativa:

    Sigue estos pasos para modificar el NodeUpgrade CR spec:

    1. Si la actualización es para servidores HPE Gen10 (GDC-4D), elimina el firmware del modelo ilo6. Si no, quita el firmware del modelo ilo5.
    2. Sección para conservar la entrada con el redfishVersion más reciente de cada descripción.
      Por ejemplo, si existen las dos entradas siguientes, conserve solo la que tenga 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 se quedan bloqueados en el estado de aprovisionamiento

    Síntomas:

    Ironic ha alcanzado el tiempo de espera mientras esperaba que se encendiera un servidor. El estado cambia de cleaning a clean failed y, después, 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

    Determina si el interruptor está activado:

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

    Si el interruptor está activado, el resultado será "On".

    Solución alternativa:

    Elimina el bloqueo image de los servidores problemáticos y espera hasta que vuelvan a estar disponibles. Cuando estén disponibles, vuelve a añadir el bloque image.

    Servidores físicos 1.12.2

    Fallo en el arranque del servidor

    Síntomas:

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

    [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 inmediatamente, lo que provoca una desreferencia de puntero nulo.

    Registro de artefactos del sistema 1.12.1

    Al actualizar de la versión 1.11.x a la 1.12.1, el estado del clúster de Harbor puede ser unhealthy

    Síntomas:

    Al actualizar de la versión 1.11.1 a la 1.12.1, el estado del clúster de Harbor puede cambiar a unhealthy y mostrar 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. Comprueba 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, comprueba 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, comprueba 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, comprueba 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. Serie KUBECONFIG

      :
      export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    2. Reducir el tamaño 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. Define el nombre de la clase de prioridad como system-cluster-critical o system-node-critical en la plantilla del 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 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 trabajo no está listo

    Síntomas:

    El pod del servicio de trabajo 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 tiene este aspecto:

      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 arranque, obtén el estado de la organización:
      kubectl get org -A

      La salida podría tener este aspecto:

      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

    Al actualizar de la versión 1.11.x a la 1.12.1, es posible que no se puedan eliminar los segmentos de Cortex

    Síntomas:

    Al actualizar de la versión 1.11.1 a la 1.12.1, es posible que no se pueda eliminar el segmento de Cortex y se produzca 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 eliminar buckets de forma forzada:

    1. Completa los pasos de la tarea MON-R0017 para acceder a la interfaz de usuario de StorageGRID.
    2. Vaya a las bucket en la interfaz de usuario.
    3. Haz clic en el botón Eliminar objetos del segmento para eliminar los datos.
    Supervisión 1.12.0
    1.12.1
    1.12.2

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

    Síntomas:

    El objeto StatefulSet de Prometheus se ha configurado incorrectamente 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 monitorización.

    El problema se produce porque el reconciliador ObservabilityPipeline solo define este valor en la primera instalación, y el reconciliador ObsProjectInfra monitoriza 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 solucionar 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 Istio Telemetry en el clúster de administrador de la organización para evitar que se registren todas las solicitudes de Cortex. 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

    El ConfigMap mon-prober-backend-prometheus-config se restablece

    Síntomas:

    • Se ha activado la alerta MON-A0001.
    • El ConfigMap mon-prober-backend-prometheus-config se restablece para que no incluya ningún trabajo de comprobación. 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:

    Para solucionar el problema, sigue estos pasos:

    1. Define las siguientes variables de entorno:
      • KUBECONFIG: la ruta al archivo kubeconfig del clúster.
      • TARGET_CLUSTER: el nombre del clúster en el que estás resolviendo 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 de 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 rellena a medida que se registra cada sonda.

    4. Sigue el runbook MON-R2009 para silenciar la alerta MON-A0001, Blackbox monitoring metrics pipeline down, ya que esta alerta se activará continuamente.
    Plataforma de nodo 1.12.1

    Al actualizar de la versión 1.11.x a la 1.12.x, es posible que un pod de descarga de imágenes de interruptor se quede bloqueado en el estado ErrImagePull

    Síntomas:

    Al actualizar de la versión 1.11.x a la 1.12.x, es posible que un pod de descarga de imágenes de interruptor se quede bloqueado 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 de nodo 1.12.1

    Al actualizar de la versión 1.11.x a la 1.12.1, el cortafuegos del host bloquea la descarga de la imagen de cambio

    Síntomas:

    Al actualizar de la versión 1.11.x a la 1.12.1, el cortafuegos del host bloquea la descarga de la imagen del interruptor debido a una incompatibilidad de las interfaces que utiliza el cortafuegos del host.

    Solución alternativa:

    Aplica la siguiente solución alternativa antes de actualizar, solo si vas a pasar 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 organización.
      1. Obtén el nombre del grupo de nodos y el espacio de nombres de los nodos de metal desnudo del administrador raíz y de los nodos de metal desnudo del administrador de la organización. En el clúster root-admin, usa el archivo kubeconfig root-admin. El siguiente comando muestra un inventario de las máquinas y filtra la lista por máquinas físicas:
        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
        La salida 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 de la salida 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 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 rellenan con la lista de todos los nodepools del clúster correspondiente cuando se implementa el archivo YAML anterior.

        Un archivo YAML de ejemplo 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 tener este aspecto:

        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 tiene este aspecto:
        worker-node-pool-o1-highgpu1-48-gdc-metal,org-1-system-cluster

        Los valores de la salida 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 rellenan con la lista de resultados 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 de los nodepools reales podría tener este aspecto:

        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 inferiores 1.12.2

    Es posible que los switches de red precargados con una versión anterior a la 9.3.10 no puedan iniciarse

    Síntomas:

    Los switches de red precargados con una versión inferior a 9.3.10 no se inician porque la versión esperada del switch es 10.3(4a).

    Solución alternativa:

    Actualiza manualmente el firmware del interruptor de la versión 9.3.5 a la 9.3.10 y, después, de la 9.3.10 a la 10.3.4a.

    Redes inferiores 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 han caducado.

    Solución alternativa:

    1. Rota los certificados del interruptor.
    2. Activa los nuevos certificados:
      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

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

    Síntomas:

    El subcomponente de configuración unificada de claves de Linux (LUKS) no se vuelve a implementar durante la actualización. Para comprobar el subcomponente file-netapp-trident, sigue estos pasos:

    1. Definir 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

    La salida podría tener este aspecto:

    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, no se han podido crear dos clases de almacenamiento: standard-rwo y standard-block.

    Solución alternativa:

    1. Elimina el StorageClasses que no se haya podido crear, como standard-rwo, standard-block, standard-rwo-non-luks y standard-block-non-luks.
    2. Activa la recreación del StorageClasses reiniciando el controlador oclcm-backend de tu clúster (controlador root-admin para clústeres root y org-admin, controlador org-admin para clústeres system y user).
    3. En la versión 1.12.4, confirma que las clases de almacenamiento instaladas tienen la anotación disk.gdc.goog/luks-encrypted: definida como true (excepto las clases de almacenamiento que no sean LUKS). Si la anotación no tiene el valor true, 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 PersistentVolumeClaim (PVC). Cada PVC debe tener un secreto con el formato g-luks-$pvc_name.
    6. Compruebe que el subcomponente file-netapp-trident no tenga ningún error en el estado.
    Almacenamiento de objetos 1.12.2

    Es posible que los segmentos de almacenamiento de objetos no estén listos después de actualizar 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 y se muestra 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:

    Añade manualmente el finalizador antes de iniciar la actualización.

    Gestión de clústeres 1.12.1 y 1.12.2

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

    Síntomas:

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

    Solución alternativa:

    No cree un clúster de usuarios con la versión 1.27.x de Kubernetes.

    Máquinas virtuales 1.12.0

    La traducción de imágenes no puede obtener 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 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 bloquean

    Síntomas:

    Obtén una lista de pods de importación:

    kubectl get pods -A | grep import 

    La salida podría tener este aspecto:

    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

    En el registro puede aparecer 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 runbook FILE-A0006.
    4. Muestra el volumen y anota el nombre del servidor virtual que devuelve el comando:
      volume show -volume INTERNAL_NAME
    5. Desactivar el volumen sin conexión:
      volume offline -volume INTERNAL_NAME -vserver VSERVER_NAME
    6. Eliminar 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 un error de instalación de network-controller-manager

    Síntomas:

    VMRuntime en el clúster de destino (puede ser el clúster de administrador o el clúster del sistema) tiene el estado 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:

    Al eliminar el despliegue network-controller-manager, el operador de VMM debería volver a crearlo automáticamente con los certificados necesarios. La implementación debería pasar al estado Running y, posteriormente, 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

    Tiempo de aprovisionamiento prolongado para los discos de máquinas virtuales

    Síntomas:

    Los pods del importador de VMs entran en un bucle de fallos y el volumen de datos se queda en el estado de importación durante más de 90 minutos. El estado de los pods podría ser el siguiente:

    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 discos se completan en un plazo de tres horas.

    Actualizar 1.12.2

    Al actualizar 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 ser similar al siguiente:

         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 la raíz, en los pasos siguientes sustituye KUBECONFIG por el archivo kubeconfig del administrador raíz.
    2. Si el error se produce en la organización, sustituye KUBECONFIG por el archivo kubeconfig del administrador de la organización en los pasos siguientes.
    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 lo siguiente:
      k patch network mgmt-network -p '{"metadata":{"finalizers":null}}' --type=merge
    5. Eliminar mgmt-network
      k delete network mgmt-network
    6. Comprueba que el estado de unet-nodenetworkpolicy-infra no tenga ningún error.

      Por ejemplo:

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

      El resultado tiene este aspecto:

               NAME                           AGE   STATUS
               unet-nodenetworkpolicy-infra   34d   ReconciliationCompleted

    Actualizaciones 1.12.2

    El clúster del sistema falla 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 las tareas con el nombre bm-system-add-ons-* fallen y se produzca 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 iniciar 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 un 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 org-1-system-cluster

    Síntomas:

    Este problema se produce al actualizar de la versión 1.11.1 a la 1.12.2.

    Consulta el archivo .yaml del subcomponente file-observability :

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

    El archivo puede tener 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. Comprueba el espacio de nombres file-system para verificar que no termina en org-admin cluster:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG get namespace file-system
    2. Si está finalizando, elimina cualquier destino de monitorización del 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 active el subcomponente mon-admin añadiendo 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. Elimina la anotación para pausar el subcomponente una vez que se haya completado 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 se produce al actualizar de la versión 1.11.1 a la 1.12.2.

    Cuando se completan todos los pasos de actualización de hsmupgraderequest y ctmclusterupgraderequest, aparece 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 tiene este aspecto:

      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 de HSM se han actualizado a .Spec.TargetVersion de ctmclusterupgraderequest:

      La salida tiene este aspecto:

            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 has obtenido en el paso anterior:

      Por ejemplo:

          kubectl edit-status hsm HSM_NAME -n gpc-system
    5. Actualiza el estado de la última condición de ctmclusterupgraderequest.status.conditions de False a True. Después, el estado de la hsmupgraderequest.status.conditions última condición también se convierte en 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 gestión no accesible

    Durante una actualización, no se puede acceder a la IP de gestión de un servidor, sobre todo después de actualizar el sistema operativo de un switch.

    En Rocky Linux, cuando se añaden rutas estáticas, la IP de destino utilizada para acceder a las rutas estáticas debe ser accesible antes de añadir las rutas estáticas. Si el switch se reinicia después de una actualización del SO, es posible que no se pueda acceder temporalmente a esa IP de gestión.

    Solución alternativa:

    Establece una conexión SSH con el servidor mediante la dirección IP de datos. Reinicia el servicio de red para volver a crear las rutas estáticas que faltan:

    systemctl restart NetworkManager.service
    Sistema de incidencias 1.12.2

    Falla la sincronización de la base de conocimientos del sistema de incidencias

    Síntomas:

    Durante una sincronización de la base de conocimientos, 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:

    Añade una propiedad del sistema para aumentar la longitud máxima:

    1. En la plataforma ServiceNow, introduce sys_properties.list en el filtro de navegación.
    2. Haz clic en New (Nuevo).
    3. En el campo Name (Nombre), introduce glide.rest.max_content_length.
    4. En el campo Type (Tipo), selecciona string.
    5. En el campo Valor, introduce 15.
    6. Haz clic en Enviar.
    7. Vuelve a sincronizar la base de conocimientos.
    Sistema de incidencias 1.12.2

    El sistema de incidencias no tiene un upstream correcto

    Síntomas:

    Al implementar la organización gdchservices manualmente, el sistema de asistencia no tiene un upstream correcto, no se crean máquinas virtuales y el pod de midserver no está en buen estado en el clúster gdchservices-system del espacio de nombres support.

    Solución alternativa:

    Crea un 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 una IP de gestión y los registros de Cilium

    Síntomas:

    El acceso de inicio de sesión no funciona en una VM con una IP de gestión. Es posible que veas un error como este en los registros del pod anetd:

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

    Solución alternativa:

    Elimina 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 este:

          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. Elimina los siguientes subcomponentes del 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. Comprueba el subcomponente en los espacios de nombres raíz y de 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 las siguientes especificaciones y el chatURL debe mostrar la versión a la que ya se han actualizado 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 comprobación previa o posterior al vuelo

    Síntomas:

    Las comprobaciones preparatorias o posteriores fallan y se produce un error. Consulta los registros:

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

    El error puede ser similar al siguiente:

     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 comprobaciones posteriores al vuelo y todas las demás comprobaciones se completan sin errores, omite las comprobaciones posteriores al vuelo. Cuando se reinicie la actualización, también debes omitir las comprobaciones previas con el archivo kubeconfig del 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 tiene este aspecto:

     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 preparatorias y todas las demás comprobaciones preparatorias se completan sin errores, omite las comprobaciones preparatorias:

    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 tiene este aspecto:

    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 tengas que aplicar esta solución alternativa más de una vez si no se aplica.

    Cartera ATAT 1.12.0
    1.12.1
    1.12.2
    1.12.4

    La cartera no se sincroniza

    Síntomas:

    ConfigSync error out with message:

     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 Portfolio ha cambiado en la versión 1.12 de GDC. El campo portfolioName se ha refactorizado a portfolioID. Busca el archivo YAML que contiene el recurso personalizado de cartera mencionado en el mensaje de error. Cambia el nombre del campo portfolioName por portfolioID.

    Actualizar 1.12.2

    Si falla el OSPolicy NTP, no se podrá ejecutar ningún otro 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 ha completado trabajos de comprobación preliminar:

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

    Solución alternativa:

    1. Comprueba el CR `NodeTargetPolicy` del nodo.
    2. Busca `.spec.osPolicies` del CR `NodeTargetPolicy` que tenga `ref.name=admin-ntp-policy` y `type: Ready` con el estado false:
            # Enter the node InventoryMachine name.
            NAME=
            kubectl get nodetargetpolicy -n gpc-system $NAME -ojsonpath="{.spec.osPolicies}" | jq
    3. La salida tiene este aspecto:
       - 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. Elimina 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 NodeUpgrade CR menciona version: rocky-86-xyz en su especificación, aunque el nodo que se está actualizando sea Ubuntu.

    Solución alternativa:

    No necesitas ninguna solución alternativa porque esta información no es perjudicial. 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

    Los trabajos de preinstalación de SIEM fallan

    Síntomas:

    Los trabajos siem-*-preinstall de los espacios de nombres root y org-1 del clúster de administrador raíz fallan repetidamente.

    Solución alternativa:

    Es normal que los trabajos fallen cuando el feature gate de SIEMComponent esté inhabilitado. Los errores no indican que el componente esté roto. La conciliación del componente SIEM se puede pausar si el ruido es molesto, pero, por lo general, se recomienda dejar el componente habilitado si es posible. Si la conciliación de componentes está en pausa, debe volver a habilitarse manualmente cuando la instalación del componente SIEM ya no esté restringida en futuras actualizaciones.

    Actualización de nodo 1.12.0
    1.12.1
    1.12.2

    No se puede actualizar el nodo porque el archivo lvm.conf está obsoleto

    Síntomas:

    Puede que haya problemas con vgs, blkid y gather_facts de Ansible no responda. Este problema afecta a los sistemas operativos Rocky y Ubuntu.

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

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

    Requisitos:

    1. Sigue los pasos del runbook 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 runbook 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 por separado. Corrija los clústeres de uno en uno. La salida podría tener este aspecto:

          NAME
          bm-2bca8e3f
          bm-4caa4f4e
    2. Crea un archivo de guía y de política:
      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 rellenarse como en este ejemplo. Añade un párrafo por cada nodo que hayas encontrado en el paso 1. Solo podrás crear un clúster a la vez, así que rellena la sección de inventario con los nodos de 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 ajuste.
    7. Sigue los pasos del runbook OS-P0005 para validar que los nodos se han actualizado.
    8. Una vez que hayas confirmado que la política se ha completado correctamente, elimínala con la herramienta k9s:
      1. Ve a las políticas de SO, como :ospolicies.
      2. Busca y selecciona la política lvm-conf-device-filter-node-update.
      3. Pulsa Ctrl + D.
      4. Confirma la eliminación.

    Para derivar este problema, registra una incidencia con el runbook SUPP-G0008. La incidencia debe incluir información como la siguiente:

    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

    Rocky OS se selecciona incorrectamente para los nuevos clústeres u organizaciones

    Síntomas:

    Este problema se produce si el entorno se desplegó anteriormente con la versión 1.11 y, a continuación, se actualizó a la versión 1.12. Cuando se crea un clúster o una organización en una versión 1.12.x, se selecciona Rocky OS en lugar de Ubuntu OS para el aprovisionamiento de nodos de hardware desnudo y de máquinas virtuales debido a la versión de Rocky OS especificada en los CRs ReleaseMetadata y Userclustermetadata.

    Solución alternativa:

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

    1. Comprueba si hay OrganizationUpgrade CRs 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 problema al equipo de ingeniería antes de continuar con los pasos siguientes.

    2. Quita todos los OrganizationUpgrade CRs 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 nueva organización. Debe haber un ReleaseMetadata correspondiente a esta versión de destino:
      TARGET_RELEASE=
    4. Identifica la OSImageMetadata CR más reciente del 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

      La salida podría tener este aspecto:

      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. Si no es así, deriva el problema al equipo de ingeniería antes de continuar con los pasos siguientes.

    5. Actualiza el ReleaseMetadata de destino para usar Ubuntu OS_VERSION 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 UserclusterMetadata asignada del ReleaseMetadata de destino:
      UCMS=$(kubectl --kubeconfig=KUBECONFIG get releasemetadata  "${TARGET_RELEASE}" -o json | jq -r '.spec.userClusters[].name')
    7. Actualiza el UserclusterMetadata de destino para que use Ubuntu OS_VERSION en el clúster de administrador raíz y en el clúster de administrador de la organización de cada organización. Ejecuta el siguiente comando en 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

    No se pueden importar imágenes qcow2 y sin formato con la función de traer tu propia imagen

    Síntomas:

    Cuando se importan imágenes de VM locales mediante la CLI de gdcloud compute images import, el estado de importación se queda bloqueado en WaitingForTranslationVM o ImportJobNotCreated. Esto se debe a que el disco temporal creado para traducir o importar usa el mismo tamaño que la imagen qcow2 o raw, pero LUKS añade una sobrecarga de unos pocos MiBs que provoca que falle el aprovisionamiento del disco.

    Solución alternativa:

    Crea un nuevo VirtualMachineImageImport manualmente con el mismo nombre de imagen, pero con un spec.minimumDiskSize más grande. Por ejemplo, si este fuera el comando usado para importar la imagen:

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

    Si el VirtualMachineImageImport 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 se debe sustituir por 21 Gi.

    Sustituye los valores de marcador de posición en función de cómo se haya llamado 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 .... Cuando la salida de la consola pase de Uploading image to ... a Image import has started for ..., pulsa CTRL + C para que la imagen local se suba al almacenamiento de objetos y se conserve el VirtualMachineImageImport para poder 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 se ha quedado bloqueada en TranslationInProgress

    Síntomas:

    El pod importer-image-import-$VMII del espacio de nombres del proyecto del clúster del sistema falla y muestra 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 VMII tiene el tipo de condición Ready con el estado False y el motivo TranslationInProgress después de 2 horas 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 eliminar y aplicar el ValidatingWebhookConfiguration, necesitas el archivo kubeconfig del clúster de administrador del clúster de administrador de la organización. Puedes obtener el siguiente runbook: IAM-R0004.

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

    El proceso de VirtualMachineImageImport continúa, pero vuelve a quedarse bloqueado en un paso posterior. En el espacio de nombres del proyecto del clúster del sistema, verás que la tarea 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 la imagen. La imagen final se sube al almacenamiento de objetos, pero falta el VirtualMachineImage. Puedes crear un VirtualMachineImage manualmente 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`, `rhel-8`]. Además, 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 se ha quedado bloqueada

    Síntomas:

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

    Para diagnosticar el problema, comprueba si el mutatingwebhookconfiguration llamado istio-revision-tag-default existe en el mismo clúster que la implementación de la pasarela bloqueada.

    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 a que el webhook exista, lo que debería ocurrir en breve, ya que está en un bucle de conciliación.
    Supervisión 1.12.2

    cortex-store-gateway se reinicia con un error de límites de segmento fuera del intervalo

    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 cortex-config configMap en el clúster del sistema y define el tiempo de espera de memcached en index_cache en dos segundos para que la configuración de index_cache tenga este aspecto:
       index_cache:
            backend: memcached
            memcached:
              addresses: dnssrvnoa+_memcached._tcp.cortex-index-memcached.mon-system.svc.cluster.local
              timeout: 2s
    3. Reinicia los pods cortex-store-gateway del 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 provoca un fallo en un subcomponente

    Síntomas:

    El nodo de hardware desnudo se muestra como NotReady y el servidor se queda bloqueado en la pantalla de arranque con el último mensaje Retrieving encryption keys.

    Solución alternativa:

    1. Reinicia iLO.
    2. Cuando iLO vuelva a estar operativo, 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 StorageCluster CR no muestra ningún valor en el campo de estado StorageVersion. Comprueba la versión:

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

    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 la suite de operaciones (OI) 1.12.4

    La ruta del instalador de Fluent Bit es incorrecta

    Síntomas:

    La ubicación del instalador de fluent-bit ha cambiado 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 porque 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 añadir la ubicación correcta del instalador:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-win64.*').Name
    Infraestructura de la suite de operaciones (OI) 1.12.4

    La ruta del instalador de Nessus es incorrecta

    Síntomas:

    La ubicación del instalador de Nessus ha cambiado a operations_center\bin\NessusAgent-x64.msi. El 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 porque 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 añadir 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 se queda bloqueada 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 que falta la configuración del endpoint de S3 para la nueva organización.

    Solución alternativa:

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

    1. Mediante el procedimiento de acceso de emergencia, obtén un archivo kubeconfig del clúster de administrador raíz que tenga acceso de lectura a los siguientes recursos:
      • Organización
      • ObjectStorageAdminNode
      • SubnetClaim
      • ObjectStorageSite
      • Secret
    2. Anota el nombre de la organización:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get Organization -A
    3. Anota las direcciones IP de los clientes de ObjectStorageAdminNode CRs en el clúster de administrador raíz.
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode

      En cada CR de AdminNode:

      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode NODE_NAME -o jsonpath='{.spec.network.clientIP}'
    4. Anota el intervalo de direcciones IP disponibles y las IPs reservadas de ese intervalo:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get SubnetClaim -n root external-objectstorage-client-lif-subnet -o jsonpath='{.status.ipv4SubnetStatus}'
    5. Obtén las credenciales de inicio de sesión de la interfaz de gestión de StorageGRID del secreto gpc-system/objectstorage-breakglass-root-level1 en el clúster root-admin.
    6. Inicia sesión en la interfaz de gestió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 detallada de cada grupo de alta disponibilidad y anota su dirección IP virtual (VIP).
    9. Crea un grupo de alta disponibilidad:
      1. Nombre del grupo: el patrón de nombre es ORGANIZATION_NAME-ha . En este caso, es org-2-ha.
      2. Descripción del grupo: usa grupos de alta disponibilidad para el patrón de descripción.
      3. Interfaces: selecciona todos los eth2.
      4. Orden de prioridad: la interfaz principal debe tener la prioridad más alta.
      5. SubnetCIDR StorageGRID rellena este campo automáticamente. Verifica que la subred coincida con la status.ipv4SubnetStatus.cidrBlock en el SubnetClaim external-objectstorage-client-lif-cidr.
      6. IP virtual: la siguiente IP del intervalo de IPs disponibles. La IP no puede coincidir con la IP reservada, la IP de cliente del nodo de administrador ni las IPs virtuales de los grupos de alta disponibilidad.
    10. Rota las credenciales de emergencia de StorageGRID.
    Actualizar 1.12.4

    Reconciliación continua en el subcomponente

    Síntomas:

    Al actualizar 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 conciliación en curso. Para diagnosticar el problema, consulta los registros de Prometheus. Por ejemplo:

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

    Los registros pueden incluir un error como este:

    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 un shell en el contenedor en ejecución.
      kubectl exec --stdin --tty POD_NAME -n gitlab-system -c prometheus-server -- /bin/sh
      /prometheus $ df -h

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

    2. Comprueba la salida 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 se produce durante la actualización, elimina la tarea de migración, ya que tiene un tiempo de espera de 3600 segundos, y, a continuación, continúa con la actualización:
      kubectl delete job gitlab-migrations-1-fe7-2 -n gitlab-system
    Actualizar 1.12.4

    Fallo en la comprobación previa de gestión de identidades y accesos

    Síntomas:

    Para diagnosticar el problema, consulta los registros de actualización de IAM. Por ejemplo:

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

    La salida podría tener este aspecto:

    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. El resultado se muestra 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

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

    4. Elimina el pod que no esté completamente correcto:
      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. Este paso puede tardar unos minutos.
    6. Si el pod eliminado no se sustituye por un pod correcto, abre una incidencia.
    Actualizar 1.12.1
    1.12.2
    1.12.4

    El estado de OrganizationUpgrade es Unknown

    Síntomas:

    El estado de OrganizationUpgrade es Unknown una vez que se ha completado la actualización.

    Solución alternativa:

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

    Actualizar 1.12.4

    Error al actualizar el subcomponente opa gatekeeper

    Síntomas:

    Durante la actualización de la organización del cliente de la versión 1.12.2 a la 1.12.4, se produce un error ReconciliationError al actualizar el subcomponente opa gatekeeper.

    Solución alternativa:

    1. Edita el objeto mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg del clúster de usuarios afectado. Si hay más de un clúster de usuarios afectados, repite los pasos con 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 añadirle los dos valores siguientes:
      • opa-system
      • cert-manager

      El objeto actualizado debería tener este aspecto:

                  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 ha actualizado como parte de la actualización del clúster

    Síntomas:

    Al actualizar 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 la ansibleplaybook no se aplican y bloquean la política del SO que ejecuta la versión anterior de la ansibleplaybook.

    Solución alternativa:

    1. Elimina 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 los cuadernos de jugadas.
    DNS 1.12.4

    No se puede crear la organización porque el tráfico DNS al nodo de administrador raíz se agota

    Síntomas:

    Cuando crees una organización, es posible que veas que el subcomponente core-dns se agota 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 añade los nuevos intervalos de IPs en los intervalos de origen del balanceador de carga.
    2. Si se anulan los cambios de CR, pausa el dns-core subcomponente con la anotación lcm.private.gdc.goog/paused="true".
    Almacenamiento de archivos y en bloques 1.12.4

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

    Síntomas:

    Al actualizar de la versión 1.12.2 a la 1.12.4, el subcomponente file-netapp-trident se queda bloqueado al eliminar 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. Elimina el StorageClasses que no se haya podido 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. Activa la recreación del StorageClasses reiniciando el oclcm-backend-controller de tu clúster. (controlador root-admin para clústeres root y org-admin, controlador org-admin para clústeres system y user):
            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 PersistentVolumeClaim (PVC). Cada PVC debe tener un secreto con el formato g-luks-$pvc_name.
            kubectl get secret -n $pvc_namespace g-luks-$pvc_name
    6. Compruebe que el subcomponente file-netapp-trident no tenga ningún error en el estado:
            kubectl get subcomponent -n $cluster_namespace file-netapp-trident -o jsonpath='{.status}' | jq
      Nota: No debe haber ningún error en los mensajes ni en `backendStatus`. `crdStatus` debe mostrar `deploymentFinished: true`.
    7. Reanuda el subcomponente para que los cambios surtan efecto.
    Servidores físicos 1.12.4

    Fallo en el arranque del servidor

    Síntomas:

    Al iniciar el servidor, es posible que veas un mensaje como este en los registros de hardware:

    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 bloqueada, sigue las instrucciones de los siguientes manuales de operaciones:
      1. SERV-R0006
      2. SERV-R0007
      3. SERV-R0008
    2. Si el problema sigue sin resolverse, sigue los pasos del runbook SERV-R0001.
    3. Si el problema sigue sin resolverse, abre una incidencia.
    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 están visibles en el espacio de nombres obs-system y en el espacio de nombres 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, entonces se trata de otro problema desconocido y no se debe aplicar la solución alternativa.

    El comportamiento previsto es que primary-prometheus-shardX-replicaX solo exista en el mon-system espacio de nombres una vez que se haya completado la actualización a la versión 1.12.

    Solución alternativa:

    1. Elimina manualmente los primary-prometheus-shardX-replicaX StatefulSets del espacio de nombres obs-system.
    2. No elimines los primary-prometheus-shardX-replicaX StatefulSets del espacio de nombres mon-system.
    Redes 1.12.4

    PodCIDR no se ha asignado a ningún nodo aunque se haya creado ClusterCIDRConfig

    Síntomas:

    Un ClusterCIDRConfig es un objeto obligatorio para asignar PodCIDRs. A pesar de que se ha creado el ClusterCIDRConfig, no se ha asignado el PodCIDRs. Este problema se produce si se crea un ClusterCIDRConfig al mismo tiempo que se inician los pods de ipam-controller. La creación del clúster se queda bloqueada en el estado de conciliación:

    1. Comprueba si el objeto ClusterCIDRConfig se ha creado en el clúster:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get clustercidrconfigs -oyaml

      La salida podría tener este aspecto:

      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 comprueba si hay un evento CIDRNotAvailable en el objeto de nodo:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG describe node NODE_NAME

      Los eventos de salida podrían tener este aspecto:

      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 del ipam-controller-manager:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG -n kube-system rollout restart ds ipam-controller-manager
    2. Una vez que los ipam-controller-manager pods estén en estado de ejecución, comprueba si el podCIDR se ha asignado a los nodos:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get nodes -oyaml | grep podCIDR

      La salida podría tener este aspecto:

      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 preentrenadas muestran el estado Enabling en la interfaz de usuario

    El MonitoringTarget muestra el estado Not Ready cuando se están creando clústeres de usuarios, lo que provoca que las APIs preentrenadas muestren continuamente el estado Enabling en la interfaz de usuario.

    Solución alternativa:

    1. Abre el menú de tu navegador Chrome (icono 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 Respuesta de una solicitud ai-service-status para ver el contenido de esa solicitud.
    6. Comprueba que todo esté 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:

    Al actualizar 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. Comprueba que cada nodo tenga las credenciales SSH correspondientes almacenadas en un secreto.
      1. Comprueba 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. Comprueba 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 tiene el siguiente aspecto en el caso de 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 ningún secreto, el error tendrá este aspecto:

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

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

    Síntomas:

    Durante las actualizaciones, se vuelve a crear el clúster de la base de datos de traducciones, lo que provoca que el secreto secret-store del clúster del sistema ODS quede obsoleto y desincronizado. Por este motivo, el pod y el servicio del frontend de traducción no se inicializan.

    Solución alternativa:

    Elimina el secreto del clúster del sistema:

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

    Sustituye SYSTEM_CLUSTER_KUBECONFIG por la ruta al archivo kubeconfig del clúster del sistema.

    Un controlador vuelve a crear el secreto automáticamente y lo vuelve a sincronizar con el clúster de la base de datos.

    Servidores físicos 1.12.4

    El servidor no puede conectarse al gestor de claves

    Síntomas:

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

    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 comprueba que iLO puede conectarse al gestor de claves.

    Almacenamiento de registros 1.12.4

    El registro de escritura previa llena el volumen persistente

    Síntomas:

    Loki solo tiene 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 puede conectarse al bucket de almacenamiento durante horas. Si el PV no tiene espacio disponible, Loki no podrá recuperarse a menos que elimines 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 eliminar el PV sin espacio disponible.

    Sigue estos pasos para recuperar el pod Loki:

    1. Asegúrate de que el contenedor de herramientas de E/S esté instalado en la estación de trabajo. Para obtener más información, consulta el manual de operaciones OOPS-P0065.
    2. Para obtener los permisos que necesitas para editar recursos, pide a tu administrador de seguridad que te conceda los siguientes roles:
      • observability-viewer
      • observability-admin
    3. Define la variable de entorno KUBECONFIG con la ruta al archivo kubeconfig del clúster de administrador raíz. Para obtener más información, consulta el runbook IAM-R0004.
    4. Define 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 LoggingPipelineReconciler:
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    7. Define la variable de entorno KUBECONFIG con la ruta al archivo kubeconfig del clúster en el que se ejecuta el pod de Loki afectado. Para obtener más información, consulta el runbook IAM-R0004.
    8. Define 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 la escala de Loki StatefulSet:
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=0
    13. Comprueba que no se esté ejecutando ningún pod StatefulSet:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      La salida debe tener el siguiente aspecto:

      NAME                      READY   AGE
      audit-logs-loki-io        0/0     4d3h
    14. Elimina el PVC afectado:
      kubectl delete pvc $LOKI_PVC_NAME -n obs-system
    15. Aumenta la escala de Loki StatefulSet:
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=${LOKI_STATEFULSET_REPLICAS}
    16. Define la variable de entorno KUBECONFIG con la ruta al archivo kubeconfig del clúster de administrador de la organización afectada. Para obtener más información, consulta el runbook 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 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

      La salida debe tener el siguiente aspecto:

      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

    Las tareas se programan de forma continua

    Síntomas:

    Las tareas se programan de forma continua. En cuanto se termina un trabajo, se programa otro. Los trabajos que se programan continuamente 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 se modifique el secreto de información de la flota en el clúster de administrador raíz. Este problema se produce cuando hay un cambio en los interruptores de gestión de la instancia, como kr get managementswitches -A, o cuando se modifica cualquier cidrclaim en el espacio de nombres de la organización.
    3. Reanuda los subcomponentes siempre que se produzca un cambio en cualquier recurso NodePool del clúster de administrador de la organización. Reanuda los subcomponentes antes de empezar.
    Actualizar 1.12.4

    No hay un upstream correcto para ServiceNow

    Síntomas:

    1. Al actualizar de la versión 1.12.2 a la 1.12.4, no hay un upstream correcto 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. El archivo adjunto de volumen indica que el PVC tiene habilitado LUKS.
    3. El reconciliador busca un secreto con las contraseñas de LUKS. Como el archivo adjunto 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 Kubeconfig del clúster raíz o del clúster de administrador de organización en el que se produce el problema:
            export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    2. Elimina 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 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:

    Puede que veas cómo el estado del subcomponente file-netapp-trident cambia de Reconciling a ReconciliationCompleted.

    Solución alternativa:

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

    1. El valor de TridentBackend es online.
    2. La configuración de TridentBackend es bound.
    3. El despliegue 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 puede generar el delta entre manifest y snapshot al actualizar el nodo de trabajo del clúster del sistema

    Síntomas:

    Al actualizar de la versión 1.12.2 a la 1.12.4, la actualización de la organización se queda bloqueada en la fase 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 del clúster raíz o del clúster de administrador de organización en el que se produce un error al actualizar el nodo y comprueba si nodeupgradetask ha fallado:
           export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
           kubectl get nodeupgradetask -A -ojsonpath='{.items[*].status.conditions[?(@.status != "True")]}' | jq 
    2. Comprueba 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 si un osartifactsnapshot tiene una distribución que falta:
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    4. Comprueba que haya al menos una captura impresa que no tenga definida 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. Comprueba 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 eliminar cgroup de 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 de runc init está bloqueado, lo que impide que kubelet elimine el pod cgroup.

    Solución alternativa:

    1. Usa la siguiente secuencia de comandos para encontrar el proceso que bloquea la eliminación 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. Comprueba el estado del congelador con cat freezer.state. El estado debe ser FROZEN.
    3. Echo "THAWED" > freezer.state
    4. El cgroup se ha eliminado correctamente. 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 ha implementado en la organización gdchservices.

    1. Inspecciona las anotaciones y las etiquetas del proyecto gdch-perftest y del bucket perftest-bucket-reports de PTaaS en el espacio de nombres perftest gdch-perftest. Puede que falten la etiqueta 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 en el contenedor. Añade estas etiquetas y anotaciones manualmente:
      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 reclama el segmento de forma forzada:
      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. Puede 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 reclama 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 reconcilia en el clúster del administrador raíz:
      kubectl get subcomponent -n gdchservices perf-ptaas