Problèmes connus de Google Distributed Cloud sous air gap 1.12.x

Catégorie Version(s) identifiée(s) Problème et solution
Sauvegarde et restauration 1.12.1

La sauvegarde de volume ne résout pas les points de terminaison de stockage d'objets au niveau de l'organisation

Le cluster de stockage pour la sauvegarde de volumes utilise le serveur DNS externe au lieu du redirecteur, ce qui empêche la sauvegarde de volumes de résoudre les points de terminaison de stockage d'objets au niveau de l'organisation. Dans la version 1.12, le trafic de sauvegarde nécessite de nouvelles routes vers chaque organisation.

Solution :

Les IO doivent mettre à jour le cluster de stockage pour activer la résolution DNS au niveau de l'organisation et créer un itinéraire depuis les interfaces logiques (LIF) de réplication vers les points de terminaison de stockage d'objets dans chaque organisation. Copiez et collez les commandes suivantes à partir du programme d'amorçage.

  1. Définissez la variable d'environnement KUBECONFIG :
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Recherchez le cluster de stockage :
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. Recherchez le CIDR externe de l'instance :
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. Mettez à jour le cluster de stockage pour utiliser un redirecteur et avec un itinéraire vers le CIDR externe de l'instance :
    kubectl patch storagecluster "${storage_cluster}" -n gpc-system --type='json' -p='[{"op": "replace", "path": "/spec/additionalNetworks/0/destinationSubnets", "value": '"${instance_external_cidr}"'}, {"op": "replace", "path": "/spec/dnsConfig/serviceRef/name", "value": "gpc-coredns-forwarder-udp"}]'
  5. Redémarrez le contrôleur pour vous assurer que la modification est implémentée :
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Sauvegarde et restauration 1.12.1

Échec de la sauvegarde des itinéraires vers les organisations

Symptômes :

L'extraction de la passerelle Ingress de l'administrateur de l'organisation à partir des nœuds ONTAP échoue, car aucune route n'existe entre le sous-réseau de sauvegarde et les plans de contrôle de l'organisation.

Solution :

Les IO doivent mettre à jour le cluster de stockage pour activer la résolution DNS au niveau de l'organisation et créer un itinéraire depuis les interfaces logiques (LIF) de réplication vers les points de terminaison de stockage d'objets dans chaque organisation. Copiez et collez les commandes suivantes à partir du programme d'amorçage.

  1. Définissez la variable d'environnement KUBECONFIG :
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Recherchez le cluster de stockage :
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. Recherchez le CIDR externe de l'instance :
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. Mettez à jour le cluster de stockage pour utiliser un redirecteur et avec un itinéraire vers le CIDR externe de l'instance :
    kubectl patch storagecluster "${storage_cluster}" -n gpc-system --type='json' -p='[{"op": "replace", "path": "/spec/additionalNetworks/0/destinationSubnets", "value": '"${instance_external_cidr}"'}, {"op": "replace", "path": "/spec/dnsConfig/serviceRef/name", "value": "gpc-coredns-forwarder-udp"}]'
  5. Redémarrez le contrôleur pour vous assurer que la modification est implémentée :
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Sauvegarde et restauration 1.12.4

Les volumes persistants sauvegardés ne peuvent pas être supprimés.

Symptômes :

Un volume persistant ne peut pas être supprimé s'il est associé à une relation SnapMirror.

Solution :

Une opération d'E/S supprime les relations SnapMirror avec le volume en tant que destination.

  1. Définissez la variable d'environnement KUBECONFIG :
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Stockez le nom du volume persistant problématique dans une variable :
    PV_NAME={ PV_NAME }
  3. Obtenez le nom du volume interne :
    volume_name=$(kubectl get pv ${PV_NAME?} -o jsonpath='{.spec.csi.volumeAttributes.internalName}')
  4. Accédez à ONTAP en suivant les étapes du runbook FILE-A0006.
  5. Supprimez les relations avec ce volume comme source, en utilisant le mot de passe collecté précédemment :
    ssh ${username?}@${mgmt_ip?} snapmirror delete -source-volume ${volume_name?} -destination-path "*"
    # enter the password collected from the breakglass secret
Sauvegarde et restauration 1.12.0
1.12.1
1.12.2

Le dépôt de sauvegarde est en bon état

Si le dépôt de sauvegarde ne présente aucun état d'erreur, mais qu'une alerte est déclenchée, il est possible que la métrique d'alerte pour le dépôt soit déclenchée par erreur. Il s'agit d'un problème connu dans la version 1.12.0, qui a été résolu dans la version 1.12.4. Ce problème est dû au fait que le dépôt de sauvegarde tente périodiquement de se connecter au stockage d'objets pour effectuer une vérification de l'état'état et passe à l'état "Non opérationnel" en cas d'échec de la connexion. Toutefois, si le dépôt de sauvegarde est récupéré, la métrique indiquant son état ne repassera pas correctement à l'état précédent, ce qui entraînera le blocage de l'alerte dans un état de déclenchement indéfini. Pour résoudre ce problème, vous pouvez supprimer et recréer manuellement le dépôt de sauvegarde afin de réinitialiser sa métrique d'état. Suivez la procédure du runbook BACK-R0003 pour recréer le dépôt de sauvegarde.

Facturation 1.12.4

Échec du sous-composant bil-storage-system-cluster - Reconciliation error: E0121

Symptômes :

Message d'erreur : bil-storage-system-cluster - Reconciliation error: E0121- rollback chart: no Job with the name "billing-storage-system-init-job-628" found

Le sous-composant bil-storage-system-cluster ne parvient pas à effectuer la réconciliation en raison de tâches obsolètes. billing-storage-system-init-job-628 et billing-storage-system-init-job-629 restent après une exécution réussie.

Solution :

Procédez comme suit :

  1. Sauvegardez les jobs de facturation obsolètes :
    cd /root/USERNAME
    kubectl --kubeconfig /root/release/gdchservices/gdchservices-system-kubeconfig get jobs billing-storage-system-init-job-628 -n billing-system -o yaml > billing-storage-system-init-job-628.yaml
    kubectl --kubeconfig /root/release/gdchservices/gdchservices-system-kubeconfig get jobs billing-storage-system-init-job-629 -n billing-system -o yaml > billing-storage-system-init-job-629.yaml
  2. Mettez le sous-composant en pause :
    export SUBCOMPONENT_NAME=bil-storage-system-cluster
    export SUBCOMPONENT_NAMESPACE=gdchservices-system-cluster
    
    kubectl annotate subcomponent "${SUBCOMPONENT_NAME:?}" -n "${SUBCOMPONENT_NAMESPACE:?}" lcm.private.gdc.goog/paused=true
  3. Supprimez les jobs obsolètes.
  4. Redémarrez oclcm-backend-controller.
  5. Réactivez le sous-composant.
Stockage de blocs 1.12.4

Pods Grafana bloqués à l'état Init en raison d'erreurs d'installation de volume.

Symptômes :

Les pods Grafana des espaces de noms anthos-identity-service-obs-system et platform-obs-obs-system sont bloqués à l'état Init en raison d'erreurs d'installation de volume. Le message d'erreur dans les journaux kubelet indique un problème d'attachement multiple. Ce problème est dû à un bug dans Trident, qui ne parvient pas à identifier et à valider correctement l'appareil sous-jacent pour les mappages LUKS, ce qui entraîne une erreur d'attachement multiple.

Solution :

Recherchez un champ "deletionTimestamp" dans la revendication de volume persistant. S'il n'y a pas de deletionTimestamp (migration de pod), procédez comme suit :

  1. Consultez VolumeAttachment pour PVC afin d'identifier l'emplacement actuel du volume.
  2. Mettez hors service les Nodes du cluster qui ne correspondent pas à cette valeur.
  3. Supprimez le Pod défaillant. Il devrait ainsi migrer vers le Node d'origine.

Après vérification, s'il existe un champ "deletionTimestamp" (suppression du volume), procédez comme suit :

  1. Consultez VolumeAttachment pour PVC afin d'identifier l'emplacement actuel du volume.
  2. Sur le Node, affichez le contenu de son fichier de suivi :
    cat /var/lib/trident/tracking/PVC_NAME.json
  3. Vérifiez que l'appareil LUKS trouvé dans le champ devicePath de la sortie du fichier de suivi est bien fermé. Ce chemin d'accès ne doit pas déjà exister :
    stat DEVICE_PATH
  4. Vérifiez si le numéro de série est actuellement associé à un appareil multipath.
    1. Copiez la valeur du champ iscsiLunSerial du fichier de suivi.
    2. Convertissez cette valeur en valeur hexadécimale attendue :
      echo 'iISCSILUNSERIAL>' | xxd -l 12 -ps
    3. Avec cette nouvelle valeur, vérifiez si l'entrée multipath existe toujours :
      multipath -ll | grep SERIAL_HEX
    4. Si ce n'est pas le cas, supprimez le fichier de suivi.
    5. Si elle existe, vous verrez une valeur hexadécimale sérielle légèrement plus longue que celle recherchée, appelée multipathSerial. Exécutez la commande suivante et recherchez les périphériques de bloc :
      multipath -ll MULTIPATH_SERIAL
    6. Exécutez ensuite les commandes suivantes, la dernière étant exécutée uniquement pour chaque périphérique de bloc :
                systemctl restart iscsid
                systemctl restart multipathd
                multipath -f MULTIPATH_SERIAL
                echo 1 > /sys/block/BLOCK_DEVICE_NAME/device/delete
                  
Gestion des clusters 1.12.0
1.12.1
1.12.2
1.12.4

Échec de la tâche machine-init lors du provisionnement du cluster

Symptômes :

  1. Lors du provisionnement du cluster, le job machine-init du deuxième nœud du plan de contrôle échoue avec le message suivant :
    FAILED! => {"changed": true, "cmd": "/usr/bin/kubeadm join phase control-plane-prepare certs --config /dev/stdin --v 5".
  2. Affichez les journaux :
    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"

    Le résultat affiché n'est pas vide.

Solution :

  1. Activez ou désactivez l'autorisation /etc/kubernetes/pki/etcd/ca.crt. Il s'agit d'une opération très sensible au temps. Le changement d'autorisation doit avoir lieu après l'exécution précédente du job machine-init, mais avant la prochaine exécution du job machine-init, car machine-init rétablit l'autorisation sur la racine.
  2. Redémarrez etcd dans le deuxième nœud pour récupérer etcd dans le premier nœud à partir de la boucle de plantage.

    Une fois ces deux étapes terminées, le kube-apiserver du premier nœud commence à s'exécuter et le prochain job machine-init réussit.

Gestion des clusters 1.12.2

Le PodCIDR IPv4 requis n'est pas disponible

Symptômes :

L'agent Cilium affiche l'avertissement suivant :

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

Solution :

  1. Déterminez l'adresse IP du nœud que vous souhaitez supprimer.
  2. Supprimez l'adresse IP de spec.nodes dans la ressource personnalisée NodePool.
  3. Attendez que le nœud soit complètement supprimé de NodePool. Si le nœud n'est pas supprimé, exécutez un force-remove :
    1. Ajoutez l'annotation baremetal.cluster.gke.io/force-remove=true à la ressource personnalisée Machine :
      kubectl -n org-1-system-cluster annotate machine IP_ADDRESS baremetal.cluster.gke.io/force-remove=true 
  4. Ajoutez de nouveau l'adresse IP à spec.nodes dans la ressource personnalisée NodePool.
Journalisation 1.12.0
1.12.1

Les journaux du serveur d'API Kubernetes ne sont pas transférés vers une destination SIEM

Symptômes :

Une fois que vous avez terminé de configurer l'exportation vers un système SIEM externe, l'entrée SIEM n'est pas incluse dans le pipeline de traitement Fluent Bit et les journaux du serveur d'API Kubernetes ne sont pas présents dans ce SIEM.

Mise en réseau 1.12.4

Échec de la tâche machine-init lors de la mise à niveau

Symptômes :

Lors de la mise à niveau de la version 1.12.2 vers la version 1.12.4, si un nœud est supprimé puis réajouté, le processus machine-init pour ce nœud peut échouer. Cet échec se produit, car le trafic réseau du nœud réajouté vers les services essentiels du plan de contrôle est refusé par la règle ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes. Cette erreur est mise en évidence par les messages d'état dans l'exemple de résultat suivant :
      Feb 17 18:52:52.330: 30.0.0.9:41046 (world) <> 30.0.0.7:2379 (host) policy-verdict:none INGRESS DENIED (TCP Flags: SYN)
      Feb 17 18:52:52.330: 30.0.0.9:41046 (world) <> 30.0.0.7:2379 (host) Policy denied DROPPED (TCP Flags: SYN)

Solution :

Pour résoudre ce problème, procédez comme suit :

  1. Pour le cluster d'administrateur racine :
    1. Récupérez les CIDR à partir de CIDRClaim/org-external-cidr -n root (plus précisément le champ .status.ipv4AllocationStatus.allocatedCidrBlocks). Exécutez la commande suivante dans le cluster d'administrateur racine :
      ROOTCIDRs=$(ka get cidrclaim/org-external-cidr -n root -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. Ajoutez ces CIDR à ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, plus précisément au champ .spec.ingress.fromCIDR. Appliquez cette modification dans le cluster d'administrateur racine à l'aide de la commande suivante :
      ka get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ROOTCIDRs}"'}]' \
        | ka apply -f -
  2. Pour le cluster d'administrateur de l'organisation :
    1. Obtenez les CIDR pour l'organisation (par exemple, org-1) à partir de CIDRClaim/org-external-cidr -n org-1 (plus précisément le champ .status.ipv4AllocationStatus.allocatedCidrBlocks). Cette commande est exécutée sur le cluster administrateur racine pour obtenir les CIDR de "org-1" :
      ORGCIDRs=$(ka get cidrclaim/org-external-cidr -n org-1 -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. Ajoutez ces CIDR à ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, plus précisément au champ .spec.ingress.fromCIDR. Appliquez cette modification dans le cluster d'administrateur de l'organisation concernée à l'aide de la commande suivante :
      ko get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ORGCIDRs}"'}]' \
        | ko apply -f -

Cette modification ne doit être effectuée qu'une seule fois avant de commencer la mise à niveau.

Mise en réseau 1.12.0 
1.12.1

Problèmes liés aux mises à jour, à l'arrêt et à la planification des VM et des conteneurs

Symptômes :

Sur un nœud bare metal du cluster système, deux conteneurs anetd ne peuvent pas être arrêtés. Après avoir arrêté de force le processus, redémarré kubelet et containerd, le pod anetd est recréé, mais tous les conteneurs sont bloqués dans podInit et containerd affiche le message d'erreur suivant :

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

Cela empêche le démarrage de l'interface réseau de conteneur (CNI) et la planification d'autres pods.

Solution :

Effectuez les atténuations suivantes pour éviter cet état de nœud :

  • Ne planifiez pas plus de 10 PVC à la fois sur un même nœud. Attendez qu'ils soient montés avant de planifier d'autres sauvegardes. Cela se remarquait surtout lorsque vous essayiez de créer des VM.
  • Mettez à jour le fichier /etc/lvm/lvm.conf sur chaque nœud pour inclure la ligne filter = [ "r|/dev/dm.|", "r|/dev/sg.|" ] dans le bloc devices{}.

Si le nœud passe dans un état où il affiche des délais d'attente pour les rattachements et les montages de volumes, ou s'il ne parvient pas à supprimer un volume, vérifiez le nombre de processus vgs suspendus sur le nœud pour déterminer si le nœud se trouve dans cet état particulièrement mauvais. Le moyen le plus fiable de corriger un nœud dans cet état consiste à le redémarrer.

Un autre mode de défaillance peut se produire. Ce mode d'échec présente la signature suivante lors de la tentative de montage : mount(2) system call failed: No space left on device. Cela provient probablement de la propagation du montage sur le nœud. Pour le vérifier, exécutez cat /proc/mounts | grep devtmpfs | awk '{ print $2 }' | sort -n | uniq -c. Si l'une de ces valeurs est supérieure à 1, supprimez le pod qui l'utilise. Cela devrait déclencher un démontage. Si cela ne fonctionne pas, démontez manuellement ce chemin. Si vous êtes toujours bloqué, redémarrez votre appareil.

Mise en réseau 1.12.2

GDC ne parvient pas à créer des LCA de commutateur à partir des règles de trafic lors du processus d'amorçage initial

Dans certains cas, en raison de conditions de concurrence, Google Distributed Cloud (GDC) air-gapped ne parvient pas à créer les ressources personnalisées Kubernetes ACL de commutateur nécessaires lors de l'amorçage initial de Distributed Cloud.

Symptômes :

Répertoriez les CR de LCA de commutateur :

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

Le résultat de cette commande indique qu'aucune liste de contrôle d'accès (ACL) de commutateur de gestion (mgmt-switch-acl) n'a été créée.

No resources found in gpc-system namespace.

Solution :

  1. Répertoriez les CR de règles de trafic :
    kubectl get trafficpolicies -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

    Le résultat renvoie deux CR Kubernetes de règles de trafic :

    NAME                          AGE     NAME
    default-traffic-policy-data   4d17h   default-traffic-policy-data
    default-traffic-policy-mgmt   4d17h   default-traffic-policy-mgmt
  2. Modifiez le CR Kubernetes de la règle de trafic default-traffic-policy-mgmt :
    kubectl edit trafficpolicies default-traffic-policy-mgmt -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  3. Accédez à la dernière règle de stratégie de ce fichier, qui peut se trouver à la fin du fichier.
  4. Identifiez le champ de description de la dernière règle de stratégie. Le champ peut se présenter comme suit :
    Deny All rule for Management Network
  5. Modifiez cette description et ajoutez The au début de la ligne de description :
    The Deny All rule for Management Network
  6. Enregistrez et fermez le fichier.
  7. Affichez à nouveau les CR de la LCA du commutateur Kubernetes :
    kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  8. La sortie liste la LCA du commutateur de gestion (mgmt-switch-acl) :
    NAME              AGE   NAME
    mgmt-switch-acl   23h   mgmt-switch-acl
Serveurs physiques 1.12.1
1.12.2

NodePool a un serveur dans un état inconnu lors de la création

Symptômes :

Lors du provisionnement de Server pendant la création d'un cluster, il est possible que le serveur soit marqué comme provisionné, mais qu'il manque la condition Provision-Ready. Par conséquent, le NodePool ne peut pas utiliser ce serveur. Un exemple de message d'événement d'erreur dans NodePool peut se présenter comme suit :

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

Solution :

Réinitialisez ILO en exécutant le script suivant :

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

Dans de rares cas, la procédure de réinitialisation d'iLO précédente peut ne pas résoudre complètement le problème. Dans ce cas, un re-provisionnement du serveur est nécessaire. Pour connaître les procédures détaillées, consultez les runbooks OS-P0002 et OS-P0003.

Serveurs physiques 1.12.2

Échec de la mise à niveau du micrologiciel du nœud dans l'organisation locataire

Symptômes :

La mise à niveau du nœud bare metal est bloquée à l'état in-progress depuis plus de trois heures.

Solution :

Suivez les étapes du runbook SERV-R0005.

Mise en réseau 1.12.1

Le script de préinstallation échoue sur plusieurs commutateurs

Symptômes :

Le POAP échoue sans cesse et son journal affiche un message semblable à celui-ci :

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

Vous ne trouvez pas nxos.10.3.1.bin, mais vous trouvez quelque chose de similaire, comme nxos64-cs.10.3.1.F.bin, dans le répertoire bootflash du commutateur.

Solution :

Sur la machine d'amorçage, procédez comme suit. Vous devez suivre ces étapes pendant le processus de préinstallation. S'il existe plusieurs dossiers /tmp/preinstall-bootstrap-, appliquez les modifications au dossier actuel utilisé par le processus de préinstallation en consultant les journaux du processus de préinstallation. Si vous devez redémarrer la commande de préinstallation, cette action crée également un dossier /tmp/preinstall-bootstrap-.

  1. Accédez au dossier /tmp/preinstall-bootstrap-RANDOM_NUMBER .
  2. Dans le dossier, recherchez le fichier poap.py.
  3. Supprimez entièrement la ligne contenant la somme de contrôle md5 dans ce fichier afin que head -n 4 poap.py se présente comme suit :
    #!/bin/env python3
    import glob
    import os
    import pkgutil
  4. Dans le même fichier, ajoutez les lignes suivantes à version_to_image_file :
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",

    La section du fichier mis à jour se présente comme suit :

    version_to_image_file = {
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",
        "nxos.10.3.3.bin": "nxos64-cs.10.3.3.F.bin",
        "nxos.10.3.4a.bin": "nxos64-cs.10.3.4a.M.bin",
    }
  5. Exécutez md5sum poap.py pour obtenir la somme md5 et ajoutez-la à poap.py afin que head -n 4 poap.py se présente comme suit :
    #!/bin/env python3
    #md5sum="396bed5a5f579b80da5fac6edf0b590c"
    import glob
    import os
Mise en réseau 1.12.1

La mise à niveau de la version 1.11.x vers la version 1.12.1 échoue, car le contrôleur pnet ne génère pas correctement la ressource personnalisée (CR) hairpinlink.

Solution :

  1. Après la mise à niveau, dans le cluster d'administrateur racine, modifiez le fichier clusterroles/pnet-core-backend-controllers-role.
  2. Recherchez hairpinlinks, puis ajoutez les autorisations create,update,delete à la ressource.
  3. Vérifiez que les CR hairpinlinks et hairpinbgpsessions sont générés.
Serveur NTP 1.12.1

Le pod du serveur de relais NTP plante après le redémarrage

Symptômes :

  • Le message suivant peut s'afficher lorsque vous exécutez la commande kubectl get pods :
    ntp-system                      ntp-relay-server-75bbf                                            1/2     CrashLoopBackOff    123 (5m12s ago)   24h
  • Un avertissement de vérification d'activité peut s'afficher dans les journaux :
    Warning  BackOff    5m55s (x82 over 28m)      kubelet  Back-off restarting failed container ntp-image in pod ntp-relay-server-75bbf_ntp-system(28e4e28f-4f99-4c6e-8c26-d271f0c7995c)
    Warning  Unhealthy  <invalid> (x37 over 35m)  kubelet  Liveness probe failed: Leap status is Not synchronised

Ce problème peut entraîner une désynchronisation de l'heure des serveurs.

Solution :

  1. Ouvrez le daemonset ntp pour le modifier :
    kubectl edit daemonset/ntp-relay-server -n ntp-system
  2. Supprimez la section livenessProbe: jusqu'à la ligne timeoutSeconds: 30.
  3. Ajoutez la section suivante dans le conteneur ntp-image :
    securityContext:
      capabilities:
        add:
        - SYS_TIME
  4. La configuration obtenue ressemble à ceci :

    containers:
      - name: ntp-image
      image: "DOCKER_REGISTRY/DOCKER_REPOSITORY/ntp-relay-server:DOCKER_TAG"
      imagePullPolicy: Always
      securityContext:
        capabilities:
          add:
          - SYS_TIME
  5. Ouvrez la règle NTP de l'OS pour la modifier :
    kubectl edit ospolicy/bm-ntp-policy -n gpc-system
  6. Supprimez toutes les adresses IP NTP dans la section des règles. La règle se présente alors comme suit :
    policy:
      installPlaybook:
        extraVars:
          ntp_servers: {}
        name: server-ntp-config
        secrets: {}
          
Serveur NTP 1.12.1

Le pod ntp-relay-job-xxxx plante après le redémarrage

Symptômes :

Le message suivant peut s'afficher lorsque vous exécutez la commande kubectl get pods :

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

Ce problème est dû au nettoyage incorrect du job de mise à niveau. Aucune action n'est requise. Vous pouvez laisser le job dans l'état de boucle de plantage.

Serveur NTP 1.12.2

L'heure de l'OS du nœud n'est pas synchronisée

Symptômes :

Le message suivant peut s'afficher dans les journaux du cluster système :

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

Cela pose problème pour les serveurs dont l'heure n'est pas synchronisée. La configuration n'est pas appliquée correctement et doit être modifiée pour un autre espace de noms afin d'être appliquée correctement.

Solution :

Appliquez les étapes suivantes à tous les clusters :

  1. Répertoriez les règles d'OS existantes :
    kubectl get ospolicies -n ntp-system

    Le résultat affiche admin-ntp-policy ou worker-ntp-policy.

  2. En fonction du nom de la règle, enregistrez-la dans un fichier .yaml :
    kubectl get ospolicy/admin-ntp-policy -n ntp-system -o yaml > ntp-ospolicy.yaml
    kubectl get ospolicy/worker-ntp-policy -n ntp-system -o yaml > ntp-ospolicy.yaml
  3. Modifiez le fichier en remplaçant metadata.namespace par gpc-system et en supprimant status: line et tout ce qui suit.ntp-system
  4. Appliquez le fichier modifié au cluster :
    kubectl apply -f ntp-ospolicy.yaml
  5. Patientez quelques minutes le temps que le contrôleur applique la règle OS.
  6. Établissez une connexion SSH à l'un des nœuds auxquels OSPolicy s'applique, puis exécutez cat /etc/chrony.conf. Le résultat affiche un message au début du fichier indiquant qu'il est géré par Ansible et que les serveurs nist.time.gov ou ntp.pool ont été supprimés de la configuration.
Sauvegarde et restauration de VM 1.12.0

Les paramètres de webhook de VM empêchent les utilisateurs de démarrer des procédures de sauvegarde et de restauration de VM

Symptômes :

Les utilisateurs ne peuvent pas démarrer le processus de sauvegarde et de restauration des VM en raison de paramètres de contrôle des accès basé sur les rôles (RBAC) et de schéma incorrects dans le gestionnaire de VM.
 Les noms des plans de sauvegarde de VM ne peuvent pas comporter plus de 63 caractères. Par exemple, le message d'erreur suivant peut s'afficher :

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

Solution :

Les noms des plans de sauvegarde de VM sont une concaténation du nom VirtualMachineBackupPlanTemplate, du type de ressource (vm ou vm-disk) et du nom de cette ressource. Cette chaîne concaténée ne doit pas dépasser 63 caractères.
 Pour ce faire, veillez à ce que les noms de ces ressources soient courts lorsque vous les créez. Pour en savoir plus sur la création de ces ressources, consultez Créer et démarrer une instance de VM et Créer un plan de sauvegarde pour les VM.

Service de base de données 1.12.0

Les charges de travail du service de base de données fonctionnent dans le cluster système.

Symptômes :

Les charges de travail du service de base de données sont provisionnées et configurées dans des projets distincts du cluster système Distributed Cloud. Bien que les projets soient utilisés pour appliquer des limites administratives dans Distributed Cloud, ils n'ont aucune incidence sur la façon dont une charge de travail est exécutée ni sur l'endroit où elle l'est. Par conséquent, ces charges de travail peuvent partager l'infrastructure de calcul sous-jacente avec d'autres instances de base de données et différents systèmes de plan de contrôle.

Solution :

Pour les charges de travail de base de données qui nécessitent une isolation supplémentaire, les utilisateurs peuvent demander la création d'un pool de nœuds sur le cluster système. Ce pool de nœuds, qui doit être référencé lors de la création du projet, garantit que les charges de travail de base de données sont provisionnées et exécutées sur une infrastructure de calcul dédiée. L'opérateur d'infrastructure doit terminer la configuration du pool de nœuds isolé.

Service de base de données 1.12.2

DBCluster AlloyDB Omni bloqué dans l'état "Réconciliation"

Symptômes :

Pour AlloyDB Omni version 15.2.1, lorsque plusieurs clusters AlloyDB Omni sont créés sur le même nœud, le dernier cluster créé reste bloqué dans un état de réconciliation. Obtenir les journaux PostgreSQL avec une commande

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- cat /obs/diagnostic/postgresql.log 
vous devriez voir que la base de données ne peut pas démarrer avec des traces de pile semblables à ce qui suit :

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

Solution :

1. Obtenir une interface système dans le pod de base de données

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- bash 
2. Créez manuellement un fichier de configuration sous /mnt/disks/pgsql/data/postgresql.conf.d/.
echo "enable_lux_wal_writer = off" > /mnt/disks/pgsql/data/postgresql.conf.d/55user.conf
3. Redémarrez la base de données pour charger le fichier de configuration.
supervisorctl restart postgres
4. La base de données démarre correctement et affiche un résultat semblable à ce qui suit :
Chose default config file: /etc/supervisor/supervisord.conf
postgres: ERROR (not running)
postgres: started

Pare-feu 1.12.0

Firewall bootstrap secret.yaml contient TO-BE-FILLED

Symptômes :

Lors du déploiement client, le nom d'utilisateur de l'administrateur du fichier secret.yaml doit être admin. Au lieu de cela, le fichier contient TO-BE-FILLED après la première création. Le nom d'utilisateur admin doit être utilisé pour initialiser la première configuration sur le pare-feu et sur l'adresse IP de bouclage admin\admin.

Solution :

Vérifiez que TO-BE-FILLED n'est pas présent dans les identifiants de pare-feu suivants :

  • CELL_ID/CELL_ID-secret.yaml
  • CELL_ID-ab-rack/CELL_ID-secret.yaml
  • CELL_ID-ac-rack/CELL_ID-secret.yaml
  • Vérifiez que tous les comptes administrateur du pare-feu ont le nom d'utilisateur admin.

    Pare-feu 1.12.2

    bm-system-machine-init échoue sur le premier nœud

    Symptômes :

    Les stratégies de pare-feu IDPS par défaut ne sont pas compatibles avec les adresses IP personnalisées de l'organisation pour l'interconnexion Direct Connect (DX). Par conséquent, la création d'une organisation avec des adresses IP personnalisées échoue, car ces adresses ne peuvent pas se connecter à Harbor dans l'administrateur racine.

    Solution :

    Pour débloquer le trafic, créez manuellement un SecurityPolicyRule pour les adresses IP personnalisées de l'organisation et déployez-le sur les pare-feu IDPS. Suivez les étapes du runbook FW-G0002 pour effectuer les opérations suivantes :

    1. Créez un SecurityPolicyRule d'entrée dans le système virtuel de pare-feu racine pour permettre aux adresses IP personnalisées de l'organisation d'accéder à Harbor racine.

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

    2. Créez un SecurityPolicyRule d'entrée dans le vsys de pare-feu de l'organisation pour autoriser l'accès root à l'APIServer de l'organisation.

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

    3. Déclenchez le remplacement de la configuration du pare-feu pour déployer SecurityPolicyRules.

    Module de sécurité matérielle 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Les licences d'essai HSM désactivées sont toujours détectables

    Symptômes :

    En raison d'un problème connu existant dans CipherTrust Manager, les licences d'essai désactivées sont toujours détectables et peuvent déclencher de faux avertissements d'expiration.

    Solution :

    Consultez HSM-R0003 pour vérifier les licences normales actives et supprimer les licences d'essai désactivées.

    Module de sécurité matérielle 1.12.0

    Le module de sécurité matériel se comporte de manière inattendue lors de la suppression d'un KMS

    Symptômes :

    Le module de sécurité matériel (HSM) se comporte de manière inattendue lors de la suppression d'un CTMKey KMS. Par exemple, il est possible que le service KMS ne démarre pas pour l'organisation.

    Solution :

    Les utilisateurs peuvent détruire les données par chiffrement en supprimant les clés KMS au lieu de la clé racine KMS, ce qui se manifeste par un CTMKey.

    Module de sécurité matérielle 1.12.0
    1.12.1
    1.12.2

    L'état du code secret rotatif pour les modules de sécurité matériels est inconnu

    Symptômes :

    Obtenez la liste des secrets rotatifs inconnus :

    kubectl get rotatablesecret -A | grep -i unknown

    Le résultat peut ressembler à ceci :

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

    Exigences :

    1. Accès au cluster d'administrateur racine
    2. L'outil jq
    3. Suivez IAM-R0004 pour générer le fichier KUBECONFIG du cluster d'administrateur racine.
    4. Suivez IAM-R0005 pour obtenir clusterrole/hsm-admin dans le cluster d'administrateur racine.

    Solution :

    1. Obtenez la liste des adresses IP du réseau de données du HSM :
      kubectl --kubeconfig ${KUBECONFIG:?} get hsm -A -o json | jq -r '.items[] | "\(.spec.dataNetwork.ip)"'

      Le résultat peut ressembler à ceci :

      10.89.3.2
      10.89.3.3
      10.89.3.4
    2. Pour chacune des adresses IP du réseau de données HSM de l'étape précédente :
      1. Exportez l'adresse IP vers une variable appelée HSM_DATA_IP :
        export HSM_DATA_IP=HSM_DATA_IP_ADDRESS
      2. Récupérez les certificats de serveur Web (port 443), nae (port 9000) et kmip (port 5696), puis examinez leur validité :
        openssl s_client -showcerts -connect $HSM_DATA_IP:443 2>/dev/null | openssl x509 -text
        openssl s_client -showcerts -connect $HSM_DATA_IP:9000 2>/dev/null | openssl x509 -text
        openssl s_client -showcerts -connect $HSM_DATA_IP:5696 2>/dev/null | openssl x509 -text

        Le résultat peut ressembler à ceci :

        Validity
                    Not Before: Mar 12 20:36:58 2024 GMT
                    Not After : Jun 16 20:36:58 2026 GMT
    3. Suivez les étapes du runbook HSM-T0016 pour renouveler les certificats de serveur si la date Not After est dans les 30 jours à venir.
    Surveillance 1.12.0

    Il est possible que les certificats Node Exporter ne soient pas prêts lors de la création d'une organisation.

    Symptômes :

    Les certificats ne sont pas prêts lors de la création d'une organisation :

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

    Les secrets existent toujours en raison de `SecretForwarder`:

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

    Solution :

    Mettez en veille le gestionnaire du cycle de vie pour qu'il ne recrée pas de certificats et n'en supprime pas :

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

    Notez que node-exporter ne sera pas réconcilié sur les clusters d'utilisateur.

    Surveillance 1.12.0
    1.12.1
    1.12.2

    La configuration du webhook ServiceNow entraîne une nouvelle réconciliation du LCM et rétablit les modifications apportées aux objets ConfigMap et Secret dans l'espace de noms mon-system.

    Symptômes :

    La configuration du webhook ServiceNow entraîne une nouvelle réconciliation et une restauration des modifications apportées à l'objet ConfigMap mon-alertmanager-servicenow-webhook-backend et à l'objet Secret mon-alertmanager-servicenow-webhook-backend dans l'espace de noms mon-system par la gestion du cycle de vie (LCM).

    Solution :

    Suspendez le sous-composant LCM pour que les modifications soient appliquées sans être annulées :

    1. Obtenez les chemins d'accès aux fichiers kubeconfig des clusters administrateur racine et administrateur de l'organisation. Enregistrez les chemins d'accès dans les variables d'environnement ROOT_ADMIN_KUBECONFIG et ORG_ADMIN_KUBECONFIG, respectivement.
    2. Mettez en veille le sous-composant LCM dans l'un des clusters suivants :
      • Mettez en veille le sous-composant LCM dans le cluster d'administrateur racine :
        kubectl --kubeconfig $ROOT_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n root lcm.private.gdc.goog/paused="true"
      • Mettez en veille le sous-composant LCM dans le cluster d'administrateur de l'organisation :
        kubectl --kubeconfig $ORG_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n org-1-system-cluster lcm.private.gdc.goog/paused="true"
    Surveillance 1.12.0

    Les métriques des clusters d'utilisateurs ne sont pas collectées.

    Symptômes :

    Certaines métriques des clusters d'utilisateurs ne sont pas collectées. Ce problème affecte les clusters de VM utilisateur, mais pas le cluster système.

    • Vous pouvez consulter les journaux suivants sur le serveur Prometheus :
      prometheus-server ts=2024-02-21T16:07:42.300Z caller=dedupe.go:112 component=remote level=warn remote_name=cortex-remote-write url=http://cortex-tenant.mon-system.svc:9009/push msg="Failed to send batch, retrying" err="server returned HTTP status 500 Internal Server Error: 2 errors occurred:"
    • Vous pouvez consulter les journaux suivants du locataire Cortex :
      cortex-tenant time="2024-02-23T18:03:44Z" level=error msg="proc: src=127.0.0.6:55021 lookup cortex.mon-system.svc on 172.25.38.10:53: no such host"

    Solution :

    Pour résoudre le problème, procédez comme suit :

    1. Obtenez le chemin d'accès au fichier kubeconfig du cluster. Enregistrez le chemin d'accès dans la variable d'environnement KUBECONFIG.
    2. Déployez un service stub dans les clusters de VM utilisateur :
            kubectl --kubeconfig $KUBECONFIG apply -f - &lt&ltEOF
            apiVersion: v1
            kind: Service
            metadata:
              labels:
                app: cortex
              name: cortex
            spec:
              ports:
              - protocol: TCP
                targetPort: 9009
                port: 9009
                name: cortex
              type: ClusterIP
              sessionAffinity: ClientIP
            EOF
            
    3. Redémarrez le déploiement du locataire Cortex :
      kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n mon-system cortex-tenant
    Surveillance 1.12.0

    L'instance Prometheus principale envoie des métriques au locataire Cortex au-delà des limites du cluster.

    Symptômes :

    Les métriques destinées à l'instance Grafana de l'opérateur d'infrastructure peuvent se trouver dans l'instance Grafana de l'administrateur de plate-forme, et inversement. Ce problème est dû aux requêtes d'équilibrage de charge ASM au-delà des limites du cluster, qui ont des locataires par défaut différents.

    Solution :

    La solution de contournement nécessite d'avoir accès à la source private-cloud et de pouvoir déployer une mise à jour de composant. Vous devez modifier la configuration du maillage pour limiter le service cortex-tenant afin qu'il ne reçoive que le trafic du cluster local, et déployer le composant ASM.

    1. Ouvrez le fichier manifests/plain/asm/1.19/asm-primary-cluster-operator.yaml.
    2. Présentez le champ serviceSettings dans le champ meshConfig.

      Le champ meshConfig se présente initialement comme suit :

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

      Vous devez donc modifier le champ meshConfig pour qu'il ressemble à l'exemple suivant :

              profile: minimal
                revision: 1-19
                meshConfig:
                  serviceSettings:
                    - settings:
                        clusterLocal: true
                      hosts:
                      - 'cortex-tenant.mon-system.svc.cluster.local'
                  localityLbSetting:
                      enabled: false
            
    3. Déployez le composant ASM dans le cluster.
    Mettre à niveau 1.12.0

    Échec de la mise à niveau des nœuds pour NodeOSInPlaceUpgradeCompleted

    Symptômes :

    Lors de la mise à niveau de la version 1.11.0 vers la version 1.11.3, la mise à niveau des nœuds échoue pour NodeOSInPlaceUpgradeCompleted.

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

    Solution :

    Connectez-vous à la machine Bare Metal qui est mise à niveau. Vérifiez si fstab comporte /boot/efi et si le répertoire est monté :

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

    Mettre en pause nodeupgradetask

    1. Exécutez mount -a et vérifiez si le répertoire est monté :
      # mount -a
      root@mb-aa-bm04:~# ls /boot/efi/
      EFI
    2. Effectuez les vérifications ici. Exécutez les commandes suivantes :
      C
      # Ensure all three cmds prints `Files are identical`
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/shimx64.efi | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/BOOT/BOOTX64.EFI | awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
      
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/grubx64.efi | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/BOOT/grubx64.efi| awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
      
      if [ "$(sha256sum /boot/efi/EFI/ubuntu/grub.cfg | awk '{ print $1 }')" == "$(sha256sum /boot/efi/EFI/ubuntu/grub.cfg | awk '{ print $1 }')" ]; then echo "Files are identical."; else  echo "Files are different."; fi
    3. Si tous les fichiers ne sont pas identiques, exécutez cette commande sur la machine et répétez les vérifications.
      /usr/local/update-efi-files.sh
    4. Réactiver nodeupgradetask
    Mettre à niveau 1.12.0

    Échec de l'exécution de la commande de mise à niveau du commutateur install add bootflash://..

    Symptômes :

    Échec de l'ajout de bootflash lors de la mise à niveau du commutateur :

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

    Solution :

    Connectez-vous au commutateur qui échoue et exécutez la commande d'installation et d'activation à partir du commutateur sur le package :

    install activate nxos.CSCwh72780-n9k_ALL-1.0.0-9.3.10.lib32_n9000.rpm
    Mettre à niveau 1.12.1, 1.12.2, 1.12.4

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.1, la mise à niveau du nœud reste bloquée avec l'erreur MaintenanceModeHealthCheckReady undrain

    Symptômes :

    La mise à niveau du cluster est bloquée depuis plus d'une heure. L'état et les spécifications du mode maintenance de la machine Bare Metal ne correspondent pas. Par exemple, la commande :

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

    spectacles :

    root        10.252.135.4   false             true

    Le job de vérification préliminaire de la machine bare metal affiche le message d'erreur suivant :

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

    Solution :

    Exécutez la commande suivante :

    export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
       kubectl get cluster -A
    kubectl annotate cluster ${CLUSTER_NAME} -n=${CLUSTER_NAMESPACE} "baremetal.cluster.gke.io/bypass-check=ntp"
    OS du nœud 1.11.3

    Le nœud de VM est bloqué au redémarrage après la solution de contournement manuelle pour le pod os-policy

    Symptômes :

    Une tâche de redémarrage de VM échoue après la solution de contournement manuelle pour le pod os-policy. Le message suivant s'affiche :

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

    Solution :

    Arrêter et démarrer la VM résout le problème. Suivez les instructions de l'article Démarrer et arrêter une VM.

    Mise en réseau supérieure 1.12.0

    Un cluster de VM utilisateur reste bloqué à l'état ContainerCreating avec l'avertissement FailedCreatePodSandBox

    Symptômes :

    Un cluster de VM utilisateur est bloqué. La description du pod à l'état ContainerCreating affiche l'avertissement suivant :

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

    Solution :

    Suivez les étapes du runbook NET-P0001 pour redémarrer anetd sur le cluster système.

    Dépôt d'artefacts système 1.12.1

    Boucles de plantage de Harbor après une mise à niveau ABM

    Symptômes :

    Lors de la mise à niveau d'une organisation racine de la version 1.11.1 vers la version 1.12.1, la mise à niveau peut échouer au niveau du module complémentaire avec des erreurs Helm pull :

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

    Solution :

    Envoyez une demande d'assistance. Pour en savoir plus, consultez Demander de l'aide.

    Mettre à niveau 1.12.0

    Plusieurs pods d'un cluster système peuvent rester bloqués dans l'état TaintToleration

    Symptômes :

    Lors d'une mise à niveau, le sous-composant OPA Gatekeeper n'est pas installé dans le cluster système. Toutefois, les contraintes et le webhook permettant de les appliquer sont installés.

    Plusieurs pods d'un cluster système peuvent rester bloqués dans l'état TaintToleration :

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

    Pods à l'état ImagePullBackOff avec l'événement Back-off pulling image "auto"

    Symptômes :

    Le pod dont le nom de conteneur est istio-proxy n'est pas prêt et présente l'état ImagePullBackOff avec l'événement Back-off pulling image "auto".

    Solution :

    1. Vérifiez que le webhook de mutation istio-revision-tag-default est présent dans le cluster. Si ce n'est pas le cas, patientez environ 10 minutes pour voir si le système se rétablit automatiquement. Si ce n'est pas le cas, signalez le problème.
    2. Si le webhook de mutation est présent, supprimez le pod problématique et vérifiez qu'il est de nouveau opérationnel. .spec.containers[].image ne doit pas être auto, mais doit ressembler à une image réelle, comme suit : gcr.io/gke-release/asm/proxyv2:<image version>.
    Journalisation 1.12.1

    La mise à niveau de ValidatingWebhookConfigurations, MutatingWebhookConfigurations et MonitoringRules déployés par le composant Log peut échouer

    Symptômes :

    Lors de la mise à niveau de la version 1.11.1 vers la version 1.12.1, il est possible que la mise à niveau de ValidatingWebhookConfigurations, MutatingWebhookConfigurations et MonitoringRules déployés par le composant Log échoue.

    Solution :

    1. Assurez-vous de disposer de kubectl et d'avoir accès au runbook IAM-R0004 pour obtenir le KUBECONFIG du cluster d'administrateur racine.

    2. Supprimez ValidatingWebhookConfiguration root-admin-private-logging-validation-webhook du cluster d'administrateur racine :

      kubectl delete validatingwebhookconfiguration root-admin-private-logging-validation-webhook
    3. Supprimez MutatingWebhookConfiguration root-admin-private-logging-defaulter-webhook du cluster d'administrateur racine :

      kubectl delete mutatingwebhookconfiguration root-admin-private-logging-defaulter-webhook
    4. Supprimez ValidatingWebhookConfiguration root-admin-logging-webhook du cluster d'administrateur racine :

      kubectl delete validatingwebhookconfiguration root-admin-logging-webhook
    5. Supprimez MonitoringRule operational-logs-alerts de l'espace de noms infra-obs dans le cluster d'administrateur racine :

      kubectl delete monitoringrule operational-logs-alerts -n infra-obs
    6. Supprimez MonitoringRules audit-logs-alerts, audit-logs-sli-syslog-prober, audit-logs-sli-filelog-prober, audit-logs-sli-fluentbit-to-loki, audit-logs-sli-fluentbit-to-splunk, audit-logs-sli-fluentbit-backlog, audit-logs-sli-loki-ingester-failed-rate, audit-logs-sli-loki-io-up et audit-logs-sli-loki-pa-up de infra-obs namespace dans le cluster d'administrateur racine :

      kubectl delete monitoringrule audit-logs-alerts audit-logs-sli-syslog-prober audit-logs-sli-filelog-prober audit-logs-sli-fluentbit-to-loki audit-logs-sli-fluentbit-to-splunk audit-logs-sli-fluentbit-backlog audit-logs-sli-loki-ingester-failed-rate audit-logs-sli-loki-io-up audit-logs-sli-loki-pa-up -n infra-obs
    7. Vérifiez que le sous-composant log-admin est prêt dans le cluster d'administrateur racine :

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

      Si l'opération réussit, la commande affiche log-audit is ready. Sinon, le résultat est log-audit is not ready.

    8. Vérifiez que le sous-composant log-admin est prêt dans le cluster d'administrateur racine :

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

      Si l'opération réussit, la commande affiche log-operational is ready. Sinon, le résultat est log-operational is not ready.

    Journalisation 1.12.1

    Journaux d'audit et journaux opérationnels non collectés

    En raison d'un problème dans le job log-infra-backend-preinstall, les journaux d'audit et les journaux opérationnels Lokis ne sont pas installés et les journaux ne sont pas collectés.

    Symptômes :

    Vous pouvez voir un CrashLoopBackoff dans le cluster système :

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

    L'état du pod cortex-ingester est OOMKilled

    Symptômes :

    L'état OOMKilled peut s'afficher pour le pod dans l'espace de noms mon-system :

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

    Solution :

    Augmentez la mémoire de chaque ingesteur, le nombre d'ingesteurs ou les deux. Pour ce faire, déployez un SubcomponentOverride sur le cluster d'administrateur de l'organisation, comme illustré dans l'exemple suivant :

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

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.1, il est possible qu'un nœud de cluster ne quitte pas le mode maintenance en raison d'un échec de la vérification de l'état'état pour registy_mirror

    Symptômes :

    Lorsque vous passez de la version 1.11.x à la version 1.12.1, la mise à niveau des nœuds échoue avec le message d'erreur suivant :

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

    Solution :

    Exécutez la commande suivante :

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

    L'état de la mise à niveau de l'organisation est bloqué aux étapes anthosBareMetal, addOn ou node avec un échec de la vérification check_registry_mirror_reachability_pass.

    Symptômes :

    1. La mise à niveau de l'organisation est bloquée aux étapes anthosBareMetal, addOn ou node et l'état Unknown s'affiche pour la condition Succeeded.

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

    Solution :

    Exécutez la commande suivante :

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

    L'opération OrganizationUpgrade est bloquée aux étapes anthosBareMetal, addOn ou node avec l'erreur de vérification de l'état'état netutil.

    Symptômes :

    1. La mise à niveau de l'organisation est bloquée aux étapes anthosBareMetal, addOn ou node et l'état Unknown s'affiche pour la condition Succeeded.

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

    Solution :

    Supprimer le job Kubernetes correspondant au HealthCheck ayant échoué

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

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.x, il est possible qu'une VM ne soit pas prête en raison d'un nombre trop élevé de pods

    Symptômes :

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.x, il est possible qu'une VM ne soit pas prête en raison d'un nombre trop élevé de pods, ce qui bloque le drainage d'un nœud Bare Metal.

    Solution :

    Redémarrez la VM.

    Serveurs physiques 1.12.1

    NodeUpgrade contient plusieurs versions pour le même modèle de matériel, ce qui bloque la vérification de la mise à niveau du micrologiciel.

    Symptômes :

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.1, NodeUpgrade contient plusieurs versions pour le même modèle de matériel, ce qui bloque la vérification de la mise à niveau du micrologiciel.

    Solution :

    Pour modifier la CR NodeUpgrade spec, procédez comme suit :

    1. Si la mise à niveau concerne des serveurs HPE Gen10 (GDC-4D), supprimez le micrologiciel du modèle ilo6. Sinon, supprimez le micrologiciel du modèle ilo5.
    2. Section permettant de conserver l'entrée avec le redfishVersion le plus récent pour chaque description.
      Par exemple, si les deux entrées suivantes existent, ne conservez que celle avec 2.98 Oct 10 2023 :
      - description: SystemBMC
              model: ilo5
              redfishVersion: 2.98 Oct 10 2023
            - description: SystemBMC
              model: ilo5
              redfishVersion: 2.95 Jul 19 2023
    Serveurs physiques 1.12.1

    Les serveurs sont bloqués à l'état "Provisioning" (Provisionnement)

    Symptômes :

    Ironic a atteint un délai d'attente lors de l'activation d'un serveur. L'état passe de cleaning à clean failed, puis à available :

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

    Déterminez si le bouton bascule est activé :

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

    Si le commutateur est activé, le résultat renvoie "On".

    Solution :

    Supprimez le bloc image des serveurs problématiques et attendez que les serveurs reviennent à l'état disponible. Une fois qu'ils sont disponibles, ajoutez à nouveau le bloc image.

    Serveurs physiques 1.12.2

    L'amorçage du serveur échoue

    Symptômes :

    Un message de débogage semblable à celui-ci peut s'afficher :

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

    Ce problème se produit lorsque les erreurs iLO sont ignorées et que la réponse HTTP est lue au lieu d'être renvoyée immédiatement, ce qui entraîne une déréférence de pointeur nul.

    Dépôt d'artefacts système 1.12.1

    Lorsque vous mettez à niveau la version 1.11.x vers la version 1.12.1, l'état du cluster Harbor peut être unhealthy

    Symptômes :

    Lorsque vous passez de la version 1.11.1 à la version 1.12.1, l'état du cluster Harbor peut devenir unhealthy avec l'erreur suivante :

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

    Étapes de diagnostic :

    1. Vérifiez l'état de harborclusters :

      root@abc-bootstrapper:/home/ubuntu# ka get harborclusters -A
      NAMESPACE       NAME     PUBLIC URL                    STATUS
      harbor-system   harbor   https://10.252.119.11:10443   unhealthy
    2. Si l'état n'est pas opérationnel, vérifiez l'état des composants Harbor :

      root@abc-bootstrapper:~# ka get pods -n harbor-system
      NAME                                               READY   STATUS    RESTARTS   AGE
      harbor-harbor-harbor-core-68d9764d8c-rgg4h         0/1     Running   0          3d2h
      harbor-harbor-harbor-exporter-54d559fdb8-nzjk7     1/1     Running   0          3d2h
      harbor-harbor-harbor-jobservice-6f5db4779-sqmlc    1/1     Running   0          3d2h
      harbor-harbor-harbor-portal-8458c847dc-z2l6n       1/1     Running   0          3d4h
      harbor-harbor-harbor-registry-7577f5d9d6-qp45c     3/3     Running   0          3d4h
      harbor-operator-harbor-operator-755b5cfc96-x2bxh   1/1     Running   0          3d4h
      harbor-operator-redisoperator-bf96ffc59-5d457      1/1     Running   0          3d4h
      harbor-operator-redisoperator-bf96ffc59-tbd8j      1/1     Running   0          3h38m
      harbor-operator-redisoperator-bf96ffc59-vlqfl      1/1     Running   0          3h38m
      pg-harbor-db-0                                     0/3     Pending   0          3h37m
      pg-harbor-db-monitor-776b946c74-c7pt9              0/1     Pending   0          3h38m
      rfr-harbor-redis-0                                 1/1     Running   0          3d4h
      rfr-harbor-redis-1                                 1/1     Running   0          3d4h
      rfr-harbor-redis-2                                 1/1     Running   0          3h37m
      rfs-harbor-redis-64d9d8df4f-fds79                  1/1     Running   0          3d4h
      rfs-harbor-redis-64d9d8df4f-p9l9h                  1/1     Running   0          3d3h
      rfs-harbor-redis-64d9d8df4f-x5x8c                  1/1     Running   0          3h38m
    3. Si harbor-core et pg-harbor-db ne sont pas prêts, vérifiez l'état de harbor-db :

      root@abc-bootstrapper:~# ka get dbclusters.postgresql.dbadmin.gdc.goog harbor-db -n harbor-system
      NAME        PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE
      harbor-db   172.20.0.146      InProgress     DBClusterReconciling
    4. Si harbor-db est en mode InProgress, vérifiez si un nœud root-admin-control-plane est en mode UNDERMAINTENANCE.

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

      Les nœuds devraient être en mode maintenance lors d'une mise à niveau. Si un nœud est en maintenance, vous n'aurez peut-être pas assez de ressources pour planifier harbor-db.

    Solution :

    Pour résoudre le problème, suivez les étapes ci-dessous :

    1. Définir KUBECONFIG

      :
      export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    2. Effectuez le scaling à la baisse des contrôleurs DBS :

      kubectl scale --replicas=0 deployment -n dbs-fleet-system fleet-controller-manager
      kubectl scale --replicas=0 deployment -n dbs-postgres-system pg-controller-manager
    3. Définissez le nom de la classe de priorité sur system-cluster-critical ou system-node-critical dans le modèle de pod :

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

      kubectl delete pods -n harbor-system pg-harbor-db-0
    5. Après avoir vérifié que harborcluster est opérationnel, augmentez à nouveau le nombre de contrôleurs dbs :

            kubectl scale --replicas=1 deployment -n dbs-fleet-system fleet-controller-manager
            kubectl scale --replicas=1 deployment -n dbs-postgres-system pg-controller-manager
    Dépôt d'artefacts système 1.12.2

    Le pod du service de tâches n'est pas prêt

    Symptômes :

    Le pod du service de job ne parvient pas à être prêt :

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

    Solution :

    1. Redémarrez le pod du service de tâches.
      kubectl delete pod POD_NAME -n NAMESPACE

      Le résultat ressemble à ceci :

      Events:
        Type    Reason     Age    From               Message
        ----    ------     ----   ----               -------
        Normal  Scheduled  2m20s  default-scheduler  Successfully assigned harbor-system/harbor-harbor-harbor-jobservice-6f59fbf974-p872s to zx-ab-bm02
        Normal  Pulling    2m15s  kubelet            Pulling image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7"
        Normal  Pulled     2m12s  kubelet            Successfully pulled image "gcr.io/private-cloud-staging/goharbor/harbor-jobservice:v2.8.4-gke.7" in 3.25s (3.25s including waiting)
        Normal  Created    2m12s  kubelet            Created container jobservice
        Normal  Started    2m12s  kubelet            Started container jobservice
    2. Sur le programme d'amorçage, obtenez l'état de l'organisation :
      kubectl get org -A

      Le résultat peut ressembler à ceci :

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

    La suppression du bucket Cortex peut échouer lors de la mise à niveau de la version 1.11.x vers la version 1.12.1

    Symptômes :

    Lorsque vous passez de la version 1.11.1 à la version 1.12.1, la suppression du bucket Cortex peut échouer avec l'erreur suivante :

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

    Solution :

    Pour supprimer de force les bucket, procédez comme suit :

    1. Suivez les étapes de la tâche toil MON-R0017 pour accéder à l'interface utilisateur StorageGRID.
    2. Accédez aux bucket dans l'UI.
    3. Cliquez sur le bouton Supprimer les objets du bucket pour supprimer les données.
    Surveillance 1.12.0
    1.12.1
    1.12.2

    La classe de stockage des métriques est mal définie dans la configuration.

    Symptômes :

    L'objet Prometheus StatefulSet est mal configuré avec la classe de stockage standard au lieu de standard-rwo. Ce problème entraîne l'échec du démarrage de l'objet StatefulSet Anthos Prometheus à partir du composant de surveillance.

    Ce problème se produit, car le reconciler ObservabilityPipeline ne définit cette valeur que lors de la première installation, et le reconciler ObsProjectInfra surveille les ressources personnalisées du cluster.

    Solution :

    Pour résoudre le problème, redémarrez le déploiement fleet-admin-controller dans le cluster d'administrateur de l'organisation.

    Surveillance 1.12.2

    Le sous-composant mon-common ne déploie pas la télémétrie Istio

    Symptômes :

    Le sous-composant mon-common doit déployer un objet de télémétrie Istio dans le cluster d'administration de l'organisation pour empêcher la journalisation d'audit de toutes les requêtes pour Cortex. Toutefois, le fichier manifeste n'est pas inclus dans le fichier de compilation.

    Solution :

    Suivez les étapes ci-dessous pour déployer l'objet de télémétrie Istio dans le cluster d'administrateur de l'organisation :

    1. Créez un fichier YAML définissant la ressource personnalisée (CR) Istio Telemetry dans l'espace de noms mon-system du cluster d'administrateur de l'organisation :

      # Disable access logging from workloads internal to GDCH.
      # Telemetry CR to disable Istio access logs from obs-system namespace.
      apiVersion: telemetry.istio.io/v1alpha1
      kind: Telemetry
      metadata:
        name: disable-audit-logging
        namespace: mon-system
      spec:
        accessLogging:
          - providers:
            - name: otel
            disabled: true
    2. Appliquez le fichier manifeste au cluster d'administrateur de l'organisation dans l'espace de noms mon-system :

      kubectl apply -f disable-audit-logging.yaml
    Surveillance 1.12.0
    1.12.1
    1.12.2

    Le ConfigMap mon-prober-backend-prometheus-config est réinitialisé

    Symptômes :

    • L'alerte MON-A0001 s'est déclenchée.
    • Le ConfigMap mon-prober-backend-prometheus-config est réinitialisé pour n'inclure aucune tâche de sonde, par exemple :
            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
            

    Solution :

    Pour résoudre le problème, procédez comme suit :

    1. Définissez les variables d'environnement suivantes :
      • KUBECONFIG : chemin d'accès au fichier kubeconfig dans le cluster.
      • TARGET_CLUSTER : nom du cluster dans lequel vous résolvez le problème.
    2. Suspendez le sous-composant mon-prober sur tous les clusters :
            kubectl --kubeconfig $KUBECONFIG annotate subcomponent mon-prober -n $TARGET_CLUSTER lcm.private.gdc.goog/paused=true
            

      Exemple :

            kubectl --kubeconfig ~/root-admin-kubeconfig annotate subcomponent mon-prober -n my-org lcm.private.gdc.goog/paused=true
            
    3. Redémarrez le contrôleur administrateur MON sur chaque cluster d'administrateur :
            kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n obs-system mon-admin-backend-controller
            

      Le ConfigMap du vérificateur se remplit à mesure que chaque vérification est enregistrée.

    4. Suivez le runbook MON-R2009 pour couper le son de l'alerte MON-A0001, Blackbox monitoring metrics pipeline down, car cette alerte continuera de se déclencher.
    Plate-forme de nœud 1.12.1

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.x, un pod de téléchargement d'image de changement peut rester bloqué à l'état ErrImagePull

    Symptômes :

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.x, un pod de téléchargement d'image de commutateur peut rester bloqué à l'état ErrImagePull avec l'avertissement suivant :

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

    Solution :

    Pour résoudre le problème, modifiez le tag de l'image pnet-core-switch-image-downloader en switch-image-downloader.

    Plate-forme de nœud 1.12.1

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.1, le pare-feu de l'hôte bloque le téléchargement de l'image de l'appli Switch

    Symptômes :

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.1, le pare-feu de l'hôte bloque le téléchargement de l'image de l'assistant en raison d'une incompatibilité des interfaces utilisées par le pare-feu de l'hôte.

    Solution :

    Appliquez la solution de contournement suivante avant la mise à niveau, uniquement si vous passez de la version 1.11.x à la version 1.12.x.

    1. Mettez à jour les clusters d'administrateur racine et d'administrateur de l'organisation.
      1. Obtenez le nom et l'espace de noms du pool de nœuds pour les nœuds Bare Metal de l'administrateur racine et de l'administrateur de l'organisation. Pour le cluster root-admin, utilisez le fichier kubeconfig root-admin. La commande suivante liste un inventaire des machines et filtre la liste par machines bare metal :
        kubectl --kubeconfig=KUBECONFIG  get inventorymachines -l cluster.private.gdc.goog/provisioner=baremetal-provisioner.cluster.private.gdc.goog -o json | jq -c -r '.items[].spec.nodePoolRef | [.name, .namespace] | @csv | sub("\"";"";"g")' | sort | uniq
        Le résultat affiche le nom et l'espace de noms du pool de nœuds :
        admin-control-plane-node-pool,org-1
        root-admin-control-plane,root

        Les valeurs du résultat correspondent aux éléments suivants :

        • ORG_ADMIN_NODEPOOL_NAME : admin-control-plane-node-pool
        • ORG_ADMIN_NODEPOOL_NAMESPACE : org-1
        • ROOT_ADMIN_NODEPOOL_NAME : root-admin-control-plane
        • ROOT_ADMIN_NODEPOOL_NAMESPACE : racine
      2. Créez les objets suivants dans le cluster root-admin et org-admin pour renommer eth0 en mgmt0 sur les nœuds :

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${ORG_ADMIN_NODEPOOL_NAME}
            namespace: ${ORG_ADMIN_NODEPOOL_NAMESPACE}
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${ROOT_ADMIN_NODEPOOL_NAME}
            namespace: ${ROOT_ADMIN_NODEPOOL_NAMESPACE}
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
              
      3. Les champs NODEPOOL_NAME et NODEPOOL_NAMESPACE sont renseignés avec la liste de tous les pools de nœuds du cluster respectif lorsque le fichier YAML précédent est déployé.

        Voici un exemple de fichier YAML pour le cluster d'administrateur racine avec les noms réels du pool de nœuds de l'administrateur racine et du pool de nœuds de l'administrateur de l'organisation :

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: admin-control-plane-node-pool
            namespace: org-1
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: root-admin-control-plane
            namespace: root
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
      4. Appliquez le fichier YAML au cluster d'administrateur racine :
        kubectl --kubeconfig=ROOT_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    2. Mettez à jour le cluster système :
      1. Obtenez un inventaire des machines et filtrez la liste par machines bare metal :
        kubectl --kubeconfig=_ORG_ADMIN_KUBECONFIG  get inventorymachines -l cluster.private.gdc.goog/provisioner=baremetal-provisioner.cluster.private.gdc.goog -o json | jq -c -r '.items[].spec.nodePoolRef | [.name, .namespace] | @csv | sub("\"";"";"g")' | sort | uniq
        Le résultat ressemble à ceci :
        worker-node-pool-o1-highgpu1-48-gdc-metal,org-1-system-cluster

        Les valeurs du résultat correspondent aux éléments suivants :

        • SYSTEM_CLUSTER_NODEPOOL_NAME : worker-node-pool-o1-highgpu1-48-gdc-metal
        • SYSTEM_CLUSTER_NODEPOOL_NAMESPACE : org-1-system-cluster
      2. Les champs NODEPOOL_NAME et NODEPOOL_NAMESPACE sont renseignés à partir de la liste de sortie de la commande précédente.

      3. Créez les objets suivants dans le cluster système pour renommer eth0 en mgmt0 sur les nœuds et mettre à jour la règle d'OS :
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: ${SYSTEM_CLUSTER_NODEPOOL_NAME}
            namespace: ${SYSTEM_CLUSTER_NODEPOOL_NAMESPACE}
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename

        Voici un exemple de fichier yaml pour le cluster système avec les noms de pool de nœuds réels :

        apiVersion: system.private.gdc.goog/v1alpha1
        kind: AnsiblePlaybook
        metadata:
          name: eth0-to-mgmt0-int-rename
          namespace: gpc-system
        spec:
          playbook: |
            - name: Rename interface from eth0 to mgmt0
              hosts: all
              gather_facts: no
              tasks:
              - name: Rename interface in netplan file
                ansible.builtin.lineinfile:
                  path: /etc/netplan/50-cloud-init.yaml
                  regexp: '^(.*)set-name: eth0(.*)$'
                  line: '\1set-name: mgmt0\2'
                  backrefs: true
                register: netplan
              - name: Disable cloud-init network configuration
                ansible.builtin.lineinfile:
                  path: /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
                  line: 'network: {config: disabled}'
                  state: present
                  create: true
              - name: Restart netplan
                command: netplan apply
                when: netplan.changed
        ---
        apiVersion: system.private.gdc.goog/v1alpha1
        kind: OSPolicy
        metadata:
          name: interface-renaming
          namespace: gpc-system
          labels:
            ospolicy.system.private.gdc.goog/override-maintenance: "true"
        spec:
          interval:
            period: 1m
          inventory:
          - apiVersion: baremetal.cluster.gke.io/v1
            kind: NodePool
            name: worker-node-pool-o1-highgpu1-48-gdc-metal
            namespace: org-1-system-cluster
          policy:
            installPlaybook:
              name: eth0-to-mgmt0-int-rename
      4. Appliquez le fichier YAML au cluster d'administrateur de l'organisation :
        kubectl --kubeconfig=ORG_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    Mise en réseau de niveau inférieur 1.12.2

    Les commutateurs réseau préchargés avec une version antérieure à 9.3.10 peuvent ne pas démarrer.

    Symptômes :

    Les commutateurs réseau préchargés avec une version antérieure à 9.3.10 ne parviennent pas à démarrer, car la version attendue du commutateur est 10.3(4a).

    Solution :

    Mettez à niveau manuellement le micrologiciel du commutateur de la version 9.3.5 à la version 9.3.10, puis de la version 9.3.10 à la version 10.3.4a.

    Mise en réseau de niveau inférieur 1.12.2

    Certaines connexions au nœud org-admin expirent

    Symptômes :

    Les connexions sont interrompues au niveau du commutateur, car celui-ci ne dispose pas de la dernière configuration en raison de certificats expirés.

    Solution :

    1. Effectuez une rotation des certificats sur le commutateur.
    2. Activez les nouveaux certificats :
      1. nxapi certificate httpskey keyfile bootflash:api-private-key.pem
      2. nxapi certificate httpscrt certfile bootflash:api-certificate.pem
      3. nxapi certificate enable
    Stockage de fichiers et de blocs 1.12.1
    1.12.2
    1.12.4

    Lors de la mise à niveau de la version 1.11.1 vers la version 1.12.1, 1.12.2 ou 1.12.4, le déploiement du sous-composant file-netapp-trident peut échouer.

    Symptômes :

    Le sous-composant Linux Unified Key Setup (LUKS) n'est pas redéployé lors de la mise à niveau. Pour vérifier le sous-composant file-netapp-trident :

    1. Définissez des alias :
      alias ka='kubectl --kubeconfig=/path/to/root-admin/root-admin-kubeconfig' 
      alias ko='kubectl --kubeconfig=/path/to/org-admin/org-admin-kubeconfig'
    2. Obtenez le sous-composant :
      ka get subcomponent -n root file-netapp-trident -o yaml
      ko get subcomponent -n root file-netapp-trident -o yaml

    Le résultat peut ressembler à ceci :

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

    Dans cet exemple, deux classes de stockage ont échoué : standard-rwo et �.standard-block

    Solution :

    1. Supprimez les StorageClasses que la tâche n'a pas réussi à créer, comme standard-rwo, standard-block, standard-rwo-non-luks et standard-block-non-luks.
    2. Déclenchez la recréation de StorageClasses en redémarrant le contrôleur oclcm-backend pour votre cluster (contrôleur root-admin pour les clusters root et d'administrateur d'organisation, contrôleur org-admin pour les clusters système et d'utilisateur).
    3. Pour la version 1.12.4, vérifiez que les classes de stockage installées ont l'annotation disk.gdc.goog/luks-encrypted: définie sur "true" (à l'exception des classes de stockage non-LUKS). Si l'annotation n'est pas définie sur "true", répétez les étapes 1 et 2.
    4. Redémarrez le déploiement netapp-trident et netapp-trident DaemonSet dans le cluster.
    5. Vérifiez que le secret LUKS a été créé pour vos ressources PersistentVolumeClaim (PVC). Chaque PVC doit avoir un secret au format g-luks-$pvc_name.
    6. Vérifiez que le sous-composant file-netapp-trident ne présente aucune erreur dans l'état.
    Stockage d'objets 1.12.2

    Les buckets de stockage d'objets peuvent ne pas être prêts après la mise à niveau de l'organisation racine

    Symptômes :

    Après la mise à niveau de l'organisation racine de la version 1.12.1 vers la version 1.12.x, la validation post-mise à niveau échoue avec l'erreur suivante :

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

    Solution :

    Ajoutez manuellement le finaliseur avant de commencer la mise à niveau.

    Gestion des clusters 1.12.1, 1.12.2

    Il est possible que les pools de nœuds des clusters d'utilisateur avec la version 1.27.x de Kubernetes ne s'initialisent pas

    Symptômes :

    Il est possible que les pools de nœuds des clusters d'utilisateur exécutés sur la version 1.27.x de Kubernetes ne s'initialisent pas, ce qui empêche le cluster d'utilisateur de gérer les charges de travail de conteneur.

    Solution :

    Ne créez pas de cluster d'utilisateur avec la version 1.27.x de Kubernetes.

    Machines virtuelles 1.12.0

    La traduction d'images ne parvient pas à récupérer les packages lorsque l'image source comporte des valeurs par défaut

    Symptômes :

    L'importation d'images de VM échoue lors de l'étape de traduction d'image si une image source Ubuntu contient des sources APT par défaut dans sources.list.

    Solution :

    Assurez-vous que le répertoire /var/lib/apt/lists/ est vide dans l'image source.

    Machines virtuelles 1.12.2

    Les pods de l'importateur échouent ou sont bloqués

    Symptômes :

    Obtenez la liste des pods de l'outil d'importation :

    kubectl get pods -A | grep import 

    Le résultat peut ressembler à ceci :

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

    Le journal peut afficher un événement semblable à celui-ci :

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

    Solution :

    1. Obtenez le nom PersistentVolumeClaim (PVC) à partir du message d'erreur, tel que pvc-2000efe0-b4a0-4856-899b-7e0c9fd33405.
    2. Recherchez le PersistentVolume (PV) portant ce nom et notez le spec.csi.volumeAttributes.internalName pour l'utiliser ultérieurement.
    3. Établissez une connexion SSH au cluster de stockage en suivant les étapes du runbook FILE-A0006.
    4. Affichez le volume et notez le nom du serveur virtuel renvoyé par la commande :
      volume show -volume INTERNAL_NAME
    5. Mettre le volume hors connexion :
      volume offline -volume INTERNAL_NAME -vserver VSERVER_NAME
    6. Supprimez le volume :
      volume delete -volume INTERNAL_NAME -vserver VSERVER_NAME
    Machines virtuelles 1.12.1
    1.12.2

    VMRuntime n'est peut-être pas prêt en raison de l'échec de l'installation de network-controller-manager

    Symptômes :

    VMRuntime sur le cluster cible (qui peut être un cluster d'administrateur ou système) a l'état VMRuntime.ready défini sur "false" et network-controller-manager dans l'espace de noms kube-system est en attente.

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

    Solution :

    La suppression du déploiement network-controller-manager devrait le recréer automatiquement avec les certificats requis par l'opérateur VMM. Le déploiement devrait passer à l'état Running, puis l'état VMRuntime devrait passer à ready=true.

    kubectl --kubeconfig=${TARGET_CLUSTER_KUBECONFIG} delete deploy network-controller-manager -n kube-system
    Machines virtuelles 1.12.2

    Temps de provisionnement long pour les disques de machines virtuelles

    Symptômes :

    Les pods de l'outil d'importation de VM plantent en boucle et le volume de données reste bloqué à l'état d'importation pendant plus de 90 minutes. L'état des pods peut ressembler à ceci :

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

    Toutes les importations de disques se terminent au bout de trois heures.

    Mettre à niveau 1.12.2

    Lors de la mise à niveau de la version 1.11.1 vers la version 1.12.2, le sous-composant unet-nodenetworkpolicy-infra ne parvient pas à effectuer la réconciliation

    Symptômes :

    Le message d'échec peut ressembler à ceci :

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

    Solution :

    1. Si l'échec se produit au niveau de la racine, remplacez KUBECONFIG par le kubeconfig de l'administrateur racine dans les étapes suivantes.
    2. Si l'échec concerne l'organisation, remplacez KUBECONFIG par le kubeconfig de l'administrateur de l'organisation dans les étapes suivantes.
    3. Exécutez la commande suivante :
               alias k="kubectl --kubeconfig=KUBECONFIG"
               k get networks mgmt-network -o json | jq '.spec.nodeInterfaceMatcher.interfaceName'
    4. Si le résultat est eth0, exécutez la commande suivante :
      k patch network mgmt-network -p '{"metadata":{"finalizers":null}}' --type=merge
    5. Supprimer mgmt-network
      k delete network mgmt-network
    6. Vérifiez que l'état de unet-nodenetworkpolicy-infra ne comporte pas d'erreur.

      Exemple :

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

      Le résultat ressemble à ceci:

               NAME                           AGE   STATUS
               unet-nodenetworkpolicy-infra   34d   ReconciliationCompleted

    Mises à niveau 1.12.2

    Le cluster système échoue lors de la mise à niveau de la version 1.11.x vers la version 1.12.2

    Symptômes :

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.2, ou après, les jobs portant le nom bm-system-add-ons-* peuvent échouer avec l'erreur suivante :

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

    Solution :

    Appliquez les annotations suivantes à tous les clusters Kubernetes avant de commencer une mise à niveau de la version 1.11 vers la version 1.12.2.

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

    Par exemple, sur le cluster d'administrateur racine, utilisez :

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

    Mettre à niveau 1.12.2

    Le sous-composant file-observability échoue sur org-1-system-cluster

    Symptômes :

    Ce problème se produit lors de la mise à niveau de la version 1.11.1 vers la version 1.12.2.

    Examinez le fichier .yaml du sous-composant file-observability :

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

    Le fichier peut contenir le message suivant dans la section backendStatus.

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

    Solution :

    1. Vérifiez l'espace de noms file-system pour vous assurer qu'il ne s'arrête pas dans org-admin cluster :
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG get namespace file-system
    2. S'il est en cours d'arrêt, supprimez toutes les cibles de surveillance dans l'espace de noms file-system :
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG delete monitoringtarget -n file-system --all
    3. Mettez en pause le sous-composant file-observability jusqu'à ce que le sous-composant mon-admin soit opérationnel, en ajoutant les annotations suivantes au sous-composant :
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused='true'
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused='true'
    4. Supprimez l'annotation pour suspendre le sous-composant une fois la mise à niveau terminée :
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused-
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused-
    Mettre à niveau 1.12.2

    HSMupgrade échoue, car hsmcluster n'est pas prêt

    Symptômes :

    Ce problème se produit lors de la mise à niveau de la version 1.11.1 vers la version 1.12.2.

    Une fois toutes les étapes de mise à niveau pour hsmupgraderequest et ctmclusterupgraderequest terminées, l'erreur suivante s'affiche :

    HSMCluster "hsmcluster" is not ready. 

    Exemple :

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

    Solution :

    1. Vérifiez que la mise à niveau est terminée sur le HSM et obtenez l'adresse IP de chaque HSM :
      kubectl get hsm -A --kubeconfig=ROOT_ADMIN_KUBECONFIG

      Le résultat ressemble à ceci :

      NAMESPACE    NAME          AGE   IP              READY   REASON
      gpc-system   zi-aa-hsm01   11d   10.252.96.192   True    ReconcileHSMSuccess
      gpc-system   zi-ab-hsm01   11d   10.252.97.192   True    ReconcileHSMSuccess
      gpc-system   zi-ac-hsm01   11d   10.252.98.192   True    ReconcileHSMSuccess
    2. Téléchargez et configurez ksctl.
    3. Exécutez ksctl system info get --url=https://HSM_MANAGEMENT_IP pour vérifier que toutes les versions de HSM sont mises à niveau vers .Spec.TargetVersion de ctmclusterupgraderequest :

      Le résultat ressemble à ceci :

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

    4. Mettez à jour le champ Status.FirmwareVersion de chaque HSM vers la version mise à niveau obtenue à l'étape précédente :

      Exemple :

          kubectl edit-status hsm HSM_NAME -n gpc-system
    5. Remplacez l'état de la dernière condition False par True pour ctmclusterupgraderequest.status.conditions. Après cela, l'état de la dernière condition hsmupgraderequest.status.conditions devient également "true" (vrai).

      Exemple :

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

    Mettre à niveau 1.12.2
    1.12.4

    Adresse IP de gestion inaccessible

    Lors d'une mise à niveau, l'adresse IP de gestion d'un serveur est inaccessible, en particulier après une mise à niveau de l'OS du commutateur.

    Avec Rocky Linux, lorsque des routes statiques sont ajoutées, l'adresse IP de destination utilisée pour atteindre les routes statiques doit être accessible avant l'ajout des routes statiques. Si le commutateur redémarre après une mise à niveau de l'OS, cette adresse IP de gestion peut être temporairement inaccessible.

    Solution :

    Établissez une connexion SSH au serveur à l'aide de l'adresse IP des données, puis redémarrez le service réseau pour recréer les routes statiques manquantes :

    systemctl restart NetworkManager.service
    Système de gestion des demandes 1.12.2

    Échec de la synchronisation de la base de connaissances du système de gestion des demandes

    Symptômes :

    Lors d'une synchronisation de la base de connaissances, l'erreur suivante peut s'afficher :

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

    Solution :

    Ajoutez une propriété système pour augmenter la longueur maximale :

    1. Sur la plate-forme ServiceNow, saisissez sys_properties.list dans le filtre de navigation.
    2. Cliquez sur New (Nouveau).
    3. Dans le champ Nom, saisissez glide.rest.max_content_length.
    4. Dans le champ Type, sélectionnez string.
    5. Dans le champ Valeur, saisissez 15.
    6. Cliquez sur Envoyer.
    7. Synchronisez à nouveau la base de connaissances.
    Système de gestion des demandes 1.12.2

    Le système de gestion des demandes n'a aucun élément opérationnel en amont

    Symptômes :

    Lorsque vous déployez manuellement l'organisation gdchservices, le système de gestion des tickets ne dispose d'aucun serveur en amont opérationnel, aucune VM n'est créée et le pod midserver n'est pas opérationnel dans le cluster gdchservices-system de l'espace de noms support.

    Solution :

    Créez une ressource personnalisée TicketingSystem avec l'image de VM appropriée dans le cluster gdchservices-admin :

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

    Échec de la connexion SSH à une VM avec une adresse IP de gestion et les journaux Cilium

    Symptômes :

    L'accès à la connexion ne fonctionne pas pour une VM avec une adresse IP de gestion. Une erreur semblable à celle-ci peut s'afficher dans les journaux de pods anetd :

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

    Solution :

    Supprimez le pod virt-launcher pour la VM.

    Mettre à niveau 1.12.2

    La mise à jour du sous-composant mz-etcd met à jour spec.deployTarget et spec.Namespace, ce qui entraîne l'échec de la mise à niveau de la version 1.11.x vers la version 1.12.x.

    Symptômes :

    Lors de la mise à niveau de la version 1.11.x vers la version 1.12.x, une erreur semblable à celle-ci peut s'afficher :

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

    Avant une mise à niveau, le sous-composant mz-etcd présente la spécification suivante :

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

    Solution :

    1. Supprimez les sous-composants suivants sur le cluster d'administrateur racine :
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n root mz-etcd
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n org-1 mz-etcd
    2. Vérifiez le sous-composant dans les espaces de noms racine et d'organisation :
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get subcomponent -n root mz-etcd -o yaml
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get subcomponent -n org-1 mz-etcd -o yaml
    3. Le nouveau sous-composant doit présenter les spécifications suivantes et l'URL de chat doit indiquer la version vers laquelle les clusters ont déjà été migrés :
                backend:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-backend:1.12.2-gdch.785
          ...
            dash:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-dash:1.12.2-gdch.785
          ...
            deployTarget: Remote
            namespace: mz-system
            mon:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-mon:1.12.2-gdch.785
                upgradeHookPolicy: OnVersionChange
          ...
            targetClusterName: root-admin
            targetClusterNamespace: root
            webhooks:
              helmManifestSpec:
                chartURL: gcr.io/mz-etcd-webhooks:1.12.2-gdch.785
                upgradeHookPolicy: OnVersionChange
    Mettre à niveau 1.12.2

    La mise à niveau du stockage d'objets affiche une erreur lors de la vérification post-vol ou pré-vol

    Symptômes :

    Les vérifications préliminaires ou post-déploiement échouent et génèrent une erreur. Vérifiez les journaux :

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

    L'erreur peut se présenter comme suit :

     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

    Solution :

    Si l'erreur se produit lors des vérifications post-vol et que toutes les autres vérifications sont effectuées sans erreur, ignorez les vérifications post-vol. Lorsque la mise à niveau redémarre, vous devez également ignorer les vérifications préliminaires à l'aide du fichier kubeconfig de l'administrateur racine :

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

    Par exemple, si l'erreur se produit sur l'organisation 1, la commande se présente comme suit :

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

    Si l'erreur se produit lors des vérifications préliminaires et que toutes les autres vérifications préliminaires sont effectuées sans erreur, ignorez les vérifications préliminaires :

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

    Par exemple, si l'erreur se produit sur l'organisation 1, la commande se présente comme suit :

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

    Vous devrez peut-être appliquer cette solution plusieurs fois si elle ne fonctionne pas.

    Portefeuille ATAT 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Échec de la synchronisation du portfolio

    Symptômes :

    ConfigSync génère une erreur avec le message suivant :

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

    Solution :

    Le schéma Portfolio a été modifié dans la version 1.12 de GDC. Le champ portfolioName a été refactorisé en portfolioID. Recherchez le fichier YAML contenant la ressource personnalisée de portefeuille mentionnée dans le message d'erreur. Renommez le champ portfolioName en portfolioID.

    Mettre à niveau 1.12.2

    L'échec de OSPolicy NTP empêche l'exécution de tous les autres OSPolicies.

    Symptômes :

    Voici les raisons potentielles pour lesquelles une tâche en cours n'est pas créée pour une tâche de correctif qui n'a effectué que des tâches de prévol :

    1. Si le protocole NTP échoue, aucune autre tâche de correctif ne peut s'exécuter.
    2. Le nœud est non opérationnel.
    3. L'agent OS Config n'est pas en cours d'exécution.
    4. L'agent OS Config ne peut pas communiquer avec le service OS Config.
    5. Un problème est survenu avec le service OS Config.

    Solution :

    1. Vérifiez le CR `NodeTargetPolicy` du nœud.
    2. Recherchez `.spec.osPolicies` du CR `NodeTargetPolicy` qui a `ref.name=admin-ntp-policy` et `type: Ready` avec l'état "false" :
            # Enter the node InventoryMachine name.
            NAME=
            kubectl get nodetargetpolicy -n gpc-system $NAME -ojsonpath="{.spec.osPolicies}" | jq
    3. Le résultat ressemble à ceci :
       - conditions:
                - lastTransitionTime: "2024-04-19T19:12:01Z"
                  message: ""
                  observedGeneration: 7
                  reason: Complete
                  status: "True"
                  type: PolicyPreflightCompleted
                - lastTransitionTime: "2024-04-19T19:12:01Z"
                  message: ""
                  observedGeneration: 7
                  reason: None
                  status: "True"
                  type: PolicyConflictNone
                - lastTransitionTime: "2024-04-19T19:56:35Z"
                  message: ""
                  observedGeneration: 7
                  reason: Reconciled
                  status: "True"
                  type: Ready
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    4. Supprimez toutes les conditions de ces "osPolicies" et ne conservez que la partie suivante :
      - conditions:
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    Mettre à niveau 1.12.3
    1.12.4

    NodeUpgrade affiche Rocky Linux

    Symptômes :

    La ressource personnalisée NodeUpgrade mentionne version: rocky-86-xyz dans sa spécification, même si le nœud en cours de mise à niveau est Ubuntu.

    Solution :

    Vous n'avez pas besoin de solution de contournement, car ces informations sont inoffensives. Le nœud est correctement mis à niveau vers une version plus récente d'Ubuntu.

    SIEM 1.12.0
    1.12.1
    1.12.2
    1.12.3
    1.12.4

    Échec des tâches de préinstallation SIEM

    Symptômes :

    Les jobs siem-*-preinstall dans l'espace de noms racine et org-1 du cluster d'administrateur racine échouent à plusieurs reprises.

    Solution :

    Il est normal que les jobs échouent lorsque le feature gate SIEMComponent est désactivé. Ces échecs n'indiquent pas que le composant est défaillant. La réconciliation du composant SIEM peut être suspendue si le bruit est perturbant, mais il est généralement recommandé de laisser le composant activé si possible. Si la réconciliation des composants est suspendue, elle doit être réactivée manuellement lorsque l'installation du composant SIEM n'est plus bloquée dans les futures mises à niveau.

    Mise à niveau des nœuds 1.12.0 
    1.12.1 
    1.12.2

    Échec de la mise à niveau des nœuds en raison d'un fichier lvm.conf obsolète

    Symptômes :

    Il est possible que vgs, blkid et gather_facts d'Ansible ne répondent pas. Ce problème affecte les systèmes d'exploitation Rocky et Ubuntu.

    Suivez ces étapes si les nœuds sont déjà mis à niveau. Pour mettre à jour le fichier lvm.conf, procédez comme suit :

    1. Obtenez la liste de tous les nœuds pour que ce correctif puisse leur être appliqué.
    2. Créez un playbook Ansible et un fichier de règles OS.
    3. Appliquez le correctif aux nœuds.
    4. Vérifiez si le correctif a été appliqué.

    Prérequis :

    1. Suivez les étapes du runbook IAM-R0004 pour générer le ROOTCONFIG pour le cluster d'administrateur racine et le ORGCONFIG pour le cluster d'administrateur de l'organisation.
    2. Suivez les étapes du runbook IAM-R0005 pour obtenir les rôles suivants de l'organisation.

    Solution :

    1. Identifiez les InventoryMachines qui correspondent aux clusters :
      kubectl --kubeconfig=$ROOTCONFIG get inventorymachines
          kubectl --kubeconfig=$ORGCONFIG get inventorymachines

      Séparez les résultats. Corrigez un cluster à la fois. Le résultat peut ressembler à ceci :

          NAME
          bm-2bca8e3f
          bm-4caa4f4e
    2. Créez un playbook et un fichier de règles :
      apiVersion: system.private.gdc.goog/v1alpha1
          kind: AnsiblePlaybook
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            playbook: |
              - name: Add a device filter to /etc/lvm/lvm.conf
                hosts: all
                gather_facts: no
                tasks:
                  # Change lvm.conf
                  - name: Configure lvm for filtering out "dm" and "sg" devices
                    ansible.builtin.lineinfile:
                      path: /etc/lvm/lvm.conf
                      insertafter: '^(\s+|)devices(\s+|)\{'
                      line: '  filter = [ \"r|/dev/dm.|\", \"r|/dev/sg.|\" ]'
      
          ---
          apiVersion: system.private.gdc.goog/v1alpha1
          kind: OSPolicy
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            interval:
              period: 1m
            inventory:
               # this is the inventory from step 1 above,
               # see the syntex below
            policy:
              installPlaybook:
                name: lvm-conf-device-filter-node-update
    3. La section "Inventaire" précédente doit être remplie comme dans cet exemple. Ajoutez un paragraphe par nœud trouvé à l'étape 1. Vous allez travailler sur un cluster à la fois. Remplissez donc la section "inventory" avec les nœuds d'un seul cluster.
      inventory:
            # Node: bm-2bca8e3f
            - apiVersion: baremetal.cluster.gke.io/v1
              kind: InventoryMachine
              name: bm-2bca8e3f
      
            # Node: bm-4caa4f4e
            - apiVersion: baremetal.cluster.gke.io/v1
              kind: InventoryMachine
              name: bm-4caa4f4e
    4. Appliquez le correctif au cluster d'administrateur racine :
      kubectl --kubeconfig=$ROOTCONFIG apply -f PRECEDING_FILENAME_WITH_ROOT_NODES
    5. Appliquez le correctif au cluster d'administrateur de l'organisation :
      kubectl --kubeconfig=$ORGCONFIG  apply -f PRECEDING_FILENAME_WITH_ORG_NODES
    6. Redémarrez le serveur pour que le nouveau paramètre prenne effet.
    7. Suivez les étapes du runbook OS-P0005 pour vérifier que les nœuds sont mis à jour.
    8. Après avoir vérifié que la règle a bien été appliquée, supprimez-la à l'aide de l'outil k9s :
      1. Accédez aux règles d'OS, telles que :ospolicies.
      2. Recherchez et sélectionnez la règle lvm-conf-device-filter-node-update.
      3. Appuyez sur Ctrl+d.
      4. Confirmez la suppression.

    Pour escalader ce problème, créez une demande à l'aide du runbook SUPP-G0008. La demande doit inclure les informations suivantes :

    1. Commandes exécutées et leurs messages de sortie
    2. Détails tels que InventoryMachineName et les clusters
    3. Messages de journal
    Système d'exploitation 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Rocky OS est sélectionné à tort pour les nouveaux clusters ou les nouvelles organisations

    Symptômes :

    Ce problème se produit si l'environnement a été déployé précédemment avec la version 1.11, puis mis à niveau vers la version 1.12. Lorsque vous créez un cluster ou une organisation dans une version 1.12.x, Rocky OS est sélectionné plutôt qu'Ubuntu OS pour le provisionnement des nœuds Bare Metal et de machine virtuelle en raison de la version Rocky OS spécifiée dans les CR ReleaseMetadata et Userclustermetadata.

    Solution :

    Appliquez la solution de contournement suivante avant de créer une organisation :

    1. Vérifiez s'il existe des CR OrganizationUpgrade qui ne sont pas à l'état Succeeded: true :
      for item in $(kubectl --kubeconfig=KUBECONFIG get OrganizationUpgrade -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace --no-headers); do
        NAME=$(echo $item | awk '{print $1}')
        NAMESPACE=$(echo $item | awk '{print $2}')
        STATUS=$(kubectl --kubeconfig=KUBECONFIG get organizationupgrade ${NAME} -n ${NAMESPACE} -o json | jq '.status.conditions[] |  select(.type=="Succeeded") | .status')
        if [[ "$STATUS" != "True" ]]; then
           echo "Not in Succeeded: true state, stop following operations"
        fi
      done

      Si c'est le cas, escaladez le problème à l'équipe d'ingénieurs avant de passer aux étapes suivantes.

    2. Supprimez tous les CR OrganizationUpgrade existants pour éviter les mises à niveau accidentelles de l'OS des nœuds :
      for item in $(kubectl --kubeconfig=KUBECONFIG get OrganizationUpgrade -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace --no-headers); do
        NAME=$(echo $item | awk '{print $1}')
        NAMESPACE=$(echo $item | awk '{print $2}')
        echo "Deleting OrganizationUpgrade $NAME in namespace $NAMESPACE"
        kubectl --kubeconfig=KUBECONFIG delete OrganizationUpgrade $NAME -n $NAMESPACE
      done
    3. Définissez la version GDC cible pour la création de la nouvelle organisation. Il doit exister des métadonnées de version correspondantes pour cette version cible :
      TARGET_RELEASE=
    4. Identifiez la dernière CR OSImageMetadata pour l'OS Ubuntu cible dans le cluster d'administrateur racine et définissez la variable OS_VERSION :
      OS_VERSION=$(kubectl --kubeconfig=KUBECONFIG get osimagemetadata --sort-by=.metadata.creationTimestamp | grep -wv rocky | tail -1 |  awk '{print $1}' |  sed 's/gdch-node-os-//g')
      
      echo $OS_VERSION

      Le résultat peut ressembler à ceci :

      1.12.4-gdch.4

      Assurez-vous que la variable utilise la même version majeure.mineure.correctif, telle que 1.12.4, que TARGET_RELEASE. Si ce n'est pas le cas, contactez l'équipe d'ingénieurs avant de passer aux étapes suivantes.

    5. Mettez à jour le ReleaseMetadata cible pour utiliser le OS_VERSION Ubuntu dans le cluster d'administrateur racine :
      kubectl --kubeconfig=KUBECONFIG patch releasemetadata "${TARGET_RELEASE}" --type='json' -p='[{"op": "replace", "path": "/spec/adminCluster/bmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/adminCluster/vmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/systemCluster/bmNodeImage", "value": '"${OS_VERSION}"'}, {"op": "replace", "path": "/spec/systemCluster/vmNodeImage", "value": '"${OS_VERSION}"'}]'
    6. Identifiez la liste UserclusterMetadata mappée pour la ReleaseMetadata cible :
      UCMS=$(kubectl --kubeconfig=KUBECONFIG get releasemetadata  "${TARGET_RELEASE}" -o json | jq -r '.spec.userClusters[].name')
    7. Mettez à jour le UserclusterMetadata cible pour utiliser le OS_VERSION Ubuntu dans le cluster d'administrateur racine et le cluster d'administrateur de l'organisation pour chaque organisation. Exécutez la commande suivante pour chaque cluster :
      for UCM in ${UCMS}; do
        echo "Updating UserclusterMetadata $UCM"
        kubectl --kubeconfig=KUBECONFIG patch userclustermetadata.upgrade.private.gdc.goog "${UCM}" --type='json' -p='[{"op": "replace", "path": "/spec/vmNodeImage", "value": '"${OS_VERSION}"'}]'
      done
    Machines virtuelles 1.12.1
    1.12.2
    1.12.4

    L'importation d'images BYO échoue pour les images qcow2 et brutes

    Symptômes :

    Lorsque des images de VM locales sont importées à l'aide de la CLI gdcloud compute images import, l'état de l'importation reste bloqué sur WaitingForTranslationVM ou ImportJobNotCreated. En effet, le disque temporaire créé pour la traduction ou l'importation utilise exactement la même taille que l'image qcow2 ou brute, mais LUKS ajoute une surcharge de quelques Mio, ce qui entraîne l'échec du provisionnement du disque.

    Solution :

    Créez manuellement un VirtualMachineImageImport avec le même nom d'image, mais avec un spec.minimumDiskSize plus grand. Par exemple, si la commande utilisée pour importer l'image était la suivante :

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

    Si le VirtualMachineImageImport d'origine créé automatiquement par la CLI a minimumDiskSize comme X Gio, créez-en un avec X+1 Gio. La valeur est basée sur la taille de l'image importée. Dans le cas de qcow2, il s'agit de la taille virtuelle. Par exemple, 20 Gio doit être remplacé par 21 Gio.

    Remplacez les valeurs des espaces réservés en fonction de la façon dont la CLI a été appelée.

    1. Recherchez le VirtualMachineImageImport :
      kubectl get virtualmachineimageimport $IMPORT_NAME -n $PROJECT -o yaml

      Si l'objet n'est pas présent, déclenchez à nouveau la commande gdcloud compute images import .... Une fois que la sortie de la console passe de Uploading image to ... à Image import has started for ..., appuyez sur CTRL+C pour que l'image locale soit importée dans le stockage d'objets et que le VirtualMachineImageImport soit conservé pour référence afin d'en créer un.

    2. Créez un VirtualMachineImageImport avec un minimumDiskSize plus grand :
      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
    Machines virtuelles 1.12.0
    1.12.1
    1.12.2
    1.12.3

    L'importation d'images est bloquée sur "TranslationInProgress"

    Symptômes :

    Le pod importer-image-import-$VMII dans l'espace de noms du projet du cluster système plante avec l'erreur suivante : Unable to process data: Unable to transfer source data to target file: unable to write to file: stream error: stream ID 1; NO_ERROR; received from peer`). L'objet VMII VirtualMachineImageImport présente la condition Type Ready avec l'état False et le motif TranslationInProgress deux heures après le début de l'importation.

    Solution :

    Pour améliorer la vitesse, modifiez la taille de disque minimale de l'image sur 200 Gio comme suit :

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

    Notez que pour supprimer et appliquer le ValidatingWebhookConfiguration, vous avez besoin du fichier kubeconfig de l'administrateur du cluster pour le cluster d'administrateur de l'organisation. Vous pouvez obtenir le runbook suivant : IAM-R0004.

    Si vous utilisez gdcloud pour lancer l'importation, notez qu'il n'existe aucun moyen de fournir le paramètre minimumDiskSize. Vous devez créer un objet VMII et le modifier comme indiqué dans la commande précédente.

    Le processus VirtualMachineImageImport se poursuit, mais se bloque à nouveau à une étape ultérieure. Dans l'espace de noms du projet du cluster système, le job image-import-$VMII échoue en permanence avec l'erreur error: stream error: stream ID x; NO_ERROR; received from peer. À ce stade, l'importation d'images est terminée. L'image finale est importée dans le stockage d'objets, mais le VirtualMachineImage est manquant. Vous pouvez créer manuellement un VirtualMachineImage comme suit :

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

    `$NAME` doit correspondre à `VMII.ImageMetadata.Name`, et `$OS_NAME` peut être l'une des valeurs suivantes : [`ubuntu-2004`, `ubuntu-2204`, `windows-2019`, `rhel-8`]. Il doit correspondre au type d'image importée.

    Istio 1.12.4

    Le déploiement istio-eastwestgateway dans l'espace de noms istio-system est bloqué.

    Symptômes :

    Le déploiement istio-eastwestgateway dans l'espace de noms istio-system est bloqué, et les événements de pod affichent une erreur Back-off pulling image "auto" provenant de kubelet.

    Pour diagnostiquer le problème, vérifiez si le mutatingwebhookconfiguration nommé istio-revision-tag-default existe dans le même cluster que le déploiement de passerelle bloqué.

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

    Solution :

    • Si la configuration existe, redémarrez le déploiement istio-eastwestgateway dans l'espace de noms istio-system.
      kubectl --kubeconfig=KUBECONFIG rollout restart deployment/istio-eastwestgateway -n istio-system
    • Si la configuration n'existe pas, attendez que le webhook existe, ce qui devrait se produire sous peu, car il se trouve dans une boucle de réconciliation.
    Surveillance 1.12.2

    cortex-store-gateway redémarrage avec une erreur de limites de tranche hors plage

    Symptômes :

    Les pods cortex-store-gateway redémarrent avec le message d'erreur suivant dans les journaux :

    panic: runtime error: slice bounds out of range

    Solution :

    1. Mettez en veille le sous-composant mon-cortex dans le cluster système.
      kubectl --kubeconfig $ORG_ADMIN_CONFIG annotate subcomponent mon-cortex -n $SYSTEM_CLUSTER_NAMESPACE lcm.private.gdc.goog/paused=true
    2. Modifiez le configMap cortex-config dans le cluster système et définissez le délai avant expiration de memcached dans index_cache sur deux secondes afin que la configuration index_cache se présente comme suit :
       index_cache:
            backend: memcached
            memcached:
              addresses: dnssrvnoa+_memcached._tcp.cortex-index-memcached.mon-system.svc.cluster.local
              timeout: 2s
    3. Redémarrez les pods cortex-store-gateway dans le cluster système afin qu'ils utilisent la configuration mise à jour.
    Mettre à niveau 1.12.4

    Le redémarrage du nœud d'administrateur racine lors de la mise à niveau entraîne l'échec d'un sous-composant

    Symptômes :

    Le nœud Bare Metal s'affiche sous la forme NotReady et le serveur est bloqué sur l'écran de démarrage avec le dernier message Retrieving encryption keys.

    Solution :

    1. Redémarrez iLO.
    2. Une fois iLO de nouveau opérationnel, redémarrez le serveur.
    Mettre à niveau 1.12.4

    Le numéro de version de storagecluster ne s'affiche pas lors de la mise à niveau

    Symptômes :

    Après la mise à niveau, le CR StorageCluster n'affiche aucune valeur pour le champ d'état StorageVersion. Vérifiez la version :

    kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get StorageCluster -n gpc-system
    Suivez la procédure de contournement si le champ "Version" est vide.

    Solution :

    Redémarrez le déploiement file-storage-backend-controller :

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

    Infrastructure de la suite Operations (OI) 1.12.4

    Le chemin d'accès au programme d'installation de Fluent Bit est incorrect

    Symptômes :

    L'emplacement de l'installateur fluent-bit est passé à operations_center\bin\fluent-bit-win64.msi. Copy-ConfigHostFiles.ps1 s'attend à ce que le programme d'installation du client fluent-bit corresponde au modèle fluent-bit-*-win64.*. Le programme d'installation ne trouve pas le programme d'installation, car ce modèle ne correspond plus.

    Solution :

    1. Ouvrez le fichier Copy-ConfigHostFiles.ps1.
    2. Recherchez la ligne suivante :
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-*-win64.*').FullName
    3. Modifiez la ligne précédente pour ajouter l'emplacement correct du programme d'installation :
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-win64.*').Name
    Infrastructure de la suite Operations (OI) 1.12.4

    Le chemin d'accès au programme d'installation de Nessus est incorrect

    Symptômes :

    L'emplacement du programme d'installation de Nessus a été modifié et se trouve désormais à l'adresse operations_center\bin\NessusAgent-x64.msi. Copy-ConfigHostFiles.ps1 s'attend à ce que le programme d'installation du client corresponde au nom de fichier /NessusAgent-10.4.1-x64.msi. Le programme d'installation ne trouve pas le programme d'installation, car ce modèle ne correspond plus.

    Solution :

    1. Ouvrez le fichier Copy-ConfigHostFiles.ps1.
    2. Recherchez les lignes suivantes :
      [pscustomobject]@{source = "H:\operations_center\bin\Nessus-10.4.1-x64.msi"; destination = "C:\config\nessus_mgr\Nessus-10.4.1-x64.msi" }
      [pscustomobject]@{source = "H:\operations_center\bin\Nessus-10.4.1-x64.msi"; destination = "C:\config\nessus_oob\Nessus-10.4.1-x64.msi" }
    3. Modifiez les lignes précédentes pour ajouter l'emplacement correct du programme d'installation, en remplaçant Nessus-10.4.1-x64.msi par NessusAgent-x64.msi :
      [pscustomobject]@{source = "H:\operations_center\bin\NessusAgent-x64.msi"; destination = "C:\config\nessus_mgr\NessusAgent-x64.msi" }
      [pscustomobject]@{source = "H:\operations_center\bin\NessusAgent-x64.msi"; destination = "C:\config\nessus_oob\NessusAgent-x64.msi" }
    Stockage d'objets 1.12.4

    La création d'une organisation reste bloquée à l'état VMImageDistributing

    Symptômes :

    Un message de ce type peut s'afficher :

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

    Ce problème est dû à l'absence de configuration du point de terminaison S3 pour la nouvelle organisation.

    Solution :

    Créez manuellement un groupe HA pour la nouvelle organisation.

    1. Grâce à la procédure de récupération d'urgence, obtenez un fichier kubeconfig du cluster administrateur racine qui dispose d'un accès en lecture aux ressources suivantes :
      • Organisation
      • ObjectStorageAdminNode
      • SubnetClaim
      • ObjectStorageSite
      • Secret
    2. Notez le nom de l'organisation :
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get Organization -A
    3. Notez les adresses IP des clients des CR ObjectStorageAdminNode dans le cluster d'administrateur racine.
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode

      Pour chaque CR AdminNode :

      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode NODE_NAME -o jsonpath='{.spec.network.clientIP}'
    4. Notez la plage d'adresses IP disponibles et les adresses IP réservées dans cette plage :
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get SubnetClaim -n root external-objectstorage-client-lif-subnet -o jsonpath='{.status.ipv4SubnetStatus}'
    5. Récupérez les identifiants de connexion à l'interface utilisateur de gestion StorageGRID à partir du secret gpc-system/objectstorage-breakglass-root-level1 dans le cluster root-admin.
    6. Connectez-vous à l'interface utilisateur de gestion StorageGRID avec les identifiants de l'étape précédente. L'URL est à l'état ObjectStorageSite :
      kubectl --kubeconfig /root/release/root-admin/root-admin-kubeconfig get ObjectStorageSite -n gpc-system mb-obj-site-1 -o jsonpath='{.status.managementAPIEndpointURL}'
    7. Accédez à l'onglet Configuration, puis cliquez sur Groupes à haute disponibilité.
    8. Ouvrez la vue détaillée de chaque groupe HA et notez son adresse IP virtuelle (VIP).
    9. Créez un groupe HA :
      1. Nom du groupe : le modèle de nom est ORGANIZATION_NAME-ha. Dans ce cas, il s'agit de org-2-ha.
      2. Description du groupe : utilisez les groupes à haute disponibilité existants pour le modèle de description.
      3. Interfaces : sélectionnez toutes les interfaces eth2.
      4. Ordre de priorité : l'interface principale doit avoir la priorité la plus élevée.
      5. SubnetCIDR : ce champ est rempli automatiquement par StorageGRID. Vérifiez que le sous-réseau correspond à status.ipv4SubnetStatus.cidrBlock dans SubnetClaim external-objectstorage-client-lif-cidr.
      6. Adresse IP virtuelle : prochaine adresse IP disponible dans la plage d'adresses IP. L'adresse IP ne peut pas entrer en conflit avec l'adresse IP réservée, l'adresse IP du client du nœud d'administration ni les adresses IP virtuelles des groupes HA existants.
    10. Effectuez une rotation des identifiants StorageGRID "break glass".
    Mettre à niveau 1.12.4

    Réconciliation continue dans le sous-composant

    Symptômes :

    Lorsque vous mettez à niveau l'organisation racine de la version 1.12.2 vers la version 1.12.4, le sous-composant iac-gitlab présente un état de réconciliation en cours. Pour diagnostiquer le problème, consultez les journaux Prometheus, par exemple :

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

    Les journaux peuvent inclure une erreur semblable à celle-ci :

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

    Solution :

    1. Par exemple, exécutez sleep 3600 pour obtenir une interface système dans le conteneur en cours d'exécution.
      kubectl exec --stdin --tty POD_NAME -n gitlab-system -c prometheus-server -- /bin/sh
      /prometheus $ df -h

      Remplacez POD_NAME par le nom du pod, par exemple gitlab-prometheus-server-d7969c968-hppsl.

    2. Vérifiez la sortie pour voir si le dossier /data est plein :
      Filesystem                Size      Used Available Use% Mounted on
      overlay                 866.4G    147.1G    719.3G  17% /
      tmpfs                    64.0M         0     64.0M   0% /dev
      tmpfs                    94.3G         0     94.3G   0% /sys/fs/cgroup/dev/mapper/luks-trident_pvc_6fb4dc48_72df_4bf1_825f_267818e3fefd
                                7.8G      7.3G         0 100% /data
    3. Si ce problème se produit lors de la mise à niveau, supprimez le job de migration, car il a un délai d'expiration de 3 600 secondes, puis poursuivez la mise à niveau :
      kubectl delete job gitlab-migrations-1-fe7-2 -n gitlab-system
    Mettre à niveau 1.12.4

    Échec de la vérification préliminaire IAM

    Symptômes :

    Pour diagnostiquer le problème, consultez les journaux de mise à niveau IAM, par exemple :

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

    Le résultat peut ressembler à ceci :

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

    Solution :

    1. Reportez-vous au message d'erreur précédent et notez l'espace de noms et le nom du déploiement. Dans cet exemple, NAME est iam-authzpdp-backend-server et NAMESPACE est iam-system.
    2. Obtenez la liste des pods :
      kubectl get pods -n NAMESPACE | grep NAME
    3. Notez le résultat au format suivant :
      iam-authzpdp-backend-server-6875654c4b-64h4t            2/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-pvscg            1/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-v7jnl            2/2     Running   0             29h

      Notez le pod dont tous les conteneurs ne sont pas prêts. Dans ce cas, POD_NAME est iam-authzpdp-backend-server-6875654c4b-pvscg, ce qui signifie que l'un des deux conteneurs n'est pas prêt, comme l'indique l'état 1/2. S'il existe plusieurs pods de ce type, répétez l'étape suivante pour chaque pod concerné.

    4. Supprimez le pod qui n'est pas entièrement opérationnel :
      kubectl delete pod -n NAMESPACE POD_NAME>
    5. Exécutez à nouveau la commande de l'étape 2. Notez que tous les pods devraient maintenant être opérationnels. Cette étape peut prendre quelques minutes.
    6. Si le pod supprimé n'est pas remplacé par un pod opérationnel, ouvrez une demande d'assistance.
    Mettre à niveau 1.12.1
    1.12.2
    1.12.4

    L'état de OrganizationUpgrade est Unknown

    Symptômes :

    L'état OrganizationUpgrade est Unknown une fois la mise à niveau terminée.

    Solution :

    Si le champ de version sur Organization correspond au champ targetVersion, vous pouvez ignorer l'état "Inconnu".

    Mettre à niveau 1.12.4

    Échec de la mise à niveau du sous-composant pour opa gatekeeper

    Symptômes :

    Lors de la mise à niveau de l'organisation locataire de la version 1.12.2 à la version 1.12.4, la mise à niveau du sous-composant opa gatekeeper échoue avec un ReconciliationError.

    Solution :

    1. Modifiez l'objet mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg du cluster d'utilisateur concerné. S'il existe plusieurs clusters d'utilisateur concernés, répétez les étapes pour chacun d'eux :
           kubectl edit mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg
    2. Modifiez la section webhooks > (edr-sidecar-injector.gpc-system.internal) > namespaceSelector > matchExpressions > (key: kubernetes.io/metadata.name) > values pour y ajouter les deux valeurs suivantes :
      • opa-system
      • cert-manager

      L'objet mis à jour devrait se présenter comme suit :

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

    3. Un délai maximal d'une heure peut être nécessaire pour que les modifications résolvent le problème.
    Mettre à niveau 1.12.4

    ansibleplaybook n'est pas mis à niveau lors de la mise à niveau du cluster

    Symptômes :

    Lors de la mise à niveau de la version 1.12.2 vers la version 1.12.4, le ansibleplaybook n'est pas mis à niveau en même temps que le cluster. Les correctifs mis à jour dans ansibleplaybook ne sont pas appliqués et bloquent la stratégie OS qui exécute la version précédente de ansibleplaybook.

    Solution :

    1. Supprimez le job Kubernetes create-ansible-playbooks :
            JOB_NAME=create-ansible-playbooks-xxx
            JOB_NAMESPACE=xxx
            kubectl delete job $JOB_NAME -n JOB_NAMESPACE --kubeconfig=/path/to/admin-cluster-config 
    2. Redémarrez le déploiement os-core-controller.
    3. Cette action redéclenche les jobs et met à jour les playbooks.
    DNS 1.12.4

    Échec de la création de l'organisation, car le trafic DNS vers le nœud administrateur racine expire

    Symptômes :

    Lorsque vous créez une organisation, le sous-composant core-dns peut expirer dans les journaux :

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

    Solution :

    1. Mettez à jour les services gpc-coredns-forwarder-udp et gpc-coredns-forwarder-tcp du cluster d'administrateur racine, et ajoutez vos nouvelles plages d'adresses IP dans les plages sources de l'équilibreur de charge.
    2. Si les modifications du CR sont remplacées, mettez en veille le sous-composant dns-core avec l'annotation lcm.private.gdc.goog/paused="true".
    Stockage de fichiers et de blocs 1.12.4

    Échec du sous-composant file-netapp-trident sur le cluster racine

    Symptômes :

    Lors de la mise à niveau de la version 1.12.2 à la version 1.12.4, le sous-composant file-netapp-trident reste bloqué sur la suppression de StorageClasses. L'état suivant s'affiche :

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

    Solution :

    1. Mettez en veille le sous-composant file-netapp-trident :
            ## Set KUBECONFIG to root-admin KUBECONFIG
            export KUBECONFIG=ROOT_ADMIN_KUBECONFIG
            kubectl annotate subcomponent file-netapp-trident -n $cluster_namespace lcm.private.gdc.goog/paused=true
    2. Supprimez le StorageClasses que la tâche n'a pas réussi à créer, comme standard-rwo, standard-block, standard-rwo-non-luks et standard-block-non-luks :
            kubectl delete storageclass $(kubectl get storageclasses -o jsonpath='{.items[?(@.provisioner=="csi.trident.netapp.io")].metadata.name}
    3. Déclenchez la recréation de StorageClasses en redémarrant le contrôleur oclcm-backend-controller pour votre cluster (contrôleur root-admin pour les clusters root et d'administrateur d'organisation, contrôleur org-admin pour les clusters système et d'utilisateur) :
            kubectl rollout restart deployment oclcm-cm-backend-controller -n oclcm-system
    4. Redémarrez le déploiement netapp-trident et netapp-trident DaemonSet dans le cluster :
            kubectl rollout restart deployment netapp-trident-controller -n netapp-trident
            kubectl rollout restart daemonset netapp-trident-node-linux -n netapp-trident
    5. Vérifiez que le secret LUKS a été créé pour vos ressources PersistentVolumeClaim (PVC). Chaque PVC doit avoir un secret au format g-luks-$pvc_name.
            kubectl get secret -n $pvc_namespace g-luks-$pvc_name
    6. Vérifiez que le sous-composant file-netapp-trident ne présente aucune erreur dans l'état :
            kubectl get subcomponent -n $cluster_namespace file-netapp-trident -o jsonpath='{.status}' | jq
      Remarque : Les messages et le `backendStatus` ne doivent comporter aucune erreur. Le `crdStatus` doit afficher `delpoymentFinished: true`.
    7. Réactivez le sous-composant pour que les remplacements prennent effet.
    Serveurs physiques 1.12.4

    L'amorçage du serveur échoue

    Symptômes :

    Lors de l'amorçage du serveur, un message semblable à celui-ci peut s'afficher dans les journaux Bare Metal :

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

    Solution :

    1. Pour chaque phase bloquée, suivez les instructions des runbooks suivants :
      1. SERV-R0006
      2. SERV-R0007
      3. SERV-R0008
    2. Si le problème persiste, suivez les étapes du runbook SERV-R0001.
    3. Si le problème persiste, ouvrez une demande d'assistance.
    Mettre à niveau 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Les pods Prometheus principaux ne sont pas nettoyés lors de la mise à niveau

    Symptômes :

    Les pods primary-prometheus-shardX-replicaX sont visibles dans l'espace de noms obs-system et dans l'espace de noms mon-system. Si le primary-prometheus-shardX-replicaX n'existe que dans l'espace de noms obs-system après une mise à niveau vers la version 1.12, il s'agit d'un autre problème inconnu et la solution de contournement ne doit pas être appliquée.

    Le comportement prévu est que primary-prometheus-shardX-replicaX n'existe que dans l'espace de noms mon-system une fois la mise à niveau vers la version 1.12 terminée.

    Solution :

    1. Supprimez manuellement les StatefulSets primary-prometheus-shardX-replicaX dans l'espace de noms obs-system.
    2. Ne supprimez pas les StatefulSets primary-prometheus-shardX-replicaX dans l'espace de noms mon-system.
    Mise en réseau 1.12.4

    PodCIDR non attribué aux nœuds alors que ClusterCIDRConfig est créé

    Symptômes :

    Un ClusterCIDRConfig est un objet requis pour attribuer PodCIDRs. Bien que le ClusterCIDRConfig ait été créé, le PodCIDRs n'a pas été attribué. Ce problème se produit si un ClusterCIDRConfig est créé en même temps que les pods ipam-controller sont en cours d'amorçage. La création du cluster est bloquée dans l'état de rapprochement :

    1. Vérifiez si l'objet ClusterCIDRConfig est créé sur le cluster :
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get clustercidrconfigs -oyaml

      Le résultat peut ressembler à ceci :

      apiVersion: v1
          items:
          - apiVersion: networking.gke.io/v1alpha1
            kind: ClusterCIDRConfig
            metadata:
              annotations:
                baremetal.cluster.gke.io/managed: "true"
                kubectl.kubernetes.io/last-applied-configuration: |
                  {"apiVersion":"networking.gke.io/v1alpha1","kind":"ClusterCIDRConfig","metadata":{"annotations":{"baremetal.cluster.gke.io/managed":"true"},"creationTimestamp":null,"name":"root-admin-control-plane"},"spec":{"ipv4":{"cidr":"172.24.0.0/21","perNodeMaskSize":23},"ipv6":{"cidr":"fd00:1::2:0/112","perNodeMaskSize":119}},"status":{}}
              creationTimestamp: "2024-06-17T05:27:55Z"
              finalizers:
              - networking.kubernetes.io/cluster-cidr-config-finalizer
              generation: 1
              name: root-admin-control-plane
              resourceVersion: "2172"
              uid: d1216fe3-04ed-4356-a105-170d72d56c90
            spec:
              ipv4:
                cidr: 172.24.0.0/21
                perNodeMaskSize: 23
              ipv6:
                cidr: fd00:1::2:0/112
                perNodeMaskSize: 119
          kind: List
          metadata:
            resourceVersion: ""
    2. Exécutez la commande "describe" pour l'un des objets de nœud du cluster qui est bloqué dans la réconciliation, puis vérifiez si un événement CIDRNotAvailable est présent sur l'objet de nœud :
      kubectl --kubeconfig=CLUSTER_KUBECONFIG describe node NODE_NAME

      Les événements de sortie peuvent ressembler à ceci :

      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

    Solution :

    1. Redémarrez les pods ipam-controller-manager :
      kubectl --kubeconfig=CLUSTER_KUBECONFIG -n kube-system rollout restart ds ipam-controller-manager
    2. Une fois que les pods ipam-controller-manager sont en cours d'exécution, vérifiez si podCIDR est attribué aux nœuds :
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get nodes -oyaml | grep podCIDR

      Le résultat peut ressembler à ceci :

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

    Les API pré-entraînées affichent l'état Enabling dans l'interface utilisateur.

    L'MonitoringTarget affiche l'état Not Ready lorsque des clusters d'utilisateur sont en cours de création, ce qui entraîne l'affichage continu de l'état Enabling dans l'interface utilisateur pour les API pré-entraînées.

    Solution :

    1. Ouvrez le menu de votre navigateur Chrome (icône à trois points).
    2. Cliquez sur Plus d'outils > Outils pour les développeurs pour ouvrir la console.
    3. Cliquez sur l'onglet Réseau dans la console.
    4. Recherchez les demandes ai-service-status.
    5. Cliquez sur l'onglet Réponse d'une requête ai-service-status pour afficher le contenu de cette requête.
    6. Vérifiez que tout semble prêt, à l'exception des composants MonitoringTarget et LoggingTarget.
    Stockage d'objets 1.12.4

    Certains avertissements de mise à niveau du stockage d'objets peuvent être ignorés

    Symptômes :

    Lorsque vous mettez à niveau le stockage d'objets, un avertissement semblable à celui-ci peut s'afficher :

     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

    Solution :

    1. Vérifiez que chaque nœud dispose d'identifiants SSH correspondants stockés dans un secret.
      1. Vérifiez les nœuds d'administrateur :
        kubectl get objectstorageadminnodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done
      2. Vérifiez les nœuds de stockage :
        kubectl get objectstoragestoragenodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done

      Voici un exemple de résultat positif pour les nœuds de stockage :

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

      Si aucun secret n'est trouvé, l'erreur se présente comme suit :

      Error from server (NotFound): secrets "gpcstgeadm02-gce-gpcstgesite01-ssh-creds" not found
    2. Si la commande ne renvoie aucune erreur, vous pouvez ignorer sans risque les erreurs signalées par les réconciliateurs.
    Vertex AI 1.11.x
    1.12.x

    Le pod et le service frontend de traduction ne parviennent pas à s'initialiser

    Symptômes :

    Lors des mises à niveau, le cluster de base de données Translation est recréé, ce qui entraîne l'obsolescence et la désynchronisation du secret secret-store du cluster système ODS. C'est pourquoi l'initialisation du pod et du service de l'interface de traduction échoue.

    Solution :

    Supprimez le secret dans le cluster système :

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

    Remplacez SYSTEM_CLUSTER_KUBECONFIG par le chemin d'accès au fichier kubeconfig dans le cluster système.

    Un contrôleur recrée automatiquement le secret et le resynchronise avec le cluster de bases de données.

    Serveurs physiques 1.12.4

    Le serveur ne peut pas se connecter au gestionnaire de clés

    Symptômes :

    Le serveur ne peut pas se connecter au gestionnaire de clés, ce qui empêche l'état du serveur de devenir disponible. Ce problème entraîne l'échec du job server-encrypt-and-create-logical-drive et l'indisponibilité du cluster d'administrateur. Une erreur semblable à celle-ci peut s'afficher dans les journaux des tâches :

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

    Solution :

    Effectuez un AuxCycle et vérifiez que iLO peut se connecter au gestionnaire de clés.

    Journalisation 1.12.4

    Le journal WAL remplit le volume persistant

    Symptômes :

    Loki ne dispose que d'un seul volume persistant (PV) pour les journaux WAL (Write-Ahead Logs) et les index. Le WAL peut remplir le PV si un pod Loki ne parvient pas à se connecter au bucket de stockage pendant des heures. Si le PV n'a plus d'espace, Loki ne peut pas récupérer, sauf si vous supprimez le PV et redémarrez StatefulSet.

    Solution :

    Pour récupérer un pod Loki dans cet état, vous devez réduire l'échelle du StatefulSet correspondant et supprimer le PV sans espace disponible.

    Pour récupérer le pod Loki :

    1. Assurez-vous que le conteneur d'outils d'E/S est installé sur le poste de travail. Pour en savoir plus, consultez le manuel d'utilisation OOPS-P0065.
    2. Pour obtenir les autorisations nécessaires pour modifier les ressources, demandez à votre Administrateur de sécurité de vous accorder les rôles suivants :
      • observability-viewer
      • observability-admin
    3. Définissez la variable d'environnement KUBECONFIG avec le chemin d'accès au fichier kubeconfig dans le cluster d'administrateur racine. Pour en savoir plus, consultez le runbook IAM-R0004.
    4. Définissez la variable d'environnement ORG_NAME sur le nom de l'organisation concernée.
    5. Enregistrez le contenu suivant dans un fichier YAML nommé log-admin-overrides.yaml :
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: "LoggingPipelineReconciler"
    6. Désactivez LoggingPipelineReconciler :
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    7. Définissez la variable d'environnement KUBECONFIG avec le chemin d'accès au fichier kubeconfig dans le cluster où le pod Loki concerné est en cours d'exécution. Pour en savoir plus, consultez le runbook IAM-R0004.
    8. Définissez la variable d'environnement LOKI_POD_NAME avec le nom du pod Loki concerné.
    9. Obtenez le nom StatefulSet de Loki :
      export LOKI_STATEFULSET_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.metadata.labels.app')
    10. Obtenez le nom de la PVC Loki :
      export LOKI_PVC_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.spec.volumes[] | select(.persistentVolumeClaim != null) | .persistentVolumeClaim.claimName')
    11. Obtenez les répliques Loki StatefulSet :
      export LOKI_STATEFULSET_REPLICAS=$(kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system -o json | jq -r '.status.replicas')
    12. Réduisez la valeur de StatefulSet Loki :
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=0
    13. Vérifiez qu'aucun pod StatefulSet n'est en cours d'exécution :
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      Le résultat doit ressembler à l'exemple ci-dessous :

      NAME                      READY   AGE
      audit-logs-loki-io        0/0     4d3h
    14. Supprimez la PVC concernée :
      kubectl delete pvc $LOKI_PVC_NAME -n obs-system
    15. Augmentez la capacité de StatefulSet Loki :
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=${LOKI_STATEFULSET_REPLICAS}
    16. Définissez la variable d'environnement KUBECONFIG avec le chemin d'accès au fichier kubeconfig dans le cluster d'administrateur de l'organisation concernée. Pour en savoir plus, consultez le runbook IAM-R0004.
    17. Modifiez le contenu du fichier YAML log-admin-overrides.yaml comme suit :
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
        namespace: root
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: ""
    18. Activez LoggingPipelineReconciler :
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    19. Vérifiez que tous les pods StatefulSet sont en cours d'exécution et opérationnels :
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      Le résultat doit ressembler à l'exemple ci-dessous :

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

      Dans ce cas, les cinq instances dupliquées de StatefulSet sont disponibles (5/5).

    Mettre à niveau 1.12.4

    Les jobs sont planifiés en continu

    Symptômes :

    Les jobs sont planifiés en continu. Dès qu'une tâche est terminée, une nouvelle tâche est planifiée. Voici les jobs qui sont planifiés en continu :

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

    Solution :

    1. Mettez en veille les sous-composants suivants :
      • unet-networkpolicy
      • unet-nodenetworkpolicy
      • unet-nodenetworkpolicy
      • unet-userclusterpolicy
      • unet-clustermesh
    2. Réactivez les sous-composants chaque fois que le secret fleet-info est modifié dans le cluster d'administrateur racine. Ce problème se produit lorsque les commutateurs de gestion de l'instance sont modifiés, par exemple kr get managementswitches -A, ou lorsqu'un cidrclaim est modifié dans l'espace de noms de l'organisation.
    3. Réactivez les sous-composants chaque fois qu'une ressource NodePool est modifiée dans le cluster d'administration de l'organisation. Réactivez les sous-composants avant de commencer.
    Mettre à niveau 1.12.4

    L'élément opérationnel en amont pour ServiceNow n'est pas disponible

    Symptômes :

    1. Lors de la mise à niveau de la version 1.12.2 vers la version 1.12.4, un upstream opérationnel pour ServiceNow n'est pas disponible. Le message suivant peut s'afficher : failed to stage volume: LUKS passphrase cannot be empty.
    2. La classe de stockage system-performance-rwo n'est pas activée pour LUKS. La pièce jointe du volume indique que le PVC est compatible avec LUKS.
    3. Le reconciler recherche un secret contenant les phrases secrètes LUKS. Étant donné que la pièce jointe du volume indique qu'il est compatible avec LUKS, mais que la classe de stockage ne l'est pas, le mot de passe secret n'est pas créé.

    Solution :

    1. Obtenez le Kubeconfig pour le cluster racine ou d'administrateur de l'organisation où le problème se produit :
            export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    2. Supprimez la classe de stockage system-performance-rwo et recréez-la :
            kubectl delete storageclass system-performance-rwo
            kubectl apply -f system-performance-rwo.yaml
    3. Créez un fichier YAML pour la classe de stockage system-performance-rwo et activez LUKS :
                 # kubectl get sc system-performance-rwo -o yaml
           allowVolumeExpansion: true
           apiVersion: storage.k8s.io/v1
           kind: StorageClass
           metadata:
             annotations:
               disk.gdc.goog/luks-encrypted: "true"
               helm.sh/resource-policy: keep
               lcm.private.gdc.goog/claim-by-force: "true"
               meta.helm.sh/release-name: file-netapp-trident-backend
               meta.helm.sh/release-namespace: netapp-trident
               storageclass.kubernetes.io/is-default-class: "false"
             labels:
               app.kubernetes.io/managed-by: Helm
             name: system-performance-rwo
           parameters:
             backendType: ontap-san
             csi.storage.k8s.io/node-expand-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-expand-secret-namespace: ${pvc.namespace}
             csi.storage.k8s.io/node-publish-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-publish-secret-namespace: ${pvc.namespace}
             csi.storage.k8s.io/node-stage-secret-name: g-luks-${pvc.name}
             csi.storage.k8s.io/node-stage-secret-namespace: ${pvc.namespace}
             fsType: ext4
             selector: tier=performance
           provisioner: csi.trident.netapp.io
           reclaimPolicy: Delete
           volumeBindingMode: Immediate
    Mettre à niveau 1.12.4

    La mise à niveau du sous-composant file-netapp-trident est à l'état Reconciliation ongoing.

    Symptômes :

    Il est possible que l'état du sous-composant file-netapp-trident passe de Reconciling à ReconciliationCompleted et inversement.

    Solution :

    Vous pouvez ignorer la réconciliation en cours si les conditions suivantes sont remplies :

    1. TridentBackend est défini sur online.
    2. La configuration de TridentBackend est bound.
    3. Le déploiement netapp-trident-controller est opérationnel.
    4. Le DaemonSet netapp-trident-node-linux est opérationnel.
    Mettre à niveau 1.12.4

    Échec de la génération du delta entre manifest et snapshot lors de la mise à niveau du nœud de calcul du cluster système

    Symptômes :

    Lors de la mise à niveau de la version 1.12.2 vers la version 1.12.4, la mise à niveau de l'organisation est bloquée à l'étape NodeUpgrade et la tâche de mise à niveau du nœud affiche l'erreur suivante :

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

    Pour confirmer le problème, procédez comme suit :

    1. Obtenez le Kubeconfig pour le cluster racine ou d'administrateur de l'organisation où la mise à niveau du nœud échoue, puis vérifiez si nodeupgradetask a échoué :
           export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
           kubectl get nodeupgradetask -A -ojsonpath='{.items[*].status.conditions[?(@.status != "True")]}' | jq 
    2. Vérifiez que le message correspond au message d'erreur précédent :
            Message: failed to generate delta between manifest and snapshot: failed to create or update delta configmap: failed to calculate delta between snapshot and manifest: failed to get valid OS distribution for delta comparison, distribution:
    3. Vérifiez qu'un osartifactsnapshot comporte une distribution manquante :
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    4. Vérifiez qu'au moins un instantané imprimé n'a pas de distribution définie.

    Solution :

    1. Obtenez le fichier kubeconfig du cluster auquel appartient le nœud :
           export KUBECONFIG=${CLUSTER_KUBECONFIG}
           kubectl rollout restart -n os-system os-core-controller 
    2. Vérifiez que l'instantané comporte désormais une distribution. (L'exécution de cette commande peut prendre quelques minutes) :
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    3. Cette commande ne doit renvoyer aucun résultat. Si vous constatez qu'une distribution est manquante, ouvrez une demande d'assistance.
    Mettre à niveau 1.12.4

    kubelet ne parvient pas à supprimer cgroup pour les pods avec des journaux de spam

    Symptômes :

    1. kubelet continue d'imprimer le journal de spam suivant :
      May 22 23:08:00 control-1--f1c6edcdeaa9e08-e387c07294a9d3ab.lab.anthos kubelet[3751]: time="2024-05-22T23:08:00Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/freezer/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
      ……
      May 22 23:09:04 control-1 kubelet[3751]: time="2024-05-22T23:09:04Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/net_cls,net_prio/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
    2. Le processus runc init est figé, ce qui empêche kubelet de supprimer le pod cgroup.

    Solution :

    1. Utilisez le script suivant pour trouver le processus qui bloque la suppression de cgroup :
           # Find matching cgroup directories
      MATCHING_CGROUPS=$(find /sys/fs/cgroup -type d -name "*74353c*")
      
      
      if [ -z "$MATCHING_CGROUPS" ]; then
       echo "No cgroups found containing 'd06aac'."
       exit 0
      fi
      
      
      echo "Matching cgroups:"
      
      
      for cgroup in $MATCHING_CGROUPS; do
       echo "- $cgroup"  # Print cgroup path
      
      
       # Check if cgroup.procs exists
       if [ -f "$cgroup/cgroup.procs" ]; then
         echo "  Processes:"
      
      
         # List PIDs in cgroup.procs
         for pid in $(cat "$cgroup/cgroup.procs"); do
           # Get process details
           ps -o pid,comm,cmd --no-headers $pid 2>/dev/null  # Suppress errors if process doesn't exist
         done
       else
         echo "  No cgroup.procs file found."  # Handle cases where cgroup.procs is missing
       fi
      
      
       echo  # Add a newline for better readability
       done
    2. Vérifiez l'état du congélateur à l'aide de cat freezer.state. L'état doit être FROZEN.
    3. Echo "THAWED" > freezer.state
    4. cgroup a bien été supprimé. Kubelet arrête le spamming du journal.
    Performances 1.12.4

    Sous-composant perf-ptaas avec une erreur de rapprochement

    Symptômes :

    Le sous-composant perf-ptaas affiche le code d'erreur suivant, ce qui empêche le déploiement de PTaaS :

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

    Solution :

    PTaaS est déployé dans l'organisation gdchservices.

    1. Inspectez les annotations et les libellés du projet PTaaS gdch-perftest et du bucket perftest-bucket-reports dans l'espace de noms perftest gdch-perftest. Il est possible que le bucket ne comporte pas le libellé app.kubernetes.io/managed-by=Helm ni les annotations meta.helm.sh/release-name=perf-ptaas-assets et meta.helm.sh/release-namespace=gdch-perftest. Ajoutez manuellement les libellés et annotations suivants :
      kubectl --kubeconfig gdchservices-admin-kubeconfig label buckets -n gdch-perftest perftest-bucket-reports app.kubernetes.io/managed-by=Helm
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-name=perf-ptaas-assets
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-namespace=gdch-perftest
      Assurez-vous qu'OCLCM revendique le bucket de force :
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports lcm.private.gdc.goog/claim-by-force=true
    2. Inspectez les annotations du projet PTaaS gdch-perftest. Il est possible que le projet soit mal configuré avec l'annotation meta.helm.sh/release-name=perf-ptaas-assets. Remplacez cette annotation par meta.helm.sh/release-name=perf-ptaas-backend :
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest meta.helm.sh/release-name=perf-ptaas-backend --overwrite=true
      Assurez-vous qu'OCLCM revendique le projet de force :
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest lcm.private.gdc.goog/claim-by-force=true
    3. Vérifiez que le sous-composant est réconcilié dans le cluster root-admin :
      kubectl get subcomponent -n gdchservices perf-ptaas