Problemas conhecidos do Google Distributed Cloud com isolamento físico 1.12.x

Categoria Versões identificadas Problema e solução alternativa
Backup e restauração 1.12.1

O backup de volume não resolve endpoints de armazenamento de objetos no nível da organização

O cluster de armazenamento para backup de volume usa o servidor DNS externo em vez do encaminhador, o que impede que o backup de volume resolva os endpoints de armazenamento de objetos no nível da organização. Na versão 1.12, o tráfego de backup exige novas rotas para cada organização.

Alternativa:

Os IOs precisam atualizar o cluster de armazenamento para ativar a resolução de DNS no nível da organização e criar uma rota das interfaces lógicas de replicação (LIFs) para endpoints de armazenamento de objetos em cada organização. Copie e cole os comandos a seguir do bootstrap.

  1. Defina a variável de ambiente KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Encontre o cluster de armazenamento:
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. Encontre o CIDR externo da instância:
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. Atualize o cluster de armazenamento para usar um encaminhador e com uma rota para o CIDR externo da instância:
    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. Reinicie o controlador para garantir que a mudança seja implementada:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Backup e restauração 1.12.1

Falha na rota de backup para organizações

Sintomas:

O comando curl do gateway de entrada do administrador da organização dos nós do ONTAP falha porque não há rota da sub-rede de backup para os planos de controle da organização.

Alternativa:

Os IOs precisam atualizar o cluster de armazenamento para ativar a resolução de DNS no nível da organização e criar uma rota das interfaces lógicas de replicação (LIFs) para endpoints de armazenamento de objetos em cada organização. Copie e cole os comandos a seguir do bootstrap.

  1. Defina a variável de ambiente KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Encontre o cluster de armazenamento:
    storage_cluster=$(kubectl get storagecluster -n gpc-system | awk 'NR == 2{print $1}')
  3. Encontre o CIDR externo da instância:
    instance_external_cidr=$(kubectl get cidrclaim -n gpc-system instance-external-cidr -ojsonpath='{.spec.ipv4Spec.staticCidrBlocks}')
  4. Atualize o cluster de armazenamento para usar um encaminhador e com uma rota para o CIDR externo da instância:
    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. Reinicie o controlador para garantir que a mudança seja implementada:
    kubectl rollout restart deploy/file-storage-backend-controller -n file-system
Backup e restauração 1.12.4

Não é possível excluir volumes permanentes que foram armazenados em backup

Sintomas:

Não é possível excluir um volume permanente se ele estiver em uma relação de espelhamento de snapshot.

Alternativa:

Um IO exclui as relações do SnapMirror com o volume como destino.

  1. Defina a variável de ambiente KUBECONFIG:
    export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
  2. Armazene o nome do PV problemático em uma variável:
    PV_NAME={ PV_NAME }
  3. Confira o nome do volume interno:
    volume_name=$(kubectl get pv ${PV_NAME?} -o jsonpath='{.spec.csi.volumeAttributes.internalName}')
  4. Siga as etapas no runbook FILE-A0006 para acessar o ONTAP.
  5. Exclua as relações com esse volume como origem usando a senha coletada anteriormente:
    ssh ${username?}@${mgmt_ip?} snapmirror delete -source-volume ${volume_name?} -destination-path "*"
    # enter the password collected from the breakglass secret
Backup e restauração 1.12.0
1.12.1
1.12.2

O repositório de backup está íntegro

Se o repositório de backup não tiver nenhum tipo de status de erro, mas um alerta for gerado, a métrica de alerta do repositório poderá ser gerada por engano. Esse é um problema conhecido na versão 1.12.0 e foi corrigido na 1.12.4. A causa desse problema é que o repositório de backup tenta periodicamente se conectar ao armazenamento de objetos como uma verificação de integridade e entra em um estado não íntegro se a conexão falhar. No entanto, se o repositório de backup for recuperado, a métrica que indica a integridade dele não será revertida corretamente, fazendo com que o alerta fique preso em um estado de disparo indefinido. Para resolver esse problema, exclua e recrie manualmente o repositório de backup para redefinir a métrica de integridade dele. Siga as etapas no runbook BACK-R0003 para recriar o repositório de backup.

Faturamento 1.12.4

Falha no subcomponente bil-storage-system-cluster - Reconciliation error: E0121

Sintomas:

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

O subcomponente bil-storage-system-cluster não consegue reconciliar devido a jobs desatualizados. Os billing-storage-system-init-job-628 e billing-storage-system-init-job-629 permanecem após uma conclusão bem-sucedida.

Alternativa:

Siga estas etapas:

  1. Faça backups dos jobs de faturamento desatualizados:
    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. Pause o subcomponente:
    export SUBCOMPONENT_NAME=bil-storage-system-cluster
    export SUBCOMPONENT_NAMESPACE=gdchservices-system-cluster
    
    kubectl annotate subcomponent "${SUBCOMPONENT_NAME:?}" -n "${SUBCOMPONENT_NAMESPACE:?}" lcm.private.gdc.goog/paused=true
  3. Exclua os jobs inativos.
  4. Reinicie o oclcm-backend-controller.
  5. Retome o subcomponente.
Armazenamento em blocos 1.12.4

Pods do Grafana travados no estado Init devido a erros de ativação de volume.

Sintomas:

Os pods do Grafana nos namespaces anthos-identity-service-obs-system e platform-obs-obs-system estão travados no estado Init devido a erros de ativação de volume. A mensagem de erro nos registros do kubelet indica um problema de multiencadeamento. O problema decorre de um bug no Trident, que não consegue identificar e verificar corretamente o dispositivo subjacente para mapeamentos LUKS, resultando em um erro de multiencadeamento.

Alternativa:

Verifique se o PVC tem um "deletionTimestamp". Se não houver deletionTimestamp (migração de pod), siga estas etapas:

  1. Verifique o VolumeAttachment do PVC para identificar onde o volume está anexado no momento.
  2. Isolar os Nodes no cluster que não correspondem a esse valor.
  3. Exclua o Pod com falha. Isso vai fazer com que ele migre de volta para o Node original.

Depois de verificar, se houver um "deletionTimestamp" (exclusão de volume), siga estas etapas:

  1. Verifique o VolumeAttachment do PVC para identificar onde o volume está anexado no momento.
  2. No Node, gere o conteúdo do arquivo de rastreamento:
    cat /var/lib/trident/tracking/PVC_NAME.json
  3. Valide se o dispositivo LUKS encontrado no campo devicePath da saída do arquivo de rastreamento está realmente fechado. Este caminho não pode existir neste momento:
    stat DEVICE_PATH
  4. Valide se o número de série está mapeado para algum dispositivo multipath.
    1. Copie o valor no campo iscsiLunSerial do arquivo de rastreamento.
    2. Converta esse valor no valor hexadecimal esperado:
      echo 'iISCSILUNSERIAL>' | xxd -l 12 -ps
    3. Com esse novo valor, verifique se a entrada de vários caminhos ainda existe:
      multipath -ll | grep SERIAL_HEX
    4. Se ele não existir, exclua o arquivo de rastreamento.
    5. Se ele existir, você vai encontrar um valor hexadecimal serial um pouco mais longo do que o pesquisado, chamado de multipathSerial. Execute o comando a seguir e encontre os dispositivos de bloco:
      multipath -ll MULTIPATH_SERIAL
    6. Em seguida, execute os comandos a seguir. O último é executado exclusivamente para cada dispositivo de transferência por blocos:
                systemctl restart iscsid
                systemctl restart multipathd
                multipath -f MULTIPATH_SERIAL
                echo 1 > /sys/block/BLOCK_DEVICE_NAME/device/delete
                  
Gerenciamento de clusters 1.12.0
1.12.1
1.12.2
1.12.4

O job machine-init falha durante o provisionamento do cluster

Sintomas:

  1. Durante o provisionamento do cluster, o job machine-init do segundo nó do plano de controle falha com a seguinte mensagem:
    FAILED! => {"changed": true, "cmd": "/usr/bin/kubeadm join phase control-plane-prepare certs --config /dev/stdin --v 5".
  2. Visualize os registros:
    kubectl --kubeconfig=ADMIN_KUBECONFIG logs -p kube-apiserver-{first_node_name} -n kube-system | grep "etcdmain: open /etc/kubernetes/pki/etcd/ca.crt: permission denied"

    A saída mostra um resultado não vazio.

Alternativa:

  1. Alterne a permissão de /etc/kubernetes/pki/etcd/ca.crt. Essa é uma operação muito sensível ao tempo. A troca de permissão precisa acontecer depois da execução anterior do job machine-init, mas antes da próxima execução do job machine-init, já que machine-init substitui a permissão de volta para a raiz.
  2. Reinicie o etcd no segundo nó para recuperar o etcd no primeiro nó de um loop de falhas.

    Depois de concluir essas duas etapas, o kube-apiserver no primeiro nó começa a ser executado, e o próximo job machine-init é concluído.

Gerenciamento de clusters 1.12.2

PodCIDR IPv4 obrigatório não disponível

Sintomas:

O agente do Cilium mostra o seguinte aviso:

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

Alternativa:

  1. Descubra o endereço IP do nó que você quer remover.
  2. Remova o endereço IP de spec.nodes no recurso personalizado NodePool.
  3. Aguarde até que o nó seja completamente removido do NodePool. Se o nó não for removido, execute um force-remove:
    1. Adicione a anotação baremetal.cluster.gke.io/force-remove=true ao recurso personalizado Machine:
      kubectl -n org-1-system-cluster annotate machine IP_ADDRESS baremetal.cluster.gke.io/force-remove=true 
  4. Adicione o endereço IP de volta a spec.nodes no recurso personalizado NodePool.
Logging 1.12.0
1.12.1

Os registros do servidor da API Kubernetes não são encaminhados para um destino SIEM

Sintomas:

Depois de configurar a exportação para um sistema SIEM externo, a entrada do SIEM não será incluída no pipeline de processamento do Fluent Bit, e os registros do servidor da API do Kubernetes não estarão presentes nesse SIEM.

Rede 1.12.4

O job machine-init falha durante o upgrade

Sintomas:

Ao fazer upgrade da versão 1.12.2 para a 1.12.4, se um nó for removido e depois adicionado novamente, o processo machine-init desse nó poderá falhar. Essa falha ocorre porque o tráfego de rede do nó adicionado novamente para os serviços essenciais do plano de controle é negado pela política ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes. Esse erro é destacado pelas mensagens de status neste exemplo de saída:
      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)

Alternativa:

Para atenuar esse problema, siga estas etapas:

  1. Para o cluster de administrador raiz:
    1. Receba CIDRs de CIDRClaim/org-external-cidr -n root (especificamente o campo .status.ipv4AllocationStatus.allocatedCidrBlocks). Execute o comando a seguir no cluster de administrador raiz:
      ROOTCIDRs=$(ka get cidrclaim/org-external-cidr -n root -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. Adicione esses CIDRs ao ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, especificamente ao campo .spec.ingress.fromCIDR. Aplique essa mudança no cluster de administrador raiz com o comando:
      ka get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ROOTCIDRs}"'}]' \
        | ka apply -f -
  2. Para o cluster de administrador da organização:
    1. Receba CIDRs para a organização (por exemplo, org-1) de CIDRClaim/org-external-cidr -n org-1 (especificamente o campo .status.ipv4AllocationStatus.allocatedCidrBlocks). Esse comando é executado no cluster de administrador raiz para receber os CIDRs de "org-1":
      ORGCIDRs=$(ka get cidrclaim/org-external-cidr -n org-1 -o json | jq '.status.ipv4AllocationStatus.allocatedCidrBlocks')
    2. Adicione esses CIDRs ao ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes, especificamente ao campo .spec.ingress.fromCIDR. Aplique essa mudança no respectivo cluster de administrador da organização com o comando:
      ko get ciliumclusterwidenetworkpolicy/base-node-policy-for-control-plane-nodes -o json \
        | jq '.spec.ingress += [{"fromCIDR":'"${ORGCIDRs}"'}]' \
        | ko apply -f -

Essa mudança só precisa ser feita uma vez antes de iniciar o upgrade.

Rede 1.12.0
1.12.1

Problemas com atualizações, encerramento e programação de VMs e contêineres

Sintomas:

Em um nó bare metal do cluster do sistema, não é possível encerrar dois contêineres anetd. Depois de interromper o processo à força e reiniciar kubelet e containerd, o pod anetd é recriado, mas todos os contêineres ficam presos em podInit, e containerd informa a mensagem de erro:

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

Isso impede que a interface de rede de contêiner (CNI) seja iniciada e que outros pods sejam programados.

Alternativa:

Faça estas mitigações para evitar esse estado do nó:

  • Não programe mais de 10 PVCs por vez em um único nó. Aguarde a montagem antes de agendar mais. Isso era mais perceptível ao tentar criar VMs.
  • Atualize o arquivo /etc/lvm/lvm.conf em todos os nós para incluir a linha: filter = [ "r|/dev/dm.|", "r|/dev/sg.|" ] no bloco devices{}.

Se o nó entrar em um estado em que mostra tempos limite para anexos e montagens de volume ou não for possível excluir um volume, verifique o número de processos vgs pendentes no nó para identificar se ele está nesse estado particularmente ruim. A maneira mais confiável de corrigir um nó nesse estado é reiniciá-lo.

Há outro modo de falha que pode ocorrer. Esse modo de falha tem a seguinte assinatura na tentativa de montagem: mount(2) system call failed: No space left on device. Isso provavelmente é resultado da propagação de montagem no nó. Verifique isso executando cat /proc/mounts | grep devtmpfs | awk '{ print $2 }' | sort -n | uniq -c. Se algum deles mostrar um valor maior que um, exclua o pod que o usa. Isso vai acionar uma desmontagem. Se isso não funcionar, desmonte manualmente esse caminho. Se o problema persistir, reinicie o dispositivo.

Rede 1.12.2

O GDC não consegue criar ACLs de switch com base em políticas de tráfego durante o processo inicial de inicialização

Em alguns cenários, devido a condições de disputa, o Google Distributed Cloud (GDC) isolado não cria os recursos personalizados do Kubernetes ACLs de switch necessários durante a inicialização inicial do Distributed Cloud.

Sintomas:

Liste os CRs de ACL do switch:

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

A saída desse comando indica que não há ACLs de switch de gerenciamento (mgmt-switch-acl) criadas.

No resources found in gpc-system namespace.

Alternativa:

  1. Liste os CRs da política de tráfego:
    kubectl get trafficpolicies -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig

    A saída retorna dois CRs do Kubernetes de política de tráfego:

    NAME                          AGE     NAME
    default-traffic-policy-data   4d17h   default-traffic-policy-data
    default-traffic-policy-mgmt   4d17h   default-traffic-policy-mgmt
  2. Edite o CR do Kubernetes da política de tráfego default-traffic-policy-mgmt:
    kubectl edit trafficpolicies default-traffic-policy-mgmt -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  3. Acesse a última regra de política no arquivo, que pode estar no final dele.
  4. Identifique o campo de descrição da última regra de política. O campo pode ter esta aparência:
    Deny All rule for Management Network
  5. Edite essa descrição e adicione The ao início da linha de descrição:
    The Deny All rule for Management Network
  6. Salve o arquivo e saia.
  7. Liste novamente os CRs de ACL de troca do Kubernetes:
    kubectl get switchacls -n gpc-system --kubeconfig=/root/release/root-admin/root-admin-kubeconfig
  8. A saída lista a ACL de troca de gerenciamento (mgmt-switch-acl):
    NAME              AGE   NAME
    mgmt-switch-acl   23h   mgmt-switch-acl
Servidores físicos 1.12.1
1.12.2

NodePool tem um servidor em estado desconhecido durante a criação

Sintomas:

Ao provisionar Server durante a criação de um cluster, há uma chance de o servidor ser marcado como provisionado, mas sem a condição Provision-Ready. Como resultado, o NodePool não pode consumir esse servidor. Uma mensagem de evento de erro de exemplo em NodePool pode ter esta aparência:

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}
      

Alternativa:

Redefina o ILO executando o seguinte script:

      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 .
       
      

Em casos raros, o procedimento de redefinição do iLO anterior pode não resolver o problema completamente. Nesse caso, é necessário um novo provisionamento do servidor. Consulte os runbooks OS-P0002 e OS-P0003 para conferir os procedimentos detalhados.

Servidores físicos 1.12.2

Falha no upgrade do firmware do nó na organização do locatário

Sintomas:

O upgrade do nó bare metal está preso no estado in-progress há mais de três horas.

Alternativa:

Siga as etapas no runbook SERV-R0005.

Rede 1.12.1

Falha no script de pré-instalação em várias chaves

Sintomas:

O POAP continua falhando, e o registro dele mostra uma mensagem como esta:

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

Não é possível encontrar nxos.10.3.1.bin, mas algo semelhante, como nxos64-cs.10.3.1.F.bin, no diretório bootflash do switch.

Alternativa:

Na máquina de bootstrap, conclua as etapas a seguir. É necessário concluir essas etapas quando o processo de pré-instalação estiver em andamento. Se houver várias pastas /tmp/preinstall-bootstrap-, aplique as mudanças à pasta atual que o processo de pré-instalação está usando. Para isso, verifique os registros do processo de pré-instalação. Se você precisar reiniciar o comando de pré-instalação, essa ação também vai criar uma nova pasta /tmp/preinstall-bootstrap-.

  1. Acesse a pasta /tmp/preinstall-bootstrap-RANDOM_NUMBER .
  2. Dentro da pasta, encontre o arquivo poap.py.
  3. Remova a linha com o checksum md5 completamente neste arquivo para que head -n 4 poap.py fique assim:
    #!/bin/env python3
    import glob
    import os
    import pkgutil
  4. No mesmo arquivo, adicione as seguintes linhas a version_to_image_file:
        "nxos.10.2.1.bin": "nxos64.10.2.1.F.bin",
        "nxos.10.2.2.bin": "nxos64-cs.10.2.2.F.bin",
        "nxos.10.2.3.bin": "nxos64-cs.10.2.3.F.bin",
        "nxos.10.2.4.bin": "nxos64-cs.10.2.4.M.bin",
        "nxos.10.2.5.bin": "nxos64-cs.10.2.5.M.bin",
        "nxos.10.2.6.bin": "nxos64-cs.10.2.6.M.bin",
        "nxos.10.2.7.bin": "nxos64-cs.10.2.7.M.bin",
        "nxos.10.3.1.bin": "nxos64-cs.10.3.1.F.bin",
        "nxos.10.3.2.bin": "nxos64-cs.10.3.2.F.bin",

    A seção do arquivo atualizado fica assim:

    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. Execute md5sum poap.py para receber a soma de md5 e adicione-a de volta a poap.py para que head -n 4 poap.py fique assim:
    #!/bin/env python3
    #md5sum="396bed5a5f579b80da5fac6edf0b590c"
    import glob
    import os
Rede 1.12.1

O upgrade da versão 1.11.x para a 1.12.1 falha porque o controlador pnet não gera o recurso personalizado (CR) hairpinlink.

Alternativa:

  1. Após o upgrade, no cluster de administrador raiz, edite o arquivo clusterroles/pnet-core-backend-controllers-role.
  2. Pesquise hairpinlinks e adicione as permissões create,update,delete ao recurso.
  3. Verifique se os CRs hairpinlinks e hairpinbgpsessions foram gerados.
Servidor NTP 1.12.1

O pod do servidor de retransmissão NTP falha após a reinicialização

Sintomas:

  • Ao executar o comando kubectl get pods, talvez você veja a seguinte mensagem:
    ntp-system                      ntp-relay-server-75bbf                                            1/2     CrashLoopBackOff    123 (5m12s ago)   24h
  • Talvez você veja um aviso de sondagem de atividade nos registros:
    Warning  BackOff    5m55s (x82 over 28m)      kubelet  Back-off restarting failed container ntp-image in pod ntp-relay-server-75bbf_ntp-system(28e4e28f-4f99-4c6e-8c26-d271f0c7995c)
    Warning  Unhealthy  <invalid> (x37 over 35m)  kubelet  Liveness probe failed: Leap status is Not synchronised

Esse problema pode fazer com que os servidores tenham horários dessincronizados.

Alternativa:

  1. Abra o daemonset ntp para edição:
    kubectl edit daemonset/ntp-relay-server -n ntp-system
  2. Remova a seção livenessProbe: até a linha timeoutSeconds: 30.
  3. Adicione a seção a seguir no contêiner ntp-image:
    securityContext:
      capabilities:
        add:
        - SYS_TIME
  4. Isso resulta em uma configuração semelhante a esta:

    containers:
      - name: ntp-image
      image: "DOCKER_REGISTRY/DOCKER_REPOSITORY/ntp-relay-server:DOCKER_TAG"
      imagePullPolicy: Always
      securityContext:
        capabilities:
          add:
          - SYS_TIME
  5. Abra a política de NTP do SO para edição:
    kubectl edit ospolicy/bm-ntp-policy -n gpc-system
  6. Remova todos os endereços IP do NTP na seção de política. Depois disso, a política fica assim:
    policy:
      installPlaybook:
        extraVars:
          ntp_servers: {}
        name: server-ntp-config
        secrets: {}
          
Servidor NTP 1.12.1

O pod ntp-relay-job-xxxx falha após a reinicialização

Sintomas:

Ao executar o comando kubectl get pods, talvez você veja a seguinte mensagem:

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

Esse problema é causado pela limpeza inadequada do job de upgrade. Nenhuma ação é necessária, e o job pode ser deixado no estado de loop de falha.

Servidor NTP 1.12.2

O SO do nó tem um horário dessincronizado

Sintomas:

Você pode ver a seguinte mensagem nos registros do cluster do sistema:

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

Isso é um problema para servidores que não mantêm o tempo sincronizado. A configuração não foi aplicada corretamente e precisa ser alterada para um namespace diferente para ser aplicada corretamente.

Alternativa:

Siga estas etapas em todos os clusters:

  1. Liste as políticas de SO atuais:
    kubectl get ospolicies -n ntp-system

    A saída mostra admin-ntp-policy ou worker-ntp-policy.

  2. Com base no nome da política, salve-a em um arquivo .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. Edite o arquivo mudando metadata.namespace de ntp-system para gpc-system e removendo o status: line e tudo o que vem depois dele.
  4. Aplique o arquivo editado ao cluster:
    kubectl apply -f ntp-ospolicy.yaml
  5. Aguarde alguns minutos para que o controlador aplique a política do SO.
  6. Estabeleça uma conexão SSH com um dos nós a que a OSPolicy se aplica e execute cat /etc/chrony.conf. A saída mostra uma mensagem no início do arquivo informando que ele é gerenciado pelo Ansible e que os servidores nist.time.gov ou ntp.pool foram removidos da configuração.
Backup e restauração de VMs 1.12.0

As configurações de webhook da VM impedem que os usuários iniciem procedimentos de backup e restauração de VMs

Sintomas:

O processo de backup e restauração de VMs não pode ser iniciado pelos usuários devido a configurações inadequadas de controle de acesso baseado em papéis (RBAC) e de esquema no gerenciador de VMs.
Os nomes dos planos de backup de VM não podem ter mais de 63 caracteres. Por exemplo, você pode ver esta mensagem de erro:

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

Alternativa:

Os nomes dos planos de backup de VM são uma concatenação do nome VirtualMachineBackupPlanTemplate, do tipo de recurso (que é vm ou vm-disk) e do nome desse recurso. Essa string concatenada precisa ter menos de 63 caracteres.
Para isso, mantenha os nomes desses recursos curtos ao criá-los. Para detalhes sobre a criação desses recursos, consulte Criar e iniciar uma instância de VM e Criar um plano de backup para VMs.

Serviço de banco de dados 1.12.0

As cargas de trabalho do serviço de banco de dados operam no cluster do sistema

Sintomas:

As cargas de trabalho do serviço de banco de dados são provisionadas e configuradas em projetos separados no cluster do sistema Distributed Cloud. Embora os projetos sejam usados para impor limites administrativos no Distributed Cloud, eles não têm impacto em como e onde uma carga de trabalho é executada. Portanto, essas cargas de trabalho podem compartilhar a infraestrutura de computação subjacente com outras instâncias de banco de dados e vários sistemas de plano de controle.

Alternativa:

Para cargas de trabalho de banco de dados que exigem isolamento adicional, os usuários podem solicitar a criação de um pool de nós no cluster do sistema. Esse pool de nós, que precisa ser referenciado durante a criação do projeto, garante que as cargas de trabalho do banco de dados sejam provisionadas e executadas em uma infraestrutura de computação dedicada. A configuração do pool de nós isolado precisa ser concluída pelo operador de infraestrutura.

Serviço de banco de dados 1.12.2

DBCluster do AlloyDB Omni preso no estado de reconciliação

Sintomas:

Na versão 15.2.1 do AlloyDB Omni, quando vários clusters do AlloyDB Omni são criados no mesmo nó, o último cluster criado fica preso em um estado de reconciliação. Receber registros do PostgreSQL com o comando

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- cat /obs/diagnostic/postgresql.log 
O banco de dados não poderá ser iniciado com stacktraces semelhantes a este:

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)

Alternativa:

1. Ative o shell no pod do banco de dados

kubectl --kubeconfig $ORG_SYSTEM_KUBECONFIG exec -ti $DATABASE_POD_NAME -n $SHADOW_NS -- bash 
2. Crie manualmente um arquivo de configuração em /mnt/disks/pgsql/data/postgresql.conf.d/
echo "enable_lux_wal_writer = off" > /mnt/disks/pgsql/data/postgresql.conf.d/55user.conf
3. Reinicie o banco de dados para carregar o arquivo de configuração.
supervisorctl restart postgres
4. O banco de dados é iniciado com sucesso com uma saída semelhante a esta:
Chose default config file: /etc/supervisor/supervisord.conf
postgres: ERROR (not running)
postgres: started

Firewall 1.12.0

O arquivo secret.yaml de bootstrap do firewall contém TO-BE-FILLED

Sintomas:

Durante a implantação do cliente, o nome de usuário do administrador do arquivo secret.yaml precisa ser admin. Em vez disso, o arquivo contém TO-BE-FILLED após a primeira criação. O nome de usuário admin precisa ser usado para inicializar a primeira configuração no firewall e no IP de loopback admin\admin.

Alternativa:

Verifique se TO-BE-FILLED não está presente nas seguintes credenciais de firewall:

  • CELL_ID/CELL_ID-secret.yaml
  • CELL_ID-ab-rack/CELL_ID-secret.yaml
  • CELL_ID-ac-rack/CELL_ID-secret.yaml
  • Verifique se todas as contas de administrador do firewall têm o nome de usuário admin.

    Firewall 1.12.2

    bm-system-machine-init está falhando no primeiro nó

    Sintomas:

    As políticas de firewall de IDPS padrão não são compatíveis com os IPs personalizados da organização para a interconexão Direct Connect (DX). Como resultado, a criação da organização com IPs personalizados falha porque eles não conseguem se conectar ao Harbor no administrador raiz.

    Alternativa:

    Para desbloquear o tráfego, crie manualmente um SecurityPolicyRule para os IPs personalizados da organização e implante nos firewalls do IDPS. Siga as etapas no runbook FW-G0002 para concluir as seguintes etapas:

    1. Crie uma entrada SecurityPolicyRule no sistema virtual de firewall raiz para permitir que os IPs personalizados da organização acessem o Harbor raiz.

        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. Crie um SecurityPolicyRule de entrada no vsys do firewall da organização para permitir que o administrador root acesse o APIServer da organização.

        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. Acione a substituição da configuração do firewall para implantar o SecurityPolicyRules.

    Módulo de segurança de hardware 1.12.0
    1.12.1
    1.12.2
    1.12.4

    As licenças de teste desativadas do HSM ainda são detectáveis

    Sintomas:

    Devido a um problema conhecido no CipherTrust Manager, as licenças de teste desativadas ainda são detectáveis e podem acionar avisos falsos de expiração.

    Alternativa:

    Consulte HSM-R0003 para verificar as licenças normais ativas e excluir as licenças de teste desativadas.

    Módulo de segurança de hardware 1.12.0

    O módulo de segurança de hardware tem um comportamento inesperado ao excluir um KMS

    Sintomas:

    O módulo de segurança de hardware (HSM) tem um comportamento inesperado ao excluir um CTMKey do KMS. Por exemplo, o serviço KMS pode não ser iniciado para a organização.

    Alternativa:

    Os usuários podem criptografar os dados excluindo as chaves do KMS em vez da chave raiz do KMS, o que se manifesta como um CTMKey.

    Módulo de segurança de hardware 1.12.0
    1.12.1
    1.12.2

    O secret rotativo para módulos de segurança de hardware está em um estado desconhecido

    Sintomas:

    Receba uma lista de secrets rotacionáveis desconhecidos:

    kubectl get rotatablesecret -A | grep -i unknown

    A saída pode ser semelhante a esta:

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

    Requisitos:

    1. Acesso ao cluster de administrador raiz
    2. A ferramenta jq
    3. Siga IAM-R0004 para gerar o KUBECONFIG do cluster de administrador raiz.
    4. Siga IAM-R0005 para receber clusterrole/hsm-admin no cluster de administrador raiz.

    Alternativa:

    1. Receba uma lista dos endereços IP da rede de dados do HSM:
      kubectl --kubeconfig ${KUBECONFIG:?} get hsm -A -o json | jq -r '.items[] | "\(.spec.dataNetwork.ip)"'

      A saída pode ser semelhante a esta:

      10.89.3.2
      10.89.3.3
      10.89.3.4
    2. Para cada um dos endereços IP da rede de dados do HSM da etapa anterior:
      1. Exporte o endereço IP para uma variável chamada HSM_DATA_IP:
        export HSM_DATA_IP=HSM_DATA_IP_ADDRESS
      2. Busque os certificados do servidor da Web (porta 443), nae (porta 9000) e kmip (porta 5696) e examine a validade deles:
        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

        A saída pode ser semelhante a esta:

        Validity
                    Not Before: Mar 12 20:36:58 2024 GMT
                    Not After : Jun 16 20:36:58 2026 GMT
    3. Siga as etapas no runbook HSM T0016 para renovar os certificados do servidor se a data Not After estiver dentro de 30 dias a partir de hoje.
    Monitoramento 1.12.0

    Os certificados do Node Exporter podem não ficar prontos ao criar uma organização

    Sintomas:

    Os certificados não ficam prontos ao criar uma organização:

    $ 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

    Os secrets ainda existem devido ao `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

    Alternativa:

    Pause o Lifecycle Manager para que ele não recrie nem exclua certificados:

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

    Observe que node-exporter não será reconciliado em clusters de usuário.

    Monitoramento 1.12.0
    1.12.1
    1.12.2

    A configuração do webhook do ServiceNow faz com que o LCM faça uma nova reconciliação e reverta as mudanças feitas nos objetos ConfigMap e Secret no namespace mon-system.

    Sintomas:

    Configurar o webhook do ServiceNow faz com que o gerenciamento do ciclo de vida (LCM) faça uma nova reconciliação e reverta as mudanças feitas no objeto ConfigMap mon-alertmanager-servicenow-webhook-backend e no objeto Secret mon-alertmanager-servicenow-webhook-backend no namespace mon-system.

    Alternativa:

    Pause o subcomponente do LCM para que as mudanças aconteçam sem serem revertidas:

    1. Consiga os caminhos para os arquivos kubeconfig dos clusters de administrador raiz e de administrador da organização. Salve os caminhos nas variáveis de ambiente ROOT_ADMIN_KUBECONFIG e ORG_ADMIN_KUBECONFIG, respectivamente.
    2. Pause o subcomponente do LCM em um dos seguintes clusters:
      • Pause o subcomponente do LCM no cluster de administrador raiz:
        kubectl --kubeconfig $ROOT_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n root lcm.private.gdc.goog/paused="true"
      • Pause o subcomponente do LCM no cluster de administrador da organização:
        kubectl --kubeconfig $ORG_ADMIN_KUBECONFIG annotate subcomponent mon-alertmanager-servicenow-webhook -n org-1-system-cluster lcm.private.gdc.goog/paused="true"
    Monitoramento 1.12.0

    As métricas dos clusters de usuários não são coletadas.

    Sintomas:

    Algumas métricas dos clusters de usuários não são coletadas. Esse problema afeta os clusters de VM do usuário, mas não o cluster do sistema.

    • É possível conferir os seguintes registros do servidor do 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:"
    • É possível ver os seguintes registros do locatário do 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"

    Alternativa:

    Siga estas etapas para resolver o problema:

    1. Consiga o caminho para o arquivo kubeconfig do cluster. Salve o caminho na variável de ambiente KUBECONFIG.
    2. Implante um serviço stub nos clusters de VM do usuário:
            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. Reinicie a implantação do locatário do Cortex:
      kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n mon-system cortex-tenant
    Monitoramento 1.12.0

    O Prometheus principal envia métricas para o locatário do Cortex em todos os limites do cluster

    Sintomas:

    As métricas destinadas à instância do Grafana do operador de infraestrutura podem estar na instância do Grafana do administrador da plataforma e vice-versa. O problema é causado por solicitações de balanceamento de carga do ASM em limites de cluster, que têm locatários padrão diferentes.

    Alternativa:

    A solução alternativa exige acesso à fonte private-cloud e a capacidade de lançar uma atualização de componente. É necessário mudar a configuração da malha para restringir o serviço cortex-tenant a receber tráfego apenas do cluster local e implantar o componente do ASM.

    1. Abra o arquivo manifests/plain/asm/1.19/asm-primary-cluster-operator.yaml.
    2. Apresente o campo serviceSettings no campo meshConfig.

      O campo meshConfig originalmente tem a seguinte aparência:

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

      Portanto, mude o campo meshConfig para que ele fique parecido com o exemplo a seguir:

              profile: minimal
                revision: 1-19
                meshConfig:
                  serviceSettings:
                    - settings:
                        clusterLocal: true
                      hosts:
                      - 'cortex-tenant.mon-system.svc.cluster.local'
                  localityLbSetting:
                      enabled: false
            
    3. Implante o componente do ASM no cluster.
    Fazer upgrade 1.12.0

    Falha no upgrade do nó para NodeOSInPlaceUpgradeCompleted

    Sintomas:

    Ao fazer upgrade da versão 1.11.0 para 1.11.3, o upgrade do nó falha para NodeOSInPlaceUpgradeCompleted.

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

    Alternativa:

    Faça login na máquina bare metal que está recebendo o upgrade. Verifique se o fstab tem /boot/efi e se o diretório está montado:

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

    Pausar o nodeupgradetask

    1. Execute mount -a e verifique se o diretório está montado:
      # mount -a
      root@mb-aa-bm04:~# ls /boot/efi/
      EFI
    2. Faça as verificações aqui. Execute os comandos a seguir:
      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. Se nem todos os arquivos forem idênticos, execute este comando na máquina e repita as verificações.
      /usr/local/update-efi-files.sh
    4. Retomar nodeupgradetask
    Fazer upgrade 1.12.0

    A troca de upgrade não executa o comando install add bootflash://..

    Sintomas:

    A troca de upgrade não adiciona bootflash:

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

    Alternativa:

    Faça login no switch com falha e execute o comando de ativação da instalação no pacote:

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

    Ao fazer upgrade da versão 1.11.x para a 1.12.1, o upgrade do nó fica parado com o erro MaintenanceModeHealthCheckReady undrain

    Sintomas:

    O upgrade do cluster está parado há mais de uma hora. O status e a especificação do modo de manutenção da máquina Bare Metal não correspondem. Por exemplo, o comando:

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

    mostra:

    root        10.252.135.4   false             true

    O job de verificação de simulação da máquina bare metal mostra a seguinte mensagem de erro:

    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"}

    Alternativa:

    Use o comando a seguir:

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

    O nó da VM fica preso na reinicialização após a solução alternativa manual para o pod os-policy

    Sintomas:

    Uma tarefa de reinicialização da VM falha após a solução alternativa manual para o pod os-policy. A seguinte mensagem é exibida:

    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

    Alternativa:

    Interromper e iniciar a VM resolve o problema. Siga as instruções em iniciar e interromper uma VM.

    Rede superior 1.12.0

    Um cluster de VM de usuário fica preso no estado ContainerCreating com o aviso FailedCreatePodSandBox

    Sintomas:

    Um cluster de VM de usuário fica travado. Ao descrever o pod com o estado ContainerCreating, o seguinte aviso é mostrado:

    # 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 

    Alternativa:

    Siga as etapas no runbook NET-P0001 para reiniciar anetd no cluster do sistema.

    Registro de artefatos do sistema 1.12.1

    Loops de falha do Harbor após um upgrade da ABM

    Sintomas:

    Ao fazer upgrade de uma organização raiz da versão 1.11.1 para a 1.12.1, o upgrade pode falhar na etapa de complemento com erros de extração do Helm:

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

    Alternativa:

    Envie uma solicitação de suporte. Consulte Pedir suporte para mais detalhes.

    Fazer upgrade 1.12.0

    Vários pods em um cluster do sistema podem ficar presos no estado TaintToleration

    Sintomas:

    Durante um upgrade, o subcomponente do OPA Gatekeeper não é instalado no cluster do sistema. No entanto, as restrições e o webhook para aplicá-las são instalados.

    Vários pods em um cluster do sistema podem ficar presos no estado TaintToleration:

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

    Pods no estado ImagePullBackOff com o evento Back-off pulling image "auto"

    Sintomas:

    O pod com o nome do contêiner istio-proxy não está pronto e tem o status ImagePullBackOff com o evento Back-off pulling image "auto".

    Alternativa:

    1. Verifique se o webhook mutante istio-revision-tag-default está presente no cluster. Se não, aguarde aproximadamente 10 minutos para ver se o sistema se recupera automaticamente. Se não for, encaminhe o problema.
    2. Se o webhook de mutação estiver presente, exclua o pod problemático e verifique se ele volta a funcionar. O .spec.containers[].image não pode ser auto. Ele precisa ser uma imagem real semelhante a esta: gcr.io/gke-release/asm/proxyv2:<image version>.
    Logging 1.12.1

    ValidatingWebhookConfigurations, MutatingWebhookConfigurations e MonitoringRules implantados pelo componente de registro em log podem não ser atualizados

    Sintomas:

    Ao fazer upgrade da versão 1.11.1 para a 1.12.1, os ValidatingWebhookConfigurations, MutatingWebhookConfigurations e MonitoringRules implantados pelo componente de registro em log podem não ser atualizados.

    Alternativa:

    1. Verifique se você tem o kubectl e pode acessar o runbook IAM-R0004 para receber o KUBECONFIG do cluster de administrador raiz.

    2. Exclua ValidatingWebhookConfiguration root-admin-private-logging-validation-webhook do cluster de administrador raiz:

      kubectl delete validatingwebhookconfiguration root-admin-private-logging-validation-webhook
    3. Exclua MutatingWebhookConfiguration root-admin-private-logging-defaulter-webhook do cluster de administrador raiz:

      kubectl delete mutatingwebhookconfiguration root-admin-private-logging-defaulter-webhook
    4. Exclua ValidatingWebhookConfiguration root-admin-logging-webhook do cluster de administrador raiz:

      kubectl delete validatingwebhookconfiguration root-admin-logging-webhook
    5. Exclua MonitoringRule operational-logs-alerts do namespace infra-obs no cluster de administrador raiz:

      kubectl delete monitoringrule operational-logs-alerts -n infra-obs
    6. Exclua 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 e audit-logs-sli-loki-pa-up de infra-obs namespace no cluster de administrador raiz:

      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. Confirme se o subcomponente log-admin está pronto no cluster de administrador raiz:

      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

      Se o comando for bem-sucedido, ele vai imprimir log-audit is ready. Caso contrário, a saída será log-audit is not ready.

    8. Confirme se o subcomponente log-admin está pronto no cluster de administrador raiz:

      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

      Se o comando for bem-sucedido, ele vai imprimir log-operational is ready. Caso contrário, a saída será log-operational is not ready.

    Logging 1.12.1

    Registros de auditoria e operacionais não coletados

    Devido a um problema no job log-infra-backend-preinstall, os registros de auditoria e operacionais do Loki não são instalados, e os registros não são coletados.

    Sintomas:

    Talvez você veja um CrashLoopBackoff no cluster do sistema:

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

    O pod cortex-ingester mostra um status OOMKilled

    Sintomas:

    Talvez você veja um status OOMKilled para o pod no namespace mon-system:

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

    Alternativa:

    Aumente a memória em cada ingester, aumente o número de ingesters ou ambos. Para isso, implante um SubcomponentOverride no cluster de administrador da organização, como mostrado no exemplo a seguir:

    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
          
    Fazer upgrade 1.12.1

    Ao fazer upgrade da versão 1.11.x para a 1.12.1, um nó do cluster pode não sair do modo de manutenção devido a uma falha na verificação de integridade de registy_mirror.

    Sintomas:

    Ao fazer upgrade da versão 1.11.x para 1.12.1, o upgrade do nó falha com a seguinte mensagem de erro:

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

    Alternativa:

    Use o comando a seguir:

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

    O OrganizationUpgrade está preso nos estágios anthosBareMetal, addOn ou node com falha na verificação check_registry_mirror_reachability_pass.

    Sintomas:

    1. O OrganizationUpgrade está preso nos estágios anthosBareMetal, addOn ou node, mostrando o status Unknown para a condição 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. O status do Baremetalmachine mostra falha na verificação 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" 
        },

    Alternativa:

    Use o comando a seguir:

    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"
    Fazer upgrade 1.12.1, 1.12.2, 1.12.4

    O OrganizationUpgrade está preso nos estágios anthosBareMetal, addOn ou node com um erro de verificação de integridade que encontra netutil.

    Sintomas:

    1. O OrganizationUpgrade está preso nos estágios anthosBareMetal, addOn ou node, mostrando o status Unknown para a condição 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. As verificações de integridade mostram o erro "netutil" ausente.
    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"
      }

    Alternativa:

    Exclua o job do Kubernetes correspondente à verificação de integridade com falha.

    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

    Ao fazer upgrade da versão 1.11.x para a 1.12.x, uma VM pode não ficar pronta devido ao excesso de pods

    Sintomas:

    Ao fazer upgrade da versão 1.11.x para a 1.12.x, uma VM pode não ficar pronta devido ao grande número de pods, o que bloqueia a drenagem de um nó bare metal.

    Alternativa:

    Reinicie a VM.

    Servidores físicos 1.12.1

    NodeUpgrade contém várias versões para o mesmo modelo de hardware, bloqueando a verificação de upgrade do firmware

    Sintomas:

    Ao fazer upgrade da versão 1.11.x para a 1.12.1, NodeUpgrade contém várias versões para o mesmo modelo de hardware, bloqueando a verificação do upgrade de firmware.

    Alternativa:

    Siga estas etapas para modificar o CR spec NodeUpgrade:

    1. Se o upgrade for para servidores HPE Gen10 (GDC-4D), remova o firmware do modelo ilo6. Caso contrário, remova o firmware do modelo ilo5.
    2. Seção para preservar a entrada com o redfishVersion mais recente para cada descrição.
      Por exemplo, se as duas entradas a seguir existirem, mantenha apenas aquela com 2.98 Oct 10 2023:
      - description: SystemBMC
              model: ilo5
              redfishVersion: 2.98 Oct 10 2023
            - description: SystemBMC
              model: ilo5
              redfishVersion: 2.95 Jul 19 2023
    Servidores físicos 1.12.1

    Os servidores estão presos no estado de provisionamento

    Sintomas:

    O Ironic atingiu o tempo limite enquanto esperava um servidor ser ativado. O status muda de cleaning para clean failed e 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

    Determine se a opção está ativada:

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

    Se a chave estiver ativada, a saída vai retornar "On".

    Alternativa:

    Remova o bloco image dos servidores problemáticos e aguarde até que eles voltem ao estado disponível. Depois que eles estiverem disponíveis, adicione o bloco image novamente.

    Servidores físicos 1.12.2

    Falha na inicialização do servidor

    Sintomas:

    Você pode ver uma mensagem de depuração assim:

    [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

    Esse problema ocorre quando os erros do iLO são ignorados e a resposta HTTP é lida em vez de ser retornada imediatamente, resultando em uma dereferência de ponteiro nulo.

    Registro de artefatos do sistema 1.12.1

    Ao fazer upgrade da versão 1.11.x para 1.12.1, o status do cluster do Harbor pode ser unhealthy

    Sintomas:

    Ao fazer upgrade da versão 1.11.1 para a 1.12.1, o status do cluster do Harbor pode se tornar unhealthy com o seguinte erro:

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

    Etapas para diagnóstico:

    1. Verifique o status 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. Se não estiver íntegro, verifique o status dos componentes do 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. Se harbor-core e pg-harbor-db não estiverem prontos, verifique o status 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. Se harbor-db estiver no modo InProgress, verifique se algum nó root-admin-control-plane está no modo UNDERMAINTENANCE.

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

      Espera-se que os nós estejam no modo de manutenção durante um upgrade. Se um nó estiver em manutenção, talvez você não tenha recursos suficientes para programar harbor-db.

    Alternativa:

    Para corrigir o problema, siga estas etapas:

    1. Definir KUBECONFIG

      :
      export KUBECONFIG=/root/release/root-admin/root-admin-kubeconfig
    2. Reduza os controladores de dbs:

      kubectl scale --replicas=0 deployment -n dbs-fleet-system fleet-controller-manager
      kubectl scale --replicas=0 deployment -n dbs-postgres-system pg-controller-manager
    3. Defina o nome da classe de prioridade como system-cluster-critical ou system-node-critical no modelo 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. Reinicie o pod pg-harbor-db:

      kubectl delete pods -n harbor-system pg-harbor-db-0
    5. Depois de verificar se o harborcluster está íntegro, aumente novamente os controladores dbs:

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

    Pod de serviço de job não está pronto

    Sintomas:

    O pod do serviço de job está com problemas para ficar pronto:

    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)

    Alternativa:

    1. Reinicie o pod do serviço de job.
      kubectl delete pod POD_NAME -n NAMESPACE

      A saída será semelhante ao seguinte:

      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. No bootstrapper, confira o status da organização:
      kubectl get org -A

      A saída pode ser semelhante a esta:

      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
    Monitoramento 1.12.1

    Ao fazer upgrade da versão 1.11.x para 1.12.1, a exclusão do bucket do Cortex pode falhar

    Sintomas:

    Ao fazer upgrade da versão 1.11.1 para a 1.12.1, a exclusão do bucket do Cortex pode falhar com o seguinte erro:

            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

    Alternativa:

    Siga estas etapas para excluir buckets à força:

    1. Conclua as etapas na tarefa de trabalho MON-R0017 para ter acesso à interface do StorageGRID.
    2. Navegue até os buckets na UI.
    3. Clique no botão Excluir objetos no bucket para remover os dados.
    Monitoramento 1.12.0
    1.12.1
    1.12.2

    A classe de armazenamento de métricas está definida incorretamente na configuração

    Sintomas:

    O objeto StatefulSet do Prometheus está configurado incorretamente com a classe de armazenamento standard em vez de standard-rwo. Esse problema faz com que a inicialização do objeto StatefulSet do Anthos Prometheus do componente de monitoramento falhe.

    O problema ocorre porque o reconciliador ObservabilityPipeline só define esse valor na primeira instalação, e o reconciliador ObsProjectInfra monitora recursos personalizados do cluster.

    Alternativa:

    Reinicie a implantação fleet-admin-controller no cluster de administrador da organização para resolver o problema.

    Monitoramento 1.12.2

    O subcomponente mon-common não implanta a telemetria do Istio

    Sintomas:

    O subcomponente mon-common precisa implantar um objeto de telemetria do Istio no cluster de administrador da organização para impedir o registro de auditoria de todas as solicitações do Cortex. No entanto, o arquivo de manifesto não está incluído no arquivo de build.

    Alternativa:

    Siga estas etapas para implantar o objeto de telemetria do Istio no cluster de administrador da organização:

    1. Crie um arquivo YAML definindo o recurso personalizado (CR) de telemetria do Istio no namespace mon-system do cluster de administrador da organização:

      # 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. Aplique o arquivo de manifesto ao cluster de administrador da organização no namespace mon-system:

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

    O ConfigMap mon-prober-backend-prometheus-config é redefinido

    Sintomas:

    • O alerta MON-A0001 é acionado.
    • O ConfigMap mon-prober-backend-prometheus-config é redefinido para não incluir jobs de sondagem. Por exemplo:
            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
            

    Alternativa:

    Siga estas etapas para resolver o problema:

    1. Defina as seguintes variáveis de ambiente:
      • KUBECONFIG: o caminho para o arquivo kubeconfig no cluster.
      • TARGET_CLUSTER: o nome do cluster em que você está resolvendo o problema.
    2. Pause o subcomponente mon-prober em todos os clusters:
            kubectl --kubeconfig $KUBECONFIG annotate subcomponent mon-prober -n $TARGET_CLUSTER lcm.private.gdc.goog/paused=true
            

      Exemplo:

            kubectl --kubeconfig ~/root-admin-kubeconfig annotate subcomponent mon-prober -n my-org lcm.private.gdc.goog/paused=true
            
    3. Reinicie o controlador de administrador do MON em cada cluster de administrador:
            kubectl --kubeconfig $KUBECONFIG rollout restart deploy -n obs-system mon-admin-backend-controller
            

      O ConfigMap do Prober é preenchido à medida que cada sondagem é registrada.

    4. Siga o runbook MON-R2009 para silenciar o alerta MON-A0001, Blackbox monitoring metrics pipeline down, porque ele vai continuar sendo acionado.
    Plataforma do nó 1.12.1

    Ao fazer upgrade da versão 1.11.x para 1.12.x, um pod de download de imagem de troca pode ficar preso no estado ErrImagePull.

    Sintomas:

    Ao fazer upgrade da versão 1.11.x para 1.12.x, um pod de download de imagem de troca pode ficar parado no estado ErrImagePull com o seguinte aviso:

     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"

    Alternativa:

    Para corrigir o problema, marque a imagem pnet-core-switch-image-downloader como switch-image-downloader.

    Plataforma do nó 1.12.1

    Ao fazer upgrade da versão 1.11.x para a 1.12.1, o firewall do host bloqueia o download da imagem de troca

    Sintomas:

    Ao fazer upgrade da versão 1.11.x para a 1.12.1, o firewall do host bloqueia o download da imagem de troca devido a uma incompatibilidade de interfaces usadas pelo firewall do host.

    Alternativa:

    Aplique a solução alternativa a seguir antes de fazer upgrade, apenas se você estiver fazendo upgrade da versão 1.11.x para a 1.12.x.

    1. Atualize os clusters de administrador raiz e de administrador da organização.
      1. Receba o nome e o namespace do pool de nós para nós bare metal de administrador raiz e de administrador da organização. Para o cluster root-admin, use o kubeconfig root-admin. O comando a seguir lista um inventário das máquinas e filtra a lista por máquinas 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
        A saída mostra o nome e o namespace do pool de nós:
        admin-control-plane-node-pool,org-1
        root-admin-control-plane,root

        Os valores na saída correspondem ao seguinte:

        • 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: root
      2. Crie os seguintes objetos nos clusters root-admin e org-admin para renomear eth0 como mgmt0 nos nós:

        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. Os campos NODEPOOL_NAME e NODEPOOL_NAMESPACE são preenchidos com a lista de todos os pools de nós no cluster respectivo quando o arquivo YAML anterior é implantado.

        Um exemplo de arquivo YAML para o cluster de administrador raiz com os nomes reais do pool de nós do administrador raiz e do pool de nós do administrador da organização pode ser assim:

        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. Aplique o arquivo YAML ao cluster de administrador raiz:
        kubectl --kubeconfig=ROOT_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    2. Atualize o cluster do sistema:
      1. Faça um inventário das máquinas e filtre a lista por máquinas 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
        A saída será semelhante a esta:
        worker-node-pool-o1-highgpu1-48-gdc-metal,org-1-system-cluster

        Os valores na saída correspondem ao seguinte:

        • SYSTEM_CLUSTER_NODEPOOL_NAME: worker-node-pool-o1-highgpu1-48-gdc-metal
        • SYSTEM_CLUSTER_NODEPOOL_NAMESPACE: org-1-system-cluster
      2. Os campos NODEPOOL_NAME e NODEPOOL_NAMESPACE são preenchidos com base na lista de saída do comando anterior.

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

        Um exemplo de arquivo YAML para o cluster do sistema com os nomes reais dos nodepools pode ser assim:

        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. Aplique o arquivo YAML ao cluster de administrador da organização:
        kubectl --kubeconfig=ORG_ADMIN_KUBECONFIG  -f YAML_FILE_NAME
    Rede de nível inferior 1.12.2

    Os switches de rede pré-carregados com uma versão anterior à 9.3.10 podem não inicializar

    Sintomas:

    Os switches de rede pré-carregados com uma versão anterior à 9.3.10 não conseguem fazer o bootstrap porque a versão esperada do switch é 10.3(4a).

    Alternativa:

    Faça upgrade manual do firmware do switch da versão 9.3.5 para a 9.3.10 e, em seguida, da 9.3.10 para a 10.3.4a.

    Rede de nível inferior 1.12.2

    Algumas conexões com o nó org-admin expiram

    Sintomas:

    As conexões são interrompidas no switch porque ele não tem a configuração mais recente devido a certificados expirados.

    Alternativa:

    1. Gire os certificados no switch.
    2. Ative os novos certificados:
      1. nxapi certificate httpskey keyfile bootflash:api-private-key.pem
      2. nxapi certificate httpscrt certfile bootflash:api-certificate.pem
      3. nxapi certificate enable
    Armazenamento de arquivos e blocos 1.12.1
    1.12.2
    1.12.4

    Ao fazer upgrade da versão 1.11.1 para 1.12.1, 1.12.2 ou 1.12.4, a implantação do subcomponente file-netapp-trident pode falhar

    Sintomas:

    O subcomponente Linux Unified Key Setup (LUKS) não é reimplantado durante o upgrade. Para verificar o subcomponente file-netapp-trident:

    1. Definir aliases:
      alias ka='kubectl --kubeconfig=/path/to/root-admin/root-admin-kubeconfig' 
      alias ko='kubectl --kubeconfig=/path/to/org-admin/org-admin-kubeconfig'
    2. Receba o subcomponente:
      ka get subcomponent -n root file-netapp-trident -o yaml
      ko get subcomponent -n root file-netapp-trident -o yaml

    A saída pode ser semelhante a esta:

    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 

    Neste exemplo, duas classes de armazenamento falharam: standard-rwo e standard-block.

    Alternativa:

    1. Exclua o StorageClasses que o job não conseguiu criar, como standard-rwo, standard-block, standard-rwo-non-luks e standard-block-non-luks.
    2. Acione a recriação do StorageClasses reiniciando o oclcm-backend-controller do cluster (controlador root-admin para clusters de administrador raiz e da organização, controlador org-admin para clusters de sistema e de usuário).
    3. Para a versão 1.12.4, confirme se as classes de armazenamento instaladas têm a anotação disk.gdc.goog/luks-encrypted: definida como "true" (excluindo as classes de armazenamento não LUKS). Se a anotação não estiver definida como "true", repita as etapas 1 e 2.
    4. Reinicie a implantação do netapp-trident e o netapp-trident DaemonSet no cluster.
    5. Verifique se o secret do LUKS foi criado para seus recursos PersistentVolumeClaim (PVC). Cada PVC precisa ter um secret no formato g-luks-$pvc_name.
    6. Verifique se o subcomponente file-netapp-trident não tem erros no status.
    Armazenamento de objetos 1.12.2

    Os buckets de armazenamento de objetos podem não estar prontos após o upgrade da organização raiz

    Sintomas:

    Depois de fazer upgrade da organização raiz da versão 1.12.1 para 1.12.x, a validação pós-upgrade falha com o seguinte erro:

    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
          

    Alternativa:

    Adicione manualmente o finalizador antes de iniciar o upgrade.

    Gerenciamento de clusters 1.12.1, 1.12.2

    Os clusters de usuários com a versão 1.27.x do Kubernetes podem ter pools de nós que não são inicializados

    Sintomas:

    Os pools de nós em clusters de usuários que executam a versão 1.27.x do Kubernetes podem não ser inicializados, o que impede que o cluster de usuário processe cargas de trabalho de contêineres.

    Alternativa:

    Não crie um cluster de usuários com a versão 1.27.x do Kubernetes.

    Máquinas virtuais 1.12.0

    A tradução de imagens não consegue buscar pacotes quando a imagem de origem tem padrões

    Sintomas:

    A importação de imagens de VM falha na etapa de tradução se uma imagem de origem do Ubuntu contiver fontes APT padrão em sources.list.

    Alternativa:

    Verifique se o diretório /var/lib/apt/lists/ está vazio na imagem de origem.

    Máquinas virtuais 1.12.2

    Os pods do importador estão falhando ou travados

    Sintomas:

    Receba uma lista de pods do importador:

    kubectl get pods -A | grep import 

    A saída pode ser semelhante a esta:

    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

    O registro pode mostrar um evento como este:

    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

    Alternativa:

    1. Extraia o nome PersistentVolumeClaim (PVC) da mensagem de erro, como pvc-2000efe0-b4a0-4856-899b-7e0c9fd33405.
    2. Procure o PersistentVolume (PV) com esse nome e anote o spec.csi.volumeAttributes.internalName para usar mais tarde.
    3. Estabeleça uma conexão SSH com o cluster de armazenamento usando as etapas no runbook FILE-A0006.
    4. Mostre o volume e anote o nome do vserver que o comando retorna:
      volume show -volume INTERNAL_NAME
    5. Deixar o volume off-line:
      volume offline -volume INTERNAL_NAME -vserver VSERVER_NAME
    6. Exclua o volume:
      volume delete -volume INTERNAL_NAME -vserver VSERVER_NAME
    Máquinas virtuais 1.12.1
    1.12.2

    O VMRuntime pode não estar pronto devido a uma falha na instalação do network-controller-manager

    Sintomas:

    O VMRuntime no cluster de destino (que pode ser de administrador ou de sistema) tem o status VMRuntime.ready = false e network-controller-manager no namespace kube-system está pendente.

    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
          

    Alternativa:

    A exclusão da implantação network-controller-manager deve recriar a implantação automaticamente com os certificados necessários pelo operador do VMM. A implantação vai entrar no estado Running e, em seguida, o status do VMRuntime vai mudar para ready=true.

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

    Tempo de provisionamento longo para máquina virtual virtuais

    Sintomas:

    Os pods do importador de VM entram em loop de falha, e o volume de dados fica preso no status de importação por mais de 90 minutos. O status dos pods pode ser assim:

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

    Todas as importações de disco são concluídas em até três horas.

    Fazer upgrade 1.12.2

    Ao fazer upgrade da versão 1.11.1 para a 1.12.2, o subcomponente unet-nodenetworkpolicy-infra não é reconciliado

    Sintomas:

    A mensagem de falha pode ser semelhante a esta:

         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

    Alternativa:

    1. Se a falha estiver na raiz, nas etapas a seguir, substitua KUBECONFIG pelo kubeconfig do administrador raiz.
    2. Se a falha for na organização, nas etapas a seguir, substitua KUBECONFIG pelo kubeconfig do administrador da organização.
    3. Execute o comando a seguir:
               alias k="kubectl --kubeconfig=KUBECONFIG"
               k get networks mgmt-network -o json | jq '.spec.nodeInterfaceMatcher.interfaceName'
    4. Se a saída for eth0, execute:
      k patch network mgmt-network -p '{"metadata":{"finalizers":null}}' --type=merge
    5. Excluir mgmt-network.
      k delete network mgmt-network
    6. Verifique se o status de unet-nodenetworkpolicy-infra não tem um erro.

      Exemplo:

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

      A saída é semelhante a esta:

               NAME                           AGE   STATUS
               unet-nodenetworkpolicy-infra   34d   ReconciliationCompleted

    Upgrades 1.12.2

    Falha no cluster do sistema durante o upgrade da versão 1.11.x para 1.12.2

    Sintomas:

    Durante ou após o upgrade da versão 1.11.x para 1.12.2, os jobs com o nome bm-system-add-ons-* podem falhar com o seguinte erro:

       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.

    Alternativa:

    Aplique as seguintes anotações a todos os clusters do Kubernetes antes de iniciar um upgrade da versão 1.11 para a 1.12.2.

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

    Por exemplo, no cluster de administrador raiz, use:

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

    Fazer upgrade 1.12.2

    O subcomponente file-observability falha no org-1-system-cluster

    Sintomas:

    Esse problema ocorre ao fazer upgrade da versão 1.11.1 para a 1.12.2.

    Analise o arquivo .yaml do subcomponente file-observability :

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

    O arquivo pode ter a seguinte mensagem na seção 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'

    Alternativa:

    1. Verifique o namespace file-system para confirmar se ele não está sendo encerrado no org-admin cluster:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG get namespace file-system
    2. Se ele estiver sendo encerrado, exclua todos os destinos de monitoramento no namespace file-system:
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG delete monitoringtarget -n file-system --all
    3. Pause o subcomponente file-observability até que o subcomponente mon-admin esteja ativo. Para isso, adicione as seguintes anotações ao subcomponente:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG annotate -n org-1 subcomponent file-observability lcm.private.gdc.goog/paused='true'
      kubectl --kubeconfig ORG_ADMIN_KUBECONFIG annotate -n org-1-system-cluster subcomponent file-observability lcm.private.gdc.goog/paused='true'
    4. Remova a anotação para pausar o subcomponente após a conclusão do upgrade:
      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-
    Fazer upgrade 1.12.2

    HSMupgrade falha porque o hsmcluster não está pronto

    Sintomas:

    Esse problema ocorre ao fazer upgrade da versão 1.11.1 para a 1.12.2.

    Quando todas as etapas de upgrade de hsmupgraderequest e ctmclusterupgraderequest forem concluídas, o seguinte erro vai aparecer:

    HSMCluster "hsmcluster" is not ready. 

    Exemplo:

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

    Alternativa:

    1. Verifique se a atualização foi concluída no HSM e receba o endereço IP de cada HSM:
      kubectl get hsm -A --kubeconfig=ROOT_ADMIN_KUBECONFIG

      A saída será semelhante ao seguinte:

      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. Faça o download e configure ksctl.
    3. Execute ksctl system info get --url=https://HSM_MANAGEMENT_IP para verificar se todas as versões do HSM foram atualizadas para .Spec.TargetVersion de ctmclusterupgraderequest:

      A saída será semelhante ao seguinte:

            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. Atualize o campo Status.FirmwareVersion de cada HSM para a versão atualizada, conforme obtido na etapa anterior:

      Exemplo:

          kubectl edit-status hsm HSM_NAME -n gpc-system
    5. Atualize o status da última condição de ctmclusterupgraderequest.status.conditions de False para True. Depois disso, o status da última condição hsmupgraderequest.status.conditions também se torna verdadeiro.

      Exemplo:

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

    Fazer upgrade 1.12.2
    1.12.4

    IP de gerenciamento inacessível

    Durante um upgrade, o IP de gerenciamento de um servidor fica inacessível, principalmente após um upgrade do SO do switch.

    Com o Rocky Linux, quando rotas estáticas são adicionadas, o IP de destino usado para alcançar as rotas estáticas precisa estar acessível antes da adição delas. Se o switch estiver reiniciando após um upgrade do SO, esse IP de gerenciamento poderá ficar temporariamente inacessível.

    Alternativa:

    Estabeleça uma conexão SSH com o servidor usando o endereço IP de dados e reinicie o serviço de rede para recriar as rotas estáticas ausentes:

    systemctl restart NetworkManager.service
    Sistema de emissão de tíquetes 1.12.2

    Falha na sincronização da base de conhecimento do sistema de emissão de tíquetes

    Sintomas:

    Durante uma sincronização da base de conhecimento, você pode encontrar o seguinte erro:

    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. 

    Alternativa:

    Adicione uma propriedade do sistema para aumentar o comprimento máximo:

    1. Na plataforma ServiceNow, insira sys_properties.list no filtro de navegação.
    2. Clique em Novo.
    3. No campo Nome, use glide.rest.max_content_length.
    4. No campo Tipo, selecione string.
    5. No campo Valor, insira 15.
    6. Clique em Enviar.
    7. Sincronize a base de conhecimento novamente.
    Sistema de emissão de tíquetes 1.12.2

    O sistema de emissão de tíquetes não tem upstream íntegro

    Sintomas:

    Ao implantar a organização gdchservices manualmente, o sistema de tíquetes não tem um upstream íntegro, não há VMs criadas e o pod midserver não está íntegro no cluster gdchservices-system no namespace support.

    Alternativa:

    Crie um novo recurso personalizado TicketingSystem com a imagem de VM correta no 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
    Fazer upgrade 1.12.2

    O SSH para uma VM com IP de gerenciamento e os registros do cilium falham

    Sintomas:

    O acesso de login não funciona em uma VM com IP de gerenciamento. Talvez você veja um erro semelhante a este nos registros do pod anetd:

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

    Alternativa:

    Exclua o pod virt-launcher da VM.

    Fazer upgrade 1.12.2

    O subcomponente mz-etcd atualiza spec.deployTarget e spec.Namespace, causando falha no upgrade da versão 1.11.x para 1.12.x

    Sintomas:

    Durante o upgrade da versão 1.11x para 1.12.x, talvez você veja um erro semelhante a este:

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

    O subcomponente mz-etcd tem a seguinte especificação antes de um upgrade:

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

    Alternativa:

    1. Exclua os seguintes subcomponentes no cluster de administrador raiz:
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n root mz-etcd
            kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG delete subcomponent -n org-1 mz-etcd
    2. Verifique o subcomponente nos namespaces raiz e da organização:
            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. O novo subcomponente precisa ter a seguinte especificação, e o chatURL precisa mostrar a versão para a qual os clusters já foram atualizados:
                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
    Fazer upgrade 1.12.2

    O upgrade do armazenamento de objetos mostra um erro durante a verificação de simulação ou pós-simulação

    Sintomas:

    As verificações de simulação ou pós-simulação falham com um erro. Verifique os registros:

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

    O erro pode ter esta aparência:

     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

    Alternativa:

    Se o erro ocorrer durante as verificações pós-voo e todas as outras verificações forem concluídas sem erros, pule as verificações pós-voo. Quando o upgrade for reiniciado, pule as verificações de simulação usando o kubeconfig do administrador raiz:

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

    Por exemplo, se o erro ocorrer em org-1, o comando será assim:

     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

    Se o erro ocorrer durante as verificações de simulação e todas as outras forem concluídas sem erros, ignore as verificações de simulação:

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

    Por exemplo, se o erro ocorrer em org-1, o comando será assim:

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

    Talvez seja necessário aplicar essa solução alternativa mais de uma vez se ela não for aplicada.

    Portfólio da ATAT 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Falha na sincronização do portfólio

    Sintomas:

    O ConfigSync falha com a mensagem:

     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. 

    Alternativa:

    O esquema Portfolio mudou na versão 1.12 do GDC. O campo portfolioName foi refatorado para portfolioID. Encontre o arquivo YAML que contém o recurso personalizado de portfólio mencionado na mensagem de erro. Renomeie o campo portfolioName como portfolioID.

    Fazer upgrade 1.12.2

    Uma falha no NTP OSPolicy impede a execução de todos os outros OSPolicies

    Sintomas:

    Confira os possíveis motivos para que um job em execução não seja criado para um job de patch que concluiu apenas jobs de pré-teste:

    1. A falha do NTP impede a execução de todos os outros jobs de patch.
    2. O nó não está íntegro.
    3. O agente de configuração do SO não está em execução.
    4. O agente de configuração do SO não consegue se comunicar com o serviço de configuração do SO.
    5. Há um problema com o serviço de configuração do SO.

    Alternativa:

    1. Verifique o CR "NodeTargetPolicy" do nó.
    2. Pesquise `.spec.osPolicies` do CR `NodeTargetPolicy` que tem `ref.name=admin-ntp-policy` e `type: Ready` com status "false":
            # Enter the node InventoryMachine name.
            NAME=
            kubectl get nodetargetpolicy -n gpc-system $NAME -ojsonpath="{.spec.osPolicies}" | jq
    3. A saída será semelhante ao seguinte:
       - 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. Exclua todas as condições dessas `osPolicies` e mantenha apenas a seguinte parte:
      - conditions:
                diff: os-policy-preflight-admin-ntp-policymf2w4-dpbxw
                playbookName: server-ntp-config
                ref:
                  name: admin-ntp-policy
                  namespace: gpc-system
    Fazer upgrade 1.12.3
    1.12.4

    NodeUpgrade mostra o Rocky Linux

    Sintomas:

    O CR NodeUpgrade menciona version: rocky-86-xyz na especificação, mesmo que o nó em upgrade seja o Ubuntu.

    Alternativa:

    Não é necessário usar uma solução alternativa porque essas informações são benignas. O nó é atualizado corretamente para uma versão mais recente do Ubuntu.

    SIEM 1.12.0
    1.12.1
    1.12.2
    1.12.3
    1.12.4

    Falha nos jobs de pré-instalação do SIEM

    Sintomas:

    Os jobs siem-*-preinstall no namespace raiz e org-1 no cluster de administrador raiz falham repetidamente.

    Alternativa:

    É esperado que os jobs falhem quando o flag de recurso SIEMComponent estiver desativado. As falhas não indicam que o componente está com defeito. A reconciliação do componente SIEM pode ser pausada se o ruído for prejudicial, mas geralmente é recomendável deixar o componente ativado, se possível. Se a reconciliação de componentes estiver pausada, ela precisará ser reativada manualmente quando a instalação do componente SIEM não for mais limitada em upgrades futuros.

    Upgrade de nós 1.12.0
    1.12.1
    1.12.2

    Falha no upgrade do nó devido a um arquivo lvm.conf desatualizado

    Sintomas:

    Pode haver problemas com vgs, blkid e o gather_facts do Ansible não responder. Esse problema afeta os sistemas operacionais Rocky e Ubuntu.

    Siga estas etapas se os nós já tiverem sido atualizados. O processo para atualizar o arquivo lvm.conf consiste nas seguintes etapas:

    1. Receba uma lista de todos os nós para que essa correção possa ser aplicada a todos eles.
    2. Crie um playbook do Ansible e um arquivo de política do SO.
    3. Aplique a correção aos nós.
    4. Verifique se a correção foi aplicada.

    Pré-requisitos:

    1. Siga as etapas no runbook IAM-R0004 para gerar o ROOTCONFIG do cluster de administrador raiz e o ORGCONFIG do cluster de administrador da organização.
    2. Siga as etapas no runbook IAM-R0005 para receber os seguintes papéis da organização:

    Alternativa:

    1. Identifique os InventoryMachines que correspondem aos clusters:
      kubectl --kubeconfig=$ROOTCONFIG get inventorymachines
          kubectl --kubeconfig=$ORGCONFIG get inventorymachines

      Mantenha a saída separada. Corrija um cluster por vez. A saída pode ser semelhante a esta:

          NAME
          bm-2bca8e3f
          bm-4caa4f4e
    2. Crie um playbook e um arquivo de política:
      apiVersion: system.private.gdc.goog/v1alpha1
          kind: AnsiblePlaybook
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            playbook: |
              - name: Add a device filter to /etc/lvm/lvm.conf
                hosts: all
                gather_facts: no
                tasks:
                  # Change lvm.conf
                  - name: Configure lvm for filtering out "dm" and "sg" devices
                    ansible.builtin.lineinfile:
                      path: /etc/lvm/lvm.conf
                      insertafter: '^(\s+|)devices(\s+|)\{'
                      line: '  filter = [ \"r|/dev/dm.|\", \"r|/dev/sg.|\" ]'
      
          ---
          apiVersion: system.private.gdc.goog/v1alpha1
          kind: OSPolicy
          metadata:
            name: lvm-conf-device-filter-node-update
            namespace: gpc-system
          spec:
            interval:
              period: 1m
            inventory:
               # this is the inventory from step 1 above,
               # see the syntex below
            policy:
              installPlaybook:
                name: lvm-conf-device-filter-node-update
    3. A seção de inventário anterior precisa ser preenchida como neste exemplo. Adicione um parágrafo para cada nó encontrado na etapa 1. Você vai trabalhar com um cluster por vez. Portanto, preencha a seção de inventário com nós de um 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. Aplique a correção ao cluster de administrador raiz:
      kubectl --kubeconfig=$ROOTCONFIG apply -f PRECEDING_FILENAME_WITH_ROOT_NODES
    5. Aplique a correção ao cluster de administrador da organização:
      kubectl --kubeconfig=$ORGCONFIG  apply -f PRECEDING_FILENAME_WITH_ORG_NODES
    6. Reinicie o servidor para que a nova configuração entre em vigor.
    7. Siga as etapas no runbook OS-P0005 para validar se os nós foram atualizados.
    8. Depois de confirmar que a política foi concluída, exclua-a usando a ferramenta k9s:
      1. Navegue até as políticas do SO, como :ospolicies.
      2. Encontre e selecione a política do lvm-conf-device-filter-node-update.
      3. Pressione Ctrl + d.
      4. Confirme a exclusão.

    Para encaminhar esse problema, abra um tíquete usando o runbook SUPP-G0008. O tíquete precisa incluir informações como:

    1. Comandos executados e as mensagens de saída
    2. Detalhes como InventoryMachineName e clusters
    3. Mensagens de registro
    Sistema operacional (SO) 1.12.0
    1.12.1
    1.12.2
    1.12.4

    O Rocky OS foi selecionado por engano para novos clusters ou organizações

    Sintomas:

    Esse problema ocorre se o ambiente foi implantado anteriormente com a versão 1.11 e depois atualizado para a 1.12. Ao criar um cluster ou uma organização em uma versão 1.12.x, o Rocky OS em vez do Ubuntu OS é selecionado para provisionamento de nós de bare metal e máquina virtual devido à versão do Rocky OS especificada nas CRs ReleaseMetadata e Userclustermetadata.

    Alternativa:

    Aplique a solução alternativa a seguir antes de criar uma nova organização:

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

      Se for esse o caso, encaminhe para a equipe de engenharia antes de seguir para as próximas etapas.

    2. Remova todos os CRs OrganizationUpgrade para evitar upgrades acidentais do SO do nó:
      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. Defina a versão de destino do GDC para a criação da nova organização. Deve haver um ReleaseMetadata correspondente para essa versão de destino:
      TARGET_RELEASE=
    4. Identifique a CR OSImageMetadata mais recente para o SO Ubuntu de destino no cluster de administrador raiz e defina a variável 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

      A saída pode ser semelhante a esta:

      1.12.4-gdch.4

      Verifique se a variável usa a mesma versão principal.secundária.patch, como 1.12.4, que o TARGET_RELEASE. Caso contrário, encaminhe para a equipe de engenharia antes de prosseguir.

    5. Atualize o ReleaseMetadata de destino para usar o Ubuntu OS_VERSION no cluster de administrador raiz:
      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. Identifique a lista de UserclusterMetadata mapeada para o ReleaseMetadata de destino:
      UCMS=$(kubectl --kubeconfig=KUBECONFIG get releasemetadata  "${TARGET_RELEASE}" -o json | jq -r '.spec.userClusters[].name')
    7. Atualize o UserclusterMetadata de destino para usar o Ubuntu OS_VERSION no cluster de administrador raiz e no cluster de administrador da organização para cada organização. Execute o seguinte comando para cada 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
    Máquinas virtuais 1.12.1
    1.12.2
    1.12.4

    A importação de imagens BYO falha para imagens qcow2 e raw

    Sintomas:

    Quando as imagens de VM locais são importadas usando a CLI gdcloud compute images import, o status da importação fica preso em WaitingForTranslationVM ou ImportJobNotCreated. Isso acontece porque o disco temporário criado para tradução ou importação usa o mesmo tamanho da imagem qcow2 ou bruta, mas o LUKS adiciona uma sobrecarga de alguns MiBs que causa falha no provisionamento do disco.

    Alternativa:

    Crie um novo VirtualMachineImageImport manualmente com o mesmo nome de imagem, mas com um spec.minimumDiskSize maior. Por exemplo, se este foi o comando usado para importar a imagem:

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

    Se o VirtualMachineImageImport original criado automaticamente pela CLI tiver minimumDiskSize como X Gi, crie um novo com X+1 Gi. O valor é baseado no tamanho da imagem que está sendo importada. No caso de qcow2, seria o tamanho virtual. Por exemplo, 20Gi deve ser substituído por 21Gi.

    Substitua os valores do marcador de posição com base em como a CLI foi chamada.

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

      Se o objeto não estiver presente, acione o comando gdcloud compute images import ... novamente. Depois que a saída do console passar de Uploading image to ... para Image import has started for ..., pressione CTRL + C para que a imagem local seja enviada por upload para o armazenamento de objetos e o VirtualMachineImageImport seja preservado para referência ao criar um novo.

    2. Crie um novo VirtualMachineImageImport com um minimumDiskSize maior:
      apiVersion: virtualmachine.gdc.goog/v1
      kind: VirtualMachineImageImport
      metadata:
        name: $IMPORT_NAME_NEW
        namespace: $NAMESPACE
      spec:
        imageMetadata:
          minimumDiskSize: $NEW_SIZE
          name: $IMAGE_NAME
          operatingSystem: $OS
        source:
           objectStorage:
            bucketRef:
              name: vm-images-bucket
            objectName: $LOCAL_FILENAME
    Máquinas virtuais 1.12.0
    1.12.1
    1.12.2
    1.12.3

    A importação de imagens está travada em TranslationInProgress

    Sintomas:

    O pod importer-image-import-$VMII no namespace do projeto do cluster do sistema falha com o seguinte erro: 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`). O objeto VirtualMachineImageImport VMII tem o tipo de condição Ready com status False e motivo TranslationInProgress após 2 horas do início da importação.

    Alternativa:

    Para melhorar a velocidade, modifique o tamanho mínimo do disco da imagem para 200Gi da seguinte maneira:

    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

    Para excluir e aplicar o ValidatingWebhookConfiguration, você precisa do kubeconfig de administrador do cluster para o cluster de administrador da organização. Você pode acessar o seguinte runbook IAM-R0004.

    Se você usar gdcloud para iniciar a importação, não será possível fornecer o parâmetro minimumDiskSize. Você precisa criar um objeto VMII e modificá-lo conforme mostrado no comando anterior.

    O processo de VirtualMachineImageImport continua, mas fica preso novamente em uma etapa posterior. No namespace do projeto no cluster do sistema, o job image-import-$VMII falha continuamente com o erro: error: stream error: stream ID x; NO_ERROR; received from peer. Nesse ponto, a importação da imagem é concluída. A imagem final é enviada para o armazenamento de objetos, mas o VirtualMachineImage está faltando. É possível criar um VirtualMachineImage manualmente da seguinte forma:

    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` precisa corresponder a `VMII.ImageMetadata.Name`, e `$OS_NAME` pode ser um destes: [`ubuntu-2004`, `ubuntu-2204`, `windows-2019`, `rhel-8`] e precisa corresponder ao tipo da imagem importada.

    Istio 1.12.4

    A implantação do istio-eastwestgateway no namespace istio-system está travada

    Sintomas:

    A implantação istio-eastwestgateway no namespace istio-system está travada, com eventos de pod mostrando um erro Back-off pulling image "auto" de kubelet.

    Para diagnosticar o problema, verifique se o mutatingwebhookconfiguration chamado istio-revision-tag-default existe no mesmo cluster que a implantação de gateway travada.

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

    Alternativa:

    • Se a configuração existir, reinicie a implantação istio-eastwestgateway no namespace istio-system.
      kubectl --kubeconfig=KUBECONFIG rollout restart deployment/istio-eastwestgateway -n istio-system
    • Se a configuração não existir, aguarde até que o webhook seja criado, o que deve acontecer em breve, já que ele está em um loop de reconciliação.
    Monitoramento 1.12.2

    cortex-store-gateway reiniciando com erro de limites de intervalo fora do alcance

    Sintomas:

    Os pods cortex-store-gateway são reiniciados com a seguinte mensagem de erro nos registros:

    panic: runtime error: slice bounds out of range

    Alternativa:

    1. Pause o subcomponente mon-cortex no cluster do sistema.
      kubectl --kubeconfig $ORG_ADMIN_CONFIG annotate subcomponent mon-cortex -n $SYSTEM_CLUSTER_NAMESPACE lcm.private.gdc.goog/paused=true
    2. Modifique o configMap cortex-config no cluster do sistema e defina o tempo limite do memcached no index_cache como dois segundos para que a configuração do index_cache fique assim:
       index_cache:
            backend: memcached
            memcached:
              addresses: dnssrvnoa+_memcached._tcp.cortex-index-memcached.mon-system.svc.cluster.local
              timeout: 2s
    3. Reinicie os pods cortex-store-gateway no cluster do sistema para que eles usem a configuração atualizada.
    Fazer upgrade 1.12.4

    A reinicialização do nó de administrador raiz durante o upgrade causa uma falha no subcomponente

    Sintomas:

    O nó bare metal aparece como NotReady, e o servidor fica preso na tela de inicialização com a última mensagem dizendo Retrieving encryption keys.

    Alternativa:

    1. Reinicie o iLO.
    2. Depois que o iLO voltar a funcionar, reinicie o servidor.
    Fazer upgrade 1.12.4

    O número da versão do storagecluster não é exibido durante o upgrade

    Sintomas:

    Após o upgrade, o CR StorageCluster não mostra nenhum valor para o campo de status StorageVersion. Verifique a versão:

    kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG get StorageCluster -n gpc-system
    Siga as etapas da solução alternativa se o campo "Versão" estiver vazio.

    Alternativa:

    Reinicie a implantação file-storage-backend-controller:

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

    Infraestrutura do pacote de operações (OI) 1.12.4

    O caminho do instalador do Fluent Bit está incorreto

    Sintomas:

    O local do instalador do fluent-bit mudou para operations_center\bin\fluent-bit-win64.msi. O Copy-ConfigHostFiles.ps1 espera que o instalador do cliente fluent-bit corresponda ao padrão fluent-bit-*-win64.*. O instalador não encontra o instalador porque esse padrão não corresponde mais.

    Alternativa:

    1. Abra o arquivo Copy-ConfigHostFiles.ps1.
    2. Encontre a seguinte linha:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-*-win64.*').FullName
    3. Edite a linha anterior para adicionar o local correto do instalador:
      $(Get-Item -Path 'H:\operations_center\bin\fluent-bit-win64.*').Name
    Infraestrutura do pacote de operações (OI) 1.12.4

    O caminho do instalador do Nessus está incorreto

    Sintomas:

    O local do instalador do Nessus mudou para operations_center\bin\NessusAgent-x64.msi. O Copy-ConfigHostFiles.ps1 espera que o instalador do cliente corresponda ao nome do arquivo /NessusAgent-10.4.1-x64.msi. O instalador não encontra o instalador porque esse padrão não corresponde mais.

    Alternativa:

    1. Abra o arquivo Copy-ConfigHostFiles.ps1.
    2. Encontre as seguintes linhas:
      [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. Edite as linhas anteriores para adicionar o local correto do instalador, mudando Nessus-10.4.1-x64.msi para 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" }
    Armazenamento de objetos 1.12.4

    A criação de uma nova organização fica travada no estado VMImageDistributing

    Sintomas:

    Você pode receber uma mensagem como esta:

    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  

    Esse problema é causado pela falta de uma configuração de endpoint do S3 para a nova organização.

    Alternativa:

    Crie manualmente um grupo de alta disponibilidade para a nova organização.

    1. Pelo procedimento de emergência, adquira um kubeconfig do cluster de administrador raiz com acesso de leitura aos seguintes recursos:
      • Organização
      • ObjectStorageAdminNode
      • SubnetClaim
      • ObjectStorageSite
      • Secret
    2. Anote o nome da organização:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get Organization -A
    3. Anote os endereços IP do cliente dos CRs ObjectStorageAdminNode no cluster de administrador raiz.
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode

      Para cada CR AdminNode:

      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get ObjectStorageAdminNode NODE_NAME -o jsonpath='{.spec.network.clientIP}'
    4. Anote o intervalo de endereços IP disponíveis e os IPs reservados nesse intervalo:
      kubectl --kubeconfig ROOT_ADMIN_KUBECONFIG_ABSOLUTE_PATH get SubnetClaim -n root external-objectstorage-client-lif-subnet -o jsonpath='{.status.ipv4SubnetStatus}'
    5. Extraia as credenciais de login da interface de gerenciamento do StorageGRID do secret gpc-system/objectstorage-breakglass-root-level1 no cluster root-admin.
    6. Faça login na interface de gerenciamento do StorageGRID com as credenciais da etapa anterior. O URL está no status ObjectStorageSite:
      kubectl --kubeconfig /root/release/root-admin/root-admin-kubeconfig get ObjectStorageSite -n gpc-system mb-obj-site-1 -o jsonpath='{.status.managementAPIEndpointURL}'
    7. Acesse a guia Configuração e clique em Grupos de alta disponibilidade.
    8. Abra a visualização de detalhes de cada grupo de alta disponibilidade e anote o endereço IP virtual (VIPs).
    9. Crie um novo grupo de alta disponibilidade:
      1. Nome do grupo: o padrão de nome é ORGANIZATION_NAME-ha . Nesse caso, é org-2-ha.
      2. Descrição do grupo: use grupos de HA atuais para o padrão de descrição.
      3. Interfaces: selecione todos os eth2.
      4. Ordem de prioridade: a interface principal precisa ter a maior prioridade.
      5. SubnetCIDR: esse campo é preenchido automaticamente pelo StorageGRID. Verifique se a sub-rede corresponde ao status.ipv4SubnetStatus.cidrBlock no SubnetClaim external-objectstorage-client-lif-cidr.
      6. IP virtual: o próximo IP no intervalo de IP disponível. O IP não pode entrar em conflito com o IP reservado, o IP do cliente do nó de administrador e os VIPs dos grupos de alta disponibilidade atuais.
    10. Alterne as credenciais de emergência do StorageGRID.
    Fazer upgrade 1.12.4

    Reconciliação em andamento no subcomponente

    Sintomas:

    Ao fazer upgrade da organização raiz de 1.12.2 para 1.12.4, o subcomponente iac-gitlab tem um status de reconciliação em andamento. Para diagnosticar o problema, verifique os registros do Prometheus. Por exemplo:

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

    Os registros podem incluir um erro como este:

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

    Alternativa:

    1. Execute "sleep 3600" para receber um shell no contêiner em execução, por exemplo.
      kubectl exec --stdin --tty POD_NAME -n gitlab-system -c prometheus-server -- /bin/sh
      /prometheus $ df -h

      Substitua POD_NAME pelo nome do pod, como gitlab-prometheus-server-d7969c968-hppsl.

    2. Verifique a saída para saber se a pasta /data está cheia:
      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. Se esse problema ocorrer durante o upgrade, exclua o job de migração, já que ele tem um tempo limite de 3.600 segundos, e continue com o upgrade:
      kubectl delete job gitlab-migrations-1-fe7-2 -n gitlab-system
    Fazer upgrade 1.12.4

    Falhas na verificação de simulação do IAM

    Sintomas:

    Para diagnosticar o problema, verifique os registros de upgrade do IAM, por exemplo:

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

    A saída pode ser semelhante a esta:

    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

    Alternativa:

    1. Consulte a mensagem de erro anterior e anote o namespace e o nome da implantação. Neste exemplo, o NAME é iam-authzpdp-backend-server e o NAMESPACE é iam-system.
    2. Confira a lista de pods:
      kubectl get pods -n NAMESPACE | grep NAME
    3. Observe o resultado no seguinte formato:
      iam-authzpdp-backend-server-6875654c4b-64h4t            2/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-pvscg            1/2     Running   0             29h
      iam-authzpdp-backend-server-6875654c4b-v7jnl            2/2     Running   0             29h

      Observe o pod que não tem todos os contêineres prontos. Nesse caso, o POD_NAME é iam-authzpdp-backend-server-6875654c4b-pvscg, que tem um dos dois contêineres não prontos, mostrado pelo status 1/2. Se houver mais de um pod assim, repita a próxima etapa para cada pod afetado.

    4. Exclua o pod que não está totalmente íntegro:
      kubectl delete pod -n NAMESPACE POD_NAME>
    5. Execute o comando da etapa 2 novamente. Todos os pods devem estar íntegros agora. Essa etapa pode levar alguns minutos.
    6. Se o pod excluído não for substituído por um pod íntegro, abra um tíquete de suporte.
    Fazer upgrade 1.12.1
    1.12.2
    1.12.4

    O status de OrganizationUpgrade é Unknown

    Sintomas:

    O status OrganizationUpgrade é Unknown depois que um upgrade é concluído.

    Alternativa:

    Se o campo de versão no Organization corresponder ao campo targetVersion, será seguro ignorar o status "Desconhecido".

    Fazer upgrade 1.12.4

    Falha no upgrade do subcomponente opa gatekeeper

    Sintomas:

    Durante o upgrade da organização do locatário da versão 1.12.2 para a 1.12.4, o upgrade do subcomponente opa gatekeeper falha com um ReconciliationError.

    Alternativa:

    1. Edite o objeto mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg do cluster de usuário afetado. Se houver mais de um cluster de usuário afetado, repita as etapas para cada um deles:
           kubectl edit mutatingwebhookconfiguration edr-sidecar-injector-webhook-cfg
    2. Edite a seção webhooks > (edr-sidecar-injector.gpc-system.internal) > namespaceSelector > matchExpressions > (key: kubernetes.io/metadata.name) > values para adicionar os dois valores a seguir:
      • opa-system
      • cert-manager.

      O objeto atualizado vai ficar assim:

                  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. As mudanças podem levar até uma hora para resolver o problema.
    Fazer upgrade 1.12.4

    ansibleplaybook não é atualizado como parte do upgrade do cluster

    Sintomas:

    Ao fazer upgrade da versão 1.12.2 para a 1.12.4, o ansibleplaybook não é atualizado como parte do upgrade do cluster. As correções atualizadas no ansibleplaybook não são aplicadas e bloqueiam a política do SO que executa a versão anterior do ansibleplaybook.

    Alternativa:

    1. Exclua o job do 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. Reinicie a implantação os-core-controller.
    3. Essa ação reativa os jobs e atualiza os playbooks.
    DNS 1.12.4

    A criação da organização falha porque o tráfego DNS para o nó de administrador raiz expira

    Sintomas:

    Ao criar uma organização, talvez o tempo limite do subcomponente core-dns seja atingido nos registros:

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

    Alternativa:

    1. Atualize os serviços gpc-coredns-forwarder-udp e gpc-coredns-forwarder-tcp do cluster de administrador raiz e adicione os novos intervalos de IP aos intervalos de origem do balanceador de carga.
    2. Se as mudanças de CR forem substituídas, pause o subcomponente dns-core com a anotação lcm.private.gdc.goog/paused="true".
    Armazenamento de arquivos e blocos 1.12.4

    Falha do subcomponente file-netapp-trident no cluster raiz

    Sintomas:

    Ao fazer upgrade da versão 1.12.2 para a 1.12.4, o subcomponente file-netapp-trident fica preso na exclusão de StorageClasses. Ele mostra o seguinte status:

          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

    Alternativa:

    1. Pause o subcomponente file-netapp-trident:
            ## Set KUBECONFIG to root-admin KUBECONFIG
            export KUBECONFIG=ROOT_ADMIN_KUBECONFIG
            kubectl annotate subcomponent file-netapp-trident -n $cluster_namespace lcm.private.gdc.goog/paused=true
    2. Exclua o StorageClasses que o job não conseguiu criar, como standard-rwo, standard-block, standard-rwo-non-luks e standard-block-non-luks:
            kubectl delete storageclass $(kubectl get storageclasses -o jsonpath='{.items[?(@.provisioner=="csi.trident.netapp.io")].metadata.name}
    3. Acione a recriação do StorageClasses reiniciando o oclcm-backend-controller do cluster (controlador root-admin para clusters de administrador raiz e da organização, controlador org-admin para clusters de sistema e de usuário):
            kubectl rollout restart deployment oclcm-cm-backend-controller -n oclcm-system
    4. Reinicie a implantação do netapp-trident e o netapp-trident DaemonSet no cluster:
            kubectl rollout restart deployment netapp-trident-controller -n netapp-trident
            kubectl rollout restart daemonset netapp-trident-node-linux -n netapp-trident
    5. Verifique se o secret do LUKS foi criado para seus recursos PersistentVolumeClaim (PVC). Cada PVC precisa ter um secret no formato g-luks-$pvc_name.
            kubectl get secret -n $pvc_namespace g-luks-$pvc_name
    6. Verifique se o subcomponente file-netapp-trident não tem erros no status:
            kubectl get subcomponent -n $cluster_namespace file-netapp-trident -o jsonpath='{.status}' | jq
      Observação: não pode haver erros nas mensagens e no `backendStatus`. O `crdStatus` precisa mostrar `delpoymentFinished: true`
    7. Ative o subcomponente para que as substituições entrem em vigor.
    Servidores físicos 1.12.4

    Falha na inicialização do servidor

    Sintomas:

    Ao fazer o bootstrap do servidor, talvez você veja uma mensagem como esta nos registros do 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

    Alternativa:

    1. Para cada fase travada, siga as instruções nos seguintes runbooks:
      1. SERV-R0006
      2. SERV-R0007
      3. SERV-R0008
    2. Se o problema persistir, siga as etapas no runbook SERV-R0001.
    3. Se o problema persistir, abra um tíquete de suporte.
    Fazer upgrade 1.12.0
    1.12.1
    1.12.2
    1.12.4

    Pods principais do Prometheus não limpos durante o upgrade

    Sintomas:

    Os pods primary-prometheus-shardX-replicaX estão visíveis nos namespaces obs-system e mon-system. Se o primary-prometheus-shardX-replicaX existir apenas no namespace obs-system após um upgrade para a versão 1.12, isso será um problema desconhecido diferente, e a solução alternativa não deverá ser realizada.

    O comportamento esperado é que primary-prometheus-shardX-replicaX exista apenas no namespace mon-system depois que o upgrade para a versão 1.12 for concluído.

    Alternativa:

    1. Exclua manualmente os primary-prometheus-shardX-replicaX StatefulSets no namespace obs-system.
    2. Não exclua os StatefulSets primary-prometheus-shardX-replicaX no namespace mon-system.
    Rede 1.12.4

    PodCIDR não atribuído a nós, mesmo que ClusterCIDRConfig seja criado

    Sintomas:

    Um ClusterCIDRConfig é um objeto obrigatório para atribuir PodCIDRs. Apesar de o ClusterCIDRConfig ter sido criado, o PodCIDRs não foi atribuído. Esse problema acontece se um ClusterCIDRConfig for criado ao mesmo tempo em que os pods ipam-controller estão fazendo bootstrap. A criação do cluster está travada no estado de reconciliação:

    1. Verifique se o objeto ClusterCIDRConfig foi criado no cluster:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get clustercidrconfigs -oyaml

      A saída pode ser semelhante a esta:

      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. Execute "describe" em um dos objetos de nó do cluster que está preso na reconciliação e verifique se um evento CIDRNotAvailable está presente no objeto de nó:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG describe node NODE_NAME

      Os eventos de saída podem ser assim:

      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

    Alternativa:

    1. Reinicie os pods ipam-controller-manager:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG -n kube-system rollout restart ds ipam-controller-manager
    2. Depois que os pods ipam-controller-manager estiverem em um estado de execução, verifique se o podCIDR está atribuído aos nós:
      kubectl --kubeconfig=CLUSTER_KUBECONFIG get nodes -oyaml | grep podCIDR

      A saída pode ser semelhante a esta:

      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

    As APIs pré-treinadas mostram um estado Enabling na interface do usuário

    O MonitoringTarget mostra um status Not Ready quando os clusters de usuários estão sendo criados, fazendo com que as APIs pré-treinadas mostrem continuamente um estado Enabling na interface do usuário.

    Alternativa:

    1. Abra o menu no navegador Chrome (ícone de três pontos).
    2. Clique em Mais ferramentas > Ferramentas para desenvolvedores para abrir o console.
    3. Clique na guia Rede no console.
    4. Encontre as solicitações ai-service-status.
    5. Clique na guia Resposta em uma solicitação ai-service-status para mostrar o conteúdo dela.
    6. Verifique se tudo parece pronto, exceto os componentes MonitoringTarget e LoggingTarget.
    Armazenamento de objetos 1.12.4

    Alguns avisos de upgrade do armazenamento de objetos podem ser ignorados

    Sintomas:

    Ao fazer upgrade do armazenamento de objetos, talvez você veja um aviso como este:

     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

    Alternativa:

    1. Verifique se cada nó tem as credenciais de SSH correspondentes armazenadas em um secret.
      1. Verifique os nós de administrador:
        kubectl get objectstorageadminnodes -o json | jq -r '.items[].metadata.name' | while read -r nodeName; do kubectl get secret -n gpc-system $nodeName-ssh-creds; done
      2. Verifique os nós de armazenamento:
        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

      A saída bem-sucedida é semelhante a este exemplo para nós de armazenamento:

      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

      Se um secret não for encontrado, o erro vai aparecer assim:

      Error from server (NotFound): secrets "gpcstgeadm02-gce-gpcstgesite01-ssh-creds" not found
    2. Se o comando não retornar erros, ignore os erros informados pelos reconciliadores.
    Vertex AI 1.11.x
    1.12.x

    O pod e o serviço de front-end de tradução não são inicializados

    Sintomas:

    Durante os upgrades, o cluster do banco de dados de tradução é recriado, o que faz com que o segredo secret-store do cluster do sistema ODS fique desatualizado e dessincronizado. Por isso, o pod e o serviço de front-end de tradução não são inicializados.

    Alternativa:

    Exclua o secret no cluster do sistema:

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

    Substitua SYSTEM_CLUSTER_KUBECONFIG pelo caminho para o arquivo kubeconfig no cluster do sistema.

    Um controlador recria o secret automaticamente e o ressincroniza com o cluster de banco de dados.

    Servidores físicos 1.12.4

    O servidor não consegue se conectar ao gerenciador de chaves

    Sintomas:

    O servidor não consegue se conectar ao gerenciador de chaves, o que impede que o estado do servidor fique disponível. Esse problema faz com que o job server-encrypt-and-create-logical-drive falhe e o cluster de administrador não fique pronto. Talvez você veja um erro nos registros do job como este:

    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   

    Alternativa:

    Faça um AuxCycle e verifique se o iLO pode se conectar ao gerenciador de chaves.

    Logging 1.12.4

    O registro prévio de gravação preenche o volume permanente

    Sintomas:

    O Loki tem apenas um volume permanente (PV) para registros de gravação antecipada (WAL) e índices. O WAL pode preencher o PV se um pod do Loki não conseguir se conectar ao bucket de armazenamento por horas. Se o PV não tiver mais espaço, o Loki não poderá ser recuperado, a menos que você exclua o PV e reinicie o StatefulSet.

    Alternativa:

    Para recuperar um pod do Loki desse estado, reduza o escalonamento do StatefulSet correspondente e exclua o PV sem espaço restante.

    Siga estas etapas para recuperar o pod do Loki:

    1. Verifique se o contêiner da ferramenta de E/S está instalado na estação de trabalho. Para mais detalhes, consulte o manual de operações OOPS-P0065.
    2. Para receber as permissões necessárias para editar recursos, peça ao administrador de segurança para conceder a você os seguintes papéis:
      • observability-viewer
      • observability-admin
    3. Defina a variável de ambiente KUBECONFIG com o caminho para o arquivo kubeconfig no cluster de administrador raiz. Para mais detalhes, consulte o runbook IAM-R0004.
    4. Defina a variável de ambiente ORG_NAME com o nome da organização afetada.
    5. Salve o conteúdo a seguir em um arquivo YAML chamado 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. Desative LoggingPipelineReconciler:
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    7. Defina a variável de ambiente KUBECONFIG com o caminho para o arquivo kubeconfig no cluster em que o pod do Loki afetado está sendo executado. Para mais detalhes, consulte o runbook IAM-R0004.
    8. Defina a variável de ambiente LOKI_POD_NAME com o nome do pod do Loki afetado.
    9. Consiga o nome do Loki StatefulSet:
      export LOKI_STATEFULSET_NAME=$(kubectl get pod $LOKI_POD_NAME -n obs-system -o json | jq -r '.metadata.labels.app')
    10. Consiga o nome do PVC do 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. Receba as réplicas StatefulSet do Loki:
      export LOKI_STATEFULSET_REPLICAS=$(kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system -o json | jq -r '.status.replicas')
    12. Reduza a escala vertical do Loki StatefulSet:
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=0
    13. Verifique se nenhum pod StatefulSet está em execução:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      A saída será semelhante ao exemplo a seguir:

      NAME                      READY   AGE
      audit-logs-loki-io        0/0     4d3h
    14. Exclua a PVC afetada:
      kubectl delete pvc $LOKI_PVC_NAME -n obs-system
    15. Aumente a escala vertical do StatefulSet do Loki:
      kubectl scale statefulset $LOKI_STATEFULSET_NAME -n obs-system --replicas=${LOKI_STATEFULSET_REPLICAS}
    16. Defina a variável de ambiente KUBECONFIG com o caminho para o arquivo kubeconfig no cluster de administrador da organização afetada. Para mais detalhes, consulte o runbook IAM-R0004.
    17. Edite o conteúdo no arquivo YAML log-admin-overrides.yaml da seguinte maneira:
      apiVersion: lcm.private.gdc.goog/v1
      kind: SubcomponentOverride
      metadata:
        name: log-admin-overrides
        namespace: root
      spec:
        subComponentRef: log-admin
        backend:
          operableParameters:
            controller:
              disableReconcilers: ""
    18. Ative a LoggingPipelineReconciler:
      kubectl apply -f log-admin-overrides.yaml -n ${ORG_NAME}
    19. Verifique se todos os pods StatefulSet estão em execução e íntegros:
      kubectl get statefulset $LOKI_STATEFULSET_NAME -n obs-system

      A saída será semelhante ao exemplo a seguir:

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

      Nesse caso, o StatefulSet tem cinco de cinco réplicas (5/5) disponíveis.

    Fazer upgrade 1.12.4

    Os jobs são programados continuamente

    Sintomas:

    Os jobs são programados continuamente. Assim que um job é encerrado, um novo é programado. Os jobs que estão sendo programados continuamente são:

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

    Alternativa:

    1. Pause os seguintes subcomponentes:
      • unet-networkpolicy
      • unet-nodenetworkpolicy
      • unet-nodenetworkpolicy
      • unet-userclusterpolicy
      • unet-clustermesh
    2. Retome os subcomponentes sempre que houver uma mudança no secret fleet-info no cluster de administrador raiz. Esse problema ocorre quando há uma mudança nas chaves de gerenciamento da instância, como kr get managementswitches -A, ou uma mudança em qualquer cidrclaim no namespace da organização.
    3. Retome os subcomponentes sempre que houver uma mudança em qualquer recurso NodePool no cluster de administrador da organização. Cancele a pausa dos subcomponentes antes de começar.
    Fazer upgrade 1.12.4

    O upstream íntegro para o ServiceNow não está disponível

    Sintomas:

    1. Ao fazer upgrade da versão 1.12.2 para a 1.12.4, um upstream íntegro para o ServiceNow não está disponível. Talvez você veja a seguinte mensagem: failed to stage volume: LUKS passphrase cannot be empty.
    2. A classe de armazenamento system-performance-rwo não está ativada para LUKS. A vinculação de volume indica que o PVC está ativado para LUKS.
    3. O reconciliador procura um secret com as senhas do LUKS. Como a vinculação de volume diz que o LUKS está ativado e a classe de armazenamento não está, a senha secreta não é criada.

    Alternativa:

    1. Receba o Kubeconfig do cluster raiz ou de administrador da organização em que o problema aparece:
            export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
    2. Exclua e recrie a classe de armazenamento system-performance-rwo:
            kubectl delete storageclass system-performance-rwo
            kubectl apply -f system-performance-rwo.yaml
    3. Crie um novo YAML para a classe de armazenamento system-performance-rwo e ative o 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
    Fazer upgrade 1.12.4

    O upgrade do subcomponente file-netapp-trident tem um status Reconciliation ongoing

    Sintomas:

    É possível que o status do subcomponente file-netapp-trident fique alternando entre Reconciling e ReconciliationCompleted.

    Alternativa:

    A reconciliação em andamento pode ser ignorada se as seguintes condições forem atendidas:

    1. O TridentBackend é online.
    2. A configuração TridentBackend é bound.
    3. A implantação netapp-trident-controller está íntegra.
    4. O DaemonSet netapp-trident-node-linux está íntegro.
    Fazer upgrade 1.12.4

    O upgrade do nó de trabalho do cluster do sistema não gera delta entre manifest e snapshot

    Sintomas:

    Ao fazer upgrade da versão 1.12.2 para a 1.12.4, o upgrade da organização fica preso em uma etapa NodeUpgrade, e a tarefa de upgrade do nó mostra o seguinte erro:

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

    Para confirmar o problema, siga estas etapas:

    1. Extraia o Kubeconfig do cluster raiz ou de administrador da organização em que o upgrade do nó está falhando e verifique se nodeupgradetask falhou:
           export KUBECONFIG=${ROOT_OR_ORG_ADMIN_KUBECONFIG}
           kubectl get nodeupgradetask -A -ojsonpath='{.items[*].status.conditions[?(@.status != "True")]}' | jq 
    2. Verifique se a mensagem corresponde à mensagem de erro anterior:
            Message: failed to generate delta between manifest and snapshot: failed to create or update delta configmap: failed to calculate delta between snapshot and manifest: failed to get valid OS distribution for delta comparison, distribution:
    3. Verifique se um osartifactsnapshot tem uma distribuição ausente:
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    4. Verifique se há pelo menos um snapshot impresso que não tenha a distribuição definida.

    Alternativa:

    1. Receba o kubeconfig do cluster a que o nó pertence:
           export KUBECONFIG=${CLUSTER_KUBECONFIG}
           kubectl rollout restart -n os-system os-core-controller 
    2. Verifique se o snapshot agora tem uma distribuição. Esse comando pode levar alguns minutos:
            kubectl get osartifactsnapshots.system.private.gdc.goog -A -o json | jq '.items[] | select(.status.distribution == "") | .metadata.name'
    3. Esse comando não vai retornar resultados. Se uma distribuição continuar faltando, abra uma solicitação de suporte.
    Fazer upgrade 1.12.4

    kubelet não remove cgroup para pods com registros de spam

    Sintomas:

    1. O kubelet continua imprimindo o seguinte registro de spam:
      May 22 23:08:00 control-1--f1c6edcdeaa9e08-e387c07294a9d3ab.lab.anthos kubelet[3751]: time="2024-05-22T23:08:00Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/freezer/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
      ……
      May 22 23:09:04 control-1 kubelet[3751]: time="2024-05-22T23:09:04Z" level=warning msg="Failed to remove cgroup (will retry)" error="rmdir /sys/fs/cgroup/net_cls,net_prio/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podea876418628af89ec2a74ea73d4a6023.slice/cri-containerd-d06aacfec2b399fcf05a187883341db1207c04be3698ec058214a6392cfc6148.scope: device or resource busy"
    2. O processo runc init é congelado, impedindo que kubelet exclua o pod cgroup.

    Alternativa:

    1. Use o script a seguir para encontrar o processo que está bloqueando a exclusão 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. Verifique o estado do congelador usando cat freezer.state. O estado precisa ser FROZEN.
    3. Echo "THAWED" > freezer.state
    4. O cgroup foi excluído. Kubelet para de enviar spam para o registro.
    Desempenho 1.12.4

    Subcomponente perf-ptaas com erro de conciliação

    Sintomas:

    O subcomponente perf-ptaas mostra o seguinte código de erro, impedindo a implantação do 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"

    Alternativa:

    O PTaaS é implantado na organização gdchservices.

    1. Inspecione as anotações e os rótulos do projeto gdch-perftest e do bucket perftest-bucket-reports do PTaaS no namespace perftest gdch-perftest. O bucket pode não ter o rótulo app.kubernetes.io/managed-by=Helm e as anotações meta.helm.sh/release-name=perf-ptaas-assets e meta.helm.sh/release-namespace=gdch-perftest. Adicione estes rótulos e anotações manualmente:
      kubectl --kubeconfig gdchservices-admin-kubeconfig label buckets -n gdch-perftest perftest-bucket-reports app.kubernetes.io/managed-by=Helm
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-name=perf-ptaas-assets
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports meta.helm.sh/release-namespace=gdch-perftest
      Verifique se o OCLCM reivindica o bucket à força:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate buckets -n gdch-perftest perftest-bucket-reports lcm.private.gdc.goog/claim-by-force=true
    2. Inspecione as anotações do projeto PTaaS gdch-perftest. O projeto pode estar configurado incorretamente com a anotação: meta.helm.sh/release-name=perf-ptaas-assets. Mude esta anotação para 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
      Verifique se o OCLCM reivindica o projeto à força:
      kubectl --kubeconfig gdchservices-admin-kubeconfig annotate projects -n gpc-system gdch-perftest lcm.private.gdc.goog/claim-by-force=true
    3. Verifique se o subcomponente é reconciliado no cluster root-admin:
      kubectl get subcomponent -n gdchservices perf-ptaas