Artifact Registry
Error de conciliación del subcomponente sar-failoverregistry
Versiones: 1.13.1, 1.13.3 y 1.13.4
Síntomas: Al crear el clúster de administrador raíz con el comando gdcloud system admin-cluster install, la operación puede fallar si hay una lista larga de servidores al iniciar el proceso. El mensaje de error es el siguiente:
Secret "sar-failoveregistry-backend-parameter" is invalid: data: Too long: must have at most 1048576 bytes
Solución alternativa: para mitigar este problema, sigue estos pasos:
En el mismo clúster de Kubernetes que el subcomponente, enumera los servidores y confirma que cada recurso personalizado de servidor tiene una etiqueta con la clave
cluster.private.gdc.goog/inventory-machine:kubectl get servers -n gpc-systemBusca el recurso personalizado del componente que tenga un aspecto similar al siguiente:
apiVersion: lcm.private.gdc.goog/v1 kind: Component metadata: creationTimestamp: "2025-01-06T12:00:41Z" generation: 1 name: sar-v1.14.2-sar-acbf97caf6 resourceVersion: "3199" uid: 681ec5cb-9eb3-423b-ac1d-f6aa27abfd75 spec: name: sarEn el recurso personalizado del componente System Artifact Registry (SAR), añada el selector de etiquetas en los
runtimeParameterSourcesservidores desar-failover-registry:Consulta el recurso
server:servers: targetCluster: Local object: apiVersion: system.private.gdc.goog/v1alpha1 kind: ServerList namespace: gpc-systemActualiza el campo "servers" en el recurso personalizado del componente:
servers: targetCluster: Local object: apiVersion: system.private.gdc.goog/v1alpha1 kind: ServerList namespace: gpc-system labelSelector: - key: cluster.private.gdc.goog/inventory-machine operator: "in" strValues: - "bm-1" - "bm-2" - "bm-3"
Verifica que los cambios en el componente SAR del paso anterior se propagan al subcomponente
sar-failverregistry:Obtén los detalles del componente SAR:
kubectl get component | grep sarObtén los detalles del componente
sar-failoverregistry:kubectl get subcomponent sar-failoverregistry -n rootUsa la marca
-npara especificar el espacio de nombres.
Copia de seguridad y restauración
Las copias de seguridad fallan por falta de espacio en el volumen
Versiones: todas las versiones de 1.13.x
Síntomas: hay un problema intermitente con la copia de seguridad de volúmenes persistentes que puede afectar a los flujos de trabajo de las tareas de copia de seguridad periódicas. En algunos volúmenes con una alta tasa de cambios, las capturas de volumen que se toman para las copias de seguridad en curso pueden provocar que el volumen se quede sin espacio, lo que hace que pase al modo de solo lectura.
Solución alternativa: Para evitar posibles problemas en las cargas de trabajo de producción, sigue los pasos del runbook BACK-R0104. También puedes eliminar las copias de seguridad acumuladas siguiendo el manual de instrucciones BACK-R0106.
Los pods del agente y del plano de control se reinician por falta de memoria
Versiones: todas las versiones de 1.13.x
Síntomas: es posible que los pods del agente y del plano de control se reinicien si se quedan sin memoria.
Solución alternativa: aumenta la memoria de los pods del plano de control y del agente siguiendo las instrucciones del runbook BACK-R0005. Aumenta la memoria de los pods a 2 GiB.
Falla la copia de seguridad de la captura de PVC
Versiones: todas las versiones de 1.13.x
Síntomas: se han producido errores en las copias de seguridad porque se ha superado el límite de 1023 copias de ONTAP por recurso PersistentVolumeClaim (PVC).
Solución alternativa: Para mitigar este problema, sigue estos pasos:
Actualiza el plan de copias de seguridad para que nunca se alcancen los límites. Configura un plan de copias de seguridad para que se haga una copia cada hora o reduce el
deleteLockDaysa tres para que el número de instantáneas no supere las 1023:apiVersion: backup.gdc.goog/v1 kind: BackupPlan metadata: name: test-backup-plan spec: clusterName: system-cluster backupSchedule: cronSchedule: "*/10 * * * *" paused: false backupConfig: backupScope: selectedApplications: namespacedNames: - name: test-protected-application namespace: release-namespace backupRepository: gdchservices-backup-repository includeVolumeData: true volumeStrategy: LocalSnapshotOnly retentionPolicy: backupDeleteLockDays: LOCK_DAYS backupRetainDays: RETENTION_DAYSHaz los cambios siguientes:
LOCK_DAYS: bloquea la eliminación de la copia de seguridad durante el número de días especificado después de la creación de la copia de seguridad. Usa los siguientes valores:- Si el campo
volumeStrategytiene el valorLocalSnapshotOnly, usa el valor2. - Si el campo
volumeStrategytiene el valorProvisionerSpecific, usa el valor7.
- Si el campo
RETENTION_DAYS: elimina las copias de seguridad después del número de días especificado tras la creación de la copia de seguridad. Si el campovolumeStrategytiene el valorLocalSnapshotOnly, utilice un valor inferior a3.
Para eliminar manualmente las instantáneas excesivas de tu entorno mediante comandos de eliminación de instantáneas de volumen, sigue estos pasos:
Inicializa las variables:
export RKCNF=/root/release/root-admin/root-admin-kubeconfig export KCNF=/root/release/org-admin/gdchservices-admin-kubeconfig export ORG_NAME=ORG_NAME export PVC=PVC_NAMEHaz los cambios siguientes:
ORG_NAME: el nombre de tu organización.PVC_NAME: el nombre del recursoPVCrelacionado con el plan de copia de seguridad.
NetApp ONTAP es un sistema operativo que se usa para administrar el almacenamiento de GDC. Obtener acceso a ONTAP:
export USERNAME="$(kubectl --kubeconfig ${RKCNF?} -n gpc-system get secret storage-root-level1 -o jsonpath='{.data.username}' | base64 -d)" export MGMT_IP="$(kubectl --kubeconfig ${RKCNF?} get storagecluster -A -o jsonpath='{.items[0].spec.network.clusterManagement.ip}')" export PASSWORD="$(kubectl --kubeconfig ${RKCNF?} -n gpc-system get secret storage-root-level1 -o jsonpath='{.data.password}' | base64 -d)" echo $PASSWORDLista todas las copias de seguridad del recurso
PVCseleccionado:ssh ${USERNAME?}@${MGMT_IP?} "volume snapshot show -vserver ${ORG_NAME?} -fields volume,snapshot,size,create-time" | grep "snapshot-" > /tmp/snapshot_unsort.listUsa la contraseña del paso anterior para iniciar sesión en la máquina con la dirección IP definida por la variable
MGMT_IP.Busca el PVC con el mayor número de copias de seguridad:
grep ${ORG_NAME?} /tmp/snapshot_unsort.list | grep snapshot | awk '{print $2}' | sort | uniq -cAsigna al
PVCel nombre de recurso que tenga un número elevado de copias de seguridad:export PV_NAME=Elimina la captura del recurso
PVCque contenga un número elevado de capturas. El límite del número de copias de un recursoPVCes de 1023:for snap_name in `grep ${ORG_NAME?} /tmp/snapshot_unsort.list | grep snapshot | grep ${PV_NAME?} | awk '{print $3}'` do echo "volume snapshot delete -vserver ${ORG_NAME} -volume ${PV_NAME} -snapshot $snap_name" echo "Y" doneInicia sesión en ONTAP y ejecuta estos comandos para eliminar la instantánea:
echo $PASSWORD #Use this password to login to ontap ssh ${username?}@${mgmt_ip?}Ejecuta los comandos que se indican en el paso anterior para eliminar la instantánea. Cuando termines, cierra la sesión SSH.
Repite los pasos de eliminación hasta que se hayan limpiado todas las
PVCinstantáneas infractoras.
Restaurar a partir de una copia de seguridad que no es compatible con la cuota de SVM
Versiones: 1.13.1
Síntomas: el problema es una incompatibilidad entre las funciones de NetApp. Esta incompatibilidad impide que se proporcione la cuota de inquilino y que se implementen correctamente las restauraciones. El problema solo se produce al restaurar una copia de seguridad en un clúster de usuarios con restricciones de cuota.
Solución alternativa: si se produce este problema, la restauración falla y aparece el mensaje de error DP volumes are not supported on storage-limit enabled Vserver. El operador de infraestructura (IO) debe inhabilitar la cuota del clúster de ese usuario y reiniciar el proceso de restauración. Una vez que se haya completado la restauración, el IO debe volver a habilitar las cuotas de los inquilinos y el sistema debería seguir funcionando según lo previsto. Consulta el runbook FILE A0030 para obtener más información.
Facturación
Las métricas de facturación no se muestran correctamente en el panel de control de facturación
Versiones: 1.13.1
Síntomas: las métricas de facturación no se emiten correctamente a Cortex debido a que falta MetricsProxySidecar.
Solución: crea un recurso billing-monetizer MetricsProxySidecar. A continuación, ejecuta una secuencia de comandos para actualizar el metricExpression.
Exporta la siguiente variable kubeconfig:
export KUBECONFIG=KUBECONFIG_PATHSustituye la variable
KUBECONFIG_PATHpor la ruta al archivo kubeconfig del clúster de administrador de la organización. Sigue los pasos que se indican en el manual de servicio IAM-R0101 para generar el archivokubeconfignecesario para esta solución alternativa.Crea un recurso
billing-monetizerMetricsProxySidecarpara los espacios de nombresbilling-systemypartner-billing-system:Para
billing-system:cat <<EOF | kubectl --kubeconfig=$KUBECONFIG apply -n billing-system -f - apiVersion: monitoring.private.gdc.goog/v1alpha1 kind: MetricsProxySidecar metadata: name: billing-monetizer namespace: billing-system annotations: lcm.private.gdc.goog/claim-by-force: "true" helm.sh/resource-policy: keep spec: restartUninjectedPods: true restartUnsyncedPods: false sources: - port: 8080 scrapeInterval: 60s destinations: - certificate: secretName: billing-monetizer-monitoring-target-infra-obs-cert port: 9090 - certificate: secretName: billing-monetizer-monitoring-target-platform-obs-cert port: 9091 --- apiVersion: monitoring.private.gdc.goog/v1alpha1 kind: MetricsProxySidecar metadata: name: usagemetering namespace: billing-system annotations: lcm.private.gdc.goog/claim-by-force: "true" helm.sh/resource-policy: keep spec: restartUninjectedPods: true restartUnsyncedPods: false sources: - port: 8099 scrapeInterval: 60s destinations: - port: 9090 certificate: secretName: bil-usagemetering-monitoring-target-cert EOFPara
partner-billing-system:cat <<EOF | kubectl --kubeconfig=$KUBECONFIG apply -n partner-billing-system -f - apiVersion: monitoring.private.gdc.goog/v1alpha1 kind: MetricsProxySidecar metadata: name: billing-monetizer namespace: partner-billing-system annotations: lcm.private.gdc.goog/claim-by-force: "true" helm.sh/resource-policy: keep spec: restartUninjectedPods: true restartUnsyncedPods: false sources: - port: 8080 scrapeInterval: 60s destinations: - certificate: secretName: billing-monetizer-monitoring-target-infra-obs-cert port: 9090 EOFEjecuta la siguiente secuencia de comandos para actualizar el
metricExpression. De esta forma, se elimina elcontainer_name="monetizer"delskuconfig, lo que incluye lo siguiente:billing_total_cost{container_name="monetizer"cat <<EOF | kubectl --kubeconfig=$KUBECONFIG -n billing-system patch skuconfig bc73-b150-e0ea --type=merge -p ' { "metricMappingTimeline": [ { "billingModel": "Generic", "usageAggregationLevel": "Organization", "revision": 1, "generic": { "metricExpression": "sum( increase( billing_total_cost{sku !~ \"BC4D-B784-EA3C|BC73-B150-E0EA|BD0C-C8CF-658B|BD1A-9464-9DF9|BD5A-044C-4860|BDB4-6C62-00BE|BDB4-BBA6-3EEE|3034-EE51-7404|3160-1596-5D9B|54AD-8EBC-8BB1\"}\n [{{.Range}}:1m] ) ) * max(metering_premium_support_base_fee)" } } ] }' EOF cat <<EOF | kubectl --kubeconfig=$KUBECONFIG -n billing-system patch skuconfig bd1a-9464-9df9 --type=merge -p ' { "metricMappingTimeline": [ { "billingModel": "Generic", "usageAggregationLevel": "Organization", "revision": 1, "generic": { "metricExpression": "sum( increase( billing_total_cost{sku !~ \"BC4D-B784-EA3C|BC73-B150-E0EA|BD0C-C8CF-658B|BD1A-9464-9DF9|BD5A-044C-4860|BDB4-6C62-00BE|BDB4-BBA6-3EEE|3034-EE51-7404|3160-1596-5D9B|54AD-8EBC-8BB1\"}\n [{{.Range}}:1m] ) ) * max(metering_enhanced_support_base_fee)" } } ] }' EOF cat <<EOF | kubectl --kubeconfig=$KUBECONFIG -n billing-system patch skuconfig b93c-effb-6d6b --type=merge -p ' { "metricMappingTimeline": [ { "billingModel": "Generic", "usageAggregationLevel": "Organization", "revision": 1, "generic": { "metricExpression": "sum( increase( billing_total_cost{sku !~ \"B853-4EA7-4587|B871-C5E5-BAC1|B874-4D01-5058|B8D9-1200-1016|B93C-EFFB-6D6B|B995-6E8E-BF8D|B9B4-1B11-A9F1|B9B5-DFDA-8526|BA38-E4BE-BA5D|BB08-6B46-E1B3|BB51-EA7D-1728|BBE8-7B7A-03DE|BBF1-CE8E-CD24|BC4C-AC45-6448|34A1-F9B1-DC13|53F3-F2F8-54A9|3674-F9D1-120A|5463-A50F-B07D\"}\n [{{.Range}}:1m] ) ) * max(metering_premium_support_base_fee)" } } ] }' EOF cat <<EOF | kubectl --kubeconfig=$KUBECONFIG -n billing-system patch skuconfig b871-c5e5-bac1 --type=merge -p ' { "metricMappingTimeline": [ { "billingModel": "Generic", "usageAggregationLevel": "Organization", "revision": 1, "generic": { "metricExpression": "sum( increase( billing_total_cost{sku !~ \"B853-4EA7-4587|B871-C5E5-BAC1|B874-4D01-5058|B8D9-1200-1016|B93C-EFFB-6D6B|B995-6E8E-BF8D|B9B4-1B11-A9F1|B9B5-DFDA-8526|BA38-E4BE-BA5D|BB08-6B46-E1B3|BB51-EA7D-1728|BBE8-7B7A-03DE|BBF1-CE8E-CD24|BC4C-AC45-6448|34A1-F9B1-DC13|53F3-F2F8-54A9|3674-F9D1-120A|5463-A50F-B07D\"}\n [{{.Range}}:1m] ) ) * max(metering_enhanced_support_base_fee)" } } ] }' EOF cat <<EOF | kubectl --kubeconfig=$KUBECONFIG -n billing-system patch skuconfig ba38-e4be-ba5d --type=merge -p ' { "metricMappingTimeline": [ { "billingModel": "Generic", "usageAggregationLevel": "Organization", "revision": 1, "generic": { "metricExpression": "sum( increase( billing_total_cost{sku !~ \"B853-4EA7-4587|B871-C5E5-BAC1|B874-4D01-5058|B8D9-1200-1016|B93C-EFFB-6D6B|B995-6E8E-BF8D|B9B4-1B11-A9F1|B9B5-DFDA-8526|BA38-E4BE-BA5D|BB08-6B46-E1B3|BB51-EA7D-1728|BBE8-7B7A-03DE|BBF1-CE8E-CD24|BC4C-AC45-6448|34A1-F9B1-DC13|53F3-F2F8-54A9|3674-F9D1-120A|5463-A50F-B07D\"}\n [{{.Range}}:1m] ) ) * max(metering_enhanced_support_base_fee)" } } ] }' EOF cat <<EOF | kubectl --kubeconfig=$KUBECONFIG -n billing-system patch skuconfig bbe8-7b7a-03de --type=merge -p ' { "metricMappingTimeline": [ { "billingModel": "Generic", "usageAggregationLevel": "Organization", "revision": 1, "generic": { "metricExpression": "sum( increase( billing_total_cost{sku !~ \"B853-4EA7-4587|B871-C5E5-BAC1|B874-4D01-5058|B8D9-1200-1016|B93C-EFFB-6D6B|B995-6E8E-BF8D|B9B4-1B11-A9F1|B9B5-DFDA-8526|BA38-E4BE-BA5D|BB08-6B46-E1B3|BB51-EA7D-1728|BBE8-7B7A-03DE|BBF1-CE8E-CD24|BC4C-AC45-6448|34A1-F9B1-DC13|53F3-F2F8-54A9|3674-F9D1-120A|5463-A50F-B07D\"}\n [{{.Range}}:1m] ) ) * max(metering_premium_support_base_fee)" } } ] }' EOF
El usuario no puede crear BillingAccountBinding debido a errores en el webhook de validación
Versiones: 1.13.0, 1.13.1 y 1.13.3
Síntomas: el error se encuentra en la lógica del webhook de validación de BillingAccountBinding. Si un usuario intenta crear un recurso BillingAccountBinding, el webhook devuelve el error permission denied.
Solución alternativa: para crear recursos de BillingAccountBinding, notifica al operador de la infraestructura y crea los recursos correspondientes mediante IaC.
Almacenamiento en bloques
Los pods de Grafana se quedan en el estado Init debido a errores de montaje de volumen.
Versiones: 1.13.3
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:
Comprueba si el PVC tiene un valor de deletionTimestamp. Si no hay ningún valor de deletionTimestamp (migración de pods), sigue estos pasos:
- Consulta el
VolumeAttachmentdePVCpara identificar dónde está conectado el volumen. - Cordonar los
Nodesdel clúster que no coincidan con este valor. - Elimina el
Podque falla. De esta forma, debería migrar de nuevo alNodeoriginal.
Después de comprobarlo, si hay un valor de deletionTimestamp (eliminación de volumen), sigue estos pasos:
- Consulta el
VolumeAttachmentdePVCpara identificar dónde está conectado el volumen. En
Node, muestra el contenido de su archivo de seguimiento:cat /var/lib/trident/tracking/PVC_NAME.jsonValida que el dispositivo LUKS que se encuentra en el campo
devicePathde la salida del archivo de seguimiento esté cerrado. Esta ruta no debería existir en este punto:stat DEVICE_PATHValida si el número de serie está asignado a algún dispositivo de multipath.
Copia el valor del campo
iscsiLunSerialdel archivo de seguimiento.Convierte este valor en el valor hexadecimal esperado:
echo 'iISCSILUNSERIAL' | xxd -l 12 -psCon este nuevo valor, comprueba si la entrada multipath sigue existiendo:
multipath -ll | grep SERIAL_HEXSi no existe, elimina el archivo de seguimiento.
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_SERIALA 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
Los pods de inicio de máquinas virtuales no pueden asignar volúmenes
Versiones: 1.13.1
Síntomas:
Puede que veas una advertencia como esta:
Warning FailedMapVolume 2m50s (x206 over 13h) kubelet MapVolume.SetUpDevice failed for volume "pvc-2a68356a-47da-422b-8781-15e3a6fe7ec9" : rpc error: code = DeadlineExceeded desc = context deadline exceeded
Para diagnosticar el problema, sigue estos pasos:
- Asegúrate de que los volúmenes y los pods estén en el mismo nodo.
- Busca el nodo en el que se encuentran los pods y comprueba su estado.
- Comprueba la conectividad de los nodos.
- Comprueba IPSEC.
- Comprueba la multipista para ver si hay un zombi.
Consulta los registros de Trident para averiguar qué paso del flujo de CSI puede haber introducido este elemento zombie:
kubectl --kubeconfig /root/release/system/org-1-system-cluster logs -n netapp-trident -c trident-main
Solución alternativa: para evitar este problema, sigue los pasos que se indican en los siguientes runbooks:
- Si tienes problemas con los nodos, consulta el runbook FILE-R0010.
- Si tienes problemas con IPSEC, consulta el runbook FILE-R0007.
- Si tienes problemas con LUNs zombi, consulta el runbook FILE-R0020.
- Si tienes problemas con los LUNs superzombies, consulta el runbook FILE-R0021.
Errores relacionados con el almacenamiento
Versiones: 1.13.1
Síntomas: los fallos relacionados con el almacenamiento se pueden identificar mediante la activación de la alerta file_block_zombie_luns_present o porque no se puede iniciar el pod debido a un problema en la llamada MountVolume que persiste durante más de un bucle de conciliación. El tiempo de espera puede ser de unos dos minutos.
Si se repite el mismo error, significa que ha habido un fallo en la ruta NodeStage o NodePublish de CSI y que se necesita una solución alternativa. La única excepción es la indicación de un fallo por tiempo de espera agotado. Es posible que veas algunos errores
como este:
NMountVolume.SetUp failed for volume "pvc-a63313b2-3e30-4c92-b074-f9fffe0500a4" : rpc error: code = Internal desc = unable to mount device; exit status 32
MapVolume.SetUpDevice failed for volume "pvc-f594b0c7-a5b5-4a5b-8a53-bf13e95c4bb0" : rpc error: code = Internal desc = rpc error: code = Internal desc = failed to stage volume: multipath device not found when it is expected
MapVolume.SetUpDevice failed for volume "pvc-f594b0c7-a5b5-4a5b-8a53-bf13e95c4bb0" : rpc error: code = Internal desc = rpc error: code = Internal desc = failed to stage volume: failure when reconfiguring multipath
Solución:
Para ver si el
Nodeque tiene elPodse puede corregir para el errorPVC, acordonar el nodo actual en el que se ha programado el pod y eliminar elPod:KUBECONFIG=CLUSTER_KUBECONFIG kubectl cordon node TARGET_NODEEl
Poddebe programarse en unNodecompletamente diferente, lo que obliga a Trident a ejecutar por completo NodeStage, NodePublish, NodeUnpublish y NodeUnstage. Es posible que el volumen no se corrija de inmediato, ya que puede que aún haya sesiones abiertas para este volumen en elNodeoriginal.Una vez completado el paso anterior, quita el acordonamiento del nodo en cuestión:
KUBECONFIG=CLUSTER_KUBECONFIG kubectl uncordon node TARGET_NODESi sigue habiendo errores, aísla todos los demás
Nodesexcepto aquel en el que se programó originalmente elPody elimina elPod. Debería dar como resultado quePodse inicie en elNodeoriginal, donde es posible que aún queden dispositivos.Una vez completado el paso anterior, retira el cordón de los nodos en cuestión.
Como último recurso para guardar el
PVy sus datos, se puede reiniciar elNodepara borrar los errores de multipath, udev y devmapper en elNode. Aunque este paso es bastante arduo, es el que tiene más probabilidades de dar buenos resultados.Si las mitigaciones anteriores no resuelven el problema con el volumen, significa que los datos se han dañado y no se pueden usar. La única opción que queda para continuar con el comportamiento previsto del contenedor es eliminar los elementos
PV,PVCyPodque fallan y, a continuación, reiniciar el nodo en el que se alojaba el PV. Esta acción provoca la pérdida total de los datos que ya se hayan escrito en el volumen.
Volúmenes persistentes creados con un tamaño incorrecto
Versiones: 1.13.1
Síntomas: las cargas de trabajo con un volumen persistente se crean con un tamaño 16 MiB demasiado pequeño. Si las cargas de trabajo dependen exactamente del tamaño anunciado por un volumen persistente, la pequeña discrepancia hace que la carga de trabajo falle al ampliar o aprovisionar. Este problema es más probable que se produzca en volúmenes persistentes aprovisionados con una clase de almacenamiento standard-block que en aquellos aprovisionados con una clase de almacenamiento standard-rwo. Este problema puede producirse en volúmenes persistentes con una clase de almacenamiento standard-rwo que use el modo volumemode:block.
Solución alternativa: asigna un volumen persistente que sea al menos 16 MiB mayor de lo que se necesita.
No se puede eliminar la máquina virtual de almacenamiento
Versiones: 1.13.1
Síntomas: es posible que la StorageVirtualMachine muestre un error como este:
Warning SVMDeletion 27m (x32 over 4h9m) StorageVirtualMachine Reconcile error for svm deletion: failed to delete svm: failed to delete svm volumes: failed to call VolumeCollectionGet: error message: "SVM \"org-2-user\" does not exist. "; error target: "svm.name"
Solución alternativa: elimina el finalizador de StorageVirtualMachines en el espacio de nombres de la organización.
La desactivación de la organización no elimina los recursos
Versiones: 1.13.1
Síntomas: al desactivar una organización, quedan algunos StorageVirtualMachines
recursos, como los siguientes:
- gpc-system secret/org-2-admin-backup-agent-cert-secret
- gpc-system secret/org-2-admin-client-cert-secret
- gpc-system secret/org-2-admin-server-cert-secret
- gpc-system secret/org-2-admin-svm-credential
- gpc-system secret/org-2-admin-backup-agent-cert-secret
- gpc-system secret/org-2-admin-client-cert-secret
- gpc-system secret/org-2-admin-server-cert-secret
- gpc-system secret/org-2-admin-svm-credential
Solución: elimina estos recursos.
Error de conciliación de eliminación
Versiones: 1.13.1
Síntomas: Cuando se elimina un StorageVirtualMachine antes de limpiar los clústeres que dependen de ese StorageVirtualMachine, es posible que haya un problema al limpiar algunos de los volúmenes persistentes (PV) de los clústeres. En concreto, cuando no se limpian los PVs cifrados con LUKS, su secreto impide que se elimine el espacio de nombres en el que se encuentran. Es posible que veas una advertencia en los registros como esta:
Warning ReconcileBackoff 5m35s (x6 over 88m) ClusterLifecycleReconciler cluster namespace deletion is not completed: deletion is still ongoing for namespace: /g-org-2-shared-service-cluster
Solución alternativa: Elimina el finalizador de los secretos g-luks-gdc-vm-disk-* en el espacio de nombres del clúster de servicio.
La actualización de Bare Metal se queda atascada
Versiones: 1.13.1, 1.13.5 y 1.13.6
Síntomas: los trabajos de Ansible se quedan bloqueados al recopilar datos cuando hay LUNs zombi. Al ejecutar el comando multipath -ll, puede aparecer el siguiente problema:
3600a098038314955593f574669785635 dm-11 NETAPP,LUN C-Mode
size=1.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=0 status=enabled
| |- 5:0:0:10 sdaf 65:240 failed faulty running
| `- 6:0:0:10 sdau 66:224 failed faulty running
`-+- policy='service-time 0' prio=0 status=enabled
|- 7:0:0:10 sdad 65:208 failed faulty running
`- 8:0:0:10 sdar 66:176 failed faulty running
También es posible que veas el siguiente mensaje de error:
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv PLAY [Check inventory] *********************************************************
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv TASK [set_fact] ****************************************************************
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv Wednesday 03 July 2024 01:39:04 +0000 (0:00:00.018) 0:00:00.018 ********
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv ok: [10.252.151.3]
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv PLAY [Verify inventory]********************************************************
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv TASK [assert]******************************************************************
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv Wednesday 03 July 2024 01:39:04 +0000 (0:00:00.031) 0:00:00.050 ********
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv ok: [localhost]
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv PLAY [all] *********************************************************************
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv TASK [Gathering Facts] *********************************************************
bm-system-upgrade-node-10.252.151.3-8cee3ed5ff67fdeb1716d964ztv Wednesday 03 July 2024 01:39:04 +0000 (0:00:00.064) 0:00:00.114 ********
Solución alternativa: comprueba la conectividad SSH con el nodo de destino y, a continuación, usa el siguiente runbook: FILE-R0020.
Error de adjuntos múltiples de Trident
Versiones: 1.13.3
Síntomas: Es posible que los pods y los PVCs se queden en nodos diferentes y que el pod se quede atascado inicializándose y esperando el PVC.
Solución alternativa:
Comprueba si el PVC tiene un
deletionTimestamp:kubectl --kubeconfig KUBECONFIGget pvc -n <namespace> | grep deletionTimestampSi no hay
deletionTimestamp(migración de pódcast):- Comprueba el campo VolumeAttachment del PVC para identificar dónde está conectado el volumen.
- Aísla los nodos del clúster que no coincidan con este valor.
- Elimina el pod que falla. Esta acción migra el POD de nuevo al nodo original.
Si hay un
deletionTimestamp(eliminación de volumen):- Comprueba el campo VolumeAttachment del PVC para identificar dónde está conectado el volumen.
- En el nodo, muestra el contenido de su archivo de seguimiento,
/var/lib/trident/tracking/PVC_NAME.json. - Valida que el dispositivo LUKS encontrado 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. Si la ruta sigue existiendo, se produce otro problema. - Valida si el número de serie está asignado a algún dispositivo de multipath.
- Copia el valor del campo iscsiLunSerial del archivo de seguimiento.
- Convierte este valor en el valor hexadecimal esperado:
echo ISCSI_LUN_SERIAL | xxd -l 12 -ps. - Con este nuevo valor, comprueba si la entrada de multipath sigue existiendo:
multipath -ll | grep SERIAL_HEX. - Si no existe, elimina el archivo de seguimiento.
Si existe, verás un valor hexadecimal de serie ligeramente más largo que el que has buscado. Registre este valor como MULTIPATH_SERIAL. Ejecuta
multipath -ll MULTIPATH_SERIALy verás un mensaje como este:3600a09803831486f2d24575445314678 dm-32 NETAPP,LUN C-Mode size=8.0G features='3 queue_if_no_path pg_init_retries 50' hwhandler='1 alua' wp=rw |-+- policy='service-time 0' prio=50 status=active | |- 1:0:0:12 sde 8:64 active ready running | `- 2:0:0:12 sdt 65:48 active ready running `-+- policy='service-time 0' prio=10 status=enabled |- 3:0:0:12 sdbc 67:96 active ready running `- 4:0:0:12 sdbe 67:128 active ready runningEjecuta estos comandos:
systemctl restart iscsidsystemctl restart multipathdmultipath -f MULTIPATH_SERIALecho 1 > /sys/block/BLOCK_DEVICE_NAME/device/delete
Ejecuta el último comando de forma única para cada dispositivo de bloque.
Error en la configuración de IPsec
Versiones: 1.13.4
Síntomas: La configuración de IPsec de ONTAP genera un error debido a una clave precompartida (PSK) no válida que contiene 0X, que se interpreta como una cadena hexadecimal.
Puede que veas una advertencia como esta:
Warning ONTAPIPSecConfiguration 3m47s (x22 over 75m) StorageEncryptionConnection Reconcile error on ONTAP IPSec configuration: failed to call IpsecPolicyCreateDefault: error message: "The specified pre-shared key \"0XxBDkG8iHoAlOc
nCUfHl0AKYzClgGCH\" is not valid because it is not a valid hexadecimal string."; error target: ""
Solución alternativa:
Obtén las conexiones de cifrado del almacenamiento:
kubectl get Storageencryptionconnections --kubeconfig ROOT_ADMIN_KUBECONFIGBusca la entrada con
Ready=Falsey anota el nombre dePRESHAREKEY. La salida podría tener este aspecto:NAME INVENTORYMACHINE STORAGEVIRTUALMACHINE STORAGECIDR PRESHAREDKEY READY AGE vm-5a77b2a2 vm-5a77b2a2 gpu-org-user 192.0.2.0/27 vm-5a77b2a2-pre-shared-key False 26hEsta máquina está ejecutando una organización de GPU, así que elimina
secrets gpc-system/vm-5a77b2a2-pre-shared-keyengpu-org-admin.Espera a que el sistema vuelva a crear
secret/vm-5a77b2a2-pre-shared-key.Busca un trabajo con un patrón como
gpc-system/os-policy-config-host-ipsec-vm-5a77b2a2. Ten en cuenta que los últimos 8 caracteres se generan de forma aleatoria. Cuando la clave vuelva a estar disponible, elimina el trabajo, comojobs gpc-system/os-policy-config-host-ipsec-vm-5a77b2a2m8xdlengpu-org-admin.
No se ha creado la máquina virtual de almacenamiento
Versiones: 1.13.5
Síntomas: el servicio Harbor de gpu-org no se inicia debido a un problema con el aprovisionamiento de volúmenes. Este problema se debe a que el file-storage-backend-controller
pod hace referencia a una máquina de inventario que no existe.
Es posible que veas un error del controlador de almacenamiento como este, que indica que no se ha encontrado el InventoryMachine:
{"ts":1730135301218.1772,"caller":"controller/controller.go:329","msg":"Reconciler error","controller":"StorageEncryptionConnectionGenerator","controllerGroup":"baremetal.cluster.gke.io","controllerKind":"InventoryMachine","InventoryMachine":{"n
ame":"vm-26c89d33","namespace":"@org-1/org-1-admin"},"namespace":"@org-1/org-1-admin","name":"vm-26c89d33","reconcileID":"48ab38a8-385d-4fdb-bd7e-1212f287379c","err":"InventoryMachine.baremetal.cluster.gke.io \"vm-26c89d33\" not found"}
Solución alternativa:
- Elimina el pod
file-storage-backend-controller. - Deje que el controlador de almacenamiento vuelva a obtener las máquinas de inventario presentes.
No se pueden conciliar las redes entre clústeres de almacenamiento
Versiones: 1.13.5 y 1.13.6
Síntomas: Después de una actualización, el recurso personalizado StorageCluster del clúster de administrador raíz no se puede preparar debido a un error de configuración en las subredes entre clústeres de la especificación. El clúster de almacenamiento informa de Not Ready e incluye un evento con este error:
Reconciler error: failed to configure additional networks: failed to configure intercluster LIF: the \"\" Kind is not currently supported
Si se produce este error, significa que la reclamación de subred entre clústeres que usa el clúster de almacenamiento no incluye el campo kind en la referencia. Al inspeccionar el recurso personalizado StorageCluster, encontrarás una referencia de reclamación de subred entre clústeres con solo un nombre y un espacio de nombres, como este:
spec:
additionalNetworks:
- destinationSubnets:
- 10.252.112.0/20
name: backup-agent-storage-network
port: a0a
subnetConfig:
subnetClaimRef:
name: file-block-storage-intercluster-lif-subnet
namespace: root
types:
- BackupAgent
Solución alternativa: actualiza la especificación StorageCluster para incluir el campo kind: SubnetClaim en la referencia de la reclamación de la subred:
spec:
additionalNetworks:
- destinationSubnets:
- 10.252.112.0/20
name: backup-agent-storage-network
port: a0a
subnetConfig:
subnetClaimRef:
kind: SubnetClaim
name: file-block-storage-intercluster-lif-subnet
namespace: root
types:
- BackupAgent
Después de actualizar la especificación StorageCluster, reinicia la implementación file-storage-backend-controller y comprueba que el clúster de almacenamiento esté listo.
Gestión de clústeres
La tarea machine-init falla durante el aprovisionamiento del clúster
Versiones: 1.13.1
Síntomas:
Durante el aprovisionamiento del clúster, el trabajo
machine-initdel 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".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:
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 tareamachine-init, pero antes de la siguiente, ya quemachine-initvuelve a asignar el permiso a la raíz.machine-initReinicia
etcden el segundo nodo para recuperaretcden 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.
No hay conectividad del clúster de servicio al segmento de almacenamiento de objetos
Versiones: 1.13.1
Síntomas: Falla la conexión de un pod de base de datos que se ejecuta en el clúster de servicio a un segmento de almacenamiento de objetos del clúster de administrador de la organización.
Solución: Sigue las instrucciones del runbook KUB-R0305.
Fallo en la comprobación preparatoria
Versiones: 1.13.1
Síntomas: es posible que veas el siguiente mensaje en el estado del objeto de clúster:
conditions:
message: Preflight check <cluster> failed
reason: PreflightCheckFailed
status: "False"
type: PreflightCheckSuccessful
También deberías ver un objeto PreflightCheck correspondiente con el mismo nombre y espacio de nombres que el objeto de clúster que ha estado ahí durante varias horas, mientras que se sabe que el error o el fallo indicado en el objeto PreflightCheck ya no es un problema.
Solución alternativa: elimina el objeto PreflightCheck.
No se puede crear el grupo de nodos de trabajo del clúster de usuarios
Versiones: 1.13.5
Síntomas: La creación del grupo de nodos de trabajo del clúster de usuarios puede dejar de responder en uno de estos tipos de máquinas:
- n2-standard-16-gdc
- n2-standard-32-gdc
- n2-highmem-16-gdc
- n2-highmem-32-gdc
Solución alternativa: Elimina ese grupo de nodos y vuelve a crearlo seleccionando otros tipos de máquina disponibles en el menú desplegable de la interfaz de creación de clústeres de usuario.
Es posible que los clústeres de usuarios, cuando se vuelven a crear, se queden en el estado de conciliación debido a una limpieza incorrecta
Versiones: 1.13.x
Síntomas: Cuando se crean clústeres de usuarios con el mismo nombre que un clúster que se eliminó anteriormente, es posible que se queden en Reconciling indefinidamente con el estado que menciona la fase de instalación del complemento ONE.
Solución: Desinstala el complemento de Helm
CLUSTER_NAME-abm-overrides y reinicia la implementación de
managed-adm-controller. Sigue los pasos detallados de MKS-R0004.
Servicio de base de datos
En esta sección se describen los problemas conocidos del servicio de bases de datos.
Clonación de base de datos de AlloyDB Omni bloqueada
Versiones: todas las versiones de 1.13.x
Síntomas: Cuando un usuario clona un clúster de AlloyDB Omni desde un momento dado, el clúster de base de datos clonado se bloquea con el error DBSE0005 y no puede estar listo. El recurso restore.alloydb correspondiente está bloqueado en la fase "ProvisionInProgress".
Solución alternativa: Para solucionar este problema, elige cuidadosamente el momento a partir del COMPLETETIME de las copias de seguridad correctas.
Lista de copias de seguridad de AlloyDB Omni disponibles para clonar en el servidor de la API de gestión.
kubectl get backups.alloydb -n source-dbcluster-namespace
Ejemplos de resultados:
NAMESPACE NAME PHASE COMPLETETIME
db1 backupplan1-20240908215001 Succeeded 2024-09-08T21:37:38Z
db1 backupplan1-20240909215001 Succeeded 2024-09-09T21:16:18Z
db1 backupplan1-20240910215001 Succeeded 2024-09-10T21:09:38Z
db1 backupplan1-20240911215001 Succeeded 2024-09-11T21:50:47Z
Elige un valor de COMPLETETIME como momento de la clonación. Ten en cuenta que la hora está en UTC.
El cumplimiento de las IOPS afecta al rendimiento del almacenamiento
Versiones: 1.13.1
Solución: para solucionar este problema, sigue una de estas opciones:
- Aumenta el tamaño del almacenamiento.
- Anular la cuota de IOPS.
Error de conciliación al actualizar el subcomponente dbs-fleet
Versiones: 1.13.3
Síntomas: Al actualizar la organización raíz de la versión 1.13.1 a la 1.13.3, es posible que se produzca un error de conciliación. Comprueba si hay errores de conciliación:
kubectl get subcomponent -n ${CLUSTER} -o json | jq -r '.items[] | select(.status.conditions[]?.reason == "ReconciliationError") | "Sub-Component: \(.metadata.name) - \(.status.conditions[]?.message)"'
El error puede ser similar al siguiente:
Sub-Component: dbs-fleet - Reconciliation error: E0121 - rollback chart: no ControlPlaneAgentsVersion with the name "alloydbomni-v0.12.46" found
Solución alternativa: sigue los pasos del runbook OCLCM-R0122.
No se puede crear DBCluster
Versiones: 1.13.3
Síntomas: Después de actualizar a 1.13.3, los nuevos clústeres de bases de datos no se reconcilian y muestran el siguiente error en el estado:
status:
criticalIncidents:
- code: DBSE0001
createTime: ""
message: Internal. General Controller Error.
resource:
component: controller-default
location: {}
stackTrace:
- component: controller-default
message: 'DBSE0001: Internal. General Controller Error. Failed to reconcile
Postgres DBCluster [<name>] DBSE0001: Internal.
General Controller Error. target release is empty in ModuleInstance <name>'
Solución
Verifica que haya localrollout CRs que terminen en cpa-v0.12.46 y cpa-v0.12.51 en el clúster de administrador de la organización. Por ejemplo:
kubectl get localrollouts -A
dbs-fleet-system dp-alloydbomni-15-5.2--cpa-v0.12.46 true
dbs-fleet-system dp-oracle-19-10.0.0.0--cpa-v0.12.46 true
dbs-fleet-system dp-postgresql-13-8-v0.12.46--cpa-v0.12.46 true
dbs-fleet-system dp-postgresql-14-5-v0.12.46--cpa-v0.12.46 true
dbs-fleet-system dp-postgresql-15-2-v0.12.46--cpa-v0.12.46 true
dbs-fleet-system dp-alloydbomni-15-5.2--cpa-v0.12.51 true
dbs-fleet-system dp-oracle-19-10.0.0.0--cpa-v0.12.51 true
dbs-fleet-system dp-postgresql-13-8-v0.12.51--cpa-v0.12.51 true
dbs-fleet-system dp-postgresql-14-5-v0.12.51--cpa-v0.12.51 true
dbs-fleet-system dp-postgresql-15-2-v0.12.51--cpa-v0.12.51 true
Busca y elimina localrollout CRs que terminen en cpa-v0.12.46, asegurándote de que el resto de las localrollout CRs no se vean afectadas.
kubectl get localrollouts -A | grep cpa-v0.12.46
Debería devolver una lista como esta:
dbs-fleet-system dp-alloydbomni-15-5.2--cpa-v0.12.46 true
dbs-fleet-system dp-oracle-19-10.0.0.0--cpa-v0.12.46 true
dbs-fleet-system dp-postgresql-13-8-v0.12.46--cpa-v0.12.46 true
dbs-fleet-system dp-postgresql-14-5-v0.12.46--cpa-v0.12.46 true
dbs-fleet-system dp-postgresql-15-2-v0.12.46--cpa-v0.12.46 true
Elimina cada uno de ellos:
kubectl delete -n dbs-fleet-system localrollout/dp-alloydbomni-15-5.2--cpa-v0.12.46
...
...
Verifica que las CRs de localrollout que terminan en cpa-v0.12.51 sigan presentes:
NAMESPACE NAME PAUSED IN PROGRESS FINISHED
dbs-fleet-system dp-alloydbomni-15-5.2--cpa-v0.12.51 true
dbs-fleet-system dp-oracle-19-10.0.0.0--cpa-v0.12.51 true
dbs-fleet-system dp-postgresql-13-8-v0.12.51--cpa-v0.12.51 true
dbs-fleet-system dp-postgresql-14-5-v0.12.51--cpa-v0.12.51 true
dbs-fleet-system dp-postgresql-15-2-v0.12.51--cpa-v0.12.51 true
DNS
Las DNSSEC deben desactivarse explícitamente en resolved.conf.
Versiones: 1.13.1, 1.13.3 y 1.13.4
Síntomas: la resolución de DNS falla en nodos de hardware desnudo o de máquina virtual. Para confirmar que la resolución de DNS falla, establece una conexión SSH con el nodo afectado y ejecuta systemctl status systemd-resolved. El resultado contiene líneas como
DNSSEC validation failed for question . IN SOA: no-signature.
Solución:
Añada la siguiente línea a
/etc/systemd/resolved.confen el nodo afectado.DNSSEC=falseReinicia el servicio
systemd-resolved:systemctl restart systemd-resolved.service
Servicio portuario
No se ha podido crear el servicio Harbor
Versiones: 1.13.6
Síntomas: no se puede crear una instancia de Harbor debido a una discrepancia en el espacio de nombres causada por una limitación de longitud en el nombre de ServiceIsolationEnvironment. Es posible que veas un mensaje como este:
Failed to reconcile ODSDatabase: failed to create or update ODS ProjectNetworkPolicy: namespaces "g-dbs-PROJECT_NAME-HARBOR_INSTANCE_NAME" not found
Solución alternativa: acorta el nombre de la instancia de Harbor para solucionar el problema actual. Asegúrate de que la longitud combinada de PROJECT_NAME y HARBOR_INSTANCE_NAME sea inferior a 27 caracteres.
Al eliminar instancias de Harbor, no se eliminan los espejos de registro asociados
Versiones: 1.13.1, 1.13.3, 1.13.4, 1.13.5, 1.13.6, 1.13.7 y 1.13.8
Síntomas: al eliminar instancias de Harbor, no se eliminan los espejos de registro asociados. Es posible que el nodepool esté bloqueado en el estado Provisioning. Esto se debe a que los espejos del registro creados por el controlador de MHS no se eliminan cuando se eliminan las instancias de Harbor.
Solución: Debes quitar los espejos del registro manualmente. Para mitigar este problema, sigue estos pasos:
- Conéctate al clúster de administrador de la organización. Para obtener más información, consulta la arquitectura de clústeres de GDC.
Ejecuta esta secuencia de comandos para quitar todos los espejos del registro que coincidan con el valor de la variable de entorno
HARBOR_INSTANCE_URLde todos los clústeres de Kubernetes que tengan la etiquetalcm.private.gdc.goog/cluster-type=user:LABEL="lcm.private.gdc.goog/cluster-type=user" ENDPOINT=HARBOR_INSTANCE_URL while read -r out; do info=${out% *} ns_name=${info%:*} name=${ns_name##*/} ns=${ns_name%%/*} INDEX=$(kubectl get cluster user-vm-1 -n user-vm-1-cluster -ojson | jq '.spec.nodeConfig.registryMirrors | map(.endpoint=='\"$ENDPOINT\"') | index(true)') kubectl patch clusters "${name}" -n "${ns}" --type=json -p="[{'op': 'remove', 'path': '/spec/nodeConfig/registryMirrors/$INDEX'}]" done <<< $(kubectl get clusters -l "$LABEL" -o jsonpath="$JSONPATH" -A)Sustituye
HARBOR_INSTANCE_URLpor la URL de tu instancia de Harbor.
Módulo de seguridad de hardware
Las licencias de prueba desactivadas de HSM siguen siendo detectables
Versiones: 1.13.1, 1.13.3-1.13.11
Síntomas: debido a un problema conocido de CipherTrust Manager, las licencias de prueba desactivadas siguen siendo detectables y pueden activar advertencias de vencimiento falsas.
Solución alternativa: consulta el error HSM-R0003 para verificar las licencias normales activas y eliminar las licencias de prueba desactivadas.
Fuga de descriptores de archivo del host-daemon de HSM
Versiones: 1.13.x
Síntomas: si los HSMs se ejecutan durante más de 30 días, se puede producir una fuga de descriptores de archivos que provoque que el servicio host-daemon deje de responder, lo que dará lugar a un error ServicesNotStarted.
Solución: reinicia el servicio host-daemon. Para ello, pide a tu operador de infraestructura que se conecte al HSM a través de SSH como usuario ksadmin y ejecute el siguiente comando:
sudo systemctl restart host-daemon
Si no funciona, tu IO puede reiniciar el HSM en mal estado.
Los certificados de HSM han caducado
Versiones: 1.13.11
Síntomas: al actualizar una organización, puede que veas una advertencia como esta:
Warning Unsuccessful 50m OrganizationUpgrade 1 error occurred:
* UPG1300: ABM upgrade expected to finish within 2h0m0s but hasn't after 13h45m23.442682119s, last message was: Cluster upgrade for system cluster: in-progress
El org-1-system-cluster se ha quedado bloqueado en una actualización de la versión de ABM debido a que los certificados HSM (módulo de seguridad de hardware) han caducado.
También puede que veas un error como este ejemplo en el servidor iLO de HPE, StorageGRID u ONTAP:
Not able to connect SSL to Key Manager server at IP_ADDRESS
Solución:
Rota manualmente la CA raíz y el certificado de la interfaz web con ksctl:
- Pausa todas las respuestas predefinidas de
HSM,HSMClusteryHSMTenant. Crea una nueva CA raíz con los atributos copiados de la antigua. Busca el ID de la antigua CA con
ksctl ca locals list. Por ejemplo, podría tener este aspecto:ksctl ca locals create --cn example.com --copy-from-ca 6d7f7fa7-df81-44b7-b181-0d3e6f525d46 { "id": "b0516120-6b4c-40ed-93f4-35e9fdc690e7", "uri": "kylo:kylo:naboo:localca:b0516120-6b4c-40ed-93f4-35e9fdc690e7", "account": "kylo:kylo:admin:accounts:kylo", "createdAt": "2025-06-04T18:46:25.728332Z", "updatedAt": "2025-06-04T18:46:25.728332Z", "state": "pending", "csr": "-----BEGIN CERTIFICATE REQUEST-----\nMIHQMHgCAQAwFjEUMBIGA1UEAxMLZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggq\nhkjOPQMBBwNCAAR5pwW1UC1JNg79gkjK2rvnmgaZpGNwb4VxYN3dQCieHtHlYJUu\nQWk56RB9oPw4SKkf/Y1ZwEI4m2mx3d9XFHU7oAAwCgYIKoZIzj0EAwIDSAAwRQIh\nANWTPjkJNcY56lSARN714EBa1gLuvxJlMENVHKEbanooAiA1BQ3sz7mxykL/1t7v\nqRlIpxKGrhw56XC67vz4NvZ4Kg==\n-----END CERTIFICATE REQUEST-----\n", "subject": "/CN=example.com", "notBefore": "0001-01-01T00:00:00Z", "notAfter": "0001-01-01T00:00:00Z", "sha1Fingerprint": "21F033940A65657CC6C2C1EA0BB775F14FD5D193", "sha256Fingerprint": "31EF6E1316DF039F77DDDB051890CDEBBF67BBE8A14AEE04E01716D30DC90937", "sha512Fingerprint": "F200817829A23F30239C33DC2CED8C889954A252EBA2CC12A3977FD5F91239ED7A2A4CCF0EA3D90D50CEF7A779E5C487798AAC75617DB2F29AF7F4794AD66F17", "purpose": {} }Autofirma la nueva CA con una duración de un año. Por ejemplo, podría tener este aspecto:
ksctl ca locals self-sign --id b0516120-6b4c-40ed-93f4-35e9fdc690e7 -x 365 { "id": "b0516120-6b4c-40ed-93f4-35e9fdc690e7", "uri": "kylo:kylo:naboo:localca:b0516120-6b4c-40ed-93f4-35e9fdc690e7", "account": "kylo:kylo:admin:accounts:kylo", "createdAt": "2025-06-04T18:46:25.728332Z", "updatedAt": "2025-06-04T18:52:51.976847092Z", "state": "active", "csr": "", "cert": "-----BEGIN CERTIFICATE-----\nMIIBbTCCAROgAwIBAgIRAMyQJHhs4i2uwj4ghilVFJQwCgYIKoZIzj0EAwIwFjEU\nMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMjUwNjAzMTg1MjUxWhcNMjYwNjA0MTg1\nMjUxWjAWMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABHmnBbVQLUk2Dv2CSMrau+eaBpmkY3BvhXFg3d1AKJ4e0eVglS5BaTnp\nEH2g/DhIqR/9jVnAQjibabHd31cUdTujQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQ9uCnTZ+lHhiLx3f1xEn0+JC5J+TAKBggq\nhkjOPQQDAgNIADBFAiBsSiB5BRBJ8TZQ6O5TzMBgDoWzTZVMVXNLdZUiqHtcDwIh\nAOnqKNq5ytWLvMsBQKhulGgqqw1dccpkJJz01n3Smzyp\n-----END CERTIFICATE-----\n", "serialNumber": "271910941595574900448900837122680099988", "subject": "/CN=example.com", "issuer": "/CN=example.com", "notBefore": "2025-06-03T18:52:51Z", "notAfter": "2026-06-04T18:52:51Z", "sha1Fingerprint": "1114AF5ED6DF7D4A9F83A0F8DF5DFEF041A81622", "sha256Fingerprint": "93BAD9D44B320EFB446F65FE2A4F3A341147D15AF5315C000ADF644A3C1347A7", "sha512Fingerprint": "07386D7461B4013304CF0E0830517EA433E09EAB146A9F106F1B0DED4BBEC78BB4C89EAFAEC37178FE98AC4ACA234B98290D240607D5EA896F03DABF3DB56D5C", "purpose": { "client_authentication": "Enabled", "user_authentication": "Enabled" } }Actualiza la interfaz web para que use esta nueva AC en la generación automática de certificados. Por ejemplo, podría tener este aspecto:
ksctl interfaces modify --name web --auto-gen-ca-id kylo:kylo:naboo:localca:b0516120-6b4c-40ed-93f4-35e9fdc690e7 { "id": "61aab814-2821-43ac-b652-41784b7b06bf", "name": "web", "mode": "tls-cert-opt-pw-opt", "cert_user_field": "CN", "auto_gen_ca_id": "kylo:kylo:naboo:localca:b0516120-6b4c-40ed-93f4-35e9fdc690e7", "trusted_cas": { "local": [ "kylo:kylo:naboo:localca:6d7f7fa7-df81-44b7-b181-0d3e6f525d46" ] }, "createdAt": "2023-11-13T22:46:56.251881Z", "updatedAt": "2025-06-04T19:02:12.710563Z", "port": 443, "network_interface": "all", "interface_type": "web", "minimum_tls_version": "tls_1_2", "maximum_tls_version": "tls_1_3", "local_auto_gen_attributes": { "cn": "web.ciphertrustmanager.local", "dns_names": [ "web.ciphertrustmanager.local" ], ...Genera un nuevo certificado de interfaz web firmado por la nueva AC. La marca
--urles la IP de gestión del HSM (dekubectl get hsm -n gpc-system). Por ejemplo, podría ser así:ksctl interfaces auto-gen-server-cert --name "web" --url=https://10.128.52.18 { "certificates": "-----BEGIN CERTIFICATE-----\nMIICljCCAjygAwIBAgIRANPuw/42oHZAb9nzAYnrf9MwCgYIKoZIzj0EAwIwFjEU\nMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMjUwNjAzMTkwOTU5WhcNMjYwNjA0MTg1\nMjUxWjBjMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVFgxDzANBgNVBAcTBkF1c3Rp\nbjEPMA0GA1UEChMGVGhhbGVzMSUwIwYDVQQDExx3ZWIuY2lwaGVydHJ1c3RtYW5h\nZ2VyLmxvY2FsMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEy9T8uGa/N9ruRJMy\nxy4an+G/OyZjB/8nth1BPxpw5orljbTuOh9toS9c9FiOuMQQ13mGJSImadLP33PR\ngdXcHaOCARwwggEYMA4GA1UdDwEB/wQEAwIDiDATBgNVHSUEDDAKBggrBgEFBQcD\nATAMBgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFD24KdNn6UeGIvHd/XESfT4kLkn5\nMGIGA1UdEQRbMFmCHHdlYi5jaXBoZXJ0cnVzdG1hbmFnZXIubG9jYWyBIXRlY2hu\naWNhbC5zdXBwb3J0QHRoYWxlc2dyb3VwLmNvbYcECoA0EocECgADAocErBMjAocE\nrBMLAjBeBgNVHR8EVzBVMFOgUaBPhk1odHRwOi8vY2lwaGVydHJ1c3RtYW5hZ2Vy\nLmxvY2FsL2NybHMvYjA1MTYxMjAtNmI0Yy00MGVkLTkzZjQtMzVlOWZkYzY5MGU3\nLmNybDAKBggqhkjOPQQDAgNIADBFAiEAusSKWMoFeTsK+OrbURch7XtMR31XD45E\n+w+wjf2VAk4CIAsHytphizTFQks4qqOMaHm6Ap58uU0HMNGSm0WW6mQY\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBbTCCAROgAwIBAgIRAMyQJHhs4i2uwj4ghilVFJQwCgYIKoZIzj0EAwIwFjEU\nMBIGA1UEAxMLZXhhbXBsZS5jb20wHhcNMjUwNjAzMTg1MjUxWhcNMjYwNjA0MTg1\nMjUxWjAWMRQwEgYDVQQDEwtleGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49\nAwEHA0IABHmnBbVQLUk2Dv2CSMrau+eaBpmkY3BvhXFg3d1AKJ4e0eVglS5BaTnp\nEH2g/DhIqR/9jVnAQjibabHd31cUdTujQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQ9uCnTZ+lHhiLx3f1xEn0+JC5J+TAKBggq\nhkjOPQQDAgNIADBFAiBsSiB5BRBJ8TZQ6O5TzMBgDoWzTZVMVXNLdZUiqHtcDwIh\nAOnqKNq5ytWLvMsBQKhulGgqqw1dccpkJJz01n3Smzyp\n-----END CERTIFICATE-----\n" }En este punto,
openssl s_client -showcerts -connect 10.128.52.18:443 2>/dev/null | openssl x509 -textsigue mostrando el certificado antiguo. Debes reiniciar el HSM para obtener el nuevo certificado.ssh -i ~/.ksctl/ssh-privatekey ksadmin@10.128.52.18 sudo rebootAhora
openssl s_client -showcerts -connect 10.128.52.18:443 2>/dev/null | openssl x509 -textmuestra el nuevo certificado.Elimina la AC antigua del CR del HSM:
kubectl edit hsm zv-aa-hsm01 -n gpc-system and delete hsm.Spec.RootCACertificatesReanuda el HSM:
kubectl annotate hsm zv-aa-hsm01 -n gpc-system hsm.security.private.gdc.goog/paused-Asegúrate de que el HSM esté en buen estado.
Repite estos pasos con los otros dos HSMs. Ya tienen la nueva CA raíz autofirmada, ya que la CA se comparte entre los HSMs de un clúster. Sáltate los pasos 2 y 3, pero repite los pasos del 4 al 8.
Sigue la tarea HSM T0008 para automatizar la rotación de todos los certificados, pero omite el paso Finaliza la rotación añadiendo una nueva anotación de rotación a
hsmclusteren el que se añadeca-rotation-finalizing annotation.
Sube el nuevo nombre de la AC a iLO:
- En la interfaz de iLO, abre la página Administración - Gestor de claves y haz clic en la pestaña Gestor de claves.
- Rota el nombre del certificado.
- Realiza un reinicio en frío.
- Verifica que el handshake SSL vuelva a funcionar.
Gestión de identidades y accesos
Los pods gatekeeper-audit del espacio de nombres opa-system se reinician con frecuencia
Versiones: 1.13.3
Síntomas: comprueba el estado de los pods gatekeeper-audit-*** en el espacio de nombres opa-system:
kubectl get pods/gatekeeper-audit-POD_ID -n opa-system-NAMESPACE_ID -n opa-system
La salida podría tener este aspecto:
NAME READY STATUS RESTARTS AGE
gatekeeper-audit-58d8c4c777-7hzvm 2/2 Running 987 (12h ago) 12d
Este problema se debe a que los límites de recursos son bajos.
Infraestructura como código (IaC)
Si se crean demasiados tokens de GitLab, se corre el riesgo de llenar las bases de datos de GitLab
Versiones: 1.13.1
Síntomas: el subcomponente iac-manager crea un token para el usuario configsync-ro
repetidamente, incluso cuando no es necesario. Esto puede provocar que la base de datos de GitLab se llene y que no se pueda acceder a IAC. Es posible que el pod pg-gitlab-database-0 del espacio de nombres gitlab-system
no pueda iniciarse y muestre eventos como los siguientes:
Warning Unhealthy 84s (x18 over 4m14s) kubelet Startup probe failed: /bin/bash: warning: setlocale: LC_ALL: cannot change locale (en_US.utf8)
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: FATAL: could not write init file
Solución alternativa:
Ponte en contacto con tu representante de Google para obtener hotfix_3 para la versión 1.13.1 y aplícalo.
Sistema de gestión de claves (KMS)
Si cambia el tipo de clave raíz, todas las claves dejarán de ser válidas
Versiones: 1.13.x
Síntomas: una vez que se crea una organización, KMS se aprovisiona automáticamente con una clave raíz de software. Para migrar de una clave raíz de software a una clave de CTM, los usuarios deben anular un subcomponente. De esta forma, se cambia el tipo de clave raíz, lo que invalida todas las claves de software del KMS.
Solución alternativa: Evita actualizar el tipo de clave raíz si es posible. Si actualiza el tipo de clave raíz, todas las claves que ya tenga dejarán de ser válidas.
kms-rootkey-controller CrashLoopBackOff debido a OOMKILL
Versiones: 1.13.1
Síntomas: Cuando el uso de memoria kms-rootkey-controller supera el límite de 600Mi, el controlador entra en un estado CrashLoopBackOff debido a un estado OOMKilled.
Solución: Crea un SubcomponentOverride para actualizar el límite de memoria a 1500Mi. Para obtener instrucciones, consulta el Runbook 0007 de KMS. Después de completar los pasos de los requisitos previos del runbook, ejecuta los siguientes comandos:
Crea un
SubcomponentOverriderecurso personalizado:cat << EOF > ~/kms-rootkey-subcomponentoverride.yamlEn el siguiente ejemplo, se muestra un recurso personalizado
SubcomponentOverridecompleto:apiVersion: lcm.private.gdc.goog/v1 kind: SubcomponentOverride metadata: name: kms-rootkey-subcomponentoverride namespace: root spec: subComponentRef: kms-rootkey-cm backend: operableParameters: resourcesLimit: memory: 1500Mi EOFAplica el recurso
SubcomponentOverride:kubectl --kubeconfig ${KUBECONFIG:?} apply -f ~/kms-rootkey-subcomponentoverride.yaml kubectl --kubeconfig ${KUBECONFIG:?} describe subcomponentoverride kms-rootkey-subcomponentoverride -n root
Almacenamiento de registros
El registrador de auditoría de almacenamiento de objetos no puede resolver el host DNS
Versiones: 1.13.x
Síntomas:
En el clúster de administrador raíz, la implementación de obs-system/log-remote-logger contiene varios errores, como los siguientes:
E1220 17:00:25.247258 1 manager.go:183] Failed to fetch obj audit logs for gce-gpcstgesite01: failed to get authorization token for Grid Management API: Post "https://objectstorage-grid-mgmt.gpc-system.svc.cluster.local/api/v3/authorize": dial tcp: lookup objectstorage-grid-mgmt.gpc-system.svc.cluster.local: no such host
Solución alternativa: parchea la implementación de obs-system/log-remote-logger con el siguiente comando:
kubectl --kubeconfig ${KUBECONFIG:?} patch deployment log-remote-logger -n obs-system -p '{"spec":{"template":{"spec":{"dnsPolicy":"ClusterFirstWithHostNet"}}}}'
HaaS Logger muestra errores en el clúster de administrador raíz
Versiones: 1.13.x
Síntomas:
En el clúster de administrador raíz, la implementación de obs-system/log-remote-logger contiene varios errores, como los siguientes:
E0109 17:33:08.917876 1 manager.go:156] Failed to run logger haas: Failed to get log targets: failed to list harborinstances in the cluster: failed to get API group resources: unable to retrieve the complete list of server APIs: artifactregistry.gdc.goog/v1: the server could not find the requested resource
Solución: actualiza a la versión 1.13.8 para solucionar el error. También puedes modificar la implementación de obs-system/log-remote-logger de la siguiente forma:
En los argumentos del contenedor remote-logger, actualice la marca --disabled-loggers para incluir santricity y HaaS:
YAML
args:
- --disabled-loggers=santricity,haas
Fallo de Santricity Logger
Versiones: 1.13.x
Síntomas:
En el clúster de administrador raíz, la implementación de obs-system/log-remote-logger contiene varios errores, como los siguientes:
E0109 17:33:10.931737 1 manager.go:183] Failed to fetch santricity audit logs for lb-aa-objs01: failed to get CA cert: failed to get ClusterIssuer internal-root-ca-issuer: no kind is registered for the type v1.ClusterIssuer in scheme "pkg/logging/manager.go:32"
Solución: actualiza a la versión 1.13.8 para solucionar el error.
Los registros de Logging Target se envían al proyecto incorrecto
Versiones: 1.13.x
Síntomas: los registros de obs-system/oplogs-forwarder DaemonSet muestran advertencias similares a las siguientes:
oplogs-forwarder-2xrfw [2025/01/16 21:02:09] [ warn] [output:loki:log_output_loki_dbs_fleet_system_dbs_fleet] Tenant ID is overwritten platform-obs -> infra-obs
oplogs-forwarder-kxf8p [2025/01/16 21:05:23] [ warn] [output:loki:log_output_loki_workbench_system_nws_lt] Tenant ID is overwritten infra-obs -> platform-obs
Estas advertencias provocan que los registros se dirijan al proyecto incorrecto (ID de arrendatario). Este problema se debe a un error conocido de Fluent Bit. Para obtener más información, consulta el problema de Fluent Bit en GitHub.
Solución: actualiza a la versión 1.13.8 para solucionar el error.
El PA no puede ver los registros de auditoría del espacio de nombres de la plataforma
Versiones: 1.13.x
Síntomas: Los registros de auditoría del espacio de nombres de la plataforma son visibles para el operador de infraestructura (IO) en lugar de para el administrador de la plataforma (PA).
Solución alternativa: añade manualmente la etiqueta observability.gdc.goog/auditlog-destination=pa al espacio de nombres platform en todos los clústeres de la organización. Sigue estos pasos para implementar esta solución alternativa manual:
Define
KUBECONFIGcomo clúster de destino.Añade la etiqueta necesaria al espacio de nombres:
KUBECONFIG=${KUBECONFIG:?} kubectl label namespace platform observability.gdc.goog/auditlog-destination=pa --overwriteConfirma que la etiqueta se ha añadido correctamente:
KUBECONFIG=${KUBECONFIG:?} kubectl label namespace platform --list
Los pods no pueden inicializar los contenedores
Versiones: 1.13.x
Síntomas: no se pueden crear los pods y se produce un error similar al siguiente:
Events:
│ Type Reason Age From Message │
│ ---- ------ ---- ---- ------- │
│ Warning FailedCreatePodSandBox 10m (x2080 over 7h40m) kubelet Failed to create pod sandbox: mkdir /var/log/pods/org-1_managed-asm-local-readiness-xq75d_9a3275d7-5f16-4d67-8f4a-38fe0993be4a: no space left on device │
Estos errores impiden que los pods se inicien en un nodo específico. El comportamiento observado se debe a un caso extremo conocido en el que el archivo de estado logrotate-daemon se bloquea, lo que impide que el daemon realice la rotación de archivos prevista. Para confirmar este error, sigue estos pasos:
Define
KUBECONFIGcomo clúster de destino.Identifica la instancia de
anthos-audit-logs-forwarder-xxxxprogramada en el nodo.KUBECONFIG=${KUBECONFIG:?} kubectl get po -n obs-system -o wide | grep anthos-audit-logs-forwarderObtén los registros de la instancia de
anthos-audit-logs-forwarder-xxxxprogramada en el nodo para verificarlo.KUBECONFIG=${KUBECONFIG:?} kubectl logs -n obs-system anthos-audit-logs-forwarder-xxxx -c logrotate-daemon | grep "state file /var/lib/logrotate/status is already locked"
Solución:
Sigue estos pasos para solucionar el problema:
Realiza una recuperación manual del espacio en disco en el directorio
/var/logdel nodo.Define
KUBECONFIGcomo clúster de destino.Identifica el nodo de destino del clúster.
KUBECONFIG=${KUBECONFIG:?} kubectl get no -o wideConéctate al nodo mediante SSH y libera espacio manualmente en el directorio
/var/logdel nodo.logrotategestiona los archivos de estos directorios./var/log/audit/*/*/*/audit.log /var/log/audit*/*/*.log /var/log/auditproxy-*/*.log /var/log/global-api-*/audit.log /var/log/ceph/ceph.audit.log /var/log/fanout/audit/*.log /var/log/fanout/audit/*/*.log /var/log/netflow/*.log /var/log/fanout/operational/*.log /var/log/fanout/operational/*/*.logBusca archivos de registro inusualmente grandes (más de 100 MB) o archivos de hace más de un par de días. Cuando tengas el archivo de destino, puedes truncar los registros de la siguiente manera:
truncate -s 1G <target_file>Identifica la instancia de
anthos-audit-logs-forwarder-xxxxprogramada en el nodo.KUBECONFIG=${KUBECONFIG:?} kubectl get po -n obs-system -o wide | grep anthos-audit-logs-forwarderReinicia la instancia
anthos-audit-logs-forwarder-xxxxprogramada en el nodo.KUBECONFIG=${KUBECONFIG:?} kubectl delete po -n obs-system anthos-audit-logs-forwarder-xxxx
Marketplace
Fallo al extraer la imagen de Prisma Cloud
Versiones: 1.13.7
Síntomas: no se puede crear una instancia de servicio de Prisma Cloud desde Marketplace. El problema se debe a una etiqueta de imagen incorrecta.
Solución:
Edita la
twistlock-consoleimplementación para modificar la etiqueta de imagen:KUBECONFIG=${KUBECONFIG:?} kubectl edit deployment twistlock-console -n ${PROJECT:?}Busca la siguiente línea:
image: HARBOR_IP/library/twistlock/console:console_33_01_137Reemplaza
console_33_01_137porconsole_33.01.137:image: HARBOR_IP/library/twistlock/console:console_33.01.137Comprueba que el pod se ejecuta correctamente:
KUBECONFIG=${KUBECONFIG:?} kubectl get pods -n ${PROJECT:?}La salida podría tener este aspecto:
NAME READY STATUS RESTARTS AGE twistlock-console-58b578cbf4-5nvbk 1/1 Running 0 2m45s
Supervisión
Se ha creado un gran número de alertas en ServiceNow
Versiones: 1.13.x
Síntomas:
Después de configurar la monitorización para enviar alertas a ServiceNow mediante las tareas de rutina MON-T0016 y MON-T1016, se crea automáticamente un gran número de incidencias en ServiceNow.
El problema tiene las siguientes características:
- Todos los incidentes están vacíos.
- Solo el clúster de administrador raíz y la organización
gdchservicespueden enviar alertas a ServiceNow.
Solución alternativa: sigue la tarea de esfuerzo MON-T0018 inmediatamente después de ejecutar las tareas de esfuerzo MON-T0016 y MON-T1016.
Se han creado varias alertas duplicadas en ServiceNow
Versiones: 1.13.x
Síntomas:
El problema tiene las siguientes características:
- Se están creando varios incidentes duplicados para algunas alertas incluso después de aplicar la tarea rutinaria MON-T0018.
Solución alternativa: sigue la tarea MON-T0019 inmediatamente después de ejecutar las tareas MON-T0016, MON-T1016 y MON-T0018.
No se pueden ver las métricas de Vertex AI
Versiones: 1.13.1
Síntomas: el pod dvs-frontend-server no emite métricas.
Solución alternativa: La versión 1.13.1 no admite métricas cifradas para los servicios de Vertex AI. Si el servicio de Vertex AI no se habilita en más de una hora, reinicia el pod del controlador mon-admin.
Error de conciliación en mon-cortex
Versiones: 1.13.1 y 1.13.9
Síntomas: el pod mon-cortex tiene un error de conciliación. Consulta el estado del pod mon-cortex:
kubectl get subcomponent mon-cortex -n gpu-org-1-system-cluster
La salida podría tener este aspecto:
NAME AGE STATUS
mon-cortex 15h ReconciliationError
Se puede registrar un mensaje como este:
message: 'E0100 - deploy: failed to install chart: release mon-cortex-backend
failed, and has been uninstalled due to atomic being set: context deadline
exceeded'
Solución:
Comprueba qué pod de Cortex muestra un mensaje como este:
Warning FailedMount 11s kubelet MountVolume.MountDevice failed for volume "pvc-0ad24fdc-52ec-4080-8ac0-5784989d1da3" : rpc error: code = Internal desc = rpc error: code = Internal desc = failed to stage volume: could not open LUKS device; could not open LUKS device; could not open LUKS device; exit status 1Elimina el PVC asociado a ese pod y reinícialo.
El pod metrics-server-exporter del clúster del sistema está en un bucle de fallos
Versiones: 1.13.1
Síntomas: el pod metrics-server-exporter del clúster del sistema está en un bucle de fallos con OOMKilled, pero parece que no alcanza su límite. Diagnosticar el error:
kubectl --kubeconfig $KUBECONFIG describe pod -n mon-system metrics-server-exporter-<id>
La salida podría tener este aspecto:
[...]
Containers:
[...]
otel-collector:
Container ID: containerd://3a1373de4880cde9e09aa9cacc109a8059ec29d9355aef1f03735fdcdcd45596
Image: gcr.io/private-cloud-staging/opentelemetry-collector:v0.93.0-gke.2
Image ID: gcr.io/private-cloud-staging/opentelemetry-collector@sha256:2b14f8fe936e725efca24dace1abcc26449d996b1480eab1b25d469a16aac221
Port: 3113/TCP
Host Port: 0/TCP
Command:
/otelcol
--config=/conf/otel-collector-config.yaml
--feature-gates=pkg.translator.prometheus.PermissiveLabelSanitization
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Started: Thu, 20 Jun 2024 15:55:35 +0000
Finished: Thu, 20 Jun 2024 15:56:57 +0000
Ready: False
Restart Count: 570
Limits:
cpu: 200m
memory: 200Mi
Requests:
cpu: 100m
memory: 100Mi
Environment: <none>
Solución alternativa: reduce la cantidad de datos que se sirven en el endpoint de métricas eliminando el pod y dejando que se reinicie. La antigua time-series que se ha guardado en la memoria
se borra al hacerlo, lo que reduce la memoria necesaria.
Ignorar los mensajes de error de conciliación de ObservabilityPipeline
Versiones: 1.13
Síntomas:
El objeto ObservabilityPipeline muestra registros de Reconciler error como los siguientes en el pod root-admin-controller:
{"msg":"Reconciler error","controller":"observabilitypipeline","ObservabilityPipeline":{"name":"default","namespace":"infra-obs"},"namespace":"infra-obs","name":"default","err":"unable to reconcile project level ObservabilityPipeline: 1 error occurred:\n\t* failed to get system cluster client to install per project overrides: root admin cluster has no system cluster\n\n"}
Solución:
Ignorar los registros que cumplan todas las condiciones siguientes:
"controller":"observabilitypipeline""namespace":"infra-obs""name":"default""err"contienefailed to get system cluster client to install per project overrides: root admin cluster has no system cluster
Si estás depurando una alerta debido a un gran número de errores de conciliación, ignora estos registros, ya que son falsos negativos.
Se restablece el ConfigMap mon-prober-backend-prometheus-config
Versiones: 1.13.0 y 1.13.1
Síntomas:
- Se ha activado la alerta
MON-A0001. El ConfigMap
mon-prober-backend-prometheus-configse 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:
Para solucionar el problema, sigue estos pasos:
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.
Pausa el subcomponente
mon-proberen todos los clústeres:kubectl --kubeconfig $KUBECONFIG annotate subcomponent mon-prober -n $TARGET_CLUSTER lcm.private.gdc.goog/paused=truePor ejemplo:
kubectl --kubeconfig ~/root-admin-kubeconfig annotate subcomponent mon-prober -n my-org lcm.private.gdc.goog/paused=trueReinicia el controlador de administrador de MON en cada clúster de administrador:
kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n obs-system mon-admin-backend-controllerEl ConfigMap de Prober se rellena a medida que se registra cada sonda.
Sigue el runbook MON-R2009 para silenciar la alerta
MON-A0001,Blackbox monitoring metrics pipeline down, ya que esta alerta se activará continuamente.
Cortex store gateway component OOMKilled crashloop
Versiones: 1.13.3
Síntomas: Si ve errores en Grafana al cargar métricas o las métricas no se cargan, es posible que el pod cortex-store-gateway esté en un bucle de fallos.
Para diagnosticar el pod cortex-store-gateway y comprobar si está en un bucle de fallos, revisa su estado:
kubectl --kubeconfig SYSTEM_CLUSTER_KUBECONFIG describe pod \
-l app=cortex-store-gateway -n mon-system
Sustituye SYSTEM_CLUSTER_KUBECONFIG por la ruta al archivo kubeconfig del clúster del sistema.
Si el pod está en un bucle de fallos, el resultado será similar al siguiente ejemplo:
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: OOMKilled
Exit Code: 137
Solución alternativa: aumenta temporalmente el límite de memoria cortex-store-gateway usando un SubcomponentOverride. Para obtener información sobre cómo implementar un
SubComponentOverride, consulta el runbook MON-R2008.
A continuación, se muestra un ejemplo de un SubcomponentOverride con un límite de memoria especificado:
apiVersion: lcm.private.gdc.goog/v1
kind: SubcomponentOverride
metadata:
name: mon-cortex-memory-bump
namespace: org-1-system-cluster
spec:
subComponentRef: 'mon-cortex'
backend:
operableParameters:
storeGateway:
resourcesLimit:
memory: 16Gi
Deja la anulación hasta que todos los pods cortex-store-gateway tengan el estado Ready
y asegúrate de que el subcomponente mon-cortex no esté en pausa:
Comprueba que los pods
cortex-store-gatewaytienen el estadoReady:kubectl --kubeconfig SYSTEM_CLUSTER_KUBECONFIG get statefulset \ -n mon-system cortex-store-gatewayLa salida es similar al siguiente ejemplo si todos los pods tienen el estado
Ready:NAME READY AGE cortex-store-gateway 3/3 70dLa columna
READYdebe mostrar el valorN/Npara que todos los pods estén listos. De lo contrario, muestra valores como1/3o2/3.Asegúrate de que el subcomponente
mon-cortexno esté en pausa en una organización determinada:kubectl --kubeconfig ORG_ADMIN_KUBECONFIG describe subcomponent \ -n SYSTEM_CLUSTER mon-cortex | grep pausedHaz los cambios siguientes:
ORG_ADMIN_KUBECONFIG: la ruta al archivo kubeconfig del clúster de administrador de la organización.SYSTEM_CLUSTER: el nombre del clúster del sistema.
Si el subcomponente está en pausa, el resultado muestra la siguiente línea:
lcm.private.gdc.goog/paused: trueDe lo contrario, el resultado estará vacío.
Tiempo de espera de extracción de la imagen del proxy de métricas del plano de control de Kube en el clúster de usuario
Versiones: 1.13.3
Síntomas: Cuando las métricas relacionadas con kube-scheduler o kube-controller-manager (por ejemplo, las métricas scheduler_pending_pods y workqueue_depth) no se ven en Grafana, puede haber un problema de retirada de imagen con el pod kube-control-plane-metrics-proxy.
Para diagnosticar el pod kube-control-plane-metrics-proxy y comprobar si tiene un problema de retirada de extracción de imágenes, revisa su estado:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG describe pod \
-l k8s-app=kube-control-plane-metrics-proxy -n obs-system
Sustituye USER_CLUSTER_KUBECONFIG por la ruta del archivo kubeconfig del clúster de usuario.
Si el pod tiene un problema de retirada de extracción de imágenes, el resultado será similar al siguiente ejemplo:
State: Waiting
Reason: ImagePullBackOff
Ready: False
Restart Count: 0
Solución alternativa: sigue estos pasos para solucionar el problema:
Extrae la imagen
gcr.io/gke-release/asm/proxyv2:1.20.4-asm.0del proyectogpc-system-container-imagesPuerto. Para obtener instrucciones y los permisos necesarios para extraer una imagen, consulta Extraer una imagen con Docker.Envía la imagen
gcr.io/gke-release/asm/proxyv2:1.20.4-asm.0al proyectolibraryHarbor. Para obtener instrucciones y saber qué permisos necesitas para enviar una imagen, consulta Enviar una imagen.El proyecto
libraryse usa para los artefactos que se van a implementar en el clúster de usuario.
El aumento de WAL provoca que Prometheus use mucha memoria
Versiones: 1.13.3
Síntomas: el nodo de VM del plano de control del sistema informa de los eventos NodeHasInsufficientMemory y EvictionThresholdMet:
kubectl describe node NODE_NAME | grep Events -A100
La salida podría ser similar a la del siguiente ejemplo:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal NodeNotReady 12m (x8 over 10d) node-controller Node vm-e792c63a status is now: NodeNotReady
Normal NodeHasNoDiskPressure 12m (x9 over 24d) kubelet Node vm-e792c63a status is now: NodeHasNoDiskPressure
Normal NodeHasSufficientPID 12m (x9 over 24d) kubelet Node vm-e792c63a status is now: NodeHasSufficientPID
Normal NodeReady 12m (x9 over 24d) kubelet Node vm-e792c63a status is now: NodeReady
Normal NodeHasInsufficientMemory 12m (x34 over 13h) kubelet Node vm-e792c63a status is now: NodeHasInsufficientMemory
Warning EvictionThresholdMet 12m (x64 over 13h) kubelet Attempting to reclaim memory
Normal TridentServiceDiscovery 11m (x21 over 13h) csi.trident.netapp.io [iSCSI] detected on host.
Normal NodeHasSufficientMemory 6m52s (x31 over 24d) kubelet Node vm-e792c63a status is now: NodeHasSufficientMemory
Prometheus usa mucha memoria debido al crecimiento de WAL (registro anticipado de escritura), lo que afecta a la memoria del nodo. El crecimiento de WAL puede deberse a que no se ha implementado Cortex, por lo que este problema puede ser una consecuencia de que Cortex esté inactivo. La instancia de Prometheus pierde la conectividad con Cortex durante un periodo prolongado, durante el cual almacena datos en la memoria y en el volumen persistente (PV). Cuando se termina Prometheus, carga todos los datos de su WAL en la memoria al iniciarse.
Otra causa principal pueden ser los problemas de conectividad de red (malla de servicios, redes físicas y superiores).
Solución alternativa: para recuperarse de este estado, se recomienda solucionar la causa raíz y conseguir que Cortex vuelva a funcionar correctamente o resolver los problemas de conectividad de red. A continuación, espera a que se vacíe el WAL de Prometheus. No se pierden datos, pero si Cortex no funcionaba, el nodo no estará disponible durante el tiempo que tarde Cortex en recuperarse.
También puedes reducir la escala de Prometheus STS a cero y eliminar el PV. De este modo, se reduce el tiempo total durante el que el nodo no está disponible, pero se pierden datos. Además, mientras Cortex siga sin funcionar o tengas problemas de conectividad de red, debes repetir esta acción periódicamente. Mientras haya un problema de conexión entre Prometheus y Cortex, el PV se volverá a llenar.
Sigue estos pasos para reducir la escala de Prometheus STS a cero y eliminar el PV:
Reduce el escalado del componente logmon-operator:
kubectl --kubeconfig ORG_SYSTEM_KUBECONFIG scale deployment -n obs-system logmon-operator --replicas 0Sustituye
ORG_SYSTEM_KUBECONFIGpor la ruta al archivo kubeconfig del clúster del sistema de la organización.Reduce el tamaño del componente
anthos-prometheus-k8s:kubectl --kubeconfig ORG_SYSTEM_KUBECONFIG scale statefulset -n obs-system anthos-prometheus-k8s --replicas 0Elimina la reclamación de volumen persistente:
kubectl --kubeconfig ORG_SYSTEM_KUBECONFIG delete pvc -n obs-system anthos-prometheus-k8s-data-anthos-prometheus-k8s-0Vuelve a aumentar el tamaño del
logmon-operator:kubectl --kubeconfig ORG_SYSTEM_KUBECONFIG scale deployment -n obs-system logmon-operator --replicas 1Espera a que
anthos-prometheus-k8sesté listo.
Bootstrap multizona
Faltan roles de clúster
Versiones: 1.13.1
Síntomas: no hay roles específicos para el arranque de varias zonas que se puedan usar en Añadir roles obligatorios.
Solución: Usa el rol de clúster cluster-admin, tal como se especifica en las instrucciones vinculadas. De esta forma, el usuario tiene más del acceso mínimo necesario para realizar las tareas posteriores.
Recurso Bootstrap incompatible
Versiones: 1.13.1
Síntomas: el recurso Bootstrap creado en el paso 3 de Crear el archivo de arranque no es compatible con la lógica que lo procesa.
Solución alternativa: Edita el archivo YAML generado tal como se especifica en el paso 4.
No se crea el recurso GlobalAPIZone en la API global
Versiones: 1.13.1
Síntomas: el plano de control no crea un recurso GlobalAPIZone para la zona en la API global, lo que provoca que los componentes que dependen de este recurso no funcionen correctamente.
Solución: Crea el recurso tal como se indica en Crear un recurso GlobalAPIZone.
Redes
La red de la cuadrícula de nodos de almacenamiento de objetos no funciona
Versiones: 1.13.1, 1.13.3 y 1.13.4
Síntomas:
- Durante la fase de arranque del almacenamiento de objetos, la interfaz de usuario del instalador del nodo de administrador de objetos muestra que la red de la cuadrícula está inactiva.
- cables.csv y Cell CR muestran que el valor MPN de cables.csv es
QSFP-100G-CU2.5Mpara las conexiones entre los nodos objsadmin de almacenamiento de objetos y el conmutador TOR.
Explicación
En la versión 1.13, el campo MPN de cables.csv se usa para determinar la velocidad que se establece en el interruptor Tor.
Si no se define la velocidad en estos puertos, el cambio de Tor a la conectividad del nodo objsadmin fallará. La lista usada para asignar el MPN a la velocidad no tenía en cuenta un valor que proporcionó el integrador del sistema, lo que provocó que fallara el arranque del almacenamiento de objetos.
En la mayoría de las configuraciones de la versión 1.13, el proveedor usaba QSFP-100G-CU2.5M.
Solución:
- Usa
kubectl get -A cell -oyamlen el clúster de administrador raíz para encontrar la conexión relacionada con el dispositivo de almacenamiento de objetos y el conmutador TOR. - Cambia todas las instancias de mpn a "QSFP-100G-CU3M" para objsadm -> torsw connect.
Por ejemplo:
- endA: "ap-aa-torsw01:Eth1/10"
endB: "ap-aa-objsadm01:e3a"
cableType: "DAC"
mpn: "QSFP-100G-CU3M"
length: "2m"
color: "Black"
No se puede acceder al nodo
Versiones: 1.13.1, 1.13.3 y 1.13.4
Síntomas:
- Durante la fase de arranque de la red, algunos interruptores no se pueden alcanzar.
- Durante la fase de instalación de DHCP, no se puede acceder a algunos servidores a través de su dirección IP de iLO.
Solución:
- Vuelve a cargar los interruptores de gestión afectados. Consulta el runbook PNET-R0018 para obtener más información.
PodCIDR no se ha asignado a ningún nodo aunque se haya creado ClusterCIDRConfig
Versiones: 1.13.1
Síntomas: 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 inicializan los pods de ipam-controller. La creación del clúster se ha quedado bloqueada en el estado de conciliación.
Comprueba si el objeto
ClusterCIDRConfigse ha creado en el clúster:kubectl --kubeconfig=CLUSTER_KUBECONFIG get clustercidrconfigs -oyamlLa 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: ""Ejecuta la descripción de uno de los objetos de nodo del clúster que está bloqueado en la reconciliación y comprueba si hay un evento
CIDRNotAvailableen el objeto de nodo:kubectl --kubeconfig=CLUSTER_KUBECONFIG describe node NODE_NAMELos 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:
Reinicia los pods del
ipam-controller-manager:kubectl --kubeconfig=CLUSTER_KUBECONFIG -n kube-system rollout restart ds ipam-controller-managerUna vez que los
ipam-controller-managerpods estén en estado de ejecución, comprueba si elpodCIDRse ha asignado a los nodos:kubectl --kubeconfig=CLUSTER_KUBECONFIG get nodes -oyaml | grep podCIDRLa 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:
Deriva de NTP
Versiones: 1.13.1
Síntomas: un nodo de VM se ha desviado o tiene una hora incorrecta después de estar en suspensión o de ejecutarse durante un tiempo.
Solución:
- Establece una conexión SSH con el nodo de la VM y edita el archivo
/etc/chrony.conf. - Sustituye la línea
makestep 1.0 3pormakestep 1.0 -1. Reinicia el servicio chronyd:
systemctl restart chronyd
Solo tienes que hacer este cambio una vez en cada VM. El cambio no se sobrescribirá.
Para solucionar el problema de forma rápida e inmediata, establece una conexión SSH con el nodo de la VM y ejecuta chronyc -a makestep.
No se han analizado los registros de auditoría de SyncServer
Versiones: 1.13.1, 1.13.3, 1.13.4, 1.13.5, 1.13.6 y 1.13.7
Síntomas: el
log-remote-loggerno analiza correctamente los registros de auditoría de SyncServer. Algunos registros de auditoría no estarán disponibles en Grafana y es posible que veas mensajes de error en el pod log-remote-logger de administrador raíz, como los siguientes:
Failed to fetch syncserver audit logs for syncserver-...
Solución alternativa: Los registros de auditoría siguen estando disponibles en SyncServer. Sigue las instrucciones de NTP-P0002 para acceder a la interfaz de usuario de SyncServer y ver los registros en Logs > Events.
No se ha podido extraer la imagen de cambio
Versiones: 1.13.3
Síntomas: es posible que veas un mensaje como este en el objeto SwitchImageHostRequest
cuando realices un cambio de RMA o cuando inicialices el clúster de administrador raíz:
failed to pull or extract image "192.0.2.0:10443/gdch-switch/os:v1.13.0-pnet-aa505d9004
Si tienes acceso a kubectl, úsalo para verificar si tienes este problema:
kubectl --kubeconfig=<path/to/root-admin-kubeconfig> -n gpc-system get switchimagehostrequest -o yaml
La salida podría ser similar a la del siguiente ejemplo:
kind: SwitchImageHostRequest
metadata:
annotations:
lcm.private.gdc.goog/claim-by-force: "true"
meta.helm.sh/release-name: pnet-core-assets
meta.helm.sh/release-namespace: pnet-system
creationTimestamp: "2024-08-20T04:16:36Z"
generation: 1
labels:
app.kubernetes.io/managed-by: Helm
name: v1.13.0-pnet-aa505d9004
namespace: gpc-system
resourceVersion: "149295"
uid: f6c5b880-3fdb-4679-acd4-840b52998946
spec:
fromVersion: v1.13.0-pnet-aa505d9004
toVersion: v1.13.0-pnet-aa505d9004
status:
conditions:
- lastTransitionTime: "2024-08-20T05:10:17Z"
message: ""
observedGeneration: 1
reason: TFTPRunning
status: "True"
type: TFTPReady
- lastTransitionTime: "2024-08-20T04:16:36Z"
message: 'exception: failed to pull images with config images: [{10.249.48.5:10443/gdch-switch/os:v1.13.0-pnet-aa505d9004
/shared/tftpboot/switch/images}]: failed to pull or extract image "10.249.48.5:10443/gdch-switch/os:v1.13.0-pnet-aa505d9004":
failed to pull image from source "10.249.48.5:10443/gdch-switch/os:v1.13.0-pnet-aa505d9004":
GET https://10.249.48.5:10443/v2/gdch-switch/os/manifests/v1.13.0-pnet-aa505d9004:
NOT_FOUND: artifact gdch-switch/os:v1.13.0-pnet-aa505d9004 not found'
observedGeneration: 1
reason: ReconcileBackoff
status: Unknown
type: Ready
Solución:
Crea manualmente un SwitchImageHostRequest con la etiqueta de imagen correcta:
- Inicia sesión en el servidor de arranque.
Usa
gdcloudpara identificar la versión correcta de la imagen del interruptor:release/gdcloud artifacts tree release/oci/ | grep -i gdch-switchLa salida podría ser similar a la del siguiente ejemplo:
│ │ │ │ └── gdch-switch/os:1.13.3-gdch.5385En esta salida, la versión correcta de la imagen del interruptor es
1.13.3-gdch.5385.Edita el objeto
SwitchImageHostRequestque informa del error:kubectl --kubeconfig=<path/to/root-admin-kubeconfig> -n gpc-system edit switchimagehostrequest <SWITCH_IMAGE_HOST_REQUEST_NAME>Edita o sustituye los campos
name,fromVersionytoVersionpara que coincidan con la versión de la imagen del interruptor que esperas. En este caso, es1.13.3-gdch.5385. Consulta el siguiente resultado dediff, que muestra los cambios que debes hacer en el objetoSwitchImageHostRequest.kind: SwitchImageHostRequest metadata: - name: v1.13.0-pnet-aa505d9004 + name: 1.13.3-gdch.5385 namespace: gpc-system spec: - fromVersion: v1.13.0-pnet-aa505d9004 + fromVersion: 1.13.3-gdch.5385 - toVersion: v1.13.0-pnet-aa505d9004 + toVersion: 1.13.3-gdch.5385
Fallo en la comunicación del pod de StatefulSet
Versiones: 1.13.1, 1.13.3, 1.13.4, 1.13.5, 1.13.6, 1.13.7, 1.13.8, 1.13.9 y 1.13.10
Síntomas: problemas o interrupciones de conectividad debido a que la eliminación de objetos de endpoint de Cilium (CEP) no se gestiona correctamente después de reiniciar el pod StatefulSet.
Esto podría provocar que la identidad del endpoint no gestionado haga que las políticas de red rechacen erróneamente el tráfico legítimo. Los pods afectados se pueden verificar comprobando
que no tengan el objeto CEP correspondiente:
kubectl get cep -A | grep [*POD_IP*]
Solución alternativa: reinicia los pods StatefulSet afectados para actualizar su UID y
actualizar los metadatos asociados:
kubectl rollout restart statefulset [*STATEFULSET_NAME*] -n [*NAMESPACE*]
Problemas de conectividad con instancias de DBS
Versiones: 1.13.0 y 1.13.1
Síntomas: no se puede acceder a las instancias de Servicios de Bases de Datos (DBS) y los clientes de bases de datos muestran tiempos de espera de conexión.
Este problema podría surgir a través de otro componente del sistema que dependa de DBS. Por ejemplo, Facturación puede informar de mensajes de error como los siguientes:
DBSE0301: Healthcheck: DB cluster is not healthy. Cannot connect to DBdaemon
DBSE0005: DBDaemon Client Error. secure dbdaemon connection failed: context
deadline exceeded
Solución alternativa: El error se debe a que un componente del sistema de redes no puede programar en el clúster de servicios de la organización.
Define las siguientes variables de entorno:
export KUBECONFIG=KUBECONFIG_PATH export ORG_NAME=ORG_NAMEHaz los cambios siguientes:
KUBECONFIG_PATH: la ruta al archivo kubeconfig del clúster de administrador de la organización.ORG_NAME: el nombre de tu organización, comoorg-1.
Actualiza la configuración del componente de red para permitir que se programe:
kubectl --kubeconfig=KUBECONFIG_PATH kubectl -n g-ORG_NAME-shared-service-cluster patch addonconfiguration ang-overrides --type='json' -p='[{"op": "replace", "path": "/spec/configs/1/patchContent", "value": "apiVersion: apps/v1\nkind: DaemonSet\nmetadata:\n name: ang-node\n namespace: kube-system\nspec:\n template:\n spec:\n containers:\n - name: angd\n - name: bgpd\n env:\n - name: DISABLE_RECEIVED_ROUTES\n value: \"true\"\n tolerations:\n - operator: \"Exists\"\n effect: \"NoSchedule\""}]'
La conectividad de red se restaura al cabo de unos minutos.
La malla de clústeres no está configurada con información de zonas
Versiones: 1.13.5
Síntomas: una VM no puede conectarse a un clúster de base de datos del mismo proyecto. La conectividad con el balanceador de carga interno se ve afectada. Este problema se debe a que un Clustermesh no puede intercambiar objetos de servicio entre clústeres porque falta información de zona en la configuración del nombre del clúster.
Solución alternativa: en los entornos inicializados como multizona, sigue estos pasos para que funcione el balanceador de carga interno:
En el clúster de administrador de la organización, obtén el nombre de la zona:
ZONENAME="$(kubectl get controlplanes -A -o jsonpath="{.items[0].spec.zone}")" echo $ZONENAMELa salida podría tener este aspecto:
zone1En el clúster de administrador de la organización, obtén el ID del sitio de la zona:
SITEID="$(kubectl -n mz-system get zones $ZONENAME -o jsonpath="{.spec.siteID}")" echo $SITEIDLa salida podría tener este aspecto:
1Lista de todos los clústeres:
kubectl get clusters -ALa salida podría tener este aspecto:
NAMESPACE NAME ABM VERSION DESIRED ABM VERSION CLUSTER STATE g-org-1-shared-service-cluster g-org-1-shared-service 1.30.0-gke.1592 1.30.0-gke.1592 Running org-1-system-cluster org-1-system 1.30.0-gke.1592 1.30.0-gke.1592 Running user-vm-1-cluster user-vm-1 1.16.11 1.16.11 Running user-vm-2-cluster user-vm-2 1.28.700-gke.150 1.28.700-gke.150 RunningPara cada clúster, construye el
CILIUM_CLUSTERNAME:CLUSTER_NAME=CLUSTER_NAME CILIUM_CLUSTERNAME=$CLUSTERNAME-zone$SITEID echo $CILIUM_CLUSTERNAMELa salida podría tener este aspecto:
org-1-system-zone1En cada clúster, define los demás parámetros de la siguiente manera. El siguiente ejemplo para org-1-system:
CLUSTER_NAMESPACE=org-1-system-cluster CLUSTER_VERSION=1.30.0-gke.1592Crea un objeto
AddOnConfigurationpara cada clúster y guárdalo en un archivoaddonconfig.yaml. Crea este archivo para todos los clústeres que ya tengas y para los que crees en el futuro:En esta página, define las siguientes variables para actualizar el código de ejemplo:
CLUSTER_NAMESPACE=CLUSTER_NAMESPACE CLUSTER_VERSION=CLUSTER_VERSION CILIUM_CLUSTERNAME=CILIUM_CLUSTERNAMEapiVersion: baremetal.cluster.gke.io/v1alpha1 kind: AddOnConfiguration metadata: name: cilium-addon namespace: CLUSTER_NAMESPACE spec: anthosBareMetalVersions: - CLUSTER_VERSION configs: - name: cilium-config namespace: kube-system apiVersion: v1 kind: ConfigMap patchContent: | apiVersion: v1 kind: ConfigMap metadata: name: cilium-config namespace: kube-system data: cluster-name: CILIUM_CLUSTERNAMEAplica el
addonconfig.yamlen el clúster de administrador de la organización:kubectl apply -f addonconfig.yamlEn los clústeres del sistema, de servicios y de usuarios, asegúrate de que
cluster-namese haya actualizado encilium-configdel clúster. Este proceso puede tardar un poco, pero es necesario antes de reiniciar la implementación declustermesh-apiserver.kubectl get configmap -n kube-system cilium-config -o jsonpath="{.data.cluster-name}" && echoEn los clústeres de sistema, de servicio y de usuario, reinicia la
clustermesh-apiserverimplementación:kubectl rollout restart deployment -n kube-system clustermesh-apiserver
Se generan direcciones IP de EVPN incorrectas
Versiones: 1.13.1, 1.13.3, 1.13.4, 1.13.5, 1.13.6 y 1.13.7
Síntomas: las direcciones IP de emparejamiento de la sesión de interconexión EVPN multizona (MZ) generadas por el sistema de gestión de activos de hardware (HAMS) no terminan en .65 ni en .66, lo que es incorrecto e impide que se establezcan las sesiones BGP de EVPN MZ.
Solución:
Para solucionar este problema manualmente, sigue estos pasos:
Lista todos los recursos de
InterconnectSession:kubectl get interconnectsession -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig | grep zoneevpnpeeringRevisa los recursos de EVPN multizona
InterconnectSessiongenerados que tengan un valorinterconnectTypedeZonePeeringy unaddressFamilydeEVPN:apiVersion: system.private.gdc.goog/v1alpha1 kind: InterconnectSession metadata: annotations: lcm.private.gdc.goog/claim-by-force: "true" helm.sh/resource-policy: keep creationTimestamp: null name: interconnect-session-am-aa-blsw01-zoneevpnpeering-3 namespace: gpc-system labels: system.private.gdc.goog/ipv4-session-name-1: interconnect-session-am-aa-blsw01-zoneipv4peering-3 spec: interconnectLinkRef: name: interconnect-am-aa-blsw01-zoneevpnpeering-3 namespace: gpc-system interconnectType: ZonePeering peerIP: 192.168.203.67 md5HashKey: "" peerASN: 65402 addressFamily: EVPN status: {}En cada uno de los
InterconnectSessionrecursos que coincidan con estos parámetros, aplica la siguiente corrección:- Comprueba el nombre de recurso personalizado de la sesión de interconexión.
- Si el nombre termina en un número impar, actualiza la última parte de la dirección IP del peer a
65con el comando del paso siguiente. - Si el nombre termina en un número par, actualiza la última parte de la dirección IP del peer a
66con el comando del siguiente paso.
Modifica el recurso
InterconnectSessioncon la dirección IP del peer incorrecta:kubectl edit interconnectsession interconnect-session-zy-aa-blsw01-zoneevpnpeering-1 -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfigAplica esta corrección a todos los recursos de
InterconnectSessionque provoquen el error.
El panel de control de la capa de control de redes superior no muestra datos
Versiones: 1.13.7
Síntomas: las consultas de Prometheus en TestUpperNetworkingMetrics fallan porque faltan métricas en el clúster org-1-system. Los paneles de clustermesh del panel de control de la capa de red superior de los administradores de organizaciones de IO no muestran datos. El problema se debe a una discrepancia en la etiqueta source_cluster entre Cilium y el sistema de monitorización.
Solución alternativa: quita el filtro source_cluster del panel de control de UNET para mostrar los datos.
Errores de pista falsa que se muestran en la instalación de la red
Versiones: 1.13.1
Síntomas: durante la instalación de la red, se muestran algunos mensajes de advertencia sobre el cableado. Por ejemplo:
W0725 18:01:19.127111 39319 switch_port.go:59] Got error on getting port speed for la-ac-mgmtsw01:Eth1/46<>la-ac-base03:ilo: no speed associated with cable model: 31342 (CAT6 5ft Black)
W0725 18:01:19.127127 39319 switch_port.go:59] Got error on getting port speed for la-ac-mgmtsw01:Eth1/33<>la-ac-bm21:LOM1: no speed associated with cable model: 03982 (CAT6 4ft Black)
Estos mensajes de error se pueden ignorar sin problema.
Crear un PNP de salida que permita todo el tráfico rechaza el tráfico inesperado
Versiones:
Todas las versiones de Google Distributed Cloud (GDC) con air gap pueden verse afectadas.
Síntomas: La política de red del proyecto (PNP) allow-all-egress permite el tráfico a los endpoints del proyecto y a los endpoints externos fuera del clúster, pero no permite el tráfico a los endpoints del sistema. Este problema puede provocar que se bloquee el acceso al sistema y a los servicios propios, como la resolución de DNS y el almacenamiento de objetos.
El allow-all-egress PNP podría ser similar al siguiente:
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
namespace: PROJECT_1
name: allow-all-egress
spec:
policyType: Egress
subject:
subjectType: UserWorkload
egress:
- {}
Solución: elimina el allow-all-egress PNP. De forma predeterminada, una vez que se inhabilita la protección contra la filtración externa de datos, se permite el tráfico a los endpoints externos y del proyecto que no sean del clúster ni del sistema.
kubectl delete pnp [*ALLOW_ALL_EGRESS_PNP_NAME*] -n [*NAMESPACE*]
Almacenamiento de objetos
No se puede eliminar la organización de almacenamiento
Versiones: 1.13.1
Síntomas: Es posible que no se pueda eliminar una organización debido a un problema que impide que se complete la eliminación de la SVM. Puede que veas una advertencia como esta:
Warning StorageOrganizationDeletion 49m (x97
over 23h) StorageOrganization Reconcile error for storage org
deletion: cannot delete storage organization resources, pre-checks failed:
subnet claim "poc2/poc2-admin-svm-mgmt-network-subnet" exists,
cannot continue before it is deleted
Se pueden ignorar algunas advertencias de actualización de almacenamiento de objetos
Versiones: 1.13.3
Síntomas: al actualizar el almacenamiento de objetos, puede que vea 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:
Comprueba que cada nodo tenga las credenciales SSH correspondientes almacenadas en un secreto.
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; doneComprueba 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; doneEl 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 3d23hSi no se encuentra ningún secreto, el error tendrá este aspecto:
Error from server (NotFound): secrets "gpcstgeadm02-gce-gpcstgesite01-ssh-creds" not found
Si el comando no devuelve ningún error, puedes ignorar los errores que informen los reconciliadores.
ObjectStorageStorageNodeReconciler informes maintenance.gdu.gdu_server_locked
Versiones: 1.13.3
Síntomas: muestra los detalles de la objectstoragestoragenode:
kubectl describe objectstoragestoragenode zv-aa-objs02
La salida podría ser similar a la del siguiente ejemplo:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning ReconcileError 54m (x2 over 54m) ObjectStorageStorageNodeReconciler 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: puede ignorar este problema. El servicio GDU puede bloquearse temporalmente si recibe demasiadas solicitudes, pero se desbloqueará al cabo de unos minutos.
Fallo en la comprobación del almacenamiento de objetos tras la actualización de 1.12.x a 1.13.x
Versiones: 1.13.x
Síntoma: el CR ObjectStorageUpgrade falla y se produce el error
Message: check "ObjectStorageUpgrade" of operable component "OBJ" failed with reason "BackoffLimitExceeded", please check logs in pods: [gpc-system/upgrade-managed-check-objectstorageupgrade]
Observed Generation: 2
Reason: PostflightCheckFailed
Los pods gpc-system/upgrade-managed-check-objectstorageupgrade fallan con un error
Error: check "ObjectStorageUpgrade" preflight check failed: ObjectStorageSite gce-gpcstgesite01 not ready │
Usage: │
managed [flags] │
Flags: │
--component_name string preflight check name │
--current_version string current version of the Organization │
-h, --help help for managed │
--organization-upgrade-name string the name of current OrganizationUpgrade │
--target_version string target version of the Organization │
F1023 06:18:01.122723 1 main.go:80] check "ObjectStorageUpgrade" preflight check failed: ObjectStorageSite gce-gpcstgesite01 not ready │
goroutine 1 [running]:
Causa principal: La actualización del componente operativo de Object Storage de la versión 1.12.x a la 1.13.x falla si el clúster KIND de arranque no se ha desactivado ni eliminado. Aunque la actualización se realice correctamente, es posible que se produzcan errores en los servicios de almacenamiento de objetos comunes, como la creación de nuevos contenedores o credenciales de S3 a través de RBAC de Kubernetes, debido a errores de validación de certificados TLS. Esto se debe a que un pod de almacenamiento de objetos específico del clúster de KIND intenta continuamente instalar el certificado de servidor TLS del endpoint de gestión de StorageGRID, que era válido en la versión 1.12.x, pero que puede que no se reconozca en la versión 1.13.x. Durante la actualización, StorageGRID instala un nuevo certificado de servidor TLS verificable, pero el pod del clúster de KIND lo sustituye por el certificado antiguo no válido, lo que provoca el error del certificado TLS.
Solución alternativa: Debes cumplir los siguientes requisitos:
- Actualización de Object Storage de la versión 1.12.x a la 1.13.x
- El clúster de arranque (el clúster de KIND) sigue existiendo
Sigue estos pasos:
- Obtén un
kubeconfigque tenga permiso de lectura y modificación para el recursoObjectStorageSiteen el clúster de arranque (el clúster KIND). Define un alias para
kubectlque se conecte al clúster de arranque (el clúster de KIND):alias kubectlkind="kubectl --kubeconfig <Full path to the kubeconfig of the bootstrapping cluster>Obtén la instancia de recurso personalizado
ObjectStorageSitedel clúster de bootstrapping. Debería haber una instancia de recursoObjectStorageSite:SITENAME=$(kubectlkind get ObjectStorageSite -A -o jsonpath='{.items[0].metadata.name}')Añade una anotación de pausa de almacenamiento de objetos a la instancia de recurso
ObjectStorageSite:kubectlkind annotate ObjectStorageSite "${SITENAME:?}" storagegrid.netapp.storage.private.gdc.goog/paused=trueVerifica que se haya añadido la anotación de pausa del almacenamiento de objetos a la instancia
ObjectStorageSite:kubectlkind get ObjectStorageSite "${SITENAME:?}" -o jsonpath='{.metadata.annotations}' | jqObtén un
kubeconfigque tenga acceso de lectura y permiso para aplicar parches de estado a los recursosObjectStorageClusterdel clúster de administrador raíz.Define un alias para kubectl que se conecte al clúster de administrador raíz:
alias kubectlrootadmin="kubectl --kubeconfig <Full path to the kubeconfig of the root admin >"Comprueba si existe alguna instancia de recurso
ObjectStorageClusteren el clúster de administrador raíz:kubectlrootadmin get ObjectStorageClusterSi no hay ninguna instancia de recurso
ObjectStorageCluster, la solución alternativa habrá finalizado. Es posible que tengas que volver a realizar el procedimiento de actualización de Object Storage.Obtén la URL del endpoint de gestión del estado del recurso
ObjectStorageSiteen el clúster de bootstrapping:MGMT_ENDPOINT=$(kubectlkind get ObjectStorageSite -o jsonpath='{.items[0].status.managementAPIEndpointURL}')Valida si se ha definido la variable de entorno
$MGMT_ENDPOINT. El endpoint debe empezar porhttps://:echo ${MGMT_ENDPOINT:?}Sigue los pasos restantes solo si hay exactamente una instancia de recurso
ObjectStorageClusteren el clúster de administrador raíz. De lo contrario, vuelva a realizar el procedimiento de actualización de Object Storage:kubectlrootadmin patch ObjectStorageCluster <the name of ObjectStorageCluster> --type=merge --subresource status --patch "status: {managementAPIEndpointURL: '${MGMT_ENDPOINT:?}'}"Reinicia el pod gpc-system/obj-infra-cluster-cm:
kubectlrootadmin rollout restart deployment -n gpc-system obj-infra-cluster-cm-backend-controllerComprueba si el endpoint de gestión se ha añadido al estado del recurso
ObjectStorageCluster:kubectlrootadmin get ObjectStorageCluster -o jsonpath='{.items[0].status}' | jqReinicia la comprobación posterior al vuelo eliminando el trabajo de Kubernetes de comprobación posterior al vuelo
gpc-system/upgrade-managed-check-objectstorageupgrade-<random suffix>. La tarea se volverá a crear en breve.
No se puede acceder al nodo en la red de datos
Se trata de un problema poco habitual que puede producirse si el pod anetd se queda en un bucle de fallos.
Un recurso del kernel esencial para la conectividad de los nodos puede quedarse bloqueado en un estado dañado.
En esta guía se describen los síntomas de este problema y los pasos que se pueden seguir para solucionarlo.
Versiones:
Todas las versiones de Google Distributed Cloud (GDC) con air gap pueden verse afectadas.
Síntomas:
Si se produce este problema, es posible que observes los siguientes síntomas:
- Los nodos se quedan en el estado
NotReady - Al describir el nodo, se muestra el mensaje
kubelet:kubelet was found unhealthy; repair flag : true - No se puede acceder al nodo mediante SSH en la red de datos
Solución alternativa:
Sigue estas instrucciones para reparar cada nodo en mal estado:
Obtén la dirección IP de gestión del nodo afectado:
kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get -n gpc-system servers/NODE_NAME -ojsonpath='{.spec.managementNetwork.ips[0]}'Obtén acceso SSH al nodo afectado.
Conéctate al nodo mediante SSH con la dirección IP de gestión del nodo.
En el nodo, ejecuta el siguiente comando y, a continuación, cierra la conexión SSH:
tc filter del dev bond0 egressReinicia el conjunto de demonios
anetddel clúster con el nodo afectado:kubectl --kubeconfig AFFECTED_CLUSTER_KUBECONFIG rollout restart ds/anetd -n kube-system
Sistema operativo
Pods atascados en el estado init
Versiones: 1.13.1
Síntomas: el nodo indica que está listo, pero el acceso SSH al nodo es lento y top -n 1 muestra más de 100 procesos zombi.
Solución:
- Sigue las instrucciones de OS-P0001 para drenar el servidor. El proceso puede tardar más de 20 minutos. Si el drenaje no se completa después de una hora, ve al paso siguiente.
Reinicia el servidor estableciendo una conexión SSH con él y ejecutando el siguiente comando:
systemctl rebootEs posible que sea necesario reiniciar el servidor una segunda vez para que se recupere por completo.
Comprueba que el acceso SSH ya no es lento y que el número de procesos zombi es mucho menor (preferiblemente, inferior a 30).
Para que el servidor vuelva a funcionar, cambia el valor de
maintenanceafalseen el servidor.
bm-system-machine-preflight-check Falla un trabajo de Ansible para un nodo de metal desnudo o de máquina virtual
Versiones: 1.13.1
Síntomas: el módulo del kernel nf_tables no se carga después de reiniciar, lo que provoca que las tareas de Ansible del clúster fallen con un error Either ip_tables or nf_tables kernel module must be loaded. Este problema se produce cuando se reinicia el nodo de metal desnudo o de VM antes de que se aprovisione por completo.
Es posible que el trabajo de Ansible genere un error como este:
fatal: [172.20.128.23]: FAILED! => {"changed": false, "msg": "following are the error messages for each failed preflight check {'check_netw
orking_kernel_module_pass': 'Either ip_tables or nf_tables kernel module must be loaded. Use the command \"modprobe <ip_tables OR nf_tables
>\" to load the module.'}"}
Solución alternativa:
Establece una conexión SSH con el nodo y ejecuta el siguiente comando:
modprobe nf_tables
VM sin espacio en el dispositivo
Versiones: 1.13.1, 1.13.3, 1.13.4 y 1.13.5
Síntomas: cuando el directorio de registro /var/log está lleno, Node puede quedarse atascado en el estado NotReady y es posible que los pods no se inicien debido al error no space left on device. Para comprobarlo, ejecuta el siguiente comando en el nodo y comprueba si el uso es de aproximadamente el 100%.
df -h /var/log
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rocky-rl--var_log 15G 15G 20K 100% /var/log
Solución:
Inicia sesión en el nodo que tiene el problema y elimina los archivos de registro antiguos de /var/log/messages.
find /var/log -name "messages*" -mtime +4 -deleteTambién te recomendamos que sigas aplicando la siguiente solución alternativa para evitar que vuelva a ocurrir. La solución alternativa consiste en crear un
AnsiblePlaybooky aplicar el cambio mediante unOSPolicyCR personalizado responsable de configurar de forma segura el SO de destino (máquinas BM y VM). Consulta el proceso OS-P0005 para obtener más información.Define las siguientes variables de entorno:
export KUBECONFIG=<the path to the kubeconfig file>Crea un playbook de Ansible para la solución alternativa:
kubectl --kubeconfig=${KUBECONFIG:?must be set} apply -f - <<EOF apiVersion: system.private.gdc.goog/v1alpha1 kind: AnsiblePlaybook metadata: name: update-logrotate namespace: gpc-system spec: playbook: | - name: Set the default context for the /etc/kubernetes path to etc_t hosts: all gather_facts: no tasks: - name: Change log rotation for /var/log/messages block: - name: Check if /etc/logrotate.d/syslog exists check_mode: false ansible.builtin.stat: path: '/etc/logrotate.d/syslog' register: syslog_exists - name: Comment out /var/log/messages lines in syslog ansible.builtin.replace: path: '/etc/logrotate.d/syslog' regexp: '^/var/log/messages' replace: '# /var/log/messages' when: syslog_exists.stat.exists - name: Change logrotate config for /var/log/messages ansible.builtin.blockinfile: path: '/etc/logrotate.d/syslog' block: | /var/log/messages { daily rotate 4 missingok notifempty sharedscripts postrotate /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true endscript } when: syslog_exists.stat.exists EOFIdentifica los inventarios de destino a los que se debe aplicar el cambio. El destino puede ser un
InventoryMachineo unNodePool. Consulta el proceso OS-P0005 (2. Identificar el inventario objetivo de las configuraciones de tiempo de ejecución para obtener más información.En el siguiente ejemplo de
OSPolicyse han incluido dos inventarios de destino enspec.inventory, pero puede añadir más inventarios según sea necesario.kubectl --kubeconfig=${KUBECONFIG:?must be set} apply -f - <<EOF apiVersion: system.private.gdc.goog/v1alpha1 kind: OSPolicy metadata: name: manual-update-logrotate namespace: gpc-system spec: inventory: - apiVersion: baremetal.cluster.gke.io/v1 kind: NodePool name: control-plane-node-pool namespace: org-1-system-cluster - apiVersion: baremetal.cluster.gke.io/v1 kind: NodePool name: control-plane-node-pool namespace: user-vm-1-cluster policy: installPlaybook: name: update-logrotate EOFValidación
Consulta el proceso OS-P0005 (validación) para hacer un seguimiento del estado de ejecución de la política.
Pods atascados en el estado ContainerCreating
Versiones: 1.13.3, 1.13.5 y 1.13.6
Síntomas: Un nodo aparece como correcto, pero tiene muchos pods atascados en el estado ContainerCreating y no puedes establecer una conexión SSH con el servidor.
Solución: Reinicia el servidor y confirma que puedes establecer una conexión SSH con el nodo cuando vuelva a estar operativo.
No se puede conectar por SSH al nodo aprovisionado
Versiones: 1.13.5
Síntomas: se aprovisiona un nodo, pero se agota el tiempo de espera de SSH en las IPs de gestión y de datos.
Solución alternativa: reinicia el nodo a través de iLO. Una vez que se haya iniciado, conéctate por SSH e inhabilita
clamonacc con systemctl stop clamonacc; systemctl disable clamonacc.
Infraestructura de la suite de operaciones (OI)
No se necesita SSA para el hardware 3.0
La configuración del adaptador RAID es diferente en Hardware 3.0. Los servidores OIC de hardware 3.0 usan una unidad autocifrada, por lo que ya no es necesario iniciar Smart Storage Administration (SSA). Se necesitan pasos adicionales para determinar los identificadores de disco en cada servidor. Consulta OI server bootstrap.
Seguridad perimetral
El clúster del sistema de la organización se bloquea durante el arranque de la organización
Versiones: 1.13.1
Síntomas: Durante el arranque de la organización, el clúster del sistema de la organización puede quedarse bloqueado. Los pods edr-sidecar-injector están en estado pendiente. Cuando intentes eliminar estos pods, es posible que veas un mensaje de error como este:
Delete failed with `Internal error occurred: failed calling webhook "validation.gatekeeper.sh": failed to call webhook: Post "https://gatekeeper-webhook-service.opa-system.svc:443/v1/"
Al mismo tiempo, es posible que otros pods pendientes tengan mensajes de error como este:
Error creating: Internal error occurred: failed calling webhook "edr-sidecar-injector.gpc-system.internal": failed to call webhook: Post "https://edr-sidecar-injector.gpc-system.svc:443/mutate?timeout=10s": dial tcp 172.20.3.222:443: connect: connection refused
El sistema necesita una intervención manual para desbloquearse.
Solución:
- Duplica el
MutatingWebhookConfigurationCRedr-sidecar-injector-webhook-cfgen el clúster del sistema. - Duplica el
ValidatingWebhookConfigurationCRgatekeeper-validating-webhook-configurationen el clúster del sistema. - Elimina tanto el
edr-sidecar-injector-webhook-cfgCR como elgatekeeper-validating-webhook-configurationCR del clúster del sistema. - Espera a que los pods
edr-sidecar-injectorygatekeeper-controller-managervuelvan a estar activos. - Restaura el CR de webhook con el comando
kubectl apply.
Los grupos de direcciones de cortafuegos de PANW no se actualizan con los cambios de reclamación de CIDR
Versiones: 1.13.1
Síntomas: durante el arranque, el OCIT cidr-claim se actualiza con el valor correcto, pero el firewall AddressGroups no. Un par de AddressGroups, concretamente vsys1-root-ocit-network-cidr-group y ocvsys1-root-ocit-network-cidr-group, usa bloques de red que no se solapan con lo que se está usando en OIR. OIR no puede resolver los registros de zona de GDC y las consultas agotan el tiempo de espera sin recibir respuesta.
Solución:
Después de los cambios en cidr-claim, asegúrate de que AddressGroup se actualice con la versión más reciente de cidr-claim reiniciando la implementación de fw-core-backend-controller en el espacio de nombres fw-system del clúster root-admin.
Servidores físicos
El arranque del servidor falla debido a problemas de POST en el servidor HPE
Versiones: 1.13.1
Síntomas: el arranque del servidor falla cuando no se supera el proceso de arranque POST. Al iniciar sesión en ILO y consultar la consola del servidor, se muestra el siguiente error:
Symptom: An Invalid Opcode Exception has occurred indicating
that the processor tried to execute an invalid, undefined opcode,
or an instruction with invalid prefixes.
Causes: This issue is typically a software or firmware issue and
not indicative of a hardware problem
Causes: This issue is typically a software or firmware issue and
not indicative of a hardware problem.
ACTION : Reboot the server.
Solución alternativa:
En iLO, haz clic en el botón de encendido y selecciona Cold Boot.
Servidores bloqueados en el estado de aprovisionamiento
Versiones: 1.13.1, 1.13.3 y 1.13.5
Síntomas: los servidores se quedan bloqueados en un estado de aprovisionamiento durante el arranque del servidor. Comprueba el estado de los servidores:
k get servers -A | grep -v availabl
La salida podría tener este aspecto:
NAMESPACE NAME AGE RACK MACHINE-CLASS MANAGEMENT-IP DATA-IP DATA-IP BMC-IP CLUSTER NODEPOOL STATE PROVISION-READY
gpc-system ag-aa-bm01 21h ag-aa o1-highmem1-40-gdc-metal 192.0.2.0 198.51.100.0 203.0.113.0 provisioning
gpc-system ag-ab-bm01 21h ag-ab o1-highmem1-40-gdc-metal 192.0.2.0 198.51.100.1 203.0.113.0 provisioned true
gpc-system ag-ac-bm01 21h ag-ac o1-highmem1-40-gdc-metal 192.0.2.0 198.51.100.2 203.0.113.0 provisioning
Solución:
Inicia dhcp manualmente con una configuración descargada del clúster de KIND. En este ejemplo,
/tmp/dhcp.confes la configuración de DHCP del clúster de KIND:docker run -d -it --network host --name dnsmasq -v /tmp/dhcp.conf:/etc/dnsmasq.conf --cap-add=NET_ADMIN --restart always 198.51.100.255/gpc-system-container-images/private-cloud-staging/dnsmasq:VERSIONSustituye
VERSIONpor la versión de lanzamiento, tal como se describe en las instrucciones de actualización de Actualización manual de componentes de archivos para clústeres de administrador raíz y de organización. Por ejemplo,1.13.1-gdch.525.Comprueba la configuración de la BIOS en el servidor y verifica que
NetworkBootno esté habilitado para las NICs del plano de datos (cuyo nombre sigue el patrónSlot{i}Nic{i}).Comprueba la BIOS mediante la llamada a la API:
curl -kv https://{bmcIP}/redfish/v1/Systems/1/bios -u $bmcUser:$bmcPasswordDonde
$bmcUsery$bmcPasswordson las contraseñas de los ILOs, que se pueden encontrar en el archivo o directoriocellcfgen un secreto llamadobmc-credentials-<server-name>, por ejemplo,bmc-credentials-ai-aa-bm01. Verifica que la salida de este comando muestreSlot1Nic1: Disabled.Si alguna de esas
Slot{i}Nic{i}tieneNetworkBoot, inhabilítala con la API de configuración de la BIOS.curl -kv https://{bmcIP}/redfish/v1/Systems/1/bios/settings -u $bmcUser:$bmcPassword -X PATCH -d '{"Attributes": {"Slot{i}Nic{i}":"Disabled"}}' -H 'content-type: application/json'Sustituye
Slot{i}Nic{i}por el nombre de la ranura que tiene el problema en la carga útil.Reinicia el servidor.
No se puede aprovisionar el servidor DL380a
Versiones: 1.13.3, 1.13.4 y 1.13.5
Síntomas: el aprovisionamiento del servidor falla en la tarea de cifrado del modelo HPE DL380a.
El estado del CR del servidor se queda bloqueado en available durante el arranque del servidor:
# server name
export SERVER_NAME=
kubectl --kubeconfig "${KUBECONFIG:?must be set}" get servers ${SERVER_NAME} -n gpc-system
Solución alternativa:
Sigue las instrucciones de IAM-R0004 para generar el
KUBECONFIGderoot-admin-cluster.Sigue las instrucciones de PLATAUTH-G0001 para generar la clave SSH
root-id_rsadeCLUSTER_NS=root.Para pausar el servidor, añade la anotación
server.system.private.gdc.goog/pausedal recurso personalizado del servidor:kubectl --kubeconfig "${KUBECONFIG:?must be set}" annotate server ${SERVER_NAME:?} -n gpc-system --overwrite server.system.private.gdc.goog/paused=''Inicia sesión en el servidor desde la IP de gestión:
export MGMT_IP=$(kubectl --kubeconfig "${KUBECONFIG:?must be set}" get server ${SERVER_NAME:?} -n gpc-system -o=jsonpath='{.spec.managementNetwork.ips[0]}') ssh $MGMT_IP -i ~/.ssh/root-id_rsaHabilita el cifrado manualmente:
/opt/MegaRAID/storcli/storcli64 /call/eall/sall secureerase force /opt/MegaRAID/storcli/storcli64 /c0 delete securitykey /opt/MegaRAID/storcli/storcli64 /c0 set securitykey useekms jLa salida de los comandos debería ser similar a la siguiente:
root@ubuntu:~# /opt/MegaRAID/storcli/storcli64 /call/eall/sall secureerase force CLI Version = 007.2417.0000.0000 Apr 21, 2023 Operating system = Linux 5.4.0-1072-fips Controller = 0 Status = Success Description = Drive Secure Erase Succeeded. root@ubuntu:~# /opt/MegaRAID/storcli/storcli64 /c0 delete securitykey CLI Version = 007.2417.0000.0000 Apr 21, 2023 Operating system = Linux 5.4.0-1072-fips Controller = 0 Status = Success Description = None Controller Properties : ===================== ------------------------ Ctrl Method Result ------------------------ 0 delete Key Success ------------------------ root@ubuntu:~# /opt/MegaRAID/storcli/storcli64 /c0 set securitykey useekms j { "Controllers":[ { "Command Status" : { "CLI Version" : "007.2417.0000.0000 Apr 21, 2023", "Operating system" : "Linux 5.4.0-1072-fips", "Controller" : 0, "Status" : "Success", "Description" : "None" }, "Response Data" : { "Controller Properties" : [ { "Ctrl" : 0, "Method" : "Set Security using EKMS", "Result" : "Please reboot the system for the changes to take effect" } ] } } ] }Si el último comando no se ejecuta correctamente o ves errores como "Invalid BIOS EKM status" (Estado de EKM de BIOS no válido), prueba a reiniciar el servidor y la iLO y, a continuación, vuelve a ejecutar este paso.
root@ubuntu:~# /opt/MegaRAID/storcli/storcli64 /c0 set securitykey useekms j { "Controllers":[ { "Command Status" : { "CLI Version" : "007.2417.0000.0000 Apr 21, 2023", "Operating system" : "Linux 5.4.0-1072-fips", "Controller" : 0, "Status" : "Failure", "Description" : "None", "Detailed Status" : [ { "Ctrl" : 0, "Method" : "Set Security using EKMS", "Result" : "-", "ErrMsg" : "Invalid BIOS EKM status", "ErrCd" : 255 } ] } } ] }Si el último comando se ha ejecutado correctamente, reinicia el servidor siguiendo las instrucciones.
Crea una unidad lógica manualmente:
Una vez que el servidor haya terminado de reiniciarse, vuelve a iniciar sesión en el servidor desde la IP de gestión y muestra todas las unidades disponibles:
ssh $MGMT_IP -i ~/.ssh/root-id_rsa /opt/MegaRAID/storcli/storcli64 /c0 show jLa salida del último comando podría ser similar a este ejemplo:
{ "Controllers":[ { "Command Status" : { "CLI Version" : "007.2417.0000.0000 Apr 21, 2023", "Operating system" : "Linux 5.4.0-1072-fips", "Controller" : 0, "Status" : "Success", "Description" : "None" }, "Response Data" : { "Product Name" : "HPE MR416i-o Gen11", "Serial Number" : "******", "PCI Slot Number" : 17, "SAS Address" : "******", "PCI Address" : "00:12:00:00", "System Time" : "09/12/2024 23:32:48", "Mfg. Date" : "09/15/23", "Controller Time" : "09/12/2024 23:32:47", "FW Package Build" : "52.26.3-5379", "BIOS Version" : "7.26.00.0_0x071A0000", "FW Version" : "5.260.03-3985", "Driver Name" : "megaraid_sas", "Driver Version" : "07.713.01.00-rc1", "Current Personality" : "RAID-Mode ", "Vendor Id" : 4096, "Device Id" : 4322, "SubVendor Id" : 5520, "SubDevice Id" : 808, "Host Interface" : "PCI-E", "Device Interface" : "SAS-12G", "Bus Number" : 18, "Device Number" : 0, "Function Number" : 0, "Domain ID" : 0, "Security Protocol" : "SPDM-1.0.0", "Physical Drives" : 8, "Drive LIST" : [ { "EID:Slt" : "252:1", "DID" : 0, "State" : "UGood", "DG" : "-", "Size" : "1.60 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "MO001600PXVRU ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:2", "DID" : 1, "State" : "UGood", "DG" : "-", "Size" : "1.60 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "MO001600PXVRU ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:3", "DID" : 2, "State" : "UGood", "DG" : "-", "Size" : "7.68 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "VO007680PXVRT ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:4", "DID" : 3, "State" : "UGood", "DG" : "-", "Size" : "7.68 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "VO007680PXVRT ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:5", "DID" : 4, "State" : "UGood", "DG" : "-", "Size" : "7.68 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "VO007680PXVRT ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:6", "DID" : 5, "State" : "UGood", "DG" : "-", "Size" : "7.68 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "VO007680PXVRT ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:7", "DID" : 6, "State" : "UGood", "DG" : "-", "Size" : "7.68 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "VO007680PXVRT ", "Sp" : "U", "Type" : "-" }, { "EID:Slt" : "252:8", "DID" : 7, "State" : "UGood", "DG" : "-", "Size" : "7.68 TB", "Intf" : "SAS", "Med" : "SSD", "SED" : "Y", "PI" : "N", "SeSz" : "512B", "Model" : "VO007680PXVRT ", "Sp" : "U", "Type" : "-" } ], "Enclosures" : 1, "Enclosure LIST" : [ { "EID" : 252, "State" : "OK", "Slots" : 8, "PD" : 8, "PS" : 0, "Fans" : 0, "TSs" : 0, "Alms" : 0, "SIM" : 0, "Port#" : "2I" } ] } } ] }Deberías guardar los 2 IDs de
EID:SltconSizeigual a1.60 TB. En este caso:252:1,252:2A continuación, crea una unidad lógica con los IDs de
EID:Slt:/opt/MegaRAID/storcli/storcli64 /c0 add vd type=raid1 drives=252:1,252:2 SEDEl resultado del último comando es similar al siguiente ejemplo:
/opt/MegaRAID/storcli/storcli64 /c0 add vd type=raid1 drives=252:1,252:2 SED CLI Version = 007.2417.0000.0000 Apr 21, 2023 Operating system = Linux 5.4.0-1072-fips Controller = 0 Status = Success Description = Add LD Succeeded.Estado de cifrado de disco simulado en el CR del servidor.
Edita el estado de la respuesta predefinida del servidor:
kubectl edit-status --kubeconfig "${KUBECONFIG:?must be set}" server ${SERVER_NAME:?} -n gpc-systemAñade o modifica el estado
DiskEncryptionEnableda true:- lastTransitionTime: "<time>" message: "" observedGeneration: 1 reason: DiskEncryptionJobSucceeded status: "True" type: DiskEncryptionEnabledElimina el trabajo de cifrado del servidor, si lo hay:
kubectl --kubeconfig "${KUBECONFIG:?must be set}" delete job server-encrypt-and-create-logical-drive-${SERVER_NAME:?} -n gpc-systemReanuda el servidor para que se reanude el aprovisionamiento:
kubectl --kubeconfig "${KUBECONFIG:?must be set}" annotate server ${SERVER_NAME:?} -n gpc-system --overwrite server.system.private.gdc.goog/paused-
El borrado seguro falla si no hay licencia
Versiones: 1.13.5
Síntomas: cuando un servidor se bloquea durante la instalación, es posible que veas un estado en el CR del servidor como este:
- lastTransitionTime: "2024-09-10T20:28:33Z"
message: 'unable to trigger secure erase: unable to complete secure erase
for server "zx-ad-bm07": failed to post payload to /redfish/v1/Systems/1/Actions/Oem/Hpe/HpeComputerSystemExt.SecureSystemErase:
400: {"error":{"code":"iLO.0.10.ExtendedInfo","message":"See @Message.ExtendedInfo
for more information.","@Message.ExtendedInfo":[{"MessageId":"iLO.2.27.LicenseKeyRequired"}]}}'
reason: Succeeded
status: "False"
type: BMCConfigPreinstallSecureEraseTriggered
Solución alternativa: sigue las instrucciones del runbook SERV-R0014.
Seguridad de la plataforma
El reconciliador de subautoridades de certificación propias no verifica si los certificados tienen una clave pública coincidente
Versiones: 1.13.1
Síntomas: cuando el modo de subautoridad de certificación (SubCA) de PKI BYO genera una nueva solicitud de firma de certificado (CSR) mientras se sube un certificado firmado anteriormente a la SubCA, el reconciliador no comprueba si la nueva CSR coincide con el certificado firmado antiguo y marca el recurso personalizado (CR) cert-manager CertificateRequest como Ready.
Esto ocurre durante la renovación o la rotación manual del certificado de la subautoridad de certificación. El controlador de cert-manager
intenta actualizar el estado del CR Certificate, lo que activa el siguiente mensaje de error:
The certificate request has failed to complete and will be retried: Error signing certificate: error creating x509 │
│ certificate: x509: provided PrivateKey doesn't match parent's PublicKey
Solución alternativa:
Sigue las instrucciones para subir un nuevo certificado de subautoridad de certificación BYO firmado para el nuevo CSR.
Un problema de cert-manager provoca que no se pueda emitir una PKI BYO con ACME
Versiones: 1.13.1
Síntomas: El error se produce en la primera emisión o renovación de certificados BYO con el entorno de gestión de certificados automatizado (ACME). Cuando ejecutas el comando para comprobar el estado del certificado, ves que el certificado está not ready:
kubectl -n istio-system get certificate.pki.security.gdc.goog/default-wildcard-cert
El resultado es similar al siguiente:
status:
conditions:
- lastTransitionTime: "2024-07-23T17:27:02Z"
message: 'reconciling Certificate status failed: cert-manager Certificate CR "default-wildcard-cert-pki-ct"/"pki-system" is not ready'
observedGeneration: 1
reason: ReconcileBackoff
status: "False"
type: Ready
Solución alternativa:
Reinicia la implementación de cert-manager en el clúster de administrador de la organización:
export KUBECONFIG=ORG_ADMIN_KUBECONFIG
kubectl rollout restart deployment/cert-manager -n cert-manager
Administrador de recursos
El estado del proyecto no está disponible en la consola de GDC
Versiones: 1.13.1 o posteriores
Síntomas: la consola de GDC no muestra el estado de un proyecto.
Los proyectos que no estén en el estado Ready no podrán admitir recursos nuevos ni procesar modificaciones nuevas en los recursos que ya tengan. Como no se puede confirmar el estado del proyecto, no está claro cuándo se pueden gestionar los recursos de un proyecto, lo que provoca errores al intentar realizar nuevas acciones en el proyecto.
Solución alternativa: consulta el runbook RM-R0100 para imprimir el estado del proyecto mediante la CLI de kubectl.
Actualizar
bm-system y otros trabajos atascados
Versiones: 1.13.1
Síntomas: el bm-system y otros trabajos que ejecutan el playbook de Ansible se quedan bloqueados en gathering facts.
Solución alternativa: introduce el nombre del nodo que está bloqueado y ejecuta multipath -ll | grep failed y multipath -ll | grep #. Si el resultado no está vacío,sigue los runbooks FILE R0020 y FILE R0021.
IP de gestión no accesible
Versiones: 1.13.1, 1.13.3, 1.13.4 y 1.13.5
Síntomas: durante una actualización, no se puede acceder a la IP de gestión de un servidor, sobre todo después de un cambio.
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 a esa IP de gestión temporalmente.
Solución alternativa: establece una conexión SSH con el servidor mediante la dirección IP de los datos y reinicia el servicio de red para volver a crear las rutas estáticas que faltan:
systemctl restart NetworkManager.service
No se muestra el número de versión de storagecluster
Versiones: 1.13.3
Síntomas: después de una actualización, el CR StorageCluster no muestra ningún valor en el campo de estado StorageVersion.
Comprueba la versión:
kubectl --kubeconfig <var>ROOT_ADMIN_KUBECONFIG</var> get StorageCluster -n gpc-system
Sigue los pasos de la solución alternativa si el campo de versión está vacío.
Solución: Reinicia la implementación de file-storage-backend-controller:
kubectl --kubeconfig <var>ROOT_ADMIN_KUBECONFIG</var> rollout restart deployment -n file-system file-storage-backend-controller
El servidor Bare Metal se queda bloqueado en el estado de aprovisionamiento
Versiones: 1.13.1
Síntomas:
El servidor de hardware desnudo se queda en el estado "provisioning" (aprovisionando) durante mucho tiempo cuando se crea una organización.
Solución:
Es posible que la configuración de la BIOS del servidor haya cambiado y que el servidor utilice la tarjeta de red incorrecta para el arranque PXE.
Sigue estos pasos para inhabilitar el arranque de red de la NIC del plano de datos.
- Acceso necesario:
- Necesitará acceso a las credenciales de administrador de BMC de los servidores que estén bloqueados.
- Sigue las instrucciones de IAM-R0005 para obtener el rol hardware-admin de ClusterRole en el clúster root-admin durante 1 hora.
- Sigue las instrucciones de IAM-R0004 para generar el archivo KUBECONFIG del clúster root-admin.
Define el nombre del servidor bloqueado.
export SERVER_NAME=Define la IP y las credenciales de la BMC del servidor.
export ip=$(kubectl --kubeconfig "${KUBECONFIG:?must be set}" get server ${SERVER_NAME:?} -n gpc-system -ojsonpath='{.spec.bmc.ip}') export BMC_CREDENTIALS_SECRET=$(kubectl --kubeconfig "${KUBECONFIG:?must be set}" get server ${SERVER_NAME:?} -n gpc-system -ojsonpath='{.spec.bmc.credentialsRef.name}') export user=$(kubectl --kubeconfig "${KUBECONFIG:?must be set}" get secret ${BMC_CREDENTIALS_SECRET:?} -n gpc-system -ojsonpath='{.data.username}' | base64 -d) export pass=$(kubectl --kubeconfig "${KUBECONFIG:?must be set}" get secret ${BMC_CREDENTIALS_SECRET:?} -n gpc-system -ojsonpath='{.data.password}' | base64 -d)Identifica la ranura PCIe de la tarjeta de red del plano de datos en el servidor.
kubectl --kubeconfig "${KUBECONFIG:?must be set}" get server ${SERVER_NAME} -n gpc-system -o jsonpath={.spec.serverHardware.portBond.nicPortNames}Por ejemplo, el siguiente resultado indica que la tarjeta de red está instalada en la ranura 3.
["s3p1","s3p2"]Define la variable PCIEslot:
export DATA_NIC_SLOT=3Comprueba que el inicio de red no esté inhabilitado.
curl -ks -u $user:$pass https://$ip/redfish/v1/systems/1/bios/settings | jq .Attributes | grep "Slot${DATA_NIC_SLOT}NicBoot1"Si el resultado es "NetworkBoot", debes inhabilitarlo explícitamente.
Usa BMC para inhabilitar la función de arranque de red en la tarjeta de red del plano de datos.
Sustituya "Slot3" en el siguiente comando por el número de espacio real.
curl -k -u "$user":"$pass" -H "Content-Type: application/json" https://$ip/redfish/v1/systems/1/bios/settings/ -X PUT --data '{"Attributes":{"Slot3NicBoot1":"Disabled"}}' | jqy, a continuación, reinicia el equipo.
curl -k -u "$user":"$pass" -H "Content-Type: application/json" https://$ip/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/ -X POST -d '{"ResetType": "ForceRestart"}' | jqEl servidor tarda entre 10 y 15 minutos en volver a estar operativo y reanuda automáticamente el proceso de aprovisionamiento.
La actualización del almacenamiento de objetos muestra un error durante la comprobación posterior o previa al vuelo
Versiones: 1.13.1
Síntomas: las comprobaciones previas o posteriores a la publicación 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:
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 mediante el archivo kubeconfig del administrador root:
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=okPor 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-postflight-check=ok && kubectl annotate -n gpc-system organization org-1 upgrade.private.gdc.goog/skip-preflight-check=okSi el error se produce durante las comprobaciones preparatorias y todas las demás 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=okPor 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.
Restauraciones de versiones anteriores de Helm
Versiones: 1.13.3
Síntomas: un problema con la actualización de Helm provoca una serie de restauraciones y no se encuentra Certificate ni ServiceEntry. Es posible que veas un mensaje como este:
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
91 Thu Jul 18 13:26:42 2024 deployed iam-ais-backend-1.12.4-gdch.54 1.12.4-gdch.54 Upgrade complete
9138 Fri Jul 19 22:21:56 2024 superseded iam-ais-backend-v1.13.0-iam-9b810cbc70 v1.13.0-iam-9b810cbc70 Rollback "iam-ais-backend" failed: no Certificate with the name "ais-metrics" found
9139 Fri Jul 19 22:22:04 2024 superseded iam-ais-backend-1.12.4-gdch.54 1.12.4-gdch.54 Rollback "iam-ais-backend" failed: no ServiceEntry with the name "ais-envoy-grpc" found
9140 Fri Jul 19 22:22:16 2024 superseded iam-ais-backend-v1.13.0-iam-9b810cbc70 v1.13.0-iam-9b810cbc70 Rollback "iam-ais-backend" failed: no Certificate with the name "ais-metrics" found
9141 Fri Jul 19 22:22:30 2024 superseded iam-ais-backend-1.12.4-gdch.54 1.12.4-gdch.54 Rollback "iam-ais-backend" failed: no ServiceEntry with the name "ais-envoy-grpc" found
9142 Fri Jul 19 22:22:35 2024 superseded iam-ais-backend-v1.13.0-iam-9b810cbc70 v1.13.0-iam-9b810cbc70 Rollback "iam-ais-backend" failed: no Certificate with the name "ais-metrics" found
9143 Fri Jul 19 22:22:42 2024 superseded iam-ais-backend-1.12.4-gdch.54 1.12.4-gdch.54 Rollback "iam-ais-backend" failed: no ServiceEntry with the name "ais-envoy-grpc" found
9144 Fri Jul 19 22:22:48 2024 superseded iam-ais-backend-v1.13.0-iam-9b810cbc70 v1.13.0-iam-9b810cbc70 Rollback "iam-ais-backend" failed: no Certificate with the name "ais-metrics" found
9145 Fri Jul 19 22:22:56 2024 superseded iam-ais-backend-1.12.4-gdch.54 1.12.4-gdch.54 Rollback "iam-ais-backend" failed: no ServiceEntry with the name "ais-envoy-grpc" found
9146 Fri Jul 19 22:23:04 2024 failed iam-ais-backend-v1.13.0-iam-9b810cbc70 v1.13.0-iam-9b810cbc70 Rollback "iam-ais-backend" failed: no Certificate with the name "ais-metrics" found
Solución alternativa: sigue los pasos del runbook OCLCM-R0122.
Actualización de nodos o ABM bloqueado porque no se ha vaciado el pod dhcp-tftp-core-server
Versiones: 1.13.3, 1.14.4 y 1.14.5
Síntomas: la actualización del nodo puede quedarse bloqueada. En el estado de la máquina Bare Metal, el pod dhcp-tftp-core-server no se ha drenado. Es posible que veas un mensaje como este:
bareMetalMachineDrainingStatus:
currentDrainingStage: SystemCriticalPriorityClass
podsYetToDrain:
- name: dhcp-tftp-core-server-7ffcfcbb97-6wlg7
namespace: dhcp-system
resourceVersion: "5005530"
uid: f77826ea-1d57-46ff-a699-f42faa36c1d2
Solución alternativa: fuerza la eliminación del pod dhcp-tftp-core-server-* para continuar. El comando tiene este aspecto:
kubectl delete pod dhcp-tftp-core-server-7ffcfcbb97-6wlg7 -n dhcp-system --force
OrganizationUpgrade se ha quedado atascado en la fase de actualización del nodo
Versiones: 1.13.3
Síntomas: OrganizationUpgrade se queda atascado en la fase de actualización de nodos. Es posible que veas un mensaje como este:
Last Transition Time: 2024-08-27T12:37:40Z
Message: observed the following reason: [JobRunning]
Observed Generation: 614
Reason: Unsuccessful
Status: Unknown
Type: service/Node
Solución:
Comprueba si hay
upgradetaskrequestCRs en el clúster raízka get upgradetaskrequest -n gpc-system. Comprueba si el nodo sigue en estado de ejecución. Asegúrate de que se haya quedado atascado en la tarea del servicio.spec: clusterType: service Last Transition Time: 024-08-27T12:37:40Z Message: job gpc-system/v1.13.0-os-aa505d9004-upg-task-org-1-os-node-upgra-czwwd is running Observed Generation: 1 Reason: JobRunning Status: Unknown Type: SucceededCrea manualmente
nodeupgradeCRs para cada reclamación de grupo de nodos:export KUBECONFIG=ORG_ADMIN_KUBECONFIG kubectl get nodepoolclaims -n g-org-1-shared-service-cluster NAME AGE control-plane-node-pool 34d dbs-billing-system-billing-dbcluster-n2-standard-4-gdc 34d shared-service-default-worker 34dCrea un
nodeupgradeCR para cada reclamación de grupo de nodos. Los detalles de la anotaciónupgrade.private.gdc.goog/target-release-versiondeben obtenerse del nombre CRMD del SO de destino:kubectl get crmd --kubeconfig ${ROOT_ADMIN_KUBECONFIG} | grep "os" os-1.13.1-gdch.525 35d os-v1.13.0-os-4175a6dce6 27d os-v1.13.0-os-aa505d9004 5d18hUsa la versión de aquí en las anotaciones
upgrade.private.gdc.goog/target-release-version:kubectl --kubeconfig ${ROOT_ADMIN_KUBECONFIG} get crmd os-v1.13.0-os-aa505d9004 -o json | jq -r '.spec.config.vmNodeImage' rocky-86-1.13-v20240731-1.13-r191Aplica los siguientes
yamla cada uno de los nodepoolclaim:apiVersion: upgrade.private.gdc.goog/v1alpha1 kind: NodeUpgrade metadata: annotations: upgrade.private.gdc.goog/target-release-version: VERSION name: NAME labels: addon.private.gdc.goog/cluster-type: service namespace: NAMESPACE spec: inFlightConf: maxConcurrentNodes: 1 nodePoolClaimRef: name: NAME namespace: NAMESPACE nodeType: Virtual software: osImage: name: NAME version: VERSIONUna vez que se hayan completado las actualizaciones de los nodos del clúster de servicio, actualiza el estado del
UpgradeTaskRequestCR a True para que la actualización de la organización pase a la siguiente fase:kubectl patch upgradetaskrequest upg-task-org-1-os-node-upgrade-task-pckxn --type='json' -p='[{"op": "replace", "path": "/status/conditions/0/status", "value": "True"}]' --subresource=status -n gpc-system --kubeconfig /root/release/root-admin/root-admin-kubeconfigLa actualización de la organización debería pasar a la siguiente fase y el estado del servicio o del nodo debería ser "Completado":
Last Transition Time: 2024-08-27T22:44:09Z Message: observed the following reason: [JobRunning] Observed Generation: 614 Reason: Complete Status: True Type: service/Node
El kernel no puede crear un contenedor
Versiones: 1.13.3
Síntomas: el kernel no asigna memoria cgroup, lo que provoca errores al crear contenedores.
Es posible que veas un mensaje como este:
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
FrequentContainerdRestart False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 NoFrequentContainerdRestart containerd is functioning properly
KernelDeadlock False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 KernelHasNoDeadlock kernel has no deadlock
ReadonlyFilesystem False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 FilesystemIsNotReadOnly Filesystem is not read-only
ContainerRuntimeUnhealthy False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 10:52:30 +0000 ContainerRuntimeIsHealthy Container runtime on the node is functioning properly
FrequentUnregisterNetDevice False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 NoFrequentUnregisterNetDevice node is functioning properly
KubeletUnhealthy False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 KubeletIsHealthy kubelet on the node is functioning properly
FrequentKubeletRestart False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 NoFrequentKubeletRestart kubelet is functioning properly
FrequentDockerRestart False Thu, 29 Aug 2024 13:28:33 +0000 Sun, 30 Jun 2024 07:41:50 +0000 NoFrequentDockerRestart docker is functioning properly
MemoryPressure Unknown Thu, 29 Aug 2024 13:31:31 +0000 Thu, 29 Aug 2024 13:32:30 +0000 NodeStatusUnknown Kubelet stopped posting node status.
DiskPressure Unknown Thu, 29 Aug 2024 13:31:31 +0000 Thu, 29 Aug 2024 13:32:30 +0000 NodeStatusUnknown Kubelet stopped posting node status.
PIDPressure Unknown Thu, 29 Aug 2024 13:31:31 +0000 Thu, 29 Aug 2024 13:32:30 +0000 NodeStatusUnknown Kubelet stopped posting node status.
Ready Unknown Thu, 29 Aug 2024 13:31:31 +0000 Thu, 29 Aug 2024 13:32:30 +0000 NodeStatusUnknown Kubelet stopped posting node status.
[root@zv-aa-bm01 ~]# journalctl -u kubelet -f | grep cilium-agent
Aug 29 17:29:47 zv-aa-bm01 kubelet[48625]: E0829 17:29:47.941493 48625 pod_workers.go:1298]
"Error syncing pod, skipping" err="failed to \"StartContainer\" for \"cilium-agent\" with CrashLoopBackOff: \"back-off 5m0s restarting failed container=cilium-agent pod=anetd-pvmz4_kube-system(db55cbd2-36e3-4d20-8c6b-edbb5191232d)\"" pod="kube-system/anetd-pvmz4" podUID="db55cbd2-36e3-4d20-8c6b-edbb5191232d"
Unknown Thu, 29 Aug 2024 13:31:31 +0000 Thu, 29 Aug 2024 13:32:30 +0000 NodeStatusUnknown Kubelet stopped posting node status.
y el nodo está usando un número muy elevado de cgroups:
# cat /proc/cgroups | grep memory
memory 12 380360 1
Solución:
Sigue uno de estos procedimientos:
- Ejecuta
echo 3 > /proc/sys/vm/drop_cachesen el nodo y reinicia kubelet. - Si el método anterior no funciona, prueba a reiniciar el nodo.
Fallo de conectividad intermitente a la IP virtual del clúster externo
Versiones: 1.13.3
Síntomas: los fallos de conexión intermitentes a la IP virtual (VIP) del clúster externo, como la VIP del plano de control, la VIP de istio-gateway o la VIP de Harbor, provocan un error dial tcp :: connect: no route to host.
Para diagnosticar este problema, sigue estos pasos:
- Conéctate al clúster de administrador raíz.
Esta solución alternativa presupone que estás depurando direcciones IP en un clúster de administrador raíz. Si estás depurando problemas de conectividad con otros clústeres de Kubernetes, como los clústeres del administrador o del sistema de la organización, cambia el valor de
KUBECONFIGa la ruta kubeconfig del clúster correcto. Hay dos categorías conocidas de IPs que pueden verse afectadas. Comprueba si el protocolo de puerta de enlace de frontera (BGP) anuncia las direcciones IP a los conmutadores de la parte superior del rack (ToR):
Si la IP es una dirección IP del plano de control de Kubernetes, como
192.0.2.100, usa este comando para obtener la información de configuración:KUBECONFIG=KUBECONFIG kubectl cluster-info # Kubernetes control plane is running at https://192.0.2.100:443`Sustituye
KUBECONFIGpor la ruta a tu archivo kubeconfig en el clúster de administrador raíz.En algunas configuraciones, el recurso personalizado
BGPAdvertisedRoutedefine qué rutas de la dirección IP se anuncian a otras redes o sistemas mediante BGP. Si la dirección IP se anuncia mediante el recurso personalizadoBGPAdvertisedRoute, usa este comando para obtener la información de configuración:TARGET_IP=TARGET_IP_ADDRESS KUBECONFIG=KUBECONFIG kubectl get BGPAdvertisedRoute -A --kubeconfig=$KUBECONFIG | grep $TARGET_IPSustituye
TARGET_IP_ADDRESSpor la dirección IP que tenga problemas de conectividad intermitentes.
Comprueba el estado de los
BGPSessionrecursos personalizados. UnBGPSessionrepresenta una sesión de emparejamiento de BGP individual establecida entre tu clúster de Kubernetes y un peer de BGP externo. Inspecciona los registros de los pods deBGPAdvertisery comprueba que todos los recursos deBGPSessiontengan el estadoEstablished:KUBECONFIG=KUBECONFIG kubectl get pods -l app=bgpadvertiser -n kube-system # Based on the name of pods, check their logs kubectl logs pod/bgpadvertiser-gpc-adhoc-6a265a03vm-worker-node0-zone1 -n kube-system --kubeconfig=$KUBECONFIG`La salida de un pod
BGPAdvertisercorrecto contiene el siguiente fragmento:I0904 04:32:19.999906 1 main.go:217] BGP advertiser serving...\ time="2024-09-04T04:32:25Z" level=info msg="Peer Up" Key=10.200.0.1 State=BGP_FSM_OPENCONFIRM Topic=Peer\Verifica la estabilidad de la conexión. Crea y ejecuta una secuencia de comandos para comprobar si la conectividad es intermitente o inestable:
Crea la secuencia de comandos:
#!/bin/bash TARGET=$1 CNT=0 for i in {1..100}; do output=$(curl --no-progress-meter -k https://$TARGET 2>&1) if echo "$output" | grep -q "No route to host"; then CNT=$((CNT+ 1)) echo "Attempt $i: $output" fi sleep 0.1 done echo "$CNT out of 100 runs hit No route to host error"Ejecuta la secuencia de comandos:
./script.sh TARGET_IP_ADDRESS:PORTSustituye
PORTpor el número de puerto que tiene problemas.Si tu conexión tiene problemas, verás un resultado como el siguiente:
Attempt 2: curl: (7) Failed to connect to 192.0.2.201 port 10443: No route to host Attempt 4: curl: (7) Failed to connect to 192.0.2.201 port 10443: No route to host Attempt 7: curl: (7) Failed to connect to 192.0.2.201 port 10443: No route to host`
El resultado anterior confirma el problema. Comprueba las rutas de los conmutadores TOR para ver si la configuración de los conmutadores TOR es la causa del problema.
Supongamos que el tráfico se ha descartado para una dirección IP de ejemplo
192.0.2.201y que la anuncia el recursoBGPAdvertisedRoute. Examina los saltos del recursoBGPAdvertisedRoutepara identificar posibles puntos de fallo:apiVersion: networking.gke.io/v1 kind: BGPAdvertisedRoute metadata: annotations: bgploadbalancer.networking.gke.io/servicename: istio-ingressgateway bgploadbalancer.networking.gke.io/servicens: istio-system creationTimestamp: "2024-08-20T19:03:02Z" generation: 150 name: default-istio-system-istio-ingressgateway-rj2fv namespace: kube-system ownerReferences: - apiVersion: networking.gke.io/v1 blockOwnerDeletion: true controller: true kind: BGPLoadBalancer name: default uid: f681f3e5-c66a-45d6-a3ac-9d7ae26f555f resourceVersion: "27133500" uid: 8ede0c81-3aba-40ce-a441-4aec334b41bd spec: bgpPeerNames: - 192.0.2.6-peer-10.0.1.1 - 192.0.2.5-peer-10.0.1.0 - 192.0.2.5-peer-10.0.1.1 - 192.0.2.6-peer-10.0.1.0 nextHops: - 192.0.2.2 - 192.0.2.3 - 192.0.2.4 prefix: 192.0.2.201/32Consulta las direcciones IP en el campo
nextHops. Busca el nombre del servidor de cada dirección IP. Por ejemplo:- 192.0.2.2 zt-aa-bm08 - 192.0.2.3 zt-aa-bm09 - 192.0.2.4 zt-ab-bm01Esta salida muestra que los siguientes saltos se dirigen a servidores de los racks
aayab. Inicia sesión en los conmutadores TOR de los racksaayaby compara las rutas de ambos racks:show ip route 192.0.2.201 vrf root-external-vrfSi las rutas son diferentes entre los conmutadores TOR de los dos racks, significa que tienes el problema que mitiga la solución alternativa. La salida de este problema es similar a la siguiente:
zt-aa-torsw01# show ip route 192.0.2.201 vrf root-external-vrf IP Route Table for VRF "root-external-vrf" '*' denotes best ucast next-hop '**' denotes best mcast next-hop '[x/y]' denotes [preference/metric] '%<string>' in via output denotes VRF <string> 192.0.2.201/32, ubest/mbest: 3/0, all-best *via 192.0.2.2, [20/0], 1w1d, bgp-65070, external, tag 64513 *via 192.0.2.3, [20/0], 1w1d, bgp-65070, external, tag 64513 *via 192.0.2.4, [20/0], 1w1d, bgp-65070, external, tag 64513 zt-aa-torsw02# sh ip route 192.0.2.201 vrf root-external-vrf IP Route Table for VRF "root-external-vrf" '*' denotes best ucast next-hop '**' denotes best mcast next-hop '[x/y]' denotes [preference/metric] '%<string>' in via output denotes VRF <string> 192.0.2.201/32, ubest/mbest: 3/0, all-best *via 192.0.2.2, [20/0], 1w3d, bgp-65070, external, tag 64513 *via 192.0.2.3, [20/0], 1w3d, bgp-65070, external, tag 64513 *via 192.0.2.4, [20/0], 1w3d, bgp-65070, external, tag 64513 zt-ab-torsw01# show ip route 192.0.2.201 vrf root-external-vrf IP Route Table for VRF "root-external-vrf" '*' denotes best ucast next-hop '**' denotes best mcast next-hop '[x/y]' denotes [preference/metric] '%<string>' in via output denotes VRF <string> 192.0.2.201/32, ubest/mbest: 2/0, all-best *via 10.249.88.2, [200/0], 1w1d, bgp-65070, internal, tag 64513 *via 192.0.2.3, [200/0], 1w1d, bgp-65070, internal, tag 64513 zt-ab-torsw02# sh ip route 192.0.2.201 vrf root-external-vrf IP Route Table for VRF "root-external-vrf" '*' denotes best ucast next-hop '**' denotes best mcast next-hop '[x/y]' denotes [preference/metric] '%<string>' in via output denotes VRF <string> 192.0.2.201/32, ubest/mbest: 2/0, all-best *via 192.0.2.2, [200/0], 1w3d, bgp-65070, internal, tag 64513 *via 192.0.2.3, [200/0], 1w3d, bgp-65070, internal, tag 64513En este resultado, las rutas del rack
aatienen el estado esperado y muestran tres saltos siguientes en el prefijo. Sin embargo, en el rackab, el prefijo solo tiene dos saltos siguientes. Cuando el tráfico destinado al prefijo se cifra con hash en el rackab, el nodo correspondiente al siguiente salto que falta nunca recibe el tráfico y la red tiene problemas de conectividad.
Sigue la solución alternativa para mitigar este problema.
Solución:
Esta solución alternativa ayuda a resolver problemas de conectividad intermitente con determinadas direcciones IP en clústeres de Kubernetes.
Para mitigar este problema, debe aplicar varios cambios de configuración a la sesión BGP entre los conmutadores agregados. Los conmutadores de agregación (AGG) agregan el tráfico de varios conmutadores TOR. Sigue estos pasos para actualizar todas las configuraciones necesarias:
Un archivo de configuración llamado
switchstaticconfigrepresenta las configuraciones estáticas de un solo interruptor. Descarga el archivoswitchstaticconfigpara ambos interruptores de AGG:export KUBECONFIG=KUBECONFIG kubectl get switchstaticconfig za-ab-aggsw01-static-config -n gpc-system -oyaml > /tmp/za-ab-aggsw01-static-config.yaml kubectl get switchstaticconfig za-ac-aggsw01-static-config -n gpc-system -oyaml > /tmp/za-ac-aggsw01-static-config.yamlObtén el número de sistema autónomo (ASN) del entorno:
root@bootstrapper:/tmp# kubectl get ClusterBGPRouter --kubeconfig KUBECONFIG -A -o yaml | grep networkASN | head -1 networkASN: 65030En este resultado se muestra el valor de ASN
65030. En los pasos siguientes, debes usar el valor de ASN que se devuelva aquí.Una dirección IP de bucle de retorno en un switch AGG actúa como una dirección estable y siempre activa para la gestión, el enrutamiento y la resolución de problemas, incluso si otras conexiones de red no funcionan. Obtén las direcciones IP de bucle invertido de cada uno de los switches AGG:
root@bootstrapper:~# kubectl get --kubeconfig KUBECONFIG aggswitchinternal -n gpc-system -o jsonpath='{range.items[*]}{.metadata.name}{":\t"}{.spec.loopbackIPs}{"\n"}{end}'El resultado es similar al siguiente:
za-ab-aggsw01-internal: ["192.0.2.1"] za-ac-aggsw01-internal: ["192.0.2.2"]Actualiza el valor de
staticswitchconfigen el interruptorza-ab-aggsw01AGG. Añade este fragmento a la secciónconfig:spec: config: | route-map onlydefault permit 10 match ip address prefix default router bgp ASN neighbor LOOPBACK_ADDRESS address-family l2vpn evpn route-map onlydefault in ... key chain OSPF_AUTH_KEYCHAIN_0 key 1Haz los cambios siguientes:
ASN: el valor de ASN del paso anterior. En este ejemplo, el valor es65030.LOOPBACK_ADDRESS: es la dirección IP de bucle invertido del switch AGGza-ac-aggsw01. En este ejemplo, el valor es192.0.2.2.
Aplica la misma actualización al otro interruptor AGG.
za-ac-aggsw01. Debe proporcionar la dirección de bucle invertido correcta. La dirección IP de bucle de retorno es diferente para cada switch:za-ab-aggsw01-internal: ["192.0.2.1"] za-ac-aggsw01-internal: ["192.0.2.2"]Crea y ejecuta la misma secuencia de comandos que has usado para diagnosticar el problema en este paso para verificar que la corrección se ha aplicado correctamente. En el resultado no se muestra ningún mensaje de error.
Aparece un error Incorrect version of Trident durante la actualización
Versiones: 1.13.3, 1.13.4 y 1.13.5
Síntomas: al actualizar desde versiones anteriores a la 1.13.3, ontap muestra el error Incorrect version of Trident. Es posible que veas un mensaje como este:
Status:
Conditions:
Last Transition Time: 2024-08-27T15:19:07Z
Message: Incorrect version of Trident. Wanted v23.10.0-gke.6, got v23.10.0-gke5
Observed Generation: 1
Reason: QualificationFailed
Status: False
Type: AllComplete
Events:
Solución:
Actualiza la
releasemetadatade la versión a la que vas a cambiar:export KUBECONFIG=<point to ROOT Admin Kubeconfig> To get the list of all releasemetadata: `kubectl get releasemetadata`La salida podría ser la siguiente:
NAME AGE 1.12.2-gdch.785 24d 1.12.4-gdch.96 13d 1.13.3-gdch.5548 11hElige la versión a la que vas a actualizar, como se indica en el siguiente ejemplo:
kubectl get releasemetadata 1.13.3-gdch.5548 -o yaml > releasemetadata.yamlActualiza la versión de trident en la sección fileBlockStorage del archivo .yaml a la versión que se menciona en el error. Si el mensaje de error era similar a este:
Message: Incorrect version of Trident. Wanted v23.10.0-gke.6, got v23.10.0-gke.5Cambia
tridentVersionporv23.10.0-gke.5enreleasemetadata.yaml.Por ejemplo, si el valor original era:
infraComponents: fileBlockStorage: ONTAPVersion: 9.14.1P1 harvestVersion: v22.08.0-gke.7 tridentVersion: v23.10.0-gke.6,Cámbialo por el siguiente valor:
infraComponents: fileBlockStorage: ONTAPVersion: 9.14.1P1 harvestVersion: v22.08.0-gke.7 tridentVersion: v23.10.0-gke.5.Aplica los cambios:
kubectl apply -f releasemetadata.yamlVuelve a aplicar la ampliación del almacenamiento de
ontap.
No se pueden programar pods
Versiones: 1.13.3. 1.13.4 y 1.13.5
Síntomas: durante el aprovisionamiento del clúster de usuarios, no se pueden programar algunos pods. Es posible que veas un mensaje como este:
0/6 nodes are available: 1 Insufficient cpu. preemption: 0/6 nodes are available: 6 No preemption victims found for incoming pod
Solución:
Aumenta la escala del grupo de nodos del plano de control del clúster de usuarios:
kubectl --kubeconfig ORG_ADMIN_KUBECONFIG patch addresspoolclaim/control-plane-node-pool -n ${CLUSTER_NAME}-cluster --type=json -p="[{'op': 'replace', 'path': '/spec/size', 'value': 5}]"
kubectl --kubeconfig ORG_ADMIN_KUBECONFIG patch nodepoolclaim/control-plane-node-pool -n ${CLUSTER_NAME}-cluster --type=json -p="[{'op': 'replace', 'path': '/spec/nodeCount', 'value': 5}]"
Fallo al actualizar el subcomponente iac-zoneselection-global
Versiones: 1.13.1
Síntomas: Durante una actualización a la versión 1.13.3, se produce un error en el subcomponente iac-zoneselection-global. Es posible que veas un mensaje como este:
== Subcomponents with failures in root org ===
Sub-Component: iac-zoneselection-global - Reconciliation error: E0100 - deploy: failed to install chart: release iac-zoneselection-global-backend failed, and has been uninstalled due to atomic being set: 1 error occurred:
* ZoneSelection.location.mz.global.private.gdc.goog "iac" is invalid: spec.resultObjectName: Required value
Events: Type Reason Age From Message
---- ------ ---- ---- -------
Warning ReconciliationError 119s (x521 over 20h) Subcomponent E0100 - deploy: failed to install chart: release iac-zoneselection-global-backend failed, and has been uninstalled due to atomic being set: 1 error occurred:
* ZoneSelection.location.mz.global.private.gdc.goog "iac" is invalid: spec.resultObjectName: Required value
Solución:
Si actualizas a la versión 1.13.3, se solucionará el error.
Se ha superado el plazo de las tareas de comprobación de la actualización
Versiones: 1.12.x y 1.13.x
Síntomas: durante la actualización de la organización, la comprobación de la actualización muestra el estado False con el motivo DeadlineExceeded. Es posible que veas un mensaje como este:
Preflight Check:
Conditions:
Last Transition Time: 2024-10-29T18:57:47Z
Message: the result has status: False, reason: PreflightCheckFailed, and err: [check "OPAUpgrade" of operable component "OPA" failed with reason "DeadlineExceeded", no existing pods found, check "Arti
actAvailability" of operable component "AR" failed with reason "DeadlineExceeded", no existing pods found, check "PackageValidation" of operable component "AR" failed with reason "DeadlineExceeded", no existing pods foun
d, check "IAMUpgrade" of operable component "IAM" failed with reason "DeadlineExceeded", no existing pods found, check "NodeHealth" of operable component "OS" failed with reason "DeadlineExceeded", no existing pods found
, check "DNSHealth" of operable component "DNS" failed with reason "DeadlineExceeded", no existing pods found, check "AdminClusterCheck" of operable component "UPORC" failed with reason "DeadlineExceeded", no existing po
ds found[]
Observed Generation: 3
Reason: PreflightCheckFailed
Status: False
Type: Succeeded
Start Time: 2024-10-29T17:57:47Z
Solución:
- Elimina las tareas de comprobación de actualización fallidas correspondientes a las comprobaciones de actualización fallidas.
- Espera hasta que se vuelvan a crear los trabajos de comprobación de la actualización.
- Consulta los registros de los trabajos recreados y clasifica los problemas.
El complemento meta-monitoring falla porque la ubicación de strongswan está en un directorio de tiempo de ejecución diferente
Versiones: 1.12.x y 1.13.x
Síntomas: durante la actualización a la versión 1.13.4 o 1.13.5, el complemento meta-monitoring falla:
kubectl --kubeconfig ORG_ADMIN_KUBECONFIGget addons -A | grep meta-monitoring
org-1-system-cluster meta-monitoring false false 1.12.4-gdch.96
Comprueba el complemento:
kubectl --kubeconfig ORG_ADMIN_KUBECONFIG get -n org-1-system-cluster addon meta-monitoring -o yaml
El mensaje de la condición podría ser similar al siguiente:
status:
conditions:
- lastTransitionTime: "2024-11-19T02:57:30Z"
message: 'Error occurred during addon installation: failed to rollback chart:
create: failed to create: Internal error occurred: failed calling webhook "validation.gatekeeper.sh":
failed to call webhook: Post "https://gatekeeper-webhook-service.opa-system.svc:443/v1/admit?timeout=3s":
context deadline exceeded'
observedGeneration: 2
reason: InstallationError
status: "False"
type: Deployed
Solución:
Asegúrate de que las sesiones de BGP del clúster del sistema de la organización estén fallando. Por ejemplo:
kubectl --kubeconfig ORG_SYSTEM_KUBECONFIG get bgpsessions -A NAME LOCAL ASN PEER ASN LOCAL IP PEER IP STATE LAST REPORT 10.252.122.10-peer-10.0.1.32-vm-7351eebe 64513 65030 10.252.122.10 10.0.1.32 10.252.122.10-peer-10.0.1.33-vm-7351eebe 64513 65030 10.252.122.10 10.0.1.33 10.252.122.11-peer-10.0.1.32-vm-7351eebe 64513 65030 10.252.122.11 10.0.1.32 10.252.122.11-peer-10.0.1.33-vm-7351eebe 64513 65030 10.252.122.11 10.0.1.33 172.20.128.3-peer-10.0.1.48-za-aa-bm02-hltg2 64513 65030 172.20.128.3 10.0.1.48 172.20.128.3-peer-10.0.1.49-za-aa-bm02-hqblq 64513 65030 172.20.128.3 10.0.1.49Comprueba que los
ang-nodepods estén atascados enContainerCreating. Por ejemplo:kubectl --kubeconfig ORG_SYSTEM_KUBECONFIG get pods -n kube-system -l app=ang-node NAME READY STATUS RESTARTS AGE ang-node-5c6c8 0/3 ContainerCreating 0 2d21h ang-node-6skkl 0/3 ContainerCreating 0 2d14h ang-node-7d7dj 0/3 ContainerCreating 0 2d20h ang-node-9l4xc 0/3 ContainerCreating 0 2d17hSe muestra el siguiente error:
Warning FailedMount 112s (x2056 over 2d21h) kubelet MountVolume.SetUp failed for volume "vici" : hostPath type check failed: /var/run/strongswan is not a directoryAplica el siguiente cambio a
ang-overridesAddonConfiguration en el clúster de administrador de la organización:kubectl --kubeconfig ORG_ADMIN_KUBECONFIG edit addonconfiguration ang-overrides -n org-1-system-clusterCambia lo siguiente:
volumes: - hostPath: path: /var/run/strongswan type: Directory name: vicia lo siguiente:
volumes: - hostPath: path: /var/run type: Directory name: viciDespués de un minuto, confirma que los pods de
ang-nodeestán en el estadoRunning:NAME READY STATUS RESTARTS AGE ang-node-7hj5q 3/3 Running 0 15s ang-node-xps2m 3/3 Running 0 34s ang-node-krx8p 3/3 Running 0 34s ang-node-cbm1a 3/3 Running 0 34sAsegúrate de que las sesiones de BGP del clúster del sistema de la organización se estén ejecutando.
El complemento
meta-monitoringpasará a la siguiente fase.
La actualización de la organización raíz se bloquea debido a un error en la tarea de firma
Versiones: 1.13.3 y 1.13.4
Síntomas: al actualizar de la versión 1.13.3 a la 1.13.4, es posible que veas un mensaje como este:
Message: [the result has status: False, reason: PreflightCheckFailed, and err: check "PackageValidation" of operable component "AR" failed with reason "DeadlineExceeded", no existing pods found, the result has status: Unknown, reason: UpgradeCheckJobsInProgress
Solución:
Inhabilita la comprobación preparatoria:
kubectl annotate -n gpc-system organization root upgrade.private.gdc.goog/skip-preflight-check=okElimina el trabajo
artifact-signature-verification-***fallido.Espera a que se complete la actualización de root.
Opcional: Habilita la comprobación previa al lanzamiento si el entorno se ha actualizado a la versión 1.13.4 o posterior.
Una vez que el mando tenga la versión 1.13.4, las actualizaciones no deberían tener este problema.
La actualización de la organización del arrendatario falla en la fase de comprobación previa con ErrImagePull
Versiones: 1.13.3
Síntomas: la actualización de la organización del arrendatario falla en la fase de comprobación previa con ErrImagePull para el pod de validación del paquete. Es posible que veas un mensaje como este:
export KUBECONFIG=ORG_ADMIN_KUBECONFIG
kubectl get po -n package-validation-system | grep artifact-signature-verification
Los pods muestran un error ImagePullBackOff:
kubectl describe po -n package-validation-system POD_NAME
Se muestra un error de extracción de imágenes, como el siguiente ejemplo:
Name: artifact-signature-verification-20240823224755-4ppkt
Namespace: package-validation-system
Priority: 0
Service Account: package-validation
Node: ak-ab-base02/203.0.113.250
Start Time: Fri, 23 Aug 2024 22:47:55 +0000
Labels: batch.kubernetes.io/controller-uid=bf81d5eb-d597-464e-a907-67c1c8a11c11
batch.kubernetes.io/job-name=artifact-signature-verification-20240823224755
controller-uid=bf81d5eb-d597-464e-a907-67c1c8a11c11
job-name=artifact-signature-verification-20240823224755
Annotations: <none>
Status: Pending
IP: 203.0.113.255
IPs:
IP: 203.0.113.255
Controlled By: Job/artifact-signature-verification-20240823224755
Containers:
artifact-signature-verification:
Container ID:
Image: gcr.io/private-cloud-staging/signature-verifier:v1.13.0-uporc-aa505d9004
Image ID:
Port: <none>
Host Port: <none>
State: Waiting
Reason: ImagePullBackOff
Ready: False
Restart Count: 0
...
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 10m default-scheduler Successfully assigned package-validation-system/artifact-signature-verification-20240823224755-4ppkt to ak-ab-base02
Normal Pulling 7m25s (x4 over 9m22s) kubelet Pulling image "gcr.io/private-cloud-staging/signature-verifier:v1.13.0-uporc-aa505d9004"
Warning Failed 7m14s (x4 over 9m12s) kubelet Failed to pull image "gcr.io/private-cloud-staging/signature-verifier:v1.13.0-uporc-aa505d9004": failed to pull and unpack image "gcr.io/private-cloud-staging/signature-verifier:v1.13.0-uporc-aa505d9004": failed to resolve reference "gcr.io/private-cloud-staging/signature-verifier:v1.13.0-uporc-aa505d9004": unexpected status from HEAD request to https://203.0.113.255/v2/private-cloud-staging/signature-verifier/manifests/v1.13.0-uporc-aa505d9004?ns=gcr.io: 401 Unauthorized
Warning Failed 7m14s (x4 over 9m12s) kubelet Error: ErrImagePull
Warning Failed 7m3s (x6 over 9m11s) kubelet Error: ImagePullBackOff
Normal BackOff 4m11s (x17 over 9m11s) kubelet Back-off pulling image "gcr.io/private-cloud-staging/signature-verifier:v1.13.0-uporc-aa505d9004"
Solución:
Para saltarte las comprobaciones preparatorias, haz lo siguiente:
kubectl annotate -n gpc-system organization ORG_NAME \
upgrade.private.gdc.goog/skip-preflight-check=ok
No se encuentra serviceaccount durante la actualización de la organización raíz
Versiones: 1.13.8 y 1.13.9
Síntomas: durante la actualización a la versión 1.13.8, se produce un error en la implementación de addon para los RBACs si se han realizado actualizaciones anteriores y ya existen complementos. Los síntomas pueden estar en una de las siguientes fases:
- comprobaciones preparatorias o posteriores
- Cualquier fase que implique una tarea de actualización y el mensaje indique que la tarea se está ejecutando aunque esté bloqueada. El mensaje
status.conditionsindica que el trabajo se está ejecutando durante mucho tiempo, lo que significa que hay un problema.
Para comprobar si se ha producido un error en la comprobación previa a la actualización, consulta el estado del objeto OrganizationUpgrade correspondiente a la organización que se va a actualizar:
kubectl get -n gpc-system organizationupgrade ORG_NAME -o yaml
Si el trabajo falla en PreflightCheck, puede mostrar un error como este o un mensaje
UpgradeCheckRBACDeploymentInProgress:- lastTransitionTime: "2024-09-27T00:28:21Z" message: "" observedGeneration: 2 reason: Unknown status: "False" type: PreflightCheckSi el trabajo falla en la fase de Anthos Bare Metal (ABM) en la que se está ejecutando el trabajo de la tarea, se mostrará el siguiente resultado:
- Last Transition Time: 2024-09-26T19:55:13Z message: observed the following reason: [JobRunning] observedGeneration: 3 reason: Unsuccessful status: Unknown type: root-admin/AnthosBareMetalSi el fallo se produce en las comprobaciones, la
upgradecheckrequestCR falla:kubectl get upgradecheckrequests -n gpc-system --kubeconfig /root/release/root-admin/root-admin-kubeconfigLa salida podría tener este aspecto:
NAME AGE upgrade-check-root-postflight-xc7p8 6h32mSi el fallo se produce en las tareas,
upgradetaskrequestsCR falla:kubectl get upgradetaskrequests -n gpc-system --kubeconfig /root/release/root-admin/root-admin-kubeconfigLa salida podría tener este aspecto:
NAME AGE upg-task-org-1-mz-mz-location-upgrade-5n6wp 2d19hSi el error indica que hay un error de RBAC al buscar una cuenta de servicio, comprueba si se ha desplegado un complemento anterior:
Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedCreate 38s (x11 over 5m41s) job-controller Error creating: pods "v1.13.0-mz-2837f80328-upg-task-root-mz-mz-location-jkv69-" is forbidden: error looking up service account gpc-system/upgrade-task-mz-sa-v1.13.0-mz-2837f80328: serviceaccount "upgrade-task-mz-sa-v1.13.0-mz-2837f80328" not found
Solución alternativa:
Comprueba si se ha implementado un complemento anterior:
Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedCreate 4m30s (x101 over 99m) job-controller Error creating: pods "v1.13.0-os-2837f80328-upg-task-root-os-node-upgrad-fdblm-" is forbidden: error looking up service account gpc-system/upgrade-task-os-sa-v1.13.0-os-2837f80328: serviceaccount "upgrade-task-os-sa-v1.13.0-os-2837f80328" not foundcount gpc-system/upgrade-task-mz-sa-v1.13.0-mz-2837f80328: serviceaccount "upgrade-task-mz-sa-v1.13.0-mz-2837f80328" not foundObtén los complementos anteriores que existen para el mismo componente,
upgrade-task-mzpara la tarea:kubectl get addons -n gpc-system | grep upgrade-task upgrade-task-mz-lsqzc true true v1.13.0-mz-7cf810d7a5Eliminar este complemento:
kubectl delete addon -n gpc-system upgrade-task-mz-lsqzc upgrade-task-os-px5wj addon.addon.private.gdc.goog "upgrade-task-mz-lsqzc" deletedDespués de eliminar el complemento, también debe eliminar el
upgradetaskrequesto elupgradecheckrequestcorrespondiente. Se volverá a crear.kubectl delete upgradetaskrequest -n gpc-system upgrade-task-mz-lsqzcSigue monitorizando el
upgradetaskrequesto elupgradecheckrequestque acabas de crear, o la tarea correspondiente, directamente.
No se puede cambiar a un plan superior en shared-service-cluster upgrade
Versiones: 1.13.3
Síntomas: la actualización de Anthos en Bare Metal se bloquea en una o varias máquinas Bare Metal. Todas las demás máquinas físicas se han actualizado correctamente o aún no han empezado la actualización. Una máquina física está en modo de mantenimiento, pero sigue mostrando la versión anterior en los campos VERSIÓN ABM actual y VERSIÓN ABM DESEADA.
Sigue los pasos de Anthos Bare Metal para obtener el baremetalmachine estado y los detalles del clúster:
kubectl get baremetalmachines -n "${CLUSTER_NAMESPACE}" --kubeconfig=${ADMIN_KUBECONFIG}
Resultado esperado:
NAME CLUSTER READY INSTANCEID MACHINE ABM VERSION DESIRED ABM VERSION
192.0.2.0 g-org-1-shared-service true baremetal://192.0.2.0 192.0.2.0 1.29.300-gke.185 1.29.300-gke.185
192.0.2.18 g-org-1-shared-service true baremetal://192.0.2.18 192.0.2.18 1.29.300-gke.185 1.29.300-gke.185
192.0.2.19 g-org-1-shared-service true baremetal://192.0.2.19 192.0.2.19 1.29.300-gke.185 1.29.300-gke.185
192.0.2.10 g-org-1-shared-service true baremetal://192.0.2.10 192.0.2.10 1.29.300-gke.185 1.29.300-gke.185
192.0.2.22 g-org-1-shared-service true baremetal://192.0.2.22 192.0.2.22 1.29.300-gke.185 1.29.300-gke.185
192.0.2.9 g-org-1-shared-service true baremetal://192.0.2.9 192.0.2.9 1.29.0-gke.1449 1.29.0-gke.1449
kubectl get baremetalmachines -n "${CLUSTER_NAMESPACE}" --kubeconfig=${ADMIN_KUBECONFIG} ${MACHINE_IP} -o json | jq '.status.underMaintenance'
Resultado esperado:
true
Solución alternativa:
Saca la máquina de inventario del modo de mantenimiento:
export InventoryMachineName=$(kubectl --kubeconfig=${ADMIN_KUBECONFIG} get inventorymachines -A -o json | jq '.items[] | select(.spec.address=="${MACHINE_IP}") | .metadata.name') kubectl --kubeconfig "${ADMIN_KUBECONFIG:?}" patch inventorymachine/${InventoryMachineName:?} --type=merge -p '{"spec": {"maintenance": false}}'Espera a que la máquina de inventario salga del modo de mantenimiento. Este proceso puede durar hasta 10 minutos.
kubectl --kubeconfig "${ADMIN_KUBECONFIG:?}" wait inventorymachine/${InventoryMachineName} --for=jsonpath=.status.maintenance=true --timeout=600sMonitoriza las máquinas Bare Metal para comprobar que la máquina ve la actualización de la versión de ABM seleccionada.
kubectl get baremetalmachines -n "${CLUSTER_NAMESPACE}" --kubeconfig=${ADMIN_KUBECONFIG}
No se ha podido instalar el complemento system-dashboards
Versiones: 1.13.5
Síntomas: la actualización de la versión 1.12.4 a la 1.13.5 falla en la actualización del complemento system-dashboards:
│ Status: │
│ Conditions: │
│ Last Transition Time: 2024-10-22T00:34:54Z │
│ Message: Error occurred during addon installation: failed to rollback chart: no ConfigMap with the name "cluster-etcd-platform-obs" found │
│ Observed Generation: 2 │
│ Reason: InstallationError │
│ Status: False
Solución alternativa: Sigue los pasos que se indican en el runbook OCLCM-R0122.
NodeUpgradeTask CR se queda bloqueado en la condición NodeOSInPlaceUpgradePostProcessingCompleted
Versiones: 1.13.5
Síntomas: durante la actualización a la versión 1.13.5, el NodeUpgradeTask CR se queda bloqueado en la condición NodeOSInPlaceUpgradePostProcessingCompleted.
Comprueba si el os-artifact-collectortrabajo correspondiente se ha completado. Si el trabajo se queda bloqueado durante muchas horas, se muestra el siguiente mensaje:
root@gpc-adhoc-7e017e71vm-bootstrapper-zone1:~# kag logs os-artifact-collector-bm-45942837-p8hrk-z56gh
I1020 22:06:11.844634 1 main.go:30] BuildDate: 2024-10-19T16:54:08Z
I1020 22:06:11.844695 1 main.go:31] Version: 0.0.0-gdch.1.v3f2043
Solución alternativa:
- Elimina el trabajo o el pod para forzar un nuevo intento.
La distribución de imágenes falla durante una actualización
Versiones: 1.13.5
Síntomas: la distribución de imágenes falla durante una actualización de la versión 1.12.4 a la 1.13.x:
Error: error uploading the VM image to object storage: failed to upload to object storage: BadRequest: Bad Request
status code: 400, request id: , host id:
F1018 02:04:46.191627 1 main.go:88] VM Image Distributor quit: error uploading the VM image to object storage: failed to upload to object storage: BadRequest: Bad Request
status code: 400, request id: , host id:
goroutine 1 [running]:
Comprueba los pods de obj-proxy en gpc-system de la organización para ver si se produce un error en la verificación del certificado:
E1021 19:10:31.710076 1 token_source.go:185] Unable to rotate token: failed to initialize aisClient: failed to initialise AIS client: failed to obtain login config from the provided path "https://console.org-1.zone1.google.gdch.test/.well-known/login-config" with error: unable to parse centralized login config file: unsuccessful get request to config URL (https://console.org-1.zone1.google.gdch.test/.well-known/login-config) with error: Get "https://console.org-1.zone1.google.gdch.test/.well-known/login-config": tls: failed to verify certificate: x509: certificate signed by unknown authority
Solución alternativa:
Reinicia el pod obj-proxy con
KUBECONFIGde la organización en la que se produce el error:export KUBECONFIG=<ORG_KUBECONFIG> kubectl delete pods -n gpc-system -l name=obj-proxy-managerConsulta los registros de obj-proxy:
kubectl get pods -n gpc-system | grep obj-proxyEl resultado esperado es el siguiente:
obj-proxy-gdgzp 1/1 Running 0 5d1h obj-proxy-nhnsm 1/1 Running 0 5d1h obj-proxy-wrxlq 1/1 Running 0 5d1hConsulta los registros de los pods disponibles. Por ejemplo:
kubectl logs obj-proxy-gdgzp -n gpc-systemLas tareas de distribución de imágenes deberían completarse después de aplicar la solución alternativa.
El nodo falla durante la actualización del clúster de usuarios
Versiones: 1.13.3
Síntomas: un trabajo que se ejecuta en un nodo falla durante la actualización del clúster de usuario y muestra un mensaje de error como este:
Reason: mkdir: cannot create directory '/root/.ansible/tmp/ansible-tmp-1727810181.4584012-29-114086005628321': No space left on device
Inicia sesión en el nodo y comprueba si la partición está llena:
df -h /La salida podría tener este aspecto:
Filesystem Size Used Avail Use% Mounted on /dev/mapper/rocky-rl--root 31G 31G 120K 100% /Comprueba si
/etc/kubernetes/tmpestá usando una gran cantidad de espacio:du -s /etc/kubernetes/tmp. Este problema se produce cuando Kubernetes crea más copias de seguridad de lo habitual.
Solución alternativa:
Borra todas las copias de seguridad de
rm -f /etc/kubernetes/tmp/*:df -h /La salida podría tener este aspecto:
Filesystem Size Used Avail Use% Mounted on /dev/m
Se está volviendo a crear la actualización del administrador raíz y se produce un error en las comprobaciones preparatorias
Versiones: 1.13.3, 1.13.4, 1.13.5, 1.13.6, 1.13.7, 1.13.8 y 1.13.9
Síntoma: la actualización de la organización raíz falla en la comprobación previa. Por ejemplo:
│ Preflight Check: │
│ Conditions: │
│ Last Transition Time: 2024-10-28T14:17:31Z │
│ Message: [the result has status: False, reason: PreflightCheckFailed, and err: check "ASMStable" of operable component "ASM" failed with reason "BackoffLi │
│ mitExceeded", please check logs in pods: [gpc-system/upgrade-managed-check-asmstable-4dw66-cld74, gpc-system/upgrade-managed-check-asmstable-4dw66-k8xk5, gpc-system/upgrade-m │
│ anaged-check-asmstable-4dw66-wtc6q, gpc-system/upgrade-managed-check-asmstable-4dw66-l9b6v, gpc-system/upgrade-managed-check-asmstable-4dw66-nf62h, gpc-system/upgrade-managed │
│ -check-asmstable-4dw66-6m7p2, gpc-system/upgrade-managed-check-asmstable-4dw66-4mqmb], the result has status: Unknown, reason: UpgradeCheckJobsInProgress, and err: upgrade ch │
│ eck jobs in progress for Operable Components: haas,bil] │
│ Observed Generation: 2 │
│ Reason: PreflightCheckFailed │
│ Status: False │
│ Type: Succeeded │
│ Start Time: 2024-10-28T14:46:42Z
El clúster root-admin y el kubeapiserver de root-admin se han actualizado a la versión de abm elegida.
Ejemplo:
export KUBECONFIG=<path to root admin kubeconfig>
kubectl describe kubeapiserver root-admin -n root
kubectl get cluster root-admin -n root
Ejemplo de salida de kubectl describe kubeapiserver root-admin -n root:
Name: root-admin
Namespace: root
Labels: lcm.private.gdc.goog/cluster-type=root-admin
lcm.private.gdc.goog/cluster-version=1.29.600-gke.108
lcm.private.gdc.goog/component-version=v1.13.0-oclcm-f4c190e0f2
Ejemplo de salida de kubectl get cluster root-admin -n root:
NAME ABM VERSION DESIRED ABM VERSION CLUSTER STATE
root-admin 1.29.600-gke.108 1.29.600-gke.108 Running
Solución
Aplica el salto de comprobación previa para continuar con la actualización:
export KUBECONFIG=<path to root admin kubeconfig>
kubectl delete organizationupgrade root -n gpc-system && kubectl annotate -n gpc-system organization root upgrade.private.gdc.goog/skip-preflight-check=ok
kubectl delete organizationupgrade root -n gpc-system
Los espacios de nombres platform-obs-obs-system o platform-obs se quedan en el estado de finalización
Versiones: 1.13.5
Síntomas: los complementos no se pueden implementar durante la actualización o el arranque y muestran un mensaje de error como este:
export KUBECONFIG=ROOT_ADMIN
kubectl get addon -n org-1 system-alerts system-dashboards
Se muestra el siguiente resultado:
NAME DEPLOYED READY VERSION
system-alerts
system-dashboards false false 1.12.4-gdch.96
Si los estados DEPLOYED o READY muestran false o están en blanco, comprueba si hay errores en los complementos correspondientes. Por ejemplo:
export KUBECONFIG=ROOT_ADMIN
kubectl describe addon -n org-1 system-alerts
Se muestra el siguiente resultado:
...
... unable to create new content in namespace platform-obs-obs-system because it is being terminated
...
El complemento se ha bloqueado porque ha intentado crear contenido en los espacios de nombres que se están eliminando. Este bloqueo persiste, ya que la eliminación del espacio de nombres también está bloqueada.
Solución alternativa:
Antes de iniciar una actualización, anota los proyectos para evitar que se eliminen:
export KUBECONFIG=ORG_ADMIN kubectl annotate project -n gpc-system platform-obs helm.sh/resource-policy="keep"Se muestra el siguiente resultado:
project.resourcemanager.gdc.goog/platform-obs annotated kubectl annotate project -n gpc-system platform-obs-obs-system helm.sh/resource-policy="keep" project.resourcemanager.gdc.goog/platform-obs-obs-system annotatedSi el entorno ya presenta los síntomas descritos anteriormente, sigue esta solución alternativa:
La eliminación del espacio de nombres se ha bloqueado debido a recursos con finalizadores. Para continuar con la eliminación, quita los finalizadores con la secuencia de comandos proporcionada:
export KUBECONFIG=ORG_ADMIN function rm_finalizer() { export TYPE=$1 export NS=$2 RESOURCES=$(kubectl get $TYPE -n $NS --no-headers -o custom-columns=":metadata.name") for rc in $RESOURCES; do kubectl patch $TYPE $rc -n $NS \ --type json \ --patch '{"metadata":{"finalizers":[]}}' --type=merge done } rm_finalizer "monitoringrule" "platform-obs-obs-system" rm_finalizer "monitoringrule" "platform-obs" rm_finalizer "loggingrule" "platform-obs" ``` Note: Use a bash terminal (default on bootstrappers) to run the script.Espera a que se elimine el recurso. Después de ejecutar la secuencia de comandos, elimina los recursos y los espacios de nombres que terminan. Es posible que tengas que volver a ejecutar la secuencia de comandos si el espacio de nombres sigue en el estado de finalización. Una vez finalizado, el espacio de nombres se volverá a crear automáticamente. Verifica que los espacios de nombres se hayan recreado y estén en estado ACTIVE:
export KUBECONFIG=ORG_ADMIN kubectl get namespace platform-obs platform-obs-obs-systemSe muestra el siguiente resultado:
NAME STATUS AGE platform-obs Active 45s platform-obs-obs-system Active 49sCon los espacios de nombres activos, los complementos que se habían quedado bloqueados deberían implementarse en unos minutos. Verifica que los estados DEPLOYED y READY ahora sean true:
export KUBECONFIG=ROOT_ADMIN kubectl get addon -n org-1 system-alerts system-dashboardsSe muestra el siguiente resultado:
NAME DEPLOYED READY VERSION system-alerts true true 1.14.0-gdch.143998 system-dashboards true true 1.14.0-gdch.143998
UPORC entra en bucles de fallos en el clúster de KIND durante el arranque
Versiones: 1.13.x
Síntomas: la implementación uporc-root-backend-controller en el espacio de nombres
uporc-system se bloquea en bucle en el clúster de KIND.
Solución alternativa:
Comprueba si los objetos
ComponentGroupReleaseMetadatayReleaseMetadatacoinciden:export KUBECONFIG=KIND kubectl get componentgroupreleasemetadata kubectl get releasemetadataSi los objetos coinciden, no es necesario aplicar ninguna solución alternativa.
Si los objetos no coinciden, ponte en contacto con el equipo de UPORC para obtener ayuda, ya que esto puede indicar otros problemas subyacentes.
No se ha podido actualizar el nodo
Versiones: 1.13.6
Síntomas: no se ha podido actualizar el nodo en NodeOSInPlaceUpgradeCompleted.
- Consulta los registros de los trabajos de
os-upgradeospolicy. - Si el registro incluye un error que sugiere que el archivo de configuración está dañado, accede al nodo y comprueba el contenido del archivo manualmente para ver si está dañado. En el error del registro puede aparecer el código de error
configparser.DuplicateOptionErrory el archivo/etc/yum.repos.d/gdch.repo.
Solución: Solo si has confirmado que el archivo está dañado, elimina manualmente el archivo /etc/yum.repos.d/gdch.repo dañado en el nodo que no funciona.
El trabajo de Ansible para la actualización vuelve a generar el archivo automáticamente como parte del playbook de Ansible.
### NodeUpgradeTask La respuesta predefinida se queda atascada en la condición NodeOSInPlaceUpgradePostProcessingCompleted
Versiones: 1.13.5
Síntomas: durante la actualización a la versión 1.13.5, el NodeUpgradeTask CR se queda bloqueado en la condición NodeOSInPlaceUpgradePostProcessingCompleted.
Comprueba si el os-artifact-collectortrabajo correspondiente se ha completado. Si el trabajo se queda bloqueado durante muchas horas, se muestra el siguiente mensaje:
root@gpc-adhoc-7e017e71vm-bootstrapper-zone1:~# kag logs os-artifact-collector-bm-45942837-p8hrk-z56gh
I1020 22:06:11.844634 1 main.go:30] BuildDate: 2024-10-19T16:54:08Z
I1020 22:06:11.844695 1 main.go:31] Version: 0.0.0-gdch.1.v3f2043
Solución alternativa:
- Elimina el trabajo o el pod para forzar un nuevo intento.
NodeUpgradeTask CR se queda bloqueado en la condición NodeBIOSFirmwareUpgradeCompleted
Versiones: 1.13.5
Síntomas: durante la actualización a la versión 1.13.5, el NodeUpgradeTask CR se queda bloqueado en la condición NodeBIOSFirmwareUpgradeCompleted.
Comprueba si la condición NodeBIOSFirmwareUpgradeCompleted correspondiente está atascada y se muestra la siguiente condición:
{
"lastTransitionTime": "2024-12-03T04:03:37Z",
"message": "",
"observedGeneration": 1,
"reason": "InProgress",
"status": "False",
"type": "NodeBIOSFirmwareUpgradeCompleted"
}
Solución alternativa:
- En el
NodeUpgradeCR, edita manualmente"U30 v3.20 (05/29/2024)"y cámbialo por"U30 v3.20 (05/27/2024)".
La actualización del clúster está bloqueada porque un nodo no ha podido entrar en el modo de mantenimiento
Versiones: 1.13.5, 1.13.6 y 1.13.7
Síntomas: la actualización del clúster (administrador de la organización, sistema o usuario) se bloquea porque un nodo no puede entrar en el modo de mantenimiento.
El clúster muestra que MaintenanceMode tiene el valor true, pero Status se queda en false al ejecutar lo siguiente:
kubectl get baremetalmachines -A -o custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,MaintenanceMode:.spec.maintenanceMode,Status:.status.underMaintenace
Se muestra el siguiente resultado:
NAMESPACE NAME MaintenanceMode Status
user-vm-1-cluster 10.8.4.22 true false
user-vm-1-cluster 10.8.4.23 false false
user-vm-1-cluster 10.8.4.24 false false
user-vm-1-cluster 172.20.128.13 false false
user-vm-1-cluster 172.20.128.14 false false
user-vm-1-cluster 172.20.128.15 false false
Solución alternativa:
Asigna el valor KUBECONFIG al archivo kubeconfig del clúster que contiene el nodo que no se va a drenar. El clúster puede ser el clúster de usuario o un clúster de servicios compartidos.
for VM in $(kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints --no-headers | grep "baremetal.cluster.gke.io/maintenance" | awk '{print $1}'); do
for i in {1..50}; do
kubectl delete po -n kube-system $(kubectl get po -A -o wide | grep ang | grep -e $VM| awk '{print $2}');
done
done
Tiempo de espera persistente durante la raíz inicial organizationupgrade
Versiones: 1.13.3
Síntomas: Si la anotación de ignorar la ventana de mantenimiento está presente durante una actualización de la organización, el CR de organizationupgrade se parchea repetidamente, lo que restablece el progreso.
Solución:
Pausa el subcomponente rm-org y reduce las réplicas de rm-org-backend-controller.
Si el alias no se ha declarado, ejecuta lo siguiente:
alias ka="kubectl --kubeconfig=/root/release/root-admin/root-admin-kubeconfig"Pausa el subcomponente y reduce la escala de la implementación de
rm-org:kubectl --kubeconfigROOT_ADMIN_KUBECONFIG annotate subcomponent -n root rm-org lcm.private.gdc.goog/paused=true kubectl --kubeconfigROOT_ADMIN_KUBECONFIG scale deploy -n gpc-system rm-org-backend-controller --replicas=0Una vez que se haya completado la actualización del clúster, reduce la escala de la implementación:
kubectl --kubeconfigROOT_ADMIN_KUBECONFIG scale deploy -n gpc-system rm-org-backend-controller --replicas=1
El subcomponente obj-syslog-server no se reconcilia en la organización raíz
Versiones: 1.13.3, 1.13.4, 1.13.5 y 1.13.6
Síntomas: durante la actualización a la versión 1.13.x, se detecta que el subcomponente obj-syslog-server está en estado ReconciliationError:
root obj-syslog-server ReconciliationError
con una condición similar a la siguiente:
Sub-Component: obj-syslog-server - Reconciliation error: E0100 - deploy: failed to install chart: release obj-syslog-server-backend failed, and has been uninstalled due to atomic being set: context deadline exceeded
Last Transition Time: 2024-09-17T21:49:25Z
Message: E0100 - deploy: failed to install chart: release obj-syslog-server-backend failed, and has been uninstalled due to atomic being set: context deadline exceeded
Observed Generation: 1
ReconciliationError
Status:True
Type: Reconciling
Last Transition Time: 2024-09-17T21:49:23Z
Message: E0100 - deploy: failed to install chart: release obj-syslog-server-backend failed, and has been uninstalled due to atomic being set: context deadline exceeded
Observed Generation: 1
Reason: DeployError
Status: False
Type: Deployed
Es posible que veas que el pod syslog-server-abcdefg-wxyz está en estado CrashLoopBackOff con el siguiente error:
containerID: containerd://65d460176a1dcae412af698fa02fa5ffb0c5f0ef9bf0d0e2111ef88845630827
exitCode: 128
finishedAt: "2024-09-18T19:14:45Z"
message: 'failed to create containerd task: failed to create shim task: OCI
runtime create failed: runc create failed: unable to start container process:
error during container init: error mounting "/var/lib/kubelet/pods/637cf395-e597-446d-9949-1371cca88970/volume-subpaths/observability-ca/syslog-server/2"
to rootfs at "/etc/ssl/certs/obs-ca-cert.pem": mount /var/lib/kubelet/pods/637cf395-e597-446d-9949-1371cca88970/volume-subpaths/observability-ca/syslog-server/2:/etc/ssl/certs/obs-ca-cert.pem
(via /proc/self/fd/6), flags: 0x5001: not a directory: unknown'
reason: StartError
startedAt: "1970-01-01T00:00:00Z"
Solución alternativa:
Para que el subcomponente vuelva a estar en buen estado, elimina el volumeMounts innecesario.
Edita el despliegue actual:
export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfigkubectl edit deployments syslog-server -n istio-systemElimina los
volumeMountsque no sean necesarios en elspec.containers.volumeMounts. Elimina las siguientes rutas de montaje:- mountPath: /etc/ssl/certs/obs-ca-cert.pem name: observability-ca readOnly: true1. subPath: ca.crt - mountPath: /etc/ssl/certs/obj-ca-cert.pem name: obj-ca readOnly: true subPath: ca.crtAplica los cambios y el subcomponente volverá a
ReconciliationCompletedcuando se hayan aplicado.
La actualización de ABM o de nodos se queda atascada en maintenanceMode false
Versiones: 1.13.4
Síntomas: El nodo se queda bloqueado en la actualización del clúster de Anthos Bare Metal y no entra en modo de mantenimiento.
Comprueba el elemento BareMetalMachine en un nodo de clúster de servicio. Por ejemplo:
kubectl get baremetalmachine -n g-org-1-shared-service-cluster 192.0.2.0 -o json | jq .spec.maintenanceMode
false
Solución:
Reinicia el anthos-cluster-operator para propagar el BMM.MaintenanceMode:
kubectl get baremetalmachine -n g-org-1-shared-service-cluster 192.0.2.0 -o json | jq .spec.maintenanceMode
true
Error al actualizar el complemento atat-webhooks de una organización de cliente
Versiones: 1.13.5
Síntomas: la actualización del complemento atat-webhooks no se puede recuperar:
org-1 atat-webhooks false false 1.13.4-gdch.5582
Es posible que veas un mensaje como este:
Status: │
│ Conditions: │
│ Last Transition Time: 2024-10-30T17:57:06Z │
│ Message: Error occurred during addon installation: failed to generate parameters for AddOn[atat-webhooks]: failed to generate runtime parameters: parameter job not ready yet │
│ Observed Generation: 4 │
│ Reason: InstallationError │
│ Status: False │
│ Type: Deployed │
│ Last Transition Time: 2024-10-30T17:56:36Z │
│ Message: Reconciliation error
Comprobar los pods de atat-webhooks-parameters-*****:
kubectl logs -n org-1 atat-webhooks-parameters-***** --kubeconfig ROOT_ADMIN_KUBECONFIG
Es posible que veas un error como este:
E1030 22:04:33.242244 7 main.go:39] failed to generate parameter for AddOn [atat-webhooks], error: ATAT0003: Organization.resourcemanager.private.gdc.goog "org-1" is invalid: metadata.labels[atat.config.google.com/task-order-number]: Invalid value: "TO1234": The current date 2024-10-30 is not within the valid range of this TaskOrder: 2024-06-30 - 2024-10-30.
Solución:
Hacer una copia de la cartera actual:
export KUBECONFIG=ROOT_ADMIN_KUBECONFIGkubectl get portfolios -n atat-system portfolio-org-1 -oyaml > portfolio-org-1Cambiar la fecha de
portfolio-org-1 Pop End Datea una fecha futura:kubectl delete portfolios -n atat-system portfolio-org-1Si este comando deja de responder, elimina la condición
.Metadata.Finalizersde la cartera activa antes de eliminar la cartera. La condición podría tener este aspecto:│ portfolio.finalizers.atat.config.google.comVuelve a aplicar el archivo YAML copiado:
kubectl apply -f portfolio-org-1Vuelve a comprobar las fechas para asegurarte de que tanto las carteras como el mapa de configuración se hayan actualizado.
Si el trabajo no se recupera, elimina el trabajo
atat-webhooks-parametersque ha fallado y se recuperará. Espera a que se complete:kubectl delete jobs -n org-1 atat-webhooks-parameters
Se produce un error en la comprobación posterior al vuelo o en la comprobación de actualización debido a errores de DeadlineExceeded o BackoffLimitExceeded.
Versiones: 1.13.8
Síntomas:
Al actualizar de la versión 1.13.7 a la 1.13.8, las comprobaciones posteriores al vuelo siguen pendientes y muestran errores DeadlineExceeded o BackoffLimitExceeded.
Message:postflight check result: pending, [NodeHealth (OS) HarborClusterHealth (AR)] still running
Observed Generation: 3
Reason: ReconcileBackoff
Status: Unknown
Type: ManagedCheckSucceeded
Last Transition Time: 2025-02-13T02:11:41Z
Message: observed the following failure reasons: [ReconcileBackoff UpgradeCheckJobsInProgress]
Solución:
Identifica dónde fallan los trabajos:
Comprueba si los trabajos fallan durante las comprobaciones preparatorias o posteriores:
kubectl get jobs -A -l "upgrade.private.gdc.goog/use" -o json | jq '.items[] | select(.status.conditions | any(.reason == "BackoffLimitExceeded" or .reason == "DeadlineExceeded")) | {name: .metadata.name, namespace: .metadata.namespace, status: .status.conditions[].type, reason: .status.conditions[].reason}'Comprueba si los trabajos fallan durante la actualización:
kubectl get jobs -A -l "upgrade.private.gdc.goog/upgrade-check-owner" -o json | jq '.items[] | select(.status.conditions | any(.reason == "BackoffLimitExceeded" or .reason == "DeadlineExceeded")) | {name: .metadata.name, namespace: .metadata.namespace, status: .status.conditions[].type, reason: .status.conditions[].reason}'Elimina los trabajos:
kubectl delete jobs -n gpc-system CHECK_NAME
Las comprobaciones de actualización incluyen resultados irrelevantes para el nivel de comprobación
Versiones: 1.13.x
Síntomas:
Las comprobaciones de actualización de la organización pueden fallar debido a que se han incluido resultados incorrectos de otros niveles. Por ejemplo, las comprobaciones de la organización raíz pueden mostrar resultados de la organización de inquilino, o las comprobaciones de la organización de inquilino pueden mostrar resultados del clúster de usuarios.
Ejemplo de registros de errores de comprobaciones de la organización raíz:
kubectl logs -n gpc-system upgrade-check-postflight-haas-n2rk2-zv9rr --kubeconfig /root/release/root-admin/root-admin-kubeconfig
... {org-1 admin } failure ...
Solución:
Para omitir por completo las comprobaciones preparatorias o posteriores, usa lo siguiente:
Solicitud preparatoria:
kubectl delete organizationupgrade -n gpc-system ORG_NAME && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-preflight-check=ok
Después del tramo:
kubectl delete organizationupgrade -n gpc-system ORG_NAME && kubectl annotate -n gpc-system organization ORG_NAME upgrade.private.gdc.goog/skip-postflight-check=ok
Vertex AI
Las APIs preentrenadas muestran el estado Enabling en la interfaz de usuario
Versiones: 1.13.1
Síntomas: 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:
- Abre el menú de tu navegador Chrome (icono de tres puntos).
- Haz clic en Más herramientas > Herramientas para desarrolladores para abrir la consola.
- Haz clic en la pestaña Red de la consola.
- Busca las solicitudes de
ai-service-status. - Haz clic en la pestaña Respuesta de una solicitud
ai-service-statuspara ver el contenido de esa solicitud. - Comprueba que todo esté listo, excepto los componentes
MonitoringTargetyLoggingTarget.
La función de API preentrenada streaming_recognize de Speech-to-Text falla
Versiones: 1.13.3
Síntomas: Al llamar a la función de la API preentrenada streaming_recognize de Speech-to-Text, un problema con la biblioteca de cliente provoca un mensaje de error 400 similar al siguiente:
google.api_core.exceptions.InvalidArgument: 400 The header 'x-goog-user-project' should be set
Solución alternativa: usa la siguiente secuencia de comandos de Python para que funcione la función streaming_recognize:
import base64
from google.cloud import speech_v1p1beta1
from google.cloud.speech_v1p1beta1.services.speech import client
import google.auth
from google.auth.transport import requests
import requests as reqs
from google.api_core.client_options import ClientOptions
import os
audience= "https://ENDPOINT:443"
api_endpoint="ENDPOINT:443"
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "APPLICATION_DEFAULT_CREDENTIALS_FILENAME"
os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "CERT_NAME"
def get_client(creds):
opts = ClientOptions(api_endpoint=api_endpoint)
return client.SpeechClient(credentials=creds, client_options=opts)
def main():
creds = None
try:
creds, project_id = google.auth.default()
creds = creds.with_gdch_audience(audience)
sesh = reqs.Session()
sesh.verify = False
req = requests.Request(session=sesh)
creds.refresh(req)
except Exception as e:
print("Caught exception" + str(e))
raise e
return creds
def speech_func(creds):
tc = get_client(creds)
content="[ENCODED CONTENT STRING HERE]"
audio = speech_v1p1beta1.RecognitionAudio()
audio.content = base64.standard_b64decode(content)
config = speech_v1p1beta1.StreamingRecognitionConfig()
config.config.encoding= speech_v1p1beta1.RecognitionConfig.AudioEncoding.LINEAR16
config.config.sample_rate_hertz=16000
config.config.language_code="en-US"
config.config.audio_channel_count=1
request_config = speech_v1p1beta1.StreamingRecognizeRequest(
streaming_config = config,
)
request_audio = speech_v1p1beta1.StreamingRecognizeRequest(
audio_content = audio.content
)
requests = [request_config, request_audio]
def request_generator():
for request in requests:
yield request
metadata = (("x-goog-user-project", "projects/vtx-pretrained"),)
resp = tc.streaming_recognize(requests=request_generator(), metadata=metadata)
for response in resp:
print(response)
if __name__=="__main__":
creds = main()
speech_func(creds)
Haz los cambios siguientes:
ENDPOINT: el endpoint de Speech-to-Text. Para obtener más información, consulta los estados y los endpoints de los servicios.APPLICATION_DEFAULT_CREDENTIALS_FILENAME: el nombre del archivo JSON que contiene las claves de la cuenta de servicio que has creado en el proyecto, comomy-service-key.json.CERT_NAME: el nombre del archivo de certificado de la autoridad de certificación (CA), comoorg-1-trust-bundle-ca.cert. Para obtener más información, consulta Generar el archivo de certificado de CA del paquete de confianza en un entorno de desarrollo.
La secuencia de comandos de Python introduce las siguientes diferencias entre las funciones streaming_recognize y recognize para que funcione la solución alternativa de streaming_recognize:
- Línea 4: una instrucción
importadicional en comparación con la secuencia de comandosrecognize(from google.cloud.speech_v1p1beta1.services.speech import client). - Línea 18:
client.SpeechClient()devuelve el cliente en lugar despeech_v1p1beta1.SpeechClient().
No se pueden inicializar el pod y el servicio del frontend de traducción
Versiones: 1.11.x, 1.12.x y 1.13.x
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 del clúster del sistema ODS secret-store quede obsoleto y no esté sincronizado. Por este motivo, el pod y el servicio del frontend de traducción no se inicializan.
Solución:
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.
No se admite el sondeo del estado de los trabajos en la API batchTranslateDocument
Versiones: 1.13.3
Síntomas: Vertex AI no admite las operaciones GET y LIST en las APIs del servicio Translation. Al llamar a la API Translation BatchTranslateDocument, se devuelve una operación de larga duración similar a la del siguiente ejemplo:
{
"name": "projects/PROJECT_ID/operations/OPERATION_ID",
"metadata": {
"@type": "type.googleapis.com/google.cloud.translation.v3.BatchTranslateDocumentMetadata",
"state": "RUNNING"
}
}
Este problema se debe a una limitación de APIP (autorización) que te impide llamar al endpoint directamente. Los endpoints no admiten la comprobación del estado de los trabajos y no puedes realizar operaciones GET en la operación de larga duración debido a la limitación de la APIP.
Solución alternativa: Como operador de aplicaciones, revisa el estado del trabajo consultando tu carpeta s3_destination con regularidad y busca un archivo de salida de trabajo recién creado. Si la carpeta contiene el archivo de salida, significa que el trabajo se ha completado correctamente.
Las solicitudes de batchTranslateDocument pueden provocar problemas de rendimiento
Versiones: 1.13.3
Síntomas: El servicio de traducción de documentos por lotes lee uno o varios archivos introducidos por el usuario y escribe los archivos de salida temporales de procesamiento y traducción en StorageGRID. Se crea un nuevo cliente curl para cada acción de lectura y escritura porque no se puede reutilizar el cliente.
Los clientes de S3 curl del archivo binario son de un solo uso, lo que significa que cada cliente solo puede realizar una acción de lectura y escritura en los contenedores de StorageGRID. Por lo tanto, se crea un nuevo cliente curl cada vez que se establece la comunicación con el cliente de StorageGRID desde el servidor batchTranslateDocument para leer y escribir archivos en los contenedores.
Sin embargo, no es la opción más adecuada para los clientes de curl. Esto podría provocar los siguientes problemas:
- Rendimiento degradado: aumento de la latencia y disminución del rendimiento
- Agotamiento de recursos: sobrecarga de memoria y CPU, y agotamiento de sockets
- Sobrecarga del servidor: limitación de frecuencia o restricción
La consola de GDC muestra un estado incoherente después de habilitar las APIs preentrenadas
Versiones: 1.13.3
Síntomas: Cuando habilitas por primera vez las APIs preentrenadas, la consola de GDC puede mostrar un estado incoherente al cabo de unos minutos en el servicio que has habilitado. La consola de GDC cambia el estado Enabling a Disabled y vuelve a mostrar el botón Habilitar en la interfaz de usuario, aunque el servicio se esté habilitando.
Solución alternativa: el estado se vuelve coherente al cabo de unos minutos y el servicio refleja su estado correcto.
Para verificar el estado del servicio, abre la pestaña Red en la consola del navegador y comprueba el estado de la solicitud ai-service-status. La carga útil debe mostrar que el operador de nivel 2 está habilitado.
Las solicitudes de traducción con más de 250 caracteres fallan en los pods de translation-prediction-server
Versiones: 1.13.3
Síntomas: cuando envías solicitudes de traducción con aproximadamente 250 caracteres o más (incluidas las solicitudes de traducción de documentos), es posible que los pods translation-prediction-0 o translation-prediction-1 fallen, lo que requiere que se vuelva a cargar el modelo. La recarga del modelo se realiza automáticamente y este proceso puede tardar unos 30 minutos en completarse.
Este problema se debe a una limitación de los contenedores de traducción.
Solución alternativa: divide las solicitudes de traducción para que tengan menos de 250 caracteres. Un intervalo de entre 200 y 250 caracteres es adecuado para todos los idiomas. No es necesario hacer nada más para mitigar el problema si una solicitud larga falla en los pods.
GPUAllocation para el clúster de servicios compartidos no está configurado correctamente
Versiones: 1.13.3
Síntomas: No se pueden programar cargas de trabajo de Vertex AI debido a la falta de recursos de GPU suficientes. Por ejemplo, si no puedes ver o habilitar los endpoints de servicio de Vertex AI, puede deberse a que no tienes suficientes recursos de GPU.
Este problema de recursos puede deberse a que algunos de los recursos de GPUAllocation situados en el clúster de servicios compartidos no tienen la siguiente anotación:
processed: "true"
Solución:
Sigue las instrucciones de IAM-R0004 para generar el archivo kubeconfig de
g-ORG_NAME-shared-service-cluster.Lista todas las asignaciones de GPU del clúster de servicios que no tengan la anotación
processed: "true":kubectl get gpuallocations -A -n vm-system \ --kubeconfig SERVICE_CLUSTER_KUBECONFIG \ -o json | jq \ '.items[] | select(.metadata.annotations.processed == null ) | .metadata.name'El resultado debería ser similar al siguiente:
zi-ad-bm08En el recurso
GPUAllocationque no se ha asignado, ábrelo en un editor:kubectl edit gpuallocation -n vm-system NODE_NAMEEdita la asignación de GPU en función del número total de asignaciones de GPU presentes en el clúster de servicio:
Si solo hay un recurso personalizado de asignación de GPU, añádele la anotación
processed: "true"y modifica su especificación para que sea como la siguiente:annotations: processed: "true" spec: mig: allowNodeReboot: true count: 4 profiles: - mixed-5 - uniform-3g.40gb - uniform-3g.40gb - uniform-7g.80gb node: $node_name // unchanged pod: 0 vm: 0Si hay dos recursos personalizados de asignación de GPU, busca el que no tenga la anotación
processed: "true", añádele la anotaciónprocessed: "true"y modifica su especificación para que sea como la siguiente:annotations: processed: "true" spec: mig: allowNodeReboot: true count: 2 profiles: - mixed-5 - uniform-3g.40gb node: $node_name // unchanged pod: 0 vm: 0Si hay cuatro recursos personalizados de asignación de GPU, busca el que no tenga la anotación
processed: "true", añádele la anotaciónprocessed: "true"y modifica su especificación para que sea como la siguiente:annotations: processed: "true" spec: mig: allowNodeReboot: true count: 1 profiles: - mixed-5 node: $node_name // unchanged pod: 0 vm: 0
Guarda los cambios en el recurso personalizado
GPUAllocationy confirma que su estado de asignación se ha actualizado atrue:kubectl get gpuallocations -A --kubeconfig SERVICE_CLUSTER_KUBECONFIGEl resultado debería ser similar al siguiente:
NAMESPACE NAME ALLOCATED DEVICEMODEL vm-system zi-ad-bm08 true H100L 94GB vm-system zi-ad-bm09 true H100L 94GB
Al actualizar de la versión 1.9.x a la 1.13.3, el controlador OCLCM muestra errores
Versiones: 1.13.3
Síntomas: Al actualizar de la versión 1.9.x a la 1.13.3, es posible que el controlador de gestión del ciclo de vida de los componentes operativos (OCLCM) de los subcomponentes de Vertex AI muestre errores. Este problema se debe a un error en el trabajo del complemento ai_platform. Los errores que recibes durante la actualización indican que OCLCM no puede transferir la propiedad de estos componentes de Vertex AI.
Estos son los componentes de Vertex AI afectados en el clúster de administrador de la organización:
| Nombre | Espacio de nombres |
|---|---|
aip-l1operator-deployment |
ai-system |
aip-l2operator-deployment |
ai-system |
aip-web-plugin-frontend |
ai-system |
aip-web-plugin-backend |
ai-system |
aip-l1operator-sa |
ai-system |
aip-l2operator-sa |
ai-system |
aip-web-plugin-sa |
ai-system |
aip-l1operator-role |
N/A |
aip-l2operator-role |
N/A |
aip-web-plugin-role |
N/A |
aip-l1operator-rolebinding |
N/A |
aip-l2operator-rolebinding |
N/A |
aip-web-plugin-rolebinding |
N/A |
aip-l1operator-log |
ai-system |
aip-l2operator-log |
ai-system |
aip-web-plugin-frontend-log |
ai-system |
aip-web-plugin-backend-log |
ai-system |
log-rule-aipl-a004 |
platform-obs |
mon-rule-aipl-a0001 |
platform-obs |
mon-rule-aipl-a0003 |
platform-obs |
aip-l1operator-mon |
ai-system |
aip-l1operator-mon-cm |
ai-system |
aip-l2operator-mon |
ai-system |
aip-l2operator-mon-cm |
ai-system |
aip-l1operator-webhook-svc |
ai-system |
aip-web-plugin-frontend-svc |
ai-system |
aip-web-plugin-backend-svc |
ai-system |
aip-web-plugin-frontend-virtualsvc |
ai-system |
aip-web-plugin-backend-virtualsvc |
ai-system |
aip-l1operator-selfsigned-issuer |
ai-system |
aip-l1operator-serving-cert |
ai-system |
aip-l1operator-validating-webhook |
ai-system |
aip-l1operator-mutating-webhook |
ai-system |
Solución alternativa: Para solucionar este problema, debe quitar manualmente los componentes de Vertex AI afectados del clúster de administrador de la organización. A continuación, la nueva versión de Vertex AI basada en OCLCM los vuelve a instalar.
Elimina manualmente los componentes de Vertex AI afectados en el clúster de administrador de la organización:
kubectl --kubeconfig=ORG_ADMIN_CLUSTER_KUBECONFIG delete deployment -n NAMESPACE COMPONENT_NAME
Haz los cambios siguientes:
ORG_ADMIN_CLUSTER_KUBECONFIG: la ruta al archivo kubeconfig del clúster de administrador de la organización.NAMESPACE: el espacio de nombres del componente de Vertex AI que quieras quitar. Si el componente no tiene un espacio de nombres, quita-n NAMESPACEdel comando.COMPONENT_NAME: el nombre del componente de Vertex AI que quieres quitar.
En el siguiente ejemplo se muestra cómo quitar el componente aip-l1operator-deployment que se encuentra en el espacio de nombres ai-system del clúster de administrador de la organización:
kubectl --kubeconfig=ORG-ADMIN-CLUSTER-KUBECONFIG delete deployment -n ai-system aip-l1operator-deployment
Las solicitudes de traducción pueden generar el código de error RESOURCE_EXHAUSTED
Versiones: 1.13.3
Síntomas: después de enviar una solicitud de traducción, se obtiene el código de error RESOURCE_EXHAUSTED en el mensaje de respuesta. Este error se produce cuando superas un límite de frecuencia del sistema. Se ha agotado un recurso, como una cuota por usuario, el número máximo de consultas por segundo o el espacio de todo el sistema de archivos.
Solución alternativa: pide a tu operador de infraestructura que reinicie los fragmentos del backend del servicio de traducción. Después, vuelve a enviar las solicitudes de traducción con intervalos más largos entre ellas o enviando solicitudes más cortas.
batchTranslateDocument solicita que se devuelva un error 503
Versiones: 1.13.3
Síntomas: después de enviar una solicitud batchTranslateDocument, obtienes el código de error 503 "Batch Document translation is not implemented" en el mensaje de respuesta. Este error se produce porque el método BatchTranslateDocument requiere el servicio Aspose, que solo se implementa cuando el parámetro operable enableRAG se define como true en el clúster.
Solución alternativa: pide a tu operador de infraestructura que defina el parámetro enableRAG operable como true en el clúster de administrador de la organización siguiendo estos pasos:
Crea un recurso personalizado
SubcomponentOverrideen un archivo YAML llamadovai-translation.yamlcon el parámetro operableenableRAGdefinido comotrue:apiVersion: lcm.private.gdc.goog/v1 kind: SubcomponentOverride metadata: name: "vai-translation" namespace: ORG_ADMIN_NAMESPACE spec: subComponentRef: "vai-translation" backend: operableParameters: enableRAG: trueSustituye
ORG_ADMIN_NAMESPACEpor el espacio de nombres del clúster de administrador de la organización.Aplica el recurso personalizado
SubcomponentOverrideal clúster de administrador de la organización:kubectl --kubeconfig ORG_ADMIN_KUBECONFIG apply -f vai-translation.yamlSustituye
ORG_ADMIN_KUBECONFIGpor la ruta al archivo kubeconfig del clúster del administrador de la organización.
Servicios preentrenados de Vertex AI no disponibles
Versiones: 1.13.7 y 1.13.9
Síntomas: los servicios de OCR y traducción de Vertex AI no se inician debido a problemas de programación de Kubernetes. Es posible que veas una advertencia como esta en los registros:
Warning FailedScheduling 105s (x40 over 3h18m) default-scheduler 0/9 nodes are available: 1 Insufficient nvidia.com/mig-3g.40gb-NVIDIA_A100_80GB_PCIE, 1 node(s) had untolerated taint {serviceenvironment.private.gdc.goog/dbs-billing-
system-billing-dbcluster: }, 1 node(s) had untolerated taint {serviceenvironment.private.gdc.goog/dbs-g-vai-ocr-sie-g-vai-ocr-sie: }, 1 node(s) had untolerated taint {serviceenvironment.private.gdc.goog/dbs-g-vai-translation-sie-g-v-1gvg:
}, 3 Insufficient cpu, 3 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/9 nodes are available: 3 No preemption victims found for incoming pod, 6 Preemption is not helpful for scheduling.
Solución alternativa: Añade más nodos de trabajador al grupo predeterminado y expulsa los pods de los nodos de GPU para que se puedan programar las cargas de trabajo de IA.
Máquinas virtuales
Falla la importación de imágenes BYO para imágenes qcow2 y sin formato
Versiones: 1.13.1 y 1.13.3
Síntomas: Cuando se importan imágenes de máquinas virtuales locales mediante la CLI de gdcloud compute images import, el estado de la importación se queda 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 sin formato, 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.
Busca el
VirtualMachineImageImport:kubectl get virtualmachineimageimport $IMPORT_NAME -n $PROJECT -o yamlSi el objeto no está presente, vuelve a activar el comando
gdcloud compute images import .... Una vez que la salida de la consola pase deUploading image to ..aImage import has started for ..., pulsa Ctrl+C para que la imagen local se suba al almacenamiento de objetos y se conserve elVirtualMachineImageImportpara poder crear una nueva.Crea un nuevo
VirtualMachineImageImportcon unminimumDiskSizemá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
Falla el aprovisionamiento de un disco a partir de una imagen
Versiones: 1.13.1 y 1.13.3
Síntomas: al aprovisionar un disco a partir de una imagen personalizada, el minimumDiskSize
podría estar demasiado cerca del tamaño virtual, lo que provocaría que el aprovisionamiento del disco fallara.
El disco de la VM está en estado pendiente, pero nunca se aprovisiona.
Solución: crea un disco manualmente con un spec.minimumDiskSize más grande.
El complemento de dispositivo NVIDIA DaemonSet falla cuando un clúster tiene GPUs
Versiones: 1.13.3
Síntomas: el complemento de dispositivo NVIDIA DaemonSet falla y muestra el mensaje driver rpc error en los nodos del clúster con GPUs:
kubectl --kubeconfig KUBECONFIG describe pods -lgpu-device-plugin=nvidia -n vm-system
Sustituye KUBECONFIG por la ruta al archivo kubeconfig del clúster.
Obtendrá un resultado similar al siguiente ejemplo:
Warning Failed 23m (x4 over 25m) kubelet Error: failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error running hook #0: error running hook: exit status 1, stdout: , stderr: Auto-detected mode as 'legacy'
nvidia-container-cli: initialization error: driver rpc error: timed out: unknown
Este problema provoca que las GPUs no estén disponibles para las máquinas virtuales (VM) y los pods. Las implicaciones se basan en los siguientes tipos de clústeres:
- Clúster del sistema: no se crea el recurso personalizado
GPUAllocationpara ese nodo de hardware desnudo y las GPUs de ese nodo no se configuran en el modo de máquina virtual para que las consuman el clúster de servicio y el clúster de usuario. Consulta la solución alternativa para el clúster del sistema para resolver este problema. - Clúster de servicio o de usuario: no se crea el recurso personalizado
GPUAllocationpara ese nodo de VM y los pods del clúster no pueden consumir las GPUs de ese nodo. Consulta la solución alternativa para el servicio o el clúster de usuarios para resolver este problema.
Solución alternativa para el clúster del sistema:
Sigue estos pasos para solucionar el problema en el clúster del sistema:
Define la variable de entorno
KUBECONFIGcon la ruta al archivo kubeconfig del clúster del sistema. Para obtener más información, consulta el runbook IAM-R0004.Identifica el nodo que tiene el problema:
kubectl --kubeconfig $KUBECONFIG describe pods -lgpu-device-plugin=nvidia -n vm-system | grep -i Node:La salida debe mostrar el nombre del nodo y la dirección IP del nodo de Kubernetes.
Si hay varios nodos, sigue los pasos en todos ellos. En este caso, el resultado es similar al siguiente ejemplo:
Node: yy-ab-bm04/172.20.128.26Define la variable de entorno
NODE_NAMEcon el nombre del nodo. Por ejemplo:export NODE_NAME=yy-ab-bm04Establece una conexión SSH con el nodo. Para obtener más información, consulta el runbook PLATAUTH-G0001.
Verifica que el nodo tenga GPUs:
nvidia-smi -LLa salida debe mostrar las GPUs del nodo, como en el siguiente ejemplo:
GPU 0: NVIDIA H100 NVL (UUID: GPU-0f6179a7-71a8-c654-44f0-1542bddf2574) GPU 1: NVIDIA H100 NVL (UUID: GPU-4debf794-d8a5-74a2-e521-0c763288ea79) GPU 2: NVIDIA H100 NVL (UUID: GPU-5827b65a-3841-d877-fc17-881a2b71d416) GPU 3: NVIDIA H100 NVL (UUID: GPU-31448904-9ae2-c95a-1986-a56cce004f49)Habilita el modo de persistencia en las GPUs:
nvidia-smi -pm 1De esta forma, los controladores de NVIDIA siempre se cargan para que el complemento del dispositivo no se agote.
La salida debe tener el siguiente aspecto:
Enabled persistence mode for GPU 00000000:4E:00.0. Enabled persistence mode for GPU 00000000:62:00.0. Enabled persistence mode for GPU 00000000:C9:00.0. Enabled persistence mode for GPU 00000000:DE:00.0. All done.Cierra la sesión SSH:
exitComprueba que el complemento del dispositivo se esté ejecutando consultando el
DaemonSet:kubectl --kubeconfig $KUBECONFIG describe pods -lgpu-device-plugin=nvidia -n vm-systemVerifica que el recurso personalizado
GPUAllocationse haya creado y configurado en el modo de VM:kubectl --kubeconfig $KUEBCONFIG get gpuallocation -n vm-system $NODE_NAME -o yamlLa salida debe tener el siguiente aspecto:
apiVersion: gpu.cluster.gke.io/v1 kind: GPUAllocation metadata: annotations: processed: "true" creationTimestamp: "2024-08-21T07:03:18Z" generation: 2 name: yy-ab-bm04 namespace: vm-system resourceVersion: "12179728" uid: b840cb53-5b0b-45bf-ab26-66db98fd64a4 spec: node: yy-ab-bm04 pod: 0 vm: 4 status: allocated: true conditions: - lastTransitionTime: "2024-08-21T07:05:49Z" message: "" observedGeneration: 2 reason: AllocationFulfilled status: "True" type: AllocationStatus - lastTransitionTime: "2024-08-21T07:03:53Z" message: "" observedGeneration: 2 reason: DeviceStateUpdated status: "True" type: DeviceStateUpdated consumption: pod: 0/0 vm: 4/4 deviceModel: H100L 94GB
Solución alternativa para el servicio o el clúster de usuarios:
Sigue estos pasos para solucionar el problema en el servicio o el clúster:
Define la variable de entorno
KUBECONFIGcon la ruta al archivo kubeconfig en el clúster de servicio o de usuario. Para obtener más información, consulta el runbook IAM-R0004.Identifica el nodo que tiene el problema:
kubectl --kubeconfig $KUBECONFIG describe pods -lgpu-device-plugin=nvidia -n vm-system | grep -i Node:La salida debe mostrar el nombre del nodo y la dirección IP del nodo de Kubernetes.
Si hay varios nodos, sigue los pasos en todos ellos. En este caso, el resultado es similar al siguiente ejemplo:
Node: vm-948fa7f4/172.20.128.21Define la variable de entorno
NODE_NAMEcon el nombre del nodo. Por ejemplo:export NODE_NAME=vm-948fa7f4Establece una conexión SSH con el nodo. Para obtener más información, consulta el runbook PLATAUTH-G0001.
Verifica que el nodo tenga GPUs:
nvidia-smi -LLa salida debe mostrar las GPUs del nodo, como en el siguiente ejemplo:
GPU 0: NVIDIA H100 NVL (UUID: GPU-0f6179a7-71a8-c654-44f0-1542bddf2574) GPU 1: NVIDIA H100 NVL (UUID: GPU-4debf794-d8a5-74a2-e521-0c763288ea79)Habilita el modo de persistencia en las GPUs:
nvidia-smi -pm 1De esta forma, los controladores de NVIDIA siempre se cargan para que el complemento del dispositivo no se agote.
La salida debe tener el siguiente aspecto:
Enabled persistence mode for GPU 00000000:05:00.0. Enabled persistence mode for GPU 00000000:06:00.0. All done.Cierra la sesión SSH:
exitComprueba que el complemento del dispositivo se esté ejecutando consultando el
DaemonSet:kubectl --kubeconfig $KUBECONFIG describe pods -lgpu-device-plugin=nvidia -n vm-systemVerifica que el recurso personalizado
GPUAllocationse haya creado y configurado en el modo de VM:kubectl --kubeconfig $KUBECONFIG get gpuallocation -n vm-system $NODE_NAME -o yamlLa salida debe tener el siguiente aspecto:
apiVersion: gpu.cluster.gke.io/v1 kind: GPUAllocation metadata: annotations: processed: "true" creationTimestamp: "2024-08-21T07:03:18Z" generation: 2 name: vm-948fa7f4 namespace: vm-system resourceVersion: "12179728" uid: b840cb53-5b0b-45bf-ab26-66db98fd64a4 spec: node: vm-948fa7f4 pod: 2 vm: 0 status: allocated: true conditions: - lastTransitionTime: "2024-08-21T07:05:49Z" message: "" observedGeneration: 2 reason: AllocationFulfilled status: "True" type: AllocationStatus - lastTransitionTime: "2024-08-21T07:03:53Z" message: "" observedGeneration: 2 reason: DeviceStateUpdated status: "True" type: DeviceStateUpdated consumption: pod: 0/2 vm: 0/0 deviceModel: H100L 94GB
La VM del clúster del sistema no está lista
Versiones: 1.13.3
Síntomas: la VM del clúster del sistema no está lista. Es posible que veas un mensaje como este:
│ Conditions: │
│ Type Status LastHeartbeatTime LastTransitionTime Reason │
│ Message │
│ ---- ------ ----------------- ------------------ ------ │
│ ------- │
│ KubeletUnhealthy False Tue, 20 Aug 2024 02:10:42 +0000 Tue, 20 Aug 2024 02:10:37 +0000 KubeletIsHealthy │
│ kubelet on the node is functioning properly │
│ KernelDeadlock False Tue, 20 Aug 2024 02:10:42 +0000 Sun, 30 Jun 2024 16:53:33 +0000 KernelHasNoDeadlock │
│ kernel has no deadlock │
│ ReadonlyFilesystem False Tue, 20 Aug 2024 02:10:42 +0000 Sun, 30 Jun 2024 16:53:33 +0000 FilesystemIsNotReadOnly │
│ Filesystem is not read-only │
│ FrequentUnregisterNetDevice False Tue, 20 Aug 2024 02:10:42 +0000 Tue, 20 Aug 2024 02:10:40 +0000 NoFrequentUnregisterNetDevice │
│ node is functioning properly │
│ ContainerRuntimeUnhealthy False Tue, 20 Aug 2024 02:10:42 +0000 Tue, 20 Aug 2024 02:10:39 +0000 ContainerRuntimeIsHealthy │
│ Container runtime on the node is functioning properly │
│ FrequentKubeletRestart False Tue, 20 Aug 2024 02:10:42 +0000 Tue, 20 Aug 2024 02:10:41 +0000 NoFrequentKubeletRestart │
│ kubelet is functioning properly │
│ FrequentDockerRestart False Tue, 20 Aug 2024 02:10:42 +0000 Tue, 20 Aug 2024 02:10:40 +0000 NoFrequentDockerRestart │
│ docker is functioning properly │
│ FrequentContainerdRestart False Tue, 20 Aug 2024 02:10:42 +0000 Thu, 15 Aug 2024 01:44:23 +0000 NoFrequentContainerdRestart │
│ containerd is functioning properly │
│ MemoryPressure Unknown Tue, 20 Aug 2024 01:25:55 +0000 Tue, 20 Aug 2024 01:27:22 +0000 NodeStatusUnknown │
│ Kubelet stopped posting node status. │
│ DiskPressure Unknown Tue, 20 Aug 2024 01:25:55 +0000 Tue, 20 Aug 2024 01:27:22 +0000 NodeStatusUnknown │
│ Kubelet stopped posting node status. │
│ PIDPressure Unknown Tue, 20 Aug 2024 01:25:55 +0000 Tue, 20 Aug 2024 01:27:22 +0000 NodeStatusUnknown │
│ Kubelet stopped posting node status. │
│ Ready Unknown Tue, 20 Aug 2024 01:25:55 +0000 Tue, 20 Aug 2024 01:27:22 +0000 NodeStatusUnknown │
│ Kubelet stopped posting node status.
Solución:
- Busca el
VirtualMachineInstancey elimínalo. - Reinicia una VM.
No se ha encontrado el espacio de trabajo de los informes de volumen de datos
Versiones: 1.13.3 y 1.13.4
Síntomas: al crear un disco de VM, el volumen de datos se indica como creado correctamente:
gdch-vm-infra gdc-vm-disk-vm-ce34b8ea-disk Succeeded 100.0% 1 18h
Sin embargo, un pod de importación, como importer-gdc-vm-disk-vm-ce34b8ea-disk, puede fallar
en bucle con un mensaje como este:
E0823 16:14:15.920008 1 data-processor.go:251] scratch space required and none found
E0823 16:14:15.920017 1 importer.go:185] scratch space required and none found
Solución: Elimina el pod de importación después de confirmar que el estado del volumen de datos es Succeeded.
Las VMs de los proyectos con nombres de más de 45 caracteres permanecen en estado detenido
Versiones: 1.13.5
Síntomas: al crear una VM, esta permanece en el estado Stopped si el nombre del proyecto tiene más de 45 caracteres.
Solución alternativa: Crea un proyecto con un nombre de 45 caracteres como máximo.
Falta la asignación de GPU en el clúster de servicio
Versiones: 1.13.5
Síntomas: falta el GPUAllocation en el clúster de servicios compartidos de gpu-org. Es posible que veas un mensaje al obtener las asignaciones de GPU:
KUBECONFIG=/root/release/user/gpu-org-shared-service-kubeconfig kubectl get gpuallocations -A
La salida tiene este aspecto:
No resources found
Solución:
Añade un taint al nodo de GPU:
taints: - effect: NoExecute key: vmm.gdc.goog/gpu-node value: a3-highgpu-4gQuita el taint para permitir la programación del pod virt-launcher de la VM.
No se puede programar una VM de trabajador de clúster de servicio compartido
Versiones: 1.13.6
Síntomas: una VM de trabajador de Kubernetes no ha podido programarse debido a que no tiene suficientes recursos de CPU en el nodo designado, a pesar de que hay GPUs disponibles. Puede que veas un evento como este:
Warning FailedScheduling 33m (x29 over 92m) default-scheduler 0/9 nodes are available: 1 Insufficient memory, 3 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 5 Insufficient cpu, 5 Insufficient nvidia.com/gpu-vm-H100L_94GB. preemption: 0/
9 nodes are available: 3 Preemption is not helpful for scheduling, 6 No preemption victims found for incoming pod.
Solución:
- Detén manualmente las VMs que no sean de GPU para liberar recursos de CPU.
- Una vez que se haya programado la VM pendiente, inicia las VMs sin GPU.