Descripción y configuración de la recolección de elementos no utilizados de Kubernetes

La recolección de elementos no utilizados es el proceso mediante el cual Kubernetes elimina los objetos dependientes después de eliminar un recurso. También maneja la limpieza automática de elementos redundantes en su clúster. Los contenedores terminados y las imágenes en desuso se eliminan periódicamente para evitar que se acumule una gran cantidad de recursos innecesarios con el tiempo.

Se pueden implementar varias estrategias de recolección de elementos no utilizados según el tipo de objeto que se elimine. La recolección de elementos no utilizados de recursos no utilizados se puede configurar mediante la configuración de Kubelet en los nodos de trabajo de su clúster. En este artículo, explicaremos las diferentes formas de recolección de elementos no utilizados y cómo puede personalizar la configuración de limpieza.

Índice de contenidos
  1. Recolección de Basura Básica
  2. Referencias de propietarios
  3. Mecanismos de eliminación en cascada
  4. Deshabilitar la recolección de basura de los dependientes
  5. Recolección de basura y finalizadores
  6. Personalización de la recolección de basura de recursos no utilizados
  7. Resumen

Recolección de Basura Básica

La recolección de basura de Kubernetes maneja la eliminación de objetos dependientes, contenedores antiguos e imágenes no utilizadas. Kubelet ejecuta operaciones de limpieza periódicamente mientras su servicio está activo. Eliminará los contenedores detenidos, como los de los trabajos terminados, y eliminará las imágenes no utilizadas una vez que se alcance un cierto umbral de utilización del disco.

La recolección de elementos no utilizados de los recursos del clúster en respuesta a las eliminaciones de objetos utiliza un mecanismo en cascada. Esto asegura que los elementos secundarios de un objeto se eliminen junto con él, evitando que existan elementos huérfanos. Puede controlar este proceso solicitando un orden en cascada específico cuando inicie la eliminación.

Referencias de propietarios

Las relaciones padre-hijo se expresan mediante referencias de propietario de Kubernetes. Los propietarios son responsables de los objetos anidados dentro de ellos. Esto crea un gráfico de dependencia que informa el proceso de recolección de elementos no utilizados.

Kubernetes utiliza datos de referencia del propietario para establecer qué recursos deben eliminarse antes de que se elimine un objetivo. Como ejemplo, los Pods que forman parte de un ReplicaSet tendrán una referencia de propietario que define este enlace. Eliminar el ReplicaSet también eliminará automáticamente los Pods dentro de él.

Las referencias de propietario se establecen en los objetos en su metadata.ownerReference campo manifiesto. Normalmente, no debería necesitar inspeccionar o cambiar manualmente este campo, ya que los controladores de Kubernetes administran automáticamente las referencias de los propietarios.

Los niños pueden bloquear la eliminación de sus padres configurando el metadata.blockOwnerDeletion campo al valor booleano true. Esto evitará que los padres en el objeto ownerReference la cadena se elimine hasta que el objeto se elimine.

Mecanismos de eliminación en cascada

La cadena de referencia del propietario significa que hay dos formas en las que se pueden realizar las eliminaciones de objetos:

  • Eliminación de fondo: El objeto de destino se elimina primero, luego sus dependientes.
  • Eliminación de primer plano: Los dependientes se eliminan primero, luego el objeto de destino.

Considere un comando de eliminación como el siguiente:

$ kubectl delete deployment/demo-app

El método de eliminación en segundo plano eliminará inmediatamente el demo-app Objeto de despliegue. Esto dejará sus Pods ejecutándose en su clúster. Se limpiarán automáticamente en segundo plano como parte del proceso de recolección de basura.

La eliminación de primer plano comienza marcando el demo-app Implementación como una "eliminación en curso". Luego elimina todos los objetos dependientes que existen dentro de él. los demo-app La implementación permanecerá visible en su clúster hasta que se eliminen sus pods. El Despliegue se limpiará una vez que los dependientes se hayan ido.

La cascada de fondo es el mecanismo predeterminado. Ofrece un resultado inmediato que elimina el objeto objetivo de su clúster sin demora. Sin embargo, la eliminación en primer plano puede ser más deseable en algunos escenarios, como cuando desea que se elimine una implementación o un conjunto de réplicas solo después de que se hayan destruido sus pods. Esto evita el breve período en el que los pods quedan efectivamente huérfanos y su propietario, el ReplicaSet, ya no está.

Puede optar por la eliminación en primer plano pasando el --cascade=foreground bandera a la kubectl delete dominio:

$ kubectl delete deployment/demo-app --cascade=foreground

Los Pods se eliminarán, luego el demo-app despliegue.

Deshabilitar la recolección de basura de los dependientes

Hay una tercera opción en cascada: ignorar por completo la recolección de basura dependiente. Esto dejará huérfanos a los dependientes del objeto, dejándolos en su clúster pero con su referencia de propietario eliminada.

$ kubectl delete deployment/demo-app --cascade=orphan

Este comando elimina inmediatamente el demo-app Despliegue pero deja sus Pods intactos. Seguirán ejecutándose en su clúster hasta que se eliminen por separado, como parte de otro comando. Aunque este comportamiento rara vez es deseable, puede ser útil si decide que los pods ya no necesitan estar en un Deployment o ReplicaSet.

Recolección de basura y finalizadores

Los finalizadores también afectan el funcionamiento de la recolección de elementos no utilizados. Evitan que se produzcan eliminaciones hasta que se cumplan ciertas condiciones.

Muchas eliminaciones aparentemente "atascadas" son causadas por finalizadores pendientes. Un finalizador que no esté marcado como terminado evitará que el objeto se elimine de su clúster. Una vez que se haya borrado el finalizador, el plano de control de Kubernetes procederá con la eliminación.

Algunos finalizadores se incluyen con Kubernetes, como el pv-protection protección contra la eliminación de volúmenes utilizados activamente. Otros pueden ser agregados por controladores de terceros que agregue a su clúster. No se recomienda anular un finalizador, ya que podría crear un estado incorrecto que provoque un comportamiento inesperado.

Personalización de la recolección de basura de recursos no utilizados

La recolección de elementos no utilizados de contenedores e imágenes redundantes se produce automáticamente en los nodos de trabajo. Hay cinco parámetros disponibles para ajustar los umbrales de eliminación:

  • maximum-dead-containers - El número máximo de contenedores antiguos que pueden continuar existiendo después de ejecutar la recolección de elementos no utilizados. el valor predeterminado de -1 elimina el límite.
  • maximum-dead-containers-per-container - Establecer el número máximo de contenedores antiguos retenidos por contenedor. Esto controla cuántas versiones anteriores de un contenedor permanecen en el clúster, después de que se inicia un nuevo reemplazo.
  • minimum-container-ttl-duration - Los contenedores se vuelven elegibles para la recolección de basura tantos minutos después de que se detienen. El valor predeterminado de 0 desactiva el retardo.
  • image-gc-high-threshold - Cuando el uso del disco alcance este porcentaje, Kubelet intentará eliminar las imágenes no utilizadas...
  • image-gc-low-threshold -… para bajar el uso a este nivel.

Estos parámetros se establecen como indicadores de lanzamiento de Kubelet. Las banderas normalmente se colocan en /var/lib/kubelet/kubeadm-flags.env:

KUBELET_KUBEADM_ARGS="--image-gc-high-threshold=60 --image-gc-low-threshold=50 --minimum-container-ttl-duration=5"

Esta configuración permitirá la eliminación automática de contenedores que han sido redundantes durante al menos cinco minutos. Cada pase de recolección de elementos no utilizados también intentará eliminar las imágenes antiguas una vez que se alcance el 60 % de uso del disco, con el objetivo de reducir el consumo hasta el 50 %.

Debe reiniciar el proceso de Kubelet después de realizar estos cambios:

$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

Como la configuración es parte de Kubelet, deberá aplicarla a cada uno de sus nodos de trabajo en su clúster si desea que la configuración sea consistente en todos ellos.

Resumen

Comprender las diferentes formas de recolección de basura de Kubernetes lo ayuda a decidir la estrategia correcta al eliminar objetos de su clúster. Las cascadas de fondo y de primer plano afectan el orden en que se limpian los recursos dependientes. Las relaciones entre objetos se identifican por sus cadenas de referencia de propietario. Kubernetes también limpia contenedores e imágenes no utilizados en segundo plano. Los umbrales para este comportamiento se pueden personalizar mediante la configuración de Kubelet.

Para obtener los mejores resultados, debe ceñirse a los mecanismos que proporciona Kubernetes. El proyecto advierte contra el uso de herramientas de recolección de basura de terceros, ya que pueden crear inconsistencias de estado que causan problemas en su clúster.

Descubre más contenido

Subir Change privacy settings