Quita los nodos que bloquea el presupuesto de interrupción de pods

En ciertas condiciones, las políticas de presupuesto de interrupción de Pods (PDB) pueden evitar que los nodos se quiten de grupos de nodos de forma correcta. En estas condiciones, el estado del nodo informa Ready,SchedulingDisabled a pesar de haberse quitado.

El presupuesto de interrupción de pods entra en conflicto con el número de Pods disponibles

Las políticas de PDB ayudan a garantizar el rendimiento de la app, ya que evitan que los Pods se interrumpan al mismo tiempo que realizas cambios en el sistema. En consecuencia, las políticas de PDB limitan la cantidad de Pods que no están disponibles de forma simultánea en una aplicación replicada.

Sin embargo, la política de PDB a veces puede evitar la eliminación de los nodos que deseas realizar, si quitas un nodo, infringirías la política.

Por ejemplo, una política de PDB puede definir que siempre debería haber dos Pods disponibles en el sistema (.spec.minAvailable es 2). Pero si solo tienes dos pods y tratas de quitar el nodo que contiene uno de ellos, la política de PDB entra en vigor y evita la eliminación del nodo.

Del mismo modo, cuando la política de PDB define que no hay Pods no disponibles (.spec.maxUnavailable es 0), la política también evita que se borren los nodos asociados. Incluso si intentas quitar un solo Pod a la vez, la política de PDB impide que borres el nodo afectado.

Solución alternativa: inhabilita y vuelve a habilitar la política de PDB

Para resolver este conflicto, crea una copia de seguridad y, luego, quita la política de PDB. Una vez que la PDB se borra de forma correcta, el nodo se desvía y se quitan los Pods asociados. Después de realizar los cambios que desees, puedes volver a habilitar la política de PDB.

En el siguiente ejemplo, se muestra cómo borrar un nodo en esta condición, que puede afectar a todos los tipos de clústeres de Anthos en clústeres de equipos físicos: 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 borrar un nodo de un grupo de nodos de clúster de administrador (para clústeres independientes, híbridos o de administrador) varían levemente de los comandos para borrar un nodo del grupo de nodos del clúster de usuario.

Variaciones de comandos para distintos tipos de clústeres

Para facilitar la lectura, toma nota del marcador de posición ${KUBECONFIG} en los siguientes comandos. Según el tipo de clúster, exporta la ruta de acceso del clúster de administrador kubeconfig (ADMIN_KUBECONFIG) o el grupo de usuarios kubeconfig (USER_CLUSTER_CONFIG) a $(KUBECONFIG) y sigue los pasos que se indican a continuación.

  • Para borrar un grupo de nodos de un clúster de usuario, export KUBECONFIG=USER_CLUSTER_CONFIG
  • Para borrar un nodo de un clúster de administrador, export KUBECONFIG=ADMIN_KUBECONFIG.
  1. Opcional: Si borras un nodo de un grupo de nodos de clúster de usuario, ejecuta el siguiente comando para extraer el archivo kubeconfig del clúster de usuario. Ten en cuenta que la variable ADMIN_KUBECONFIG especifica la ruta de acceso al kubeconfig del clúster de administrador, y la variable USER_CLUSTER_NAME especifica el nombre del clúster:

    kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME  \
    get secret USER_CLUSTER_NAME-kubeconfig  \
    -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
    
  2. Después de quitar el nodo del grupo de nodos, verifica su estado. El nodo afectado informa Ready, SchedulingDisabled:

    kubectl get nodes --kubeconfig ${KUBECONFIG}
    

    El estado del nodo es similar al siguiente:

    NAME        STATUS                    ROLES      AGE      VERSION
    abmnewCP2   Ready                     Master     11m      v.1.18.6-gke.6600
    abmnewCP3   Ready,SchedulingDisabled  <none>     9m22s    v.1.18.6-gke.6600
    abmnewCP4   Ready                     <none>     9m18s    v.1.18.6-gke.6600
    
  3. Verifica los PDB en tu clúster:

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

    El sistema informa PDB similares a los que se muestran a continuación:

    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
     ```
    
  4. Inspecciona el PDB. Debes encontrar una coincidencia entre la etiqueta del Pod dentro del PDB y los Pods coincidentes en el nodo. Esta coincidencia garantiza que inhabilites el PDB correcto para quitar el nodo correctamente:

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

    El sistema muestra resultados coincidentes de etiquetas en la política de PDB:

    {"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
    
  5. Busca 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 muestra una lista de Pods que coinciden con la etiqueta de PDB y verifica la política de PDB que necesitas quitar:

    stackdriver-log-aggregator-0    abmnewCP3
    stackdriver-log-aggregator-1    abmnewCP3
    
  6. Después de confirmar el pod afectado, haz una copia de seguridad de la política de PDB, en este caso, la política log-aggregator:

    kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system  \
    -o yaml >> log-aggregator.yaml
    
  7. Borra la política específica de PDB, en este caso, la política log-aggregator:

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

    Una vez que hayas borrado la política de PDB, el nodo se desviará. Sin embargo, la eliminación del nodo puede tomar algún tiempo (hasta 30 minutos), por lo que continúa con la verificación del estado del nodo.

    Ten en cuenta que, si deseas quitar el nodo de forma permanente y quitar recursos de almacenamiento asociados con el nodo, puedes hacerlo antes de restablecer la política de PDB. Consulta Quita recursos de almacenamiento.

  8. Restablece la política de PDB desde tu copia:

    kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
    
  9. Verifica que los Pods borrados se vuelvan a crear de forma correcta. En este ejemplo, si hubo dos Pods stackdriver-log-aggregator-x, se vuelven a crear:

    kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
    

Si deseas restablecer el nodo, edita el archivo de configuración adecuado del grupo de nodos y restablece la dirección IP del nodo.

Quita recursos de almacenamiento de nodos borrados de forma permanente

Si borras un nodo de forma permanente y no deseas restablecerlo en tu sistema, también puedes borrar los recursos de almacenamiento asociados con ese nodo.

En los siguientes comandos, ten en cuenta las siguientes variables:

  • ADMIN-KUBECONFIG especifica la ruta al clúster de administrador.
  • USER_CLUSTER_CONFIG especifica la ruta al archivo YAML de configuración del clúster.
  1. Verifica el volumen persistente (PV) asociado con el nodo y obtén su nombre:

    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. Borra el PV asociado con el nodo:

    kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}