Fase de actualización: AnthosBareMetal

En esta fase se actualizan la versión de Kubernetes y los complementos de un clúster de Kubernetes. Esta fase también ejecuta una tarea de actualización mz-location-upgrade.

La actualización del clúster se realiza en un nodo del clúster a la vez. Estos son los pasos generales para actualizar un clúster:

  1. Se realizan comprobaciones previas para asegurarse de que el nodo esté listo para la actualización.
  2. El nodo se vacía para prepararlo para la actualización
  3. Se actualiza la versión de Kubernetes del nodo.
  4. Se realizan comprobaciones posteriores al vuelo para asegurarse de que la actualización del nodo se ha completado correctamente.
  5. El recurso InventoryMachine del nodo se elimina de maintenance. De esta forma, el nodo estará listo para aceptar pods de nuevo.

Proceso de drenaje de nodos

El drenaje de un nodo implica mover de forma correcta todas las cargas de trabajo que se ejecutan en ese nodo. Consta de los siguientes pasos:

  1. El recurso InventoryMachine del nodo se coloca en maintenance.
  2. El recurso BaremetalMachine se coloca en maintenance.
  3. El nodo de Kubernetes está marcado con baremetal.cluster.gke.io/maintenance: NoSchedule
  4. En los nodos de hardware desnudo, las máquinas virtuales que se ejecutan en el nodo se preparan para el drenaje configurando el InventoryMachine de esa máquina virtual en maintenance.
  5. Los pods que se ejecutan en el nodo de Kubernetes se expulsan correctamente. Cada pod tiene hasta 80 minutos para finalizar correctamente.

Obtener el kubeconfig, el nombre del clúster y el espacio de nombres del clúster de administrador

Para clasificar los problemas de esta fase, necesitas el archivo KUBECONFIG del clúster de administrador, así como el nombre y el espacio de nombres del clúster que se va a actualizar. Define ORG_NAME en la organización para la que estés monitorizando la actualización.

export ORG_NAME=ORG_NAME

Selecciona una de las siguientes opciones en función del clúster especificado en el nombre de la fase.

  1. Nombre de la fase: root-admin/AnthosBareMetal

    export ADMIN_KUBECONFIG=ROOT_ADMIN_KUBECONFIG
    export CLUSTER_NAME="root-admin"
    export CLUSTER_NAMESPACE="root"
    
  2. Nombre de fase: org-admin/AnthosBareMetal

    export ADMIN_KUBECONFIG=ROOT_ADMIN_KUBECONFIG
    export CLUSTER_NAME="${ORG_NAME}-admin"
    export CLUSTER_NAMESPACE="${ORG_NAME}"
    
  3. Nombre de la fase: system/AnthosBareMetal

    export ADMIN_KUBECONFIG=ORG_ADMIN_KUBECONFIG
    export CLUSTER_NAME="${ORG_NAME}-system"
    export CLUSTER_NAMESPACE="${CLUSTER_NAME}-cluster"
    
  4. Nombre de la fase: service/AnthosBareMetal

    export ADMIN_KUBECONFIG=ORG_ADMIN_KUBECONFIG
    export CLUSTER_NAME="g-${ORG_NAME}-shared-service"
    export CLUSTER_NAMESPACE="${CLUSTER_NAME}-cluster"
    
  5. Actualización de clúster de usuarios

    export ADMIN_KUBECONFIG=ORG_ADMIN_KUBECONFIG
    export CLUSTER_NAME=USER_CLUSTER_NAME
    export CLUSTER_NAMESPACE="${CLUSTER_NAME}-cluster"
    

Recursos que se van a monitorizar

  1. Recursos de clúster de ABM clusters.baremetal.cluster.gke.io

      kubectl get cluster -n "${CLUSTER_NAMESPACE}" "${CLUSTER_NAME}" --kubeconfig=${ADMIN_KUBECONFIG}
    

    Ejemplo de salida

    NAME         ABM VERSION       DESIRED ABM VERSION   CLUSTER STATE
    root-admin   1.29.400-gke.86   1.29.400-gke.86       Running
    
  2. Recursos de BaremetalMachine de ABM

      kubectl get baremetalmachines -n "${CLUSTER_NAMESPACE}" --kubeconfig=${ADMIN_KUBECONFIG}
    

    Ejemplo de salida

    NAME       CLUSTER      READY   INSTANCEID             MACHINE    ABM VERSION       DESIRED ABM VERSION
    10.8.0.2   root-admin   true    baremetal://10.8.0.2   10.8.0.2   1.29.400-gke.86   1.29.400-gke.86
    10.8.0.3   root-admin   true    baremetal://10.8.0.3   10.8.0.3   1.29.400-gke.86   1.29.400-gke.86
    10.8.0.4   root-admin   true    baremetal://10.8.0.4   10.8.0.4   1.29.400-gke.86   1.29.400-gke.86
    

    Si alguna máquina muestra un valor de ABM VERSION diferente de DESIRED ABM VERSION o READY no es igual a true, usa la marca -o yaml para obtener más detalles sobre la máquina.

  3. HealthChecks si un nodo no puede entrar o salir del modo de mantenimiento.

      export MACHINE_IP=MACHINE_IP
      kubectl get healthchecks -n kube-system --kubeconfig=${ADMIN_KUBECONFIG}
    

    Ejemplo de salida

    NAMESPACE     NAME                                                 COMPONENT   NAMESPACE   STATUS    LAST_COMPLETED
    kube-system   bm-system-10.8.0.2-machine                                                   Healthy   14m
    kube-system   bm-system-10.8.0.3-machine                                                   Healthy   14m
    kube-system   bm-system-10.8.0.4-machine                                                   Healthy   5m43s
    kube-system   bm-system-add-ons-add-ons                                                    Healthy   46m
    kube-system   bm-system-add-ons-configdrift                                                Healthy   46m
    

    Si alguna comprobación del estado muestra que el estado no es bueno, usa la marca -o yaml para consultar los detalles.

  4. Registros del controlador para comprobar si hay errores

      export MACHINE_IP=MACHINE_IP
      kubectl logs -n kube-system -l baremetal.cluster.gke.io/lifecycle-controller-component=true | grep ${MACHINE_IP}
      kubectl logs -n capi-system -l baremetal.cluster.gke.io/lifecycle-controller-component=true | grep ${MACHINE_IP}
    
  5. Comprueba si hay tareas de actualización en curso o fallidas en esta fase.

    export KUBECONFIG=ROOT_ADMIN_KUBECONFIG
    kubectl get upgradetaskrequests -n gpc-system -o json | jq '.items[] | select(.status.conditions[].status=="Unknown") | .metadata.name'
    

    Ejemplo de salida

    "upg-task-org-1-os-node-upgrade-task-whg8v"
    
    export KUBECONFIG=ROOT_ADMIN_KUBECONFIG
    export UPGRADE_TASK=$(kubectl get upgradetaskrequests -n gpc-system -o json | jq -r '.items[] | select(.status.conditions[].status=="Unknown") | .metadata.name')
    kubectl get upgradetaskrequests -n gpc-system "${UPGRADE_TASK}" -o yaml 
    

    Ejemplo de salida

    status:
      conditions:
      - lastTransitionTime: "2024-09-25T16:26:33Z"
        message: job gpc-system/v1.13.0-os-7cf810d7a5-upg-task-org-1-os-node-upgra-4n5t6
          is running
        observedGeneration: 1
        reason: JobRunning
        status: Unknown
        type: Succeeded
      upgradeTaskResponse:
        name: upg-task-org-1-os-node-upgrade-task-whg8v-v1.13.0-os-7cf810d7a5
    

    Si ves un trabajo en ejecución en la salida, puedes describir el trabajo o consultar los registros de pods para ver si hay errores.