Quitar nodos bloqueados por PodDisruptionBudgets

En determinadas condiciones, las políticas de PodDisruptionBudgets (PDB) pueden impedir que los nodos se eliminen correctamente de los grupos de nodos. En estas condiciones, el estado del nodo indica Ready,SchedulingDisabled aunque se haya quitado. En este documento se explica cómo quitar nodos de los clústeres de Google Distributed Cloud que están bloqueados por problemas de PDB.

Esta página está dirigida a administradores, arquitectos y operadores que gestionan el ciclo de vida de la infraestructura tecnológica subyacente y responden a alertas y páginas cuando no se cumplen los objetivos de nivel de servicio (SLOs) o las aplicaciones fallan. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE. Google Cloud

El PDB entra en conflicto con el número de pods disponibles

Las políticas de PDB ayudan a asegurar el rendimiento de las aplicaciones, ya que evitan que los pods se inactiven al mismo tiempo cuando haces cambios en el sistema. Por lo tanto, las políticas de PDB limitan el número de pods no disponibles simultáneamente en una aplicación replicada.

Sin embargo, la política de PDB a veces puede impedir que elimines nodos si al hacerlo infringes la política.

Por ejemplo, una política de PDB puede definir que siempre debe haber dos pods disponibles en el sistema (.spec.minAvailable es 2). Sin embargo, si solo tienes dos pods e intentas quitar el nodo que contiene uno de ellos, se aplicará la política de PDB y se impedirá que se quite el nodo.

Del mismo modo, cuando la política de PDB define que ningún pod debe estar disponible (.spec.maxUnavailable es 0), la política también impide que se eliminen los nodos asociados. Aunque intentes eliminar un solo pod a la vez, la política de PDB te impide eliminar el nodo afectado.

Inhabilitar y volver a habilitar la política de PDB

Para resolver un conflicto de PDB, haga una copia de seguridad y, a continuación, elimine la política de PDB. Una vez que el PDB se haya eliminado correctamente, el nodo se vaciará y se quitarán los pods asociados. A continuación, puedes hacer los cambios que quieras y volver a habilitar la política de PDB.

En el siguiente ejemplo se muestra cómo eliminar un nodo en esta condición, lo que puede afectar a todos los tipos de clústeres de Google Distributed Cloud: de administrador, híbridos, independientes y de usuario.

El mismo procedimiento general funciona para todos los tipos de clústeres. Sin embargo, los comandos específicos para eliminar un nodo de un grupo de nodos de un clúster de administrador (para clústeres de administrador, híbridos o independientes) varían ligeramente de los comandos para eliminar un nodo de un grupo de nodos de un clúster de usuario.

  1. Para facilitar la lectura, se usa la variable ${KUBECONFIG} en los siguientes comandos.

    En función del tipo de clúster, exporta la ruta de kubeconfig del clúster de administrador (ADMIN_KUBECONFIG) o la ruta de kubeconfig del clúster de usuario (USER_CLUSTER_CONFIG) a $(KUBECONFIG) y sigue estos pasos:

    • Para eliminar un nodo de un clúster de usuarios, define export KUBECONFIG=USER_CLUSTER_CONFIG
    • Para eliminar un nodo de un clúster de administrador, define export KUBECONFIG=ADMIN_KUBECONFIG.
  2. Opcional: Si vas a eliminar un nodo de un grupo de nodos de un clúster de usuarios, ejecuta el siguiente comando para extraer el archivo kubeconfig del clúster de usuarios:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME \
      get secret USER_CLUSTER_NAME-kubeconfig  \
      -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
    

    Sustituye las siguientes entradas por información específica de tu entorno de clúster:

    • ADMIN_KUBECONFIG: la ruta al archivo kubeconfig del clúster de administrador.
    • CLUSTER_NAME: el nombre del clúster del que quieras hacer una captura.
    • USER_CLUSTER_CONFIG: la ruta al archivo de configuración del clúster de usuarios.
  3. Después de quitar el nodo del grupo de nodos, comprueba el estado del nodo. El nodo afectado informa de lo siguiente: Ready, SchedulingDisabled

    kubectl get nodes --kubeconfig ${KUBECONFIG}
    

    El estado del nodo es similar al siguiente ejemplo:

    NAME   STATUS                    ROLES      AGE      VERSION
    CP2    Ready                     Master     11m      v.1.18.6-gke.6600
    CP3    Ready,SchedulingDisabled  <none>     9m22s    v.1.18.6-gke.6600
    CP4    Ready                     <none>     9m18s    v.1.18.6-gke.6600
    
  4. Comprueba los PDBs de tu clúster:

    kubectl get pdb --kubeconfig ${KUBECONFIG} -A
    

    El sistema informa de PDBs similares a los que se muestran en el siguiente ejemplo de salida:

    NAMESPACE     NAME             MIN AVAILABLE    MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    gke-system    istio-ingress    1                N/A               1                     19m
    gke-system    istiod           1                N/A               1                     19m
    kube-system   coredns          1                N/A               0                     19m
    kube-system   log-aggregator   N/A              0                 0                     19m
    kube-system   prometheus       N/A              0                 0                     19m
    
  5. Inspecciona el PDB. Busca una coincidencia entre la etiqueta del pod en el PDB y los pods correspondientes en el nodo. Esta coincidencia asegura que inhabilite el PDB correcto para quitar el nodo correctamente:

    kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'
    

    El sistema devuelve los resultados de las etiquetas coincidentes en la política de PDB:

    {"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
    
  6. Busca los pods que coincidan con la etiqueta de política de PDB:

    kubectl --kubeconfig ${KUBECONFIG} get pods -A --selector=app=stackdriver-log-aggregator  \
      -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}'
    

    El comando devuelve una lista de pods que coinciden con la etiqueta del PDB y verifica la política del PDB que debes eliminar:

    stackdriver-log-aggregator-0    CP3
    stackdriver-log-aggregator-1    CP3
    
  7. Después de confirmar el pod afectado, haz una copia de seguridad de la política de PDB. En el siguiente ejemplo se crea una copia de seguridad de la política log-aggregator:

    kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system  \
      -o yaml >> log-aggregator.yaml
    
  8. Elimina la política de PDB específica. De nuevo, en los siguientes ejemplos se elimina la política log-aggregator:

    kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
    

    Después de eliminar la política de PDB, el nodo se vacía. Sin embargo, el nodo puede tardar hasta 30 minutos en eliminarse por completo. Sigue comprobando el estado del nodo para confirmar que el proceso se ha completado correctamente.

    Si quieres eliminar el nodo de forma permanente y también los recursos de almacenamiento asociados a él, puedes hacerlo antes de restaurar la política de PDB. Para obtener más información, consulta Eliminar recursos de almacenamiento.

  9. Restaura la política de PDB desde tu copia:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  10. Verifica que los pods eliminados se vuelvan a crear correctamente. En este ejemplo, si hubiera dos pods stackdriver-log-aggregator-x, se volverían a crear:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    
  11. Si quieres restaurar el nodo, edita la configuración del grupo de nodos correspondiente y restaura la dirección IP del nodo.

Eliminar recursos de almacenamiento de nodos eliminados permanentemente

Si eliminas un nodo de forma permanente y no quieres restaurarlo en tu sistema, también puedes eliminar los recursos de almacenamiento asociados a ese nodo.

  1. Comprueba y obtén el nombre del volumen persistente (PV) asociado al nodo:

    kubectl get pv --kubeconfig ${KUBECONFIG}  \
      -A -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{.spec.claimRef.name}{":\t"}  \
      {.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values}{"\n"}{end}'
    
  2. Elimina el PV asociado al nodo:

    kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
    

    Sustituye PV_NAME por el nombre del volumen persistente que quieras eliminar.

Siguientes pasos

Si necesitas más ayuda, ponte en contacto con el servicio de atención al cliente de Cloud. También puedes consultar la sección Obtener asistencia para obtener más información sobre los recursos de asistencia, incluidos los siguientes:

  • Requisitos para abrir un caso de asistencia.
  • Herramientas para ayudarte a solucionar problemas, como la configuración de tu entorno, los registros y las métricas.
  • Componentes admitidos.