Cuando necesites reparar o mantener nodos, primero debes poner los nodos en modo de mantenimiento. Esto vacía de forma elegante los Pods y las cargas de trabajo existentes, sin incluir los Pods del sistema críticos, como el servidor de la API. El modo de mantenimiento también evita que el nodo reciba nuevas asignaciones de Pods. En el modo de mantenimiento, puedes trabajar en tus nodos sin correr el riesgo de interrumpir el tráfico de los pods.
Cómo funciona
Google Distributed Cloud proporciona una forma de colocar nodos en modo de mantenimiento. Este enfoque permite que otros componentes del clúster sepan de forma correcta que el nodo está en modo de mantenimiento. Cuando colocas un nodo en modo de mantenimiento, no se pueden programar Pods adicionales en el nodo y los Pods existentes se detienen.
En lugar de usar el modo de mantenimiento, puedes usar de forma manual los comandos de Kubernetes, como kubectl cordon y kubectl drain, en un nodo específico.
Cuando usas el proceso del modo de mantenimiento, Google Distributed Cloud hace lo siguiente:
1.29
Google Distributed Cloud agrega el taint
baremetal.cluster.gke.io/maintenance:NoSchedulea los nodos especificados para evitar la programación de Pods nuevos en el nodo.Google Distributed Cloud usa la API de Eviction para desalojar cada Pod. Este método de vaciado de nodos respeta los PodDisruptionBudgets (PDBs). Puedes configurar PDBs para proteger tus cargas de trabajo especificando un nivel tolerable de interrupción para un conjunto de Pods con los campos
minAvailableymaxUnavailable. Vaciar los nodos de esta manera proporciona una mejor protección contra las interrupciones de la carga de trabajo. El vaciado de nodos basado en la expulsión está disponible como versión general para la versión 1.29.Se aplica un tiempo de espera de 20 minutos para garantizar que los nodos no se detengan a la espera de que finalicen los Pods. Es posible que los Pods no finalicen si están configurados para tolerar a todos los taints o si tienen finalizadores. Google Distributed Cloud intenta detener todos los Pods, pero si se excede el tiempo de espera, el nodo se pone en modo de mantenimiento. Este tiempo de espera evita que los Pods en ejecución bloqueen las actualizaciones.
1.28 y anteriores
Google Distributed Cloud agrega el taint
baremetal.cluster.gke.io/maintenance:NoSchedulea los nodos especificados para evitar la programación de Pods nuevos en el nodo.Google Distributed Cloud agrega el taint
baremetal.cluster.gke.io/maintenance:NoExecute. Cuando se actúa sobre el taintNoExecute, elkube-schedulerde Google Distributed Cloud detiene los Pods y drena el nodo. Este método de vaciado de nodos no respeta los PDBs.Se aplica un tiempo de espera de 20 minutos para garantizar que los nodos no se detengan a la espera de que finalicen los Pods. Es posible que los Pods no finalicen si están configurados para tolerar a todos los taints o si tienen finalizadores. Google Distributed Cloud intenta detener todos los Pods, pero si se excede el tiempo de espera, el nodo se pone en modo de mantenimiento. Este tiempo de espera evita que los Pods en ejecución bloqueen las actualizaciones.
Vaciado basado en la expulsión
No hay cambios procedimentales asociados con el cambio al vaciado de nodos basado en la expulsión desde el vaciado basado en el taint. El parámetro de configuración solo afecta la lógica de conciliación.
Esta función no se encuentra en la misma etapa de lanzamiento para todas las versiones compatibles:
- 1.29: DG
- 1.28: No disponible
- 1.16: No disponible
Orden de vaciado
Antes de la versión 1.29, el vaciado de nodos basado en taints que realiza el kube-scheduler de Google Distributed Cloud no emplea un algoritmo particular para vaciar Pods de un nodo. Con el vaciado de nodos basado en la expulsión, los Pods se expulsan en un orden específico según la prioridad. La prioridad de expulsión se asocia con criterios de Pod específicos, como se muestra en la siguiente tabla:
| Orden de vaciado | Criterios de Pod (deben coincidir con todos) |
|---|---|
| 1 |
Se desalojan los Pods que coinciden con los siguientes criterios:
|
| 2 |
Se desalojan los Pods que coinciden con los siguientes criterios:
|
| 3 |
Se desalojan los Pods que coinciden con los siguientes criterios:
El orden de expulsión para los Pods coincidentes se basa en |
| 4 |
Espera a que CSI borre los montajes de PV/PVC después de que se hayan expulsado todos los Pods. Usa |
| 5 |
Se desalojan los Pods que coinciden con los siguientes criterios:
Estos Pods aún deben agotarse, ya que kubelet no proporciona compatibilidad con la actualización en su lugar. |
Debido a que el desvío de nodos basado en la expulsión respeta los PDBs, la configuración de PDBs puede bloquear el desvío de nodos en algunas circunstancias. Para obtener información sobre la solución de problemas relacionados con el vaciado del grupo de nodos, consulta Verifica por qué un nodo está en estado de vaciado durante mucho tiempo.
Inhabilita el vaciado de nodos basado en la expulsión
El vaciado de nodos basado en la expulsión se habilita de forma predeterminada para los clústeres que ejecutan la versión 1.29 o posterior, o los que se actualizan a la versión 1.29 o posterior. Si el vaciado de nodos basado en la expulsión causa problemas con las actualizaciones o el mantenimiento del clúster, puedes volver al vaciado de nodos basado en el taint agregando la anotación baremetal.cluster.gke.io/maintenance-mode-ignore-pdb: "" a tu recurso de clúster.
Para restablecer el comportamiento predeterminado de vaciado de nodos basado en la expulsión, quita la anotación por completo. Si configuras la anotación como false, no se vuelve a habilitar el comportamiento predeterminado.
Coloca un nodo en modo de mantenimiento
Elige los nodos que deseas poner en modo de mantenimiento mediante la especificación de los rangos de IP para los nodos seleccionados en maintenanceBlocks en tu archivo de configuración del clúster. Los nodos que elijas deben estar listos y funcionando en el clúster.
Para poner los nodos en modo de mantenimiento, realiza lo siguiente:
Edita el archivo de configuración del clúster para seleccionar los nodos que deseas poner en modo de mantenimiento.
Puedes editar el archivo de configuración con el editor que prefieras o puedes editar el recurso personalizado del clúster de forma directa si ejecutas el siguiente comando:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAMEReemplaza lo siguiente:
CLUSTER_NAMESPACE: el espacio de nombres del clúster.CLUSTER_NAME: el nombre del clúster
Agrega la sección
maintenanceBlocksal archivo de configuración del clúster a fin de especificar una sola dirección IP o un rango de direcciones para los nodos que deseas poner en modo de mantenimiento.En el siguiente ejemplo, se muestra cómo seleccionar varios nodos mediante la especificación de un rango de direcciones IP:
metadata: name: my-cluster namespace: cluster-my-cluster spec: maintenanceBlocks: cidrBlocks: - 172.16.128.1-172.16.128.64Guarda y aplica la configuración actualizada del clúster.
Google Distributed Cloud comienza a poner los nodos en modo de mantenimiento.
Ejecuta el siguiente comando para obtener el estado de los nodos del clúster:
kubectl get nodes --kubeconfig=KUBECONFIGEl resultado es similar a este:
NAME STATUS ROLES AGE VERSION user-baremetal-01 Ready control-plane 2d22h v1.27.4-gke.1600 user-baremetal-04 Ready worker 2d22h v1.27.4-gke.1600 user-baremetal-05 Ready worker 2d22h v1.27.4-gke.1600 user-baremetal-06 Ready worker 2d22h v1.27.4-gke.1600Ten en cuenta que los nodos aún se pueden programar, pero los taints evitan que se programen Pods (sin una tolerancia adecuada) en el nodo.
Ejecuta el siguiente comando para obtener la cantidad de nodos en el modo de mantenimiento:
kubectl get nodepools --kubeconfig ADMIN_KUBECONFIGLa respuesta debería ser similar al siguiente resultado:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN np1 3 0 0 1 0Esta columna
UNDERMAINTENANCEen esta muestra que un nodo está en modo de mantenimiento.Google Distributed Cloud también agrega los siguientes taints a los nodos cuando se ponen en modo de mantenimiento:
baremetal.cluster.gke.io/maintenance:NoExecutebaremetal.cluster.gke.io/maintenance:NoSchedule
Quita un nodo del modo de mantenimiento
Para quitar nodos del modo de mantenimiento, realiza lo siguiente:
Edita el archivo de configuración del clúster para borrar los nodos que deseas quitar del modo de mantenimiento.
Puedes editar el archivo de configuración con el editor que prefieras o puedes editar el recurso personalizado del clúster de forma directa si ejecutas el siguiente comando:
kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAMEReemplaza lo siguiente:
CLUSTER_NAMESPACE: el espacio de nombres del clúster.CLUSTER_NAME: el nombre del clúster
Edita las direcciones IP para quitar nodos específicos del modo de mantenimiento o quita la sección
maintenanceBlockspara quitar todos los nodos del modo de mantenimiento.Guarda y aplica la configuración actualizada del clúster.
Usa los comandos
kubectlpara verificar el estado de los nodos.
Apaga y reinicia un clúster
Si es necesario detener un clúster completo, sigue las instrucciones de las siguientes secciones para detenerlo y volver a activarlo de forma segura.
Cierra un clúster
Si vas a apagar un clúster que administra clústeres de usuario, primero debes apagar todos los clústeres de usuario administrados. Las siguientes instrucciones se aplican a todos los tipos de clústeres de Google Distributed Cloud.
Verifica el estado de todos los nodos del clúster:
kubectl get nodes --kubeconfig CLUSTER_KUBECONFIGReemplaza
CLUSTER_KUBECONFIGpor la ruta de acceso del archivo kubeconfig del clúster de administrador.El resultado es similar a este:
NAME STATUS ROLES AGE VERSION control-0 Ready control-plane 202d v1.27.4-gke.1600 control-1 Ready control-plane 202d v1.27.4-gke.1600 control-2 Ready control-plane 202d v1.27.4-gke.1600 worker-0 Ready worker 202d v1.27.4-gke.1600 worker-1 Ready worker 202d v1.27.4-gke.1600 worker-2 Ready worker 202d v1.27.4-gke.1600 worker-3 Ready worker 202d v1.27.4-gke.1600 worker-4 Ready worker 154d v1.27.4-gke.1600 worker-5 Ready worker 154d v1.27.4-gke.1600 worker-6 Ready worker 154d v1.27.4-gke.1600 worker-7 Ready worker 154d v1.27.4-gke.1600 worker-8 Ready worker 154d v1.27.4-gke.1600 worker-9 Ready worker 154d v1.27.4-gke.1600Si el
STATUSde un nodo no esReady, te recomendamos que soluciones el problema del nodo y que continúes solo cuando todos los nodos seanReady.Si vas a apagar un clúster de usuario, verifica el estado de los nodos del clúster de administrador:
kubectl get nodes --kubeconfig ADMIN_KUBECONFIGReemplaza
ADMIN_KUBECONFIGpor la ruta de acceso del archivo kubeconfig del clúster de administración.Los pasos posteriores dependen del clúster de administrador. Si el
STATUSde un nodo no esReady, te recomendamos que soluciones el problema del nodo y que continúes solo cuando todos los nodos seanReady.Verifica el estado del clúster que deseas apagar:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIGReemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster que verificas.ADMIN_KUBECONFIG: La ruta de acceso del archivo kubeconfig del clúster de administrador.
Corrige los problemas informados antes de continuar.
Para el clúster que cerrarás, asegúrate de que todos los Pods de
etcdse estén ejecutando:kubectl get pods --kubeconfig CLUSTER_KUBECONFIG -A \ -l component=etcdReemplaza
CLUSTER_KUBECONFIGpor la ruta de acceso del archivo kubeconfig del clúster de administrador.El resultado es similar a este:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system etcd-control-0-admin 1/1 Running 0 2d22h kube-system etcd-control-1-admin 1/1 Running 0 2d22h kube-system etcd-control-2-admin 1/1 Running 0 2d22hSi el
STATUSde un Pod no esRunning, te recomendamos que soluciones el problema del Pod y que continúes solo cuando todos los Pods seanRunning.Crea una copia de seguridad como se describe en Crea una copia de seguridad de un clúster.
Es importante crear una copia de seguridad de etcd antes de apagar el clúster para que se pueda restablecer si tienes problemas cuando lo reinicies. La corrupción de etcd, las fallas de hardware de los nodos, los problemas de conectividad de red y otras condiciones pueden impedir que el clúster se reinicie correctamente.
Si vas a apagar un clúster con nodos de trabajador, coloca los nodos de trabajador en modo de mantenimiento.
Este paso minimiza la cantidad de escrituras en etcd, lo que reduce la probabilidad de que se deban conciliar una gran cantidad de escrituras en etcd cuando se reinicie el clúster.
Coloca los nodos del plano de control en modo de mantenimiento.
Este paso evita escrituras dañadas para cargas de trabajo con estado durante el apagado del nodo.
Apaga los nodos del clúster en la siguiente secuencia:
- Nodos trabajadores
- Nodos del balanceador de cargas del plano de control
Nodos del plano de control, comenzando por los seguidores de etcd y terminando por el líder de etcd
Si tienes un clúster de alta disponibilidad (HA), puedes encontrar el líder de etcd mediante SSH para conectarte a cada nodo del plano de control y ejecutar el siguiente comando
etcdctl:ETCDCTL_API=3 etcdctl \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --cert /etc/kubernetes/pki/etcd/server.crt \ --key /etc/kubernetes/pki/etcd/server.key \ --write-out=table endpoint statusLa respuesta incluye una columna
IS LEADER, que devuelvetruesi el nodo es el líder de etcd.
En este punto, el clúster está completamente cerrado. Después de realizar el mantenimiento necesario, puedes reiniciar el clúster como se describe en la siguiente sección.
Reinicia el clúster
Sigue estos pasos para reiniciar un clúster que se apagó por completo.
Enciende las máquinas de los nodos en el orden inverso a la secuencia de apagado.
Quita los nodos del plano de control del modo de mantenimiento.
Para obtener instrucciones, consulta Quita un nodo del modo de mantenimiento.
Quita los nodos trabajadores del modo de mantenimiento.
Ejecuta verificaciones de estado del clúster para asegurarte de que funcione correctamente:
bmctl check cluster -c CLUSTER_NAME --kubeconfig ADMIN_KUBECONFIGSi un problema, como un bucle de fallas de etcd, impide que el clúster se reinicie correctamente, intenta restablecerlo desde la última copia de seguridad correcta conocida. Para obtener instrucciones, consulta Rstablece un clúster.
Modo de facturación y mantenimiento
La facturación de Google Distributed Cloud se basa en la cantidad de CPUs virtuales que tiene tu clúster para los nodos que pueden ejecutar cargas de trabajo. Cuando pones un nodo en modo de mantenimiento, se agregan los taints NoExecute y NoSchedule al nodo, pero no se inhabilita la facturación. Después de poner un nodo en modo de mantenimiento, acordonarlo (kubectl cordon NODE_NAME) para marcarlo como no programable. Una vez que un nodo se marca como no programable, el nodo y sus CPU virtuales asociadas se excluyen de la facturación.
Como se describe en la página de precios, puedes usar kubectl para ver la capacidad de CPU virtual (que se usa para la facturación) de cada uno de tus clústeres de usuario. El comando no tiene en cuenta si el nodo se puede programar o no, solo proporciona un recuento de CPUs virtuales por nodo.
Para identificar la cantidad de CPUs virtuales por nodo de tu clúster de usuarios, haz lo siguiente:
kubectl get nodes \
--kubeconfig USER_KUBECONFIG \
-o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
{.status.capacity.cpu}{\"\n\"}{end}"
Reemplaza USER_KUBECONFIG por la ruta de acceso del archivo kubeconfig del clúster de usuario.