En este documento se explica cómo personalizar la configuración de los nodos de Google Kubernetes Engine (GKE) mediante un archivo de configuración llamado configuración del sistema de nodos.
Información general
Puedes personalizar la configuración de tu nodo de varias formas. Por ejemplo, puedes especificar parámetros como el tipo de máquina y la plataforma de CPU mínima al crear un pool de nodos.
Una configuración del sistema de nodos es un archivo de configuración que proporciona una forma de ajustar un conjunto limitado de ajustes del sistema. Puedes usar una configuración del sistema de nodos para especificar ajustes personalizados del agente de nodos de Kubernetes (
kubelet
)
y configuraciones de kernel de Linux de bajo nivel
(sysctl
) en tus grupos de nodos.
También puedes personalizar el tiempo de ejecución del contenedor de containerd en tus nodos de GKE mediante otro archivo llamado archivo de configuración del tiempo de ejecución. Para obtener instrucciones, consulta Personalizar la configuración de containerd en nodos de GKE.
También puedes usar DaemonSets para personalizar nodos, como en Inicializar automáticamente nodos de GKE con DaemonSets.
Usar una configuración del sistema de nodos
Puedes personalizar la configuración del sistema de nodos con cualquiera de los siguientes métodos:
- Archivo de configuración: disponible en el modo Estándar. Se usa un archivo YAML que contiene los parámetros de configuración de kubelet y del kernel de Linux. En los pasos de esta página se explica cómo crear y usar un archivo de configuración.
- ComputeClass disponible en los modos Autopilot y Standard. Puedes especificar la configuración del sistema de nodos en la especificación de ComputeClass de GKE. Las clases de computación te permiten definir conjuntos de atributos de nodo para que GKE los use cuando aumente la escala de tu clúster. Disponible en la versión 1.32.1-gke.1729000 de GKE y en versiones posteriores. Para obtener más información, consulta Información sobre las clases de computación en GKE.
Para usar un archivo de configuración del sistema de nodos, haz lo siguiente:
- Crea un archivo de configuración. Este archivo contiene las configuraciones de
kubelet
ysysctl
. - Añade la configuración cuando crees un clúster o cuando crees o actualices un grupo de nodos.
Crear un archivo de configuración
Escribe el archivo de configuración del sistema de nodos en YAML. En el ejemplo siguiente se muestra cómo añadir configuraciones para las opciones kubelet
y sysctl
:
kubeletConfig:
cpuManagerPolicy: static
allowedUnsafeSysctls:
- 'kernel.shm*'
- 'kernel.msg*'
- 'kernel.sem'
- 'fs.mqueue*'
- 'net.*'
linuxConfig:
sysctl:
net.core.somaxconn: '2048'
net.ipv4.tcp_rmem: '4096 87380 6291456'
En este ejemplo:
cpuManagerPolicy: static
configura elkubelet
para que use la política de gestión de CPU estática.net.core.somaxconn: '2048'
limita la acumulación desocket listen()
a 2048 bytes.net.ipv4.tcp_rmem: '4096 87380 6291456'
define los valores mínimo, predeterminado y máximo del búfer de recepción de sockets TCP en 4096 bytes, 87.380 bytes y 6.291.456 bytes, respectivamente.
Si solo quieres añadir configuraciones para kubelet
o sysctl
, incluye únicamente esa sección en tu archivo de configuración. Por ejemplo, para añadir una configuración de kubelet
, crea el siguiente archivo:
kubeletConfig:
cpuManagerPolicy: static
Para ver una lista completa de los campos que puedes añadir al archivo de configuración, consulta las secciones Opciones de configuración de Kubelet y Opciones de configuración de Sysctl.
Añadir la configuración a un grupo de nodos
Una vez que hayas creado el archivo de configuración, añade la marca --system-config-from-file
con la interfaz de línea de comandos de Google Cloud. Puedes añadir esta marca cuando crees un clúster o cuando crees o actualices un grupo de nodos. No puedes añadir una configuración de sistema de nodos con la consola Google Cloud .
Crear un clúster con la configuración del sistema de nodos
Puedes añadir una configuración del sistema de nodos durante la creación del clúster con la CLI de gcloud o Terraform. Las siguientes instrucciones aplican la configuración del sistema de nodos al grupo de nodos predeterminado:
CLI de gcloud
gcloud container clusters create CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
Haz los cambios siguientes:
CLUSTER_NAME
: el nombre del clústerLOCATION
: la zona o región de computación del clústerSYSTEM_CONFIG_PATH
: la ruta al archivo que contiene las configuraciones dekubelet
ysysctl
Una vez que hayas aplicado una configuración del sistema de nodos, el grupo de nodos predeterminado del clúster usará los ajustes que hayas definido.
Terraform
Para crear un clúster regional con una configuración de sistema de nodos personalizada mediante Terraform, consulta el siguiente ejemplo:
Para obtener más información sobre el uso de Terraform, consulta Compatibilidad de Terraform con GKE.
Crear un grupo de nodos con la configuración del sistema de nodos
Puedes añadir una configuración del sistema de nodos cuando utilices la CLI de gcloud o Terraform para crear un grupo de nodos. También puedes actualizar la configuración del sistema de nodos de un grupo de nodos.
Las siguientes instrucciones aplican la configuración del sistema de nodos a un nuevo grupo de nodos:
CLI de gcloud
gcloud container node-pools create POOL_NAME \
--cluster CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
``` Replace the following:
POOL_NAME
: el nombre del grupo de nodosCLUSTER_NAME
: el nombre del clúster al que quieres añadir un grupo de nodosLOCATION
: la zona o región de computación del clústerSYSTEM_CONFIG_PATH
: la ruta al archivo que contiene las configuraciones dekubelet
ysysctl
Terraform
Para crear un grupo de nodos con una configuración del sistema de nodos personalizada mediante Terraform, consulta el siguiente ejemplo:
Para obtener más información sobre el uso de Terraform, consulta Compatibilidad de Terraform con GKE.
Actualizar la configuración del sistema de nodos de un grupo de nodos
Ejecuta el siguiente comando:
gcloud container node-pools update POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--system-config-from-file=SYSTEM_CONFIG_PATH
Haz los cambios siguientes:
POOL_NAME
: el nombre del grupo de nodos que quieras actualizarCLUSTER_NAME
: el nombre del clúster que quieras actualizarLOCATION
: la zona o región de computación del clústerSYSTEM_CONFIG_PATH
: la ruta al archivo que contiene las configuraciones dekubelet
ysysctl
Para aplicar este cambio, es necesario volver a crear los nodos, lo que puede provocar interrupciones en las cargas de trabajo en ejecución. Para obtener más información sobre este cambio concreto, busca la fila correspondiente en la tabla Cambios manuales que recrean los nodos mediante una estrategia de actualización de nodos sin respetar las políticas de mantenimiento. Para obtener más información sobre las actualizaciones de nodos, consulta Planificar las interrupciones de las actualizaciones de nodos.
Editar una configuración del sistema de nodos
Para editar la configuración del sistema de nodos, puedes crear un grupo de nodos con la configuración que quieras o actualizar la configuración del sistema de nodos de un grupo de nodos.
Editar creando un grupo de nodos
Para editar la configuración del sistema de nodos creando un grupo de nodos, sigue estos pasos:
- Crea un archivo de configuración con la configuración que quieras.
- Añade la configuración a un nuevo grupo de nodos.
- Migra tus cargas de trabajo al nuevo grupo de nodos.
- Elimina el grupo de nodos antiguo.
Editar un grupo de nodos actualizándolo
Para editar la configuración del sistema de nodos de un grupo de nodos, sigue las instrucciones de la pestaña Actualizar grupo de nodos para añadir la configuración a un grupo de nodos. Al actualizar la configuración del sistema de nodos, se sustituye la configuración del sistema del grupo de nodos por la nueva configuración, lo que requiere volver a crear los nodos. Si omites algún parámetro durante una actualización, se le asignará el valor predeterminado correspondiente.
Si quieres restablecer la configuración predeterminada del sistema de nodos, actualiza el archivo de configuración con valores vacíos para kubelet
y sysctl
. Por ejemplo:
kubeletConfig: {}
linuxConfig:
sysctl: {}
Eliminar una configuración del sistema de nodos
Para quitar una configuración del sistema de nodos:
- Crea un grupo de nodos.
- Migra tus cargas de trabajo al nuevo grupo de nodos.
- Elimina el grupo de nodos que tenga la configuración del sistema de nodos anterior.
Opciones de configuración de Kubelet
En la siguiente tabla se muestran las opciones de kubelet
que puedes modificar.
Ajustes de configuración de Kubelet | Restricciones | Ajuste predeterminado | Descripción |
---|---|---|---|
allowedUnsafeSysctls |
Lista de sysctl nombres o grupos. Grupos sysctl
permitidos: kernel.shm* , kernel.msg* ,
kernel.sem , fs.mqueue.* y net.* .
Ejemplo: [kernel.msg*, net.ipv4.route.min_pmtu] .
|
none
|
Este ajuste define una lista de elementos permitidos separada por comas de nombres o grupos sysctl no seguros, que se pueden definir en los pods.sysctl
Disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE. |
containerLogMaxSize |
El valor debe ser un número positivo y un sufijo de unidad entre 10Mi y 500Mi , ambos incluidos. Las unidades válidas son
Ki, Mi, Gi .
|
10Mi
|
Este ajuste controla el ajuste containerLogMaxSize de la política de rotación de registros de contenedores, que le permite configurar el tamaño máximo de cada archivo de registro. El valor predeterminado es 10Mi . |
containerLogMaxFiles |
El valor debe ser un número entero entre 2 y 10 , ambos incluidos.
|
5
|
Este ajuste controla el ajuste containerLogMaxFiles de la política de rotación de archivos de registro de contenedores, que te permite configurar el número máximo de archivos permitidos para cada contenedor. El valor predeterminado es 5 . El tamaño total de los registros (container_log_max_size*container_log_max_files) por contenedor no puede superar el 1 % del almacenamiento total del nodo. |
cpuCFSQuota |
El valor debe ser true o false
|
true
|
Este ajuste aplica el límite de CPU de los pods. Si se asigna el valor false , se ignorarán los límites de CPU de los pods.Ignorar los límites de CPU puede ser recomendable en determinados casos en los que los pods sean sensibles a los límites de CPU. El riesgo de inhabilitar cpuCFSQuota es que un pod no autorizado puede consumir más recursos de CPU de lo previsto.
|
cpuCFSQuotaPeriod | El valor debe ser una duración |
"100ms"
|
Este ajuste define el valor del periodo de cuota de CFS de la CPU, cpu.cfs_period_us ,
que especifica la frecuencia con la que se debe reasignar el acceso de un cgroup a los recursos de la CPU. Esta opción te permite ajustar el comportamiento de limitación de la CPU. |
imageGcLowThresholdPercent |
El valor debe ser un número entero entre 10 y 85, ambos incluidos, e inferior a imageGcHighThresholdPercent .
|
80
|
Este ajuste define el porcentaje de uso del disco antes del cual nunca se ejecuta la recogida de elementos no utilizados de las imágenes. Uso de disco más bajo para la recolección de elementos no utilizados. El porcentaje se calcula dividiendo el valor de este campo entre 100. Si se especifica, el valor debe ser inferior a imageGcHighThresholdPercent . |
imageGcHighThresholdPercent |
El valor debe ser un número entero entre 10 y 85, ambos incluidos, y superior a imageGcLowThresholdPercent .
|
85
|
Este ajuste define el porcentaje de uso del disco por encima del cual se ejecuta la recogida de elementos no utilizados de las imágenes. Uso de disco máximo para la recolección de elementos no utilizados. El porcentaje se calcula dividiendo el valor de este campo entre 100. Si se especifica, el valor debe ser superior a imageGcLowThresholdPercent . |
imageMinimumGcAge |
El valor debe ser una duración no superior a "2m". Las unidades de tiempo válidas
son "ns", "us" (or "µs"), "ms", "s", "m", "h" .
|
2m
|
imageMinimumGcAge es la edad mínima de una imagen no utilizada antes de que se recoja como elemento no utilizado. |
imageMaximumGcAge | El valor debe ser una duración |
0s
|
imageMaximumGcAge es la antigüedad máxima que puede tener una imagen sin usar antes de que se recoja como elemento no utilizado. El valor predeterminado de este campo es "0s", lo que lo inhabilita. Es decir, las imágenes no se eliminarán por no haberse usado durante demasiado tiempo. Si se especifica, el valor debe ser superior a imageMinimumGcAge .
Disponible en las versiones 1.30.7-gke.1076000, 1.31.3-gke.1023000 o posteriores de GKE. |
insecureKubeletReadonlyPortEnabled |
El valor debe ser un valor booleano (true o false ). |
true |
Este ajuste inhabilita el puerto de solo lectura de kubelet no seguro 10255
en cada grupo de nodos nuevo de tu clúster. Si configuras este ajuste en este archivo, no podrás usar un cliente de la API de GKE para cambiar el ajuste a nivel de clúster. |
podPidsLimit | El valor debe estar entre 1024 y 4194304 |
none
|
Este ajuste define el número máximo de IDs de proceso (PIDs) que puede usar cada pod. |
maxParallelImagePulls | El valor debe ser un número entero entre 2 y 5, ambos incluidos. |
2 o 3 en función del tipo de disco
|
Este ajuste define el número máximo de extracciones de imágenes en paralelo. El valor predeterminado se decide en función del tipo de disco de arranque: 3 : pd-balanced , pd-ssd o SSD local efímero.2 : pd-standard u otros tipos de disco de arranque.Disponible en las versiones 1.33.1-gke.1918000 o posteriores de GKE. |
evictionSoft | Mapa de nombres de señales. Para ver las restricciones de los valores, consulta la siguiente tabla. |
none
|
Esta opción asigna nombres de señales a cantidades o porcentajes que definen los umbrales de desalojo flexible. Un umbral de desalojo suave debe tener un periodo de gracia. Kubelet no expulsa los pods hasta que se supera el periodo de gracia. |
evictionSoftGracePeriod |
Mapa de nombres de señales, que tiene las mismas opciones que evictionSoft con restricciones diferentes. En el caso de cada nombre de señal, el valor debe ser una duración positiva inferior a 5m (por ejemplo, 30s o 1m ). Las unidades de tiempo válidas son "ns" , "us" (o "µs" ), "ms" , "s" , "m" o "h" .
|
none
|
Este ajuste asigna nombres de señales a duraciones que definen los periodos de gracia de los umbrales de expulsión suave. Cada umbral de desalojo suave debe tener un periodo de gracia correspondiente. |
evictionMinimumReclaim |
Mapa de nombres de señales, que tiene las mismas opciones que evictionSoft con restricciones diferentes. En el caso de cada nombre de señal, el valor debe ser un porcentaje positivo inferior a 10% (por ejemplo, 5% ).
|
none
|
Esta opción asigna nombres de señales a porcentajes que definen la cantidad mínima de un recurso determinado que reclama kubelet cuando realiza un desalojo de pods. |
evictionMaxPodGracePeriodSeconds |
El valor debe ser un número entero entre 0 y 300 .
|
0
|
Este ajuste define, en segundos, el periodo de gracia máximo para la finalización de los pods durante el desalojo. |
En la siguiente tabla se muestran las opciones de la marca evictionSoft
que puedes modificar. Las mismas opciones se aplican también a las marcas evictionSoftGracePeriod
y evictionMinimumReclaim
, pero con diferentes restricciones.
Ajustes de configuración de Kubelet | Restricciones | Ajuste predeterminado | Descripción |
---|---|---|---|
memoryAvailable |
El valor debe ser una cantidad superior a 100Mi e inferior a 50% de la memoria del nodo. Por ejemplo, 100Mi , 1Gi .
|
none
|
Representa la cantidad de memoria disponible antes de la expulsión suave. Define la cantidad de la señal memory.available en el kubelet. |
nodefsAvailable |
El valor debe estar entre 10% y 50% .
|
none
|
Representa el nodefs disponible antes de la expulsión suave. Define la cantidad de la señal nodefs.available en el kubelet. |
nodefsInodesFree |
El valor debe estar entre 5% y 50% .
|
none
|
Representa los inodos de nodefs que están libres antes de la expulsión suave. Define la cantidad de la señal nodefs.inodesFree en el kubelet. |
imagefsAvailable |
El valor debe estar entre 15% y 50% .
|
none
|
Representa el espacio de almacenamiento de imágenes disponible antes de la expulsión suave. Define la cantidad de señal imagefs.available en el kubelet. |
imagefsInodesFree |
El valor debe estar entre 5% y 50% .
|
none
|
Representa los inodos de imagefs que están libres antes de la expulsión suave. Define la cantidad de la señal imagefs.inodesFree en el kubelet. |
pidAvailable |
El valor debe estar entre 10% y 50% .
|
none
|
Representa los PIDs disponibles antes de la expulsión suave. Define la cantidad de la señal pid.available en el kubelet. |
singleProcessOOMKill |
El valor debe ser true o false
|
true para nodos cgroupv1 y false para nodos cgroupv2.
|
Este ajuste determina si los procesos del contenedor se eliminan por falta de memoria individualmente o como grupo.
Disponible en las versiones 1.32.4-gke.1132000, 1.33.0-gke.1748000 o posteriores de GKE. |
Gestores de recursos
Kubernetes ofrece un conjunto de gestores de recursos. Puedes configurar estos gestores de recursos para coordinar y optimizar la asignación de recursos de nodos a pods configurados con requisitos específicos de recursos de CPU, dispositivos y memoria (páginas enormes). Para obtener más información, consulta Gestores de recursos de nodos.
Con GKE, puedes configurar los siguientes ajustes para estos gestores de recursos. Puedes configurar estos ajustes de forma independiente, pero te recomendamos que los uses juntos para alinear la gestión de recursos. Puedes usar los ajustes de Topology Manager junto con los de CPU Manager y Memory Manager para alinear la CPU y la memoria con otros recursos solicitados en la especificación del pod.
Ajustes de configuración de Kubelet | Restricciones | Ajuste predeterminado | Descripción |
---|---|---|---|
cpuManagerPolicy: |
El valor debe ser none o static
|
none
|
Este ajuste controla la política del gestor de CPU de kubelet. El valor predeterminado es none , que es el esquema de afinidad de CPU predeterminado. No proporciona ninguna afinidad más allá de lo que el programador del SO hace automáticamente.Si se asigna el valor static , los pods que estén en la clase de QoS Guaranteed y tengan solicitudes de CPU de números enteros podrán tener CPUs exclusivas. |
memoryManager: policy: |
El valor debe ser None o Static |
None |
Este ajuste controla la política del gestor de memoria de kubelet. Con el valor predeterminado Si asignas el valor Este ajuste se puede aplicar a clústeres con el plano de control que ejecute la versión 1.32.3-gke.1785000 o posterior de GKE. |
topologyManager: policy: scope: |
El valor debe ser uno de los ajustes admitidos para cada uno de los campos correspondientes. |
|
Estos ajustes controlan la política del gestor de topología de kubelet, que coordina el conjunto de componentes responsables de las optimizaciones de rendimiento relacionadas con el aislamiento de la CPU, la memoria y la localidad del dispositivo. Puedes definir la política y la configuración del ámbito de forma independiente. Para obtener más información sobre estos ajustes, consulta Ámbitos y políticas del gestor de topología. Los siguientes recursos de GKE admiten este ajuste:
|
En el ejemplo siguiente se muestra una configuración del sistema de nodos en la que se han configurado las tres políticas de Resource Manager:
cpuManagerPolicy: static
memoryManager:
policy: Static
topologyManager:
policy: best-effort
scope: pod
Opciones de configuración de sysctl
Para optimizar el rendimiento de tu sistema, puedes modificar los siguientes atributos del kernel:
kernel.shmmni
kernel.shmmax
kernel.shmall
net.core.busy_poll
net.core.busy_read
net.core.netdev_max_backlog
net.core.rmem_max
net.core.rmem_default
net.core.wmem_default
net.core.wmem_max
net.core.optmem_max
net.core.somaxconn
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_max_orphans
net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.default.disable_ipv6
net.netfilter.nf_conntrack_acct
: disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE.net.netfilter.nf_conntrack_max
: disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE.net.netfilter.nf_conntrack_buckets
: disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE.net.netfilter.nf_conntrack_tcp_timeout_close_wait
: disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE.net.netfilter.nf_conntrack_tcp_timeout_established
: disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE.net.netfilter.nf_conntrack_tcp_timeout_time_wait
: disponible en las versiones 1.32.0-gke.1448000 o posteriores de GKE.fs.aio-max-nr
fs.file-max
fs.inotify.max_user_instances
fs.inotify.max_user_watches
fs.nr_open
vm.max_map_count
vm.dirty_background_ratio
vm.dirty_expire_centisecs
vm.dirty_ratio
vm.dirty_writeback_centisecs
vm.overcommit_memory
vm.overcommit_ratio
vm.vfs_cache_pressure
vm.swappiness
vm.watermark_scale_factor
vm.min_free_kbytes
Para obtener más información sobre los valores admitidos de cada marca sysctl
, consulta la documentación de la CLI de gcloud --system-config-from-file.
Los distintos espacios de nombres de Linux
pueden tener valores únicos para un sysctl
determinado, mientras que otros son globales para todo el nodo. Si actualiza las opciones de sysctl
mediante una configuración del sistema de nodos, se asegura de que sysctl
se aplique de forma global en el nodo y en cada espacio de nombres, lo que hace que cada pod tenga valores de sysctl
idénticos en cada espacio de nombres de Linux.
Opciones de configuración del modo cgroup de Linux
El kubelet y el tiempo de ejecución del contenedor usan cgroups del kernel de Linux para gestionar los recursos, como limitar la cantidad de CPU o memoria a la que puede acceder cada contenedor de un pod. Hay dos versiones del subsistema cgroup en el kernel: cgroupv1
y cgroupv2
.
La compatibilidad con Kubernetes para cgroupv2
se introdujo como alfa en la versión 1.18 de Kubernetes, como beta en la 1.22 y como GA en la 1.25. Para obtener más información, consulta la documentación de cgroups v2 de Kubernetes.
La configuración del sistema de nodos te permite personalizar la configuración de cgroup de tus grupos de nodos. Puedes usar cgroupv1
o cgroupv2
. GKE usa cgroupv2
para los grupos de nodos Standard nuevos que ejecutan la versión 1.26 y posteriores, y cgroupv1
para las versiones anteriores a la 1.26. En los grupos de nodos creados con el aprovisionamiento automático de nodos, la configuración de cgroup depende de la versión inicial del clúster, no de la versión del grupo de nodos. cgroupv1
no es compatible con máquinas Arm.
Puedes usar la configuración del sistema de nodos para cambiar el ajuste de un grupo de nodos y usar cgroupv1
o cgroupv2
de forma explícita. Si actualizas un grupo de nodos a la versión 1.26, el ajuste no cambiará a cgroupv2
, ya que los grupos de nodos creados con una versión anterior a la 1.26 (sin una configuración de cgroup personalizada) seguirán usando cgroupv1
a menos que especifiques lo contrario.
Por ejemplo, para configurar tu grupo de nodos de forma que use cgroupv2
, utiliza un archivo de configuración del sistema de nodos como el siguiente:
linuxConfig:
cgroupMode: 'CGROUP_MODE_V2'
Las opciones de cgroupMode
admitidas son las siguientes:
CGROUP_MODE_V1
: usacgroupv1
en el grupo de nodos.CGROUP_MODE_V2
: usacgroupv2
en el grupo de nodos.CGROUP_MODE_UNSPECIFIED
: usa la configuración predeterminada de cgroup de GKE.
Para usar cgroupv2
, se aplican los siguientes requisitos y limitaciones:
- En el caso de los grupos de nodos que ejecuten una versión anterior a la 1.26, debes usar la versión 408.0.0 o una posterior de la interfaz de línea de comandos de gcloud. También puedes usar gcloud beta con la versión 395.0.0 o una posterior.
- Tu clúster y tus grupos de nodos deben ejecutar la versión 1.24.2-gke.300 de GKE o una posterior.
- Debes usar la imagen de nodo de Container-Optimized OS con containerd o Ubuntu con containerd.
- Si alguna de tus cargas de trabajo depende de la lectura del sistema de archivos cgroup
(
/sys/fs/cgroup/...
), asegúrate de que sea compatible con la APIcgroupv2
.- Asegúrate de que las herramientas de monitorización o de terceros sean compatibles con
cgroupv2
.
- Asegúrate de que las herramientas de monitorización o de terceros sean compatibles con
- Si usas JDK (carga de trabajo de Java), te recomendamos que utilices versiones que admitan cgroupv2 por completo, como JDK
8u372
, JDK 11.0.16 o versiones posteriores, o JDK 15 o versiones posteriores.
Verificar la configuración de cgroup
Cuando añades una configuración del sistema de nodos, GKE debe volver a crear los nodos para implementar los cambios. Una vez que hayas añadido la configuración a un pool de nodos y se hayan recreado los nodos, podrás verificar la nueva configuración.
Puedes verificar la configuración de cgroup de los nodos de un grupo de nodos con la CLI de gcloud o la herramienta de línea de comandos kubectl
:
CLI de gcloud
Comprueba la configuración de cgroup de un grupo de nodos:
gcloud container node-pools describe POOL_NAME \
--format='value(Config.effectiveCgroupMode)'
Sustituye POOL_NAME
por el nombre de tu grupo de nodos.
El resultado potencial es uno de los siguientes:
EFFECTIVE_CGROUP_MODE_V1
: los nodos usancgroupv1
EFFECTIVE_CGROUP_MODE_V2
: los nodos usancgroupv2
El resultado solo muestra la nueva configuración del cgroup después de que se hayan recreado los nodos del node pool. La salida está vacía en los grupos de nodos de Windows Server, que no admiten cgroup.
kubectl
Para verificar la configuración de cgroup de los nodos de este grupo de nodos con kubectl
, selecciona un nodo y conéctate a él siguiendo estas instrucciones:
- Crea un shell interactivo
con cualquier nodo del grupo de nodos. Sustituye
mynode
en el comando por el nombre de cualquier nodo del grupo de nodos. - Identifica la versión de cgroup en los nodos de Linux.
Opciones de configuración de páginas enormes de Linux
Puedes usar el archivo de configuración del sistema de nodos para usar la función páginas enormes del kernel de Linux.
Kubernetes admite páginas enormes en los nodos como un tipo de recurso, de forma similar a la CPU o la memoria. Usa los siguientes parámetros para indicar a tus nodos de Kubernetes que preasignen páginas enormes para que las usen los pods. Para gestionar el consumo de páginas enormes de tus pods, consulta Gestionar páginas enormes.
Para preasignar páginas enormes a tus nodos, especifica las cantidades y los tamaños. Por ejemplo, para configurar los nodos de forma que asignen tres páginas enormes de 1 GB y 1024 páginas enormes de 2 MB, utiliza una configuración del sistema de nodos como la siguiente:
linuxConfig:
hugepageConfig:
hugepage_size2m: 1024
hugepage_size1g: 3
Para usar páginas enormes, se aplican las siguientes limitaciones y requisitos:
- Para asegurarse de que el nodo no esté ocupado por completo por páginas enormes, el tamaño total de las páginas enormes asignadas no puede superar el 60% de la memoria total de las máquinas con menos de 30 GB de memoria, ni el 80% en las máquinas con más de 30 GB de memoria. Por ejemplo, en una máquina e2-standard-2 con 8 GB de memoria, no puedes asignar más de 4,8 GB a páginas enormes. En c4a-standard-8 con 32 GB de memoria, las páginas enormes no pueden superar los 25,6 GB.
- Las páginas enormes de 1 GB solo están disponibles en los tipos de máquinas A3, C2D, C3, C3D, C4, C4A, C4D, CT5E, CT5LP, CT6E, H3, M2, M3, M4 o Z3.
Compatibilidad con páginas enormes transparentes
Puedes usar el archivo de configuración del sistema de nodos para habilitar la función del kernel de Linux Transparent HugePage Support. La compatibilidad con páginas enormes transparentes (THP) es una solución alternativa a las páginas enormes estáticas. Con THP, el kernel asigna automáticamente páginas enormes a los procesos, por lo que no es necesario reservar páginas enormes manualmente. Se admiten los siguientes campos:
linuxConfig:
transparentHugepageEnabled: TRANSPARENT_HUGEPAGE_ENABLED_ALWAYS
transparentHugepageDefrag: TRANSPARENT_HUGEPAGE_DEFRAG_ALWAYS
transparentHugepageEnabled
controla la compatibilidad con páginas enormes transparentes para la memoria anónima. Los valores admitidos son los siguientes:TRANSPARENT_HUGEPAGE_ENABLED_ALWAYS
: las páginas enormes transparentes están habilitadas en todo el sistema.TRANSPARENT_HUGEPAGE_ENABLED_MADVISE
: las páginas enormes transparentes están habilitadas en las regiones de MADV_HUGEPAGE. Esta es la configuración predeterminada del kernel.TRANSPARENT_HUGEPAGE_ENABLED_NEVER
: Transparent hugepage está inhabilitado.TRANSPARENT_HUGEPAGE_ENABLED_UNSPECIFIED
: valor predeterminado. GKE no modifica la configuración del kernel.
transparentHugepageDefrag
define la configuración de desfragmentación de páginas enormes transparentes en el nodo. Los valores admitidos son los siguientes:TRANSPARENT_HUGEPAGE_DEFRAG_ALWAYS
: una aplicación que solicita THP se bloquea si no se puede asignar y reclama directamente páginas y comprime la memoria para asignar un THP inmediatamente.TRANSPARENT_HUGEPAGE_DEFRAG_DEFER
: una aplicación activa kswapd en segundo plano para reclamar páginas y activa kcompactd para compactar la memoria, de modo que THP esté disponible en un futuro próximo. Es responsabilidad de khugepaged instalar las páginas THP más adelante.TRANSPARENT_HUGEPAGE_DEFRAG_DEFER_WITH_MADVISE
: una aplicación entra en la recuperación directa y la compactación como siempre, pero solo para las regiones que han usadomadvise(MADV_HUGEPAGE)
. Todas las demás regiones activan kswapd en segundo plano para recuperar páginas y activan kcompactd para compactar la memoria, de modo que THP esté disponible en un futuro próximo.TRANSPARENT_HUGEPAGE_DEFRAG_MADVISE
: una aplicación entra en la recuperación directa y la compactación como siempre, pero solo para las regiones que han usadomadvise(MADV_HUGEPAGE)
. Todas las demás regiones activan kswapd en segundo plano para recuperar páginas y activan kcompactd para compactar la memoria, de modo que THP esté disponible en un futuro próximo.TRANSPARENT_HUGEPAGE_DEFRAG_NEVER
: una aplicación nunca entra en la reclamación directa ni en la compactación.TRANSPARENT_HUGEPAGE_DEFRAG_UNSPECIFIED
: valor predeterminado. GKE no modifica la configuración del kernel.
THP está disponible en GKE 1.33.2-gke.4655000 o versiones posteriores. También está habilitado de forma predeterminada en los nuevos grupos de nodos de TPU en la versión 1.33.2-gke.4655000 de GKE o posterior. THP no se habilita cuando actualizas los grupos de nodos a una versión compatible o posterior.