Controla los atributos de los nodos ajustados automáticamente con clases de procesamiento personalizadas


En esta página, se muestra cómo controlar la infraestructura de procesamiento y el comportamiento de escalamiento automático de los clústeres de Google Kubernetes Engine (GKE) según las necesidades específicas de tus cargas de trabajo con clases de procesamiento personalizadas. Ya deberías estar familiarizado con el concepto de clases de procesamiento personalizadas. Para obtener más información, consulta Acerca de las clases de procesamiento personalizadas.

Este documento está dirigido a los administradores de la plataforma que desean definir de manera declarativa perfiles de ajuste de escala automático para nodos y operadores de clústeres que desean ejecutar sus cargas de trabajo en clases de procesamiento específicas.

Acerca de las clases de procesamiento personalizadas

Las clases de procesamiento personalizadas son recursos personalizados de Kubernetes que te permiten definir las prioridades que debe seguir GKE cuando aprovisionas nodos para ejecutar tus cargas de trabajo. Puedes usar una clase de procesamiento personalizada para hacer lo siguiente:

  • Proporciona a GKE un conjunto de prioridades que se deben seguir de forma secuencial cuando se aprovisionan nodos, cada uno con parámetros específicos, como una serie de máquinas de Compute Engine o una capacidad mínima de recursos.
  • Define umbrales y parámetros de ajuste de escala automático para quitar nodos que no se usan y consolidar cargas de trabajo de manera eficiente en la capacidad de procesamiento existente
  • Indica a GKE que reemplace automáticamente las configuraciones de nodos menos preferidas por configuraciones de nodos más preferidas para obtener un rendimiento óptimo de la carga de trabajo.

Para comprender todas las opciones de configuración y cómo interactúan entre sí y con el modo GKE Autopilot y el modo GKE Standard, consulta Acerca de las clases de procesamiento personalizadas.

Precios

El recurso personalizado ComputeClass se proporciona sin costo adicional en GKE. Se aplican las siguientes consideraciones de precios:

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 gcloud components update para obtener la versión más reciente.

Situación de ejemplo para clases de procesamiento

En este documento, se presenta una situación de ejemplo para la que defines una clase de procesamiento personalizada. En la práctica, debes considerar los requisitos de tu organización y carga de trabajo específicas, y definir las clases de procesamiento que cumplan con esos requisitos. Para obtener descripciones completas de todas las opciones de las clases de procesamiento y conocer consideraciones especiales, consulta Acerca de las clases de procesamiento personalizadas.

Considera la siguiente situación de ejemplo:

  • Tu objetivo es optimizar los costos de ejecución de tus cargas de trabajo.
  • Tus cargas de trabajo son tolerantes a errores y no requieren un apagado elegante ni un tiempo de ejecución extendido.
  • Tus cargas de trabajo necesitan al menos 64 CPU virtuales para ejecutarse de manera óptima
  • Solo puedes usar la serie de máquinas N2 de Compute Engine

En función de la situación de ejemplo, decides que deseas una clase de procesamiento que haga lo siguiente:

  • Prioriza los nodos Spot N2 que tienen al menos 64 CPU virtuales
  • Permite que GKE recurra a cualquier nodo N2 Spot, sin importar la capacidad de procesamiento
  • Si no hay nodos N2 Spot disponibles, permite que GKE use nodos N2 según demanda
  • Le indica a GKE que mueva tus cargas de trabajo a los nodos Spot cuando vuelvan a estar disponibles

Configura una clase de procesamiento en modo Autopilot

En GKE Autopilot, defines una clase de procesamiento, la implementas en el clúster y solicitas esa clase de procesamiento en tus cargas de trabajo. GKE realiza cualquier paso de configuración de nodo, como aplicar etiquetas y taints, por ti.

Guarda el siguiente manifiesto como compute-class.yaml:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false
  activeMigration:
    optimizeRulePriority: true
  nodepoolAutoCreation:
    enabled: true

Configura una clase de procesamiento en modo Standard

En los clústeres del modo GKE Standard, defines una clase de procesamiento, después de lo cual es posible que debas realizar la configuración manual para asegurarte de que los Pods de tu clase de procesamiento se programen según lo esperado. La configuración manual depende de si tus grupos de nodos se aprovisionan automáticamente, de la siguiente manera:

Usa clases de procesamiento con grupos de nodos creados de forma manual

En esta sección, se muestra cómo definir una clase de procesamiento en un clúster que solo usa grupos de nodos creados de forma manual.

  1. Guarda el siguiente manifiesto como compute-class.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: cost-optimized
    spec:
      priorities:
      - machineFamily: n2
        spot: true
        minCores: 64
      - machineFamily: n2
        spot: false
      activeMigration:
        optimizeRulePriority: true
    
  2. Crea un nuevo grupo de nodos con ajuste de escala automático que use VMs Spot y asócialo con la clase de procesamiento:

    gcloud container node-pools create cost-optimized-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n2-standard-64 \
        --spot \
        --enable-autoscaling \
        --max-nodes=9 \
        --node-labels="cloud.google.com/compute-class=cost-optimized" \
        --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
    

    Reemplaza lo siguiente:

    • LOCATION: Es la ubicación de tu clúster.
    • CLUSTER_NAME: Es el nombre del clúster existente.
  3. Crea un nuevo grupo de nodos con ajuste de escala automático con VMs según demanda y asócialo con la clase de procesamiento:

    gcloud container node-pools create on-demand-pool \
        --location=LOCATION \
        --cluster=CLUSTER_NAME \
        --machine-type=n2-standard-64 \
        --enable-autoscaling \
        --max-nodes=9 \
        --num-nodes=0 \
        --node-labels="cloud.google.com/compute-class=cost-optimized" \
        --node-taints="cloud.google.com/compute-class=cost-optimized:NoSchedule"
    

Cuando implementas Pods que solicitan esta clase de procesamiento y se deben crear nodos nuevos, GKE prioriza la creación de nodos en el grupo de nodos cost-optimized-pool. Si no se pueden crear nodos nuevos, GKE crea nodos en el grupo de nodos on-demand-pool.

Si deseas obtener más detalles sobre cómo interactúan los grupos de nodos creados de forma manual con las clases de procesamiento personalizadas, consulta Configura grupos de nodos creados manualmente para el uso de la clase de procesamiento.

Usa clases de procesamiento con grupos de nodos aprovisionados de forma automática

En esta sección, se muestra cómo definir una clase de procesamiento en un clúster que usa el aprovisionamiento automático de nodos.

Guarda el siguiente manifiesto como compute-class.yaml:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false
  activeMigration:
    optimizeRulePriority: true
  nodepoolAutoCreation:
    enabled: true

Cuando implementas Pods que solicitan esta clase de procesamiento y se deben crear nodos nuevos, GKE prioriza la creación de nodos en los elementos de orden del campo priorities. Si es necesario, GKE crea grupos de nodos nuevos que cumplen con los requisitos de hardware de la clase de procesamiento.

Para obtener más detalles sobre cómo funciona el aprovisionamiento automático de nodos con clases de procesamiento personalizadas, consulta Aprovisionamiento automático de nodos y clases de procesamiento.

Personaliza los umbrales de ajuste de escala automático para la consolidación de nodos

De forma predeterminada, GKE quita los nodos con poco uso y reprograma tus cargas de trabajo en otros nodos disponibles. Puedes personalizar aún más los umbrales y el tiempo después de los cuales un nodo se convierte en candidato para su eliminación mediante el campo autoscalingPolicy en la definición de la clase de procesamiento, como en el siguiente ejemplo:

apiVersion: cloud.google.com/v1
kind: ComputeClass
metadata:
  name: cost-optimized
spec:
  priorities:
  - machineFamily: n2
    spot: true
    minCores: 64
  - machineFamily: n2
    spot: true
  - machineFamily: n2
    spot: false
  activeMigration:
    optimizeRulePriority: true
  autoscalingPolicy:
    consolidationDelayMinutes : 5
    consolidationThreshold    : 70

En este ejemplo, un nodo se convierte en candidato para la eliminación si el 70% de su capacidad de CPU y memoria disponible no se utiliza durante más de cinco minutos. Para obtener una lista de los parámetros disponibles, consulta Configura parámetros de ajuste de escala automático para la consolidación de nodos.

Implementa una clase de procesamiento en un clúster

Después de definir una clase de procesamiento, impleméntala en el clúster:

kubectl apply -f compute-class.yaml

Esta clase de procesamiento está lista para usarse en el clúster. Puedes solicitar la clase de procesamiento en las especificaciones del Pod o, de forma opcional, establecerla como la clase de procesamiento predeterminada en un espacio de nombres específico.

Establece una clase de procesamiento predeterminada para un espacio de nombres

Cuando configuras una clase de procesamiento predeterminada para un espacio de nombres, GKE usa esa clase de procesamiento para crear nodos para los Pods que implementes en ese espacio de nombres. Si un Pod solicita de forma explícita una clase de procesamiento diferente, la solicitud a nivel del Pod anula la predeterminada del espacio de nombres.

Para establecer una clase de procesamiento como predeterminada para un espacio de nombres específico, haz lo siguiente:

  1. Crea un espacio de nombres:

    kubectl create namespace cost-optimized-ns
    
  2. Etiqueta el espacio de nombres con la clase de procesamiento:

    kubectl label namespaces cost-optimized-ns \
        cloud.google.com/default-compute-class=cost-optimized
    

Solicita una clase de procesamiento en una carga de trabajo

Para solicitar una clase de procesamiento en una carga de trabajo, agrega un selector de nodos para esa clase de procesamiento en tu manifiesto.

  1. Guarda el siguiente manifiesto como cc-workload.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: custom-workload
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: custom-workload
      template:
        metadata:
          labels:
            app: custom-workload
        spec:
          nodeSelector:
            cloud.google.com/compute-class: cost-optimized
          containers:
          - name: test
            image: gcr.io/google_containers/pause
            resources:
              requests:
                cpu: 1.5
                memory: "4Gi"
    
  2. Implementa la carga de trabajo:

    kubectl apply -f cc-workload.yaml
    

Cuando implementas esta carga de trabajo, GKE agrega de forma automática una tolerancia a los Pods que corresponde al taint de nodo para la clase de procesamiento solicitada. Esta tolerancia garantiza que solo los Pods que soliciten la clase de procesamiento se ejecuten en nodos de clase de procesamiento.

¿Qué sigue?