Execute a ferramenta de pré-atualização

Este documento mostra como executar uma ferramenta autónoma em preparação para uma atualização. Antes de atualizar um cluster de administrador ou de utilizador que esteja na versão 1.9 e versões posteriores do Google Distributed Cloud, recomendamos que execute a ferramenta de pré-atualização.

Para executar a ferramenta, use o script bash neste documento que usa algoritmos hash seguros (SHA) codificados. Para cada lançamento da ferramenta, este documento é atualizado com o novo SHA. O script cria um trabalho do Kubernetes para executar uma versão específica das verificações prévias, consoante a versão para a qual está a fazer a atualização.

Verificações pré-atualização

A ferramenta verifica o seguinte antes de atualizar um cluster de utilizadores:

Categoria Descrição
Estado do cluster
  • Valida os PDBs em todos os espaços de nomes do cluster de administrador.
  • Valida os PDBs em todos os espaços de nomes do cluster de utilizadores.
  • Valida se uma atualização anterior do cluster de administrador foi concluída com êxito.
Configurações
  • Recomenda a versão de patch para a qual deve atualizar.
  • Se estiver a atualizar para a versão 1.10, avisa se tiver de aplicar a solução alternativa descrita neste problema conhecido.

A ferramenta verifica o seguinte antes de atualizar um cluster de administrador:

Categoria Descrição
Estado do cluster Valida os PodDisruptionBudgets (PDBs) em todos os namespaces do cluster de administrador.
Configurações

Prepare-se para executar a ferramenta

  1. Atualize a sua estação de trabalho de administrador se ainda não o fez.

  2. Execute gkectl prepare para importar imagens do SO para o vSphere, se ainda não o tiver feito:

    gkectl prepare \
        --bundle-path /var/lib/gke/bundles/gke-onprem-vsphere-TARGET_VERSION.tgz \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

    Substitua o seguinte:

    • TARGET_VERSION: A versão de patch do Google Distributed Cloud para a qual quer fazer a atualização. O formato do número da versão tem de ser uma versão de patch completa, como 1.13.10-gke.42.

    • ADMIN_CLUSTER_KUBECONFIG: o caminho para o kubeconfig do cluster de administrador.

  3. Se estiver a usar um registo privado, transfira a imagem do contentor de pré-publicação com o resumo do Docker fornecido e carregue a imagem para o registo privado. Se não estiver a usar um registo privado, avance para o passo seguinte.

    export SRC_IMAGE=gcr.io/gke-on-prem-release/preflight@sha256:9704315c6637750a014d0079ca04a8f97d0ca3735e175020377107c3181f6234
    export DST_IMAGE=REGISTRY_ADDRESS/preflight:$(date +%Y-%m%d-%H%M%S)
    docker pull $SRC_IMAGE
    docker tag $SRC_IMAGE $DST_IMAGE
    docker push $DST_IMAGE
    

    Substitua REGISTRY_ADDRESS pelo endereço do registo privado.

  4. No seguinte script bash, defina valores para estes marcadores de posição:

    • ADMIN_CLUSTER_KUBECONFIG: o caminho para o kubeconfig do cluster de administrador.

    • REGISTRY_ADDRESS: se o cluster de administrador usar um registo privado, este é o endereço do registo privado que especificou no passo anterior. Se não estiver a usar um registo privado, especifique o registo público: gcr.io/gke-on-prem-release

    #!/bin/bash
    UPGRADE_TARGET_VERSION=${1}
    CLUSTER_NAME=${2}
    ADMIN_KUBECONFIG=ADMIN_CLUSTER_KUBECONFIG
    REGISTRY_ADDRESS=REGISTRY_ADDRESS
    pre_upgrade_namespace=kube-system
    if [[ -z "$CLUSTER_NAME" ]]
    then
      echo "Running the pre-ugprade tool before admin cluster upgrade"
    else
      echo "Running the pre-ugprade tool before user cluster upgrade"
      pre_upgrade_namespace=$CLUSTER_NAME-gke-onprem-mgmt
    fi
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: pre-upgrade-job
      namespace: $pre_upgrade_namespace
    EOF
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      creationTimestamp: null
      name: pre-upgrade-job-rolebinding-in-$pre_upgrade_namespace
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: onprem-user-cluster-controller-role
    subjects:
      - kind: ServiceAccount
        name: pre-upgrade-job
        namespace: $pre_upgrade_namespace
    EOF
    kubectl apply --kubeconfig ${ADMIN_KUBECONFIG} -f - <<EOF
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pre-upgrade-$(date +%Y-%m%d-%H%M%S)
      namespace: $pre_upgrade_namespace
      labels:
        onprem.cluster.gke.io/job-usage: preflight
    spec:
      ttlSecondsAfterFinished: 2592000
      backoffLimit: 2
      template:
        metadata:
          labels:
            onprem.cluster.gke.io/pod-usage: preflight
        spec:
          containers:
          - name: preflight
            image: $REGISTRY_ADDRESS/preflight@sha256:9704315c6637750a014d0079ca04a8f97d0ca3735e175020377107c3181f6234
            imagePullPolicy: Always
            command:
            - /preflight
            - --upgrade-target-version
            - "$UPGRADE_TARGET_VERSION"
            - --cluster-name
            - "$CLUSTER_NAME"
            - --scenario
            - pre-upgrade
          restartPolicy: Never
          serviceAccountName: pre-upgrade-job
          imagePullSecrets:
          - name: private-registry-creds
    EOF
    
  5. Guarde o script bash acima num ficheiro denominado pre-upgrade.sh e torne-o executável:

    chmod +x pre-upgrade.sh
    

Execute o script

  1. Os argumentos que fornece quando executa o script dependem de estar a atualizar um cluster de utilizadores ou um cluster de administrador:

    • Antes de atualizar um cluster de administrador, execute o script da seguinte forma:
    ./pre-upgrade.sh TARGET_VERSION
    
    • Antes de atualizar um cluster de utilizadores:
    ./pre-upgrade.sh TARGET_VERSION USER_CLUSTER_NAME
    

    Substitua USER_CLUSTER_NAME pelo nome do cluster de utilizadores que vai atualizar.

    O resultado é semelhante ao seguinte:

    job.batch/pre-upgrade-2023-0822-213551 created
    
  2. Execute o seguinte comando nos pods controlados pela tarefa para obter uma lista de resultados da validação.

    kubectl logs -n JOB_NAMESPACE jobs/JOB_NAME \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG
    

    Substitua o seguinte:

    • JOB_NAME: este é o nome da tarefa que o script gera a partir do passo anterior.

    • JOB_NAMESPACE: o valor que define depende de estar a atualizar um cluster de administrador ou de utilizador. Se estiver a atualizar um cluster de administrador, especifique kube-system. Se estiver a atualizar um cluster de utilizadores, especifique USER_CLUSTER_NAME-gke-onprem-mgmt.

    Aguarde alguns minutos até que a tarefa seja concluída ou atinja o limite de recuo e falhe. Nos resultados, reveja o Reason para qualquer verificação com o estado Warning, Unknown ou Failure para ver se consegue resolver o problema.

  3. Antes de atualizar os clusters, execute o seguinte comando para eliminar a tarefa:

    kubectl delete jobs JOB_NAME -n JOB_NAMESPACE \
        --kubeconfig ADMIN_CLUSTER_KUBECONFIG