Crear y personalizar un grupo de nodos

En esta página se muestra cómo crear un grupo de nodos en GKE en AWS y cómo personalizar la configuración de los nodos mediante un archivo de configuración.

Para crear un grupo de nodos, debes proporcionar los siguientes recursos:

Si quieres tener acceso SSH a tus nodos, puedes crear un par de claves de EC2.

Esta página está dirigida a administradores de TI y operadores que quieran configurar, monitorizar y gestionar la infraestructura de la nube. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud

Crear un grupo de nodos estándar

Una vez que estos recursos estén disponibles, puedes crear un grupo de nodos con este comando:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --instance-type INSTANCE_TYPE \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

Haz los cambios siguientes:

  • NODE_POOL_NAME: el nombre que elijas para tu grupo de nodos
  • CLUSTER_NAME: el nombre del clúster al que se va a adjuntar el grupo de nodos
  • INSTANCE_TYPE: el tipo de instancia de máquina de AWS que quieras para este grupo de nodos. Por ejemplo, m5.large.
  • ROOT_VOLUME_SIZE: tamaño deseado del volumen raíz de cada nodo, en GB
  • NODEPOOL_PROFILE: el perfil de instancia de gestión de identidades y accesos de las máquinas virtuales del grupo de nodos. Para obtener información sobre cómo actualizar un perfil de instancia de IAM, consulta Actualizar un perfil de instancia de AWS IAM.
  • NODE_VERSION: la versión de Kubernetes que se va a instalar en cada nodo del grupo de nodos (por ejemplo, "1.32.4-gke.200")
  • MIN_NODES: número mínimo de nodos que puede contener el grupo de nodos
  • MAX_NODES: número máximo de nodos que puede contener el grupo de nodos.
  • MAX_PODS_PER_NODE: el número máximo de pods que se pueden crear en cualquier nodo del grupo.
  • GOOGLE_CLOUD_LOCATION: el nombre de la Google Cloud ubicación desde la que se gestionará este grupo de nodos
  • NODEPOOL_SUBNET: el ID de la subred en la que se ejecutará el grupo de nodos.
    • No debe haber ninguna superposición entre los intervalos de IPs de pods o servicios del clúster y la red de subredes del grupo de nodos. Para obtener más información sobre cómo seleccionar intervalos de IPs de pods y servicios para tu clúster, consulta Seleccionar intervalos de CIDR para tu clúster.
    • Si esta subred está fuera del bloque CIDR principal de la VPC, se necesitan algunos pasos adicionales. Para obtener más información, consulta Grupos de seguridad.
  • SSH_KEY_PAIR_NAME: nombre del par de claves SSH de AWS creado para el acceso SSH (opcional)
  • CONFIG_KMS_KEY_ARN: el nombre de recurso de Amazon (ARN) de la clave de AWS KMS que cifra los datos de usuario.

Si está presente, el parámetro --tags aplica la etiqueta dada a todos los nodos del grupo de nodos. En este ejemplo, se etiquetan todos los nodos del grupo con los nombres del clúster y del grupo de nodos al que pertenece el nodo.

Personalizar la configuración del sistema de nodos

Puedes personalizar la configuración de tu nodo de varias formas. Por ejemplo, puedes especificar parámetros como el límite de CPU del pod al crear un grupo de nodos.

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.

Configurar el agente kubelet

Para personalizar la configuración de los nodos con kubelet, usa Google Cloud CLI o Terraform.

gcloud

Puedes especificar ajustes personalizados para el agente de nodo de Kubernetes (kubelet) cuando crees tus grupos de nodos. Por ejemplo, para configurar kubelet para que use la política de gestión de CPU estática, ejecuta el siguiente comando:

  gcloud container aws node-pools create POOL_NAME \
       --cluster CLUSTER_NAME \
       --location=LOCATION \
       --kubelet_config_cpu_manager_policy=static

Haz los cambios siguientes:

  • POOL_NAME: el nombre del grupo de nodos.
  • CLUSTER_NAME: el nombre del clúster al que quieres añadir un grupo de nodos.
  • LOCATION: la zona o región de computación del clúster.

Para ver una lista completa de los campos que puedes añadir al comando anterior, consulta Opciones de configuración de Kubelet.

Terraform

Puedes obtener más información sobre Terraform en un entorno de AWS en la referencia de grupos de nodos de Terraform.

  1. Define las variables de Terraform incluyendo el siguiente bloque en el archivo variables.tf:

    variable "node_pool_kubelet_config_cpu_manager" {
      default     = "none"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota" {
      default     = "true"
    }
    
    variable "node_pool_kubelet_config_cpu_cfs_quota_period" {
      default     = "100ms"
    }
    
    variable "node_pool_kubelet_config_pod_pids_limit" {
      default     = -1
    }
    
  2. Añade el siguiente bloque a tu configuración de Terraform:

    resource "google_container_aws_node_pool" "NODE_POOL_RESOURCE_NAME" {
     provider           = google
     cluster            = CLUSTER_NAME
     name               = POOL_NAME
     subnet_id          = SUBNET_ID
     version            = CLUSTER_VERSION
     location           = CLUSTER_LOCATION
    
     kubelet_config {
       cpu_manager_policy = var.node_pool_kubelet_config_cpu_manager
       cpu_cfs_quota = var.node_pool_kubelet_config_cpu_cfs_quota
       cpu_cfs_quota_period = var.node_pool_kubelet_config_cpu_cfs_quota_period
       pod_pids_limit = var.node_pool_kubelet_config_pod_pids_limit
     }
    }
    

    Haz los cambios siguientes:

    • NODE_POOL_RESOURCE_NAME: el nombre del recurso del grupo de nodos en la plantilla de Terraform.
    • CLUSTER_NAME: el nombre del clúster.
    • POOL_NAME: el nombre del grupo de nodos que se va a personalizar.
    • SUBNET_ID: la subred asignada al grupo de nodos.
    • CLUSTER_VERSION: la versión del plano de control y los nodos del clúster de GKE en AWS.
    • CLUSTER_LOCATION: la región o zona de Compute Engine del clúster.

Configurar la utilidad sysctl

Para personalizar la configuración del sistema de nodos con sysctl, haz una solicitud POST al método awsClusters.awsNodePools.create. Esta solicitud POST crea un grupo de nodos con las personalizaciones que hayas especificado. En el siguiente ejemplo, los parámetros busy_poll y busy_read se han configurado en 5000 microsegundos cada uno:

POST https://ENDPOINT/v1/projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/CLUSTER_NAME/awsNodePools

{
    "name": NODE_POOL_NAME,
    "version": CLUSTER_VERSION,
    "config": {
        "linuxNodeConfig": {
            "sysctls": {
                "net.core.busy_poll": "5000",
                "net.core.busy_read": "5000",
            }
        }
    }
}

Haz los cambios siguientes:

  • ENDPOINT: el Google Cloud endpoint de tu servicio.
  • PROJECT_ID: tu ID de proyecto Google Cloud .
  • GOOGLE_CLOUD_LOCATION: la Google Cloud ubicación del clúster.
  • CLUSTER_NAME: el nombre del clúster al que quieres añadir un grupo de nodos.
  • NODE_POOL_NAME: el nombre del grupo de nodos.
  • CLUSTER_VERSION: el número de versión de tu clúster, por ejemplo, 1.31.0-gke.500.

Para ver una lista completa de los pares clave-valor que puede añadir a la solicitud JSON anterior, consulte Opciones de configuración de Sysctl.

Opciones de configuración del agente 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
kubelet_config_cpu_manager_policy El valor debe ser none o static "none" Este ajuste controla la política de gestión 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 de la clase de QoS Garantizada con solicitudes de CPU de números enteros podrán usar las CPUs de forma exclusiva.
kubelet_config_cpu_cfs_quota 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.
kubelet_config_cpu_cfs_quota_period 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.
kubelet_config_pod_pids_limit El valor debe estar entre 1024 y 4194304 -1 Este ajuste define el número máximo de IDs de proceso (PIDs) que puede usar cada pod. Si se define con el valor predeterminado, el límite de PIDs se ajusta automáticamente en función del tamaño del equipo subyacente.

Opciones de configuración de la utilidad sysctl

Para optimizar el rendimiento de tu sistema, puedes modificar los siguientes atributos:

Grupos de nodos de instancias Spot

GKE on AWS admite los nodos de instancia de spot de AWS como función de vista previa. Los grupos de nodos de instancias de acceso puntual son grupos de instancias de acceso puntual de Amazon EC2 que están disponibles en AWS a un coste más bajo.

Las instancias Spot pueden ofrecer ahorros de costes en aplicaciones sin reconocimiento del estado, tolerantes a fallos y flexibles. Sin embargo, no son adecuados para cargas de trabajo inflexibles, con reconocimiento del estado, intolerantes a fallos o con un acoplamiento estrecho entre nodos de instancia. Amazon EC2 puede interrumpir las instancias de Spot cuando necesite recuperar la capacidad, por lo que están sujetas a fluctuaciones en el mercado de Spot. Si tus cargas de trabajo requieren capacidad garantizada y no pueden tolerar periodos de indisponibilidad ocasionales, elige un grupo de nodos estándar en lugar de un grupo de nodos de instancia de spot.

La estrategia de asignación empleada en GKE en AWS se centra en seleccionar grupos de instancias de Spot con la mayor disponibilidad de capacidad, lo que minimiza el riesgo de interrupciones. Esta estrategia es especialmente útil para cargas de trabajo con un coste de interrupción más alto, como el renderizado de imágenes y contenido multimedia o el aprendizaje profundo. En concreto, se ha implementado la estrategia de asignación capacityOptimized, tal como se describe en Estrategias de asignación de instancias Spot.

Crear un grupo de nodos Spot

Para crear un grupo de nodos de instancia de Spot, ejecuta el siguiente comando:

gcloud container aws node-pools create NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --spot-instance-types INSTANCE_TYPE_LIST \
    --root-volume-size ROOT_VOLUME_SIZE \
    --iam-instance-profile NODEPOOL_PROFILE \
    --node-version NODE_VERSION \
    --min-nodes MIN_NODES \
    --max-nodes MAX_NODES \
    --max-pods-per-node MAX_PODS_PER_NODE \
    --location GOOGLE_CLOUD_LOCATION \
    --subnet-id NODEPOOL_SUBNET \
    --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
    --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
    --tags "Name=CLUSTER_NAME-NODE_POOL_NAME"

Haz los cambios siguientes:

  • NODE_POOL_NAME: el nombre que quieras asignar a este grupo de nodos.
  • CLUSTER_NAME: el nombre del clúster al que quieres adjuntar este grupo de nodos.
  • INSTANCE_TYPE_LIST: lista separada por comas de tipos de instancias de AWS EC2. El grupo de nodos aprovisiona instancias de acceso puntual con estos tipos de instancia. Los tipos de instancia deben tener la misma arquitectura de CPU, el mismo número de CPUs y la misma cantidad de memoria. Por ejemplo: "c6g.large,c6gd.large,c6gn.large,c7g.large,t4g.medium". Puedes usar la herramienta Amazon EC2 Instance Selector para encontrar tipos de instancias que tengan configuraciones de CPU y memoria idénticas.
  • ROOT_VOLUME_SIZE: tamaño deseado del volumen raíz de cada nodo, en GB
  • NODEPOOL_PROFILE: el perfil de instancia de gestión de identidades y accesos de las VMs del grupo de nodos
  • NODE_VERSION: la versión de Kubernetes que se va a instalar en cada nodo del grupo de nodos (por ejemplo, "1.32.4-gke.200")
  • MIN_NODES: número mínimo de nodos que puede contener el grupo de nodos
  • MAX_NODES: número máximo de nodos que puede contener el grupo de nodos.
  • MAX_PODS_PER_NODE: el número máximo de pods que se pueden crear en cualquier nodo del grupo.
  • GOOGLE_CLOUD_LOCATION: el nombre de la Google Cloud ubicación desde la que se gestionará este grupo de nodos
  • NODEPOOL_SUBNET: el ID de la subred en la que se ejecutará el grupo de nodos.
    • No debe haber ninguna superposición entre los intervalos de IPs de pods o servicios del clúster y la red de subredes del grupo de nodos. Para obtener más información sobre cómo seleccionar intervalos de IPs de pods y servicios para tu clúster, consulta Seleccionar intervalos de CIDR para tu clúster.
    • Si esta subred está fuera del bloque CIDR principal de la VPC, se necesitan algunos pasos adicionales. Para obtener más información, consulta Grupos de seguridad.
  • SSH_KEY_PAIR_NAME: nombre del par de claves SSH de AWS creado para el acceso SSH (opcional)
  • CONFIG_KMS_KEY_ARN: el nombre de recurso de Amazon (ARN) de la clave de AWS KMS que cifra los datos de usuario.

Lo más recomendable es incluir varios tipos de instancia en el campo INSTANCE_TYPE_LIST. Esta práctica recomendada es importante porque, si un grupo de nodos se configura con un solo tipo de instancia y ese tipo de instancia no está disponible en ninguna de las zonas de disponibilidad deseadas, el grupo de nodos no podrá aprovisionar ningún nodo nuevo. Esto puede afectar a la disponibilidad de tus aplicaciones y provocar interrupciones en el servicio.

Tenga en cuenta que el campo spot-instance-types se excluye mutuamente con el campo instance-type. Esto significa que solo puedes proporcionar uno de estos campos y no ambos.