Puedes permitir que las cargas de trabajo de Google Kubernetes Engine (GKE) administren recursos, como CPU y memoria, para procesos secundarios mediante la API de cgroups de Linux . En este documento, se muestra cómo proporcionar a los contenedores acceso de lectura y escritura a la API de cgroups sin ejecutar esos contenedores en modo privilegiado.
Cuándo usar cgroups grabables
De forma predeterminada, Kubernetes proporciona a todos los contenedores de Linux acceso de solo lectura a la API de cgroups mediante la activación del sistema de archivos /sys/fs/cgroup en cada contenedor.
De manera opcional, puedes permitir que GKE active este sistema de archivos en modo de lectura y escritura en Pods específicos para permitir que los procesos raíz administren y restrinjan los recursos para los procesos secundarios.
Estos cgroups grabables ayudan a mejorar la confiabilidad en aplicaciones como
Ray que ejecutan
procesos del sistema y código de usuario en el mismo contenedor. Cuando escribe en el sistema de archivos /sys/fs/cgroup, Ray puede reservar partes de los recursos de un contenedor para procesos críticos. Puedes usar cgroups grabables para mejorar la confiabilidad en estas aplicaciones sin el riesgo de seguridad de usar el modo privilegiado para los contenedores.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea,
instala y, luego,
inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.
- Asegúrate de tener un clúster de Autopilot o Standard que ejecute la versión 1.34.1-gke.2541000 o posterior. Para crear un clúster nuevo, consulta Crea un clúster de Autopilot.
- Asegúrate de que tu clúster use cgroup v2. Para obtener más información, consulta Migra nodos a Linux cgroup v2.
Habilita cgroups grabables para tus nodos
Para habilitar cgroups grabables en tus grupos de nodos, personaliza la configuración de containerd. Puedes aplicar esta configuración a todo el clúster o a grupos de nodos específicos en clústeres Standard.
En tu archivo de configuración de containerd, agrega una sección writableCgroups y configura el campo enabled como true. Para obtener más información, consulta
Personaliza la configuración de containerd en nodos de GKE.
writableCgroups:
enabled: true
Especifica el archivo de configuración actualizado cuando crees o actualices un clúster o un grupo de nodos.
Usa cgroups grabables en cargas de trabajo
Después de habilitar cgroups grabables para tu clúster o grupos de nodos, configura tus cargas de trabajo para que cumplan con todos los siguientes requisitos:
- Selecciona un nodo que tenga habilitados los cgroups grabables.
- Habilita cgroups grabables para uno o más contenedores en el Pod.
Usa la clase de calidad de servicio (QoS) garantizada si cumples con una de las siguientes condiciones:
- Para las cargas de trabajo que
especifican recursos a nivel del Pod,
establece valores iguales para
resources.requestsyresources.limitsen la especificación del Pod. - Para las cargas de trabajo que especifican recursos para cada contenedor, establece valores iguales para
resources.requestsyresources.limitsen la especificación de cada contenedor del Pod, incluidos los contenedores de inicialización.
- Para las cargas de trabajo que
especifican recursos a nivel del Pod,
establece valores iguales para
Para configurar estos requisitos, sigue estos pasos:
Para seleccionar nodos que tengan habilitados los cgroups grabables, agrega la
node.gke.io/enable-writable-cgroups: "true"etiqueta alspec.nodeSelectorcampo en la especificación del Pod:node.gke.io/enable-writable-cgroups: "true"Para habilitar cgroups grabables para tu carga de trabajo, agrega una de las siguientes etiquetas al campo
metadata.annotationsen la especificación del Pod:Habilitar para todo el Pod:
node.gke.io/enable-writable-cgroups: "true"Habilitar para un contenedor específico en el Pod:
node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"Reemplaza
CONTAINER_NAMEpor el nombre del contenedor.
Para configurar la clase de QoS garantizada para tu Pod, especifica solicitudes y límites de CPU y memoria iguales para cada contenedor del Pod o para todo el Pod, como en el siguiente ejemplo:
resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"Debes especificar solicitudes y límites iguales para cada contenedor, incluso si habilitas cgroups grabables solo para uno de los contenedores del Pod.
La especificación final del Pod debería ser similar a los siguientes ejemplos.
En este ejemplo, se habilitan cgroups grabables para todos los contenedores del Pod:
apiVersion: v1 kind: Pod metadata: name: writable-cgroups-pod annotations: node.gke.io/enable-writable-cgroups: "true" spec: nodeSelector: node.gke.io/enable-writable-cgroups: "true" containers: - name: container image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"En este ejemplo, se habilitan cgroups grabables para un contenedor específico en un Pod de varios contenedores:
apiVersion: v1 kind: Pod metadata: name: writable-cgroups-per-container annotations: node.gke.io/enable-writable-cgroups.busybox-container: "true" spec: nodeSelector: node.gke.io/enable-writable-cgroups: "true" containers: - name: busybox-container image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi" - name: container-disabled image: busybox:stable command: ["/bin/sh", "-c"] args: - | trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM echo "Waiting for termination signal..." while true; do sleep 1; done resources: requests: cpu: "100m" memory: "100Mi" limits: cpu: "100m" memory: "100Mi"
Verifica que el sistema de archivos cgroup sea grabable
Para verificar los permisos en el sistema de archivos /sys/fs/cgroup para un Pod o un contenedor, sigue estos pasos:
- Identifica un Pod que deseas verificar. Puedes usar uno de los Pods de muestra de la sección Usa cgroups grabables en cargas de trabajo.
Crea una sesión de shell en el Pod:
kubectl exec -it POD_NAME -- /bin/shReemplaza
POD_NAMEpor el nombre del pod.Describe el sistema de archivos cgroup activado:
mount | grep cgroupEl resultado es similar a este:
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)En este resultado,
rwindica que el sistema de archivos es grabable. Si vesroen el resultado, el sistema de archivos es de solo lectura.