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:
Modo GKE Autopilot: se te factura mediante el modo de facturación basado en nodos. Para obtener más información, consulta Precios del modo Autopilot.
Modo GKE Standard: Consulta los precios del modo Standard.
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.
- Asegúrate de tener un clúster de GKE existente que ejecute la versión 1.30.3-gke.1451000 o posterior. Para obtener más información, consulta Crea un clúster de Autopilot.
- Si usas un clúster de modo Standard, asegúrate de tener al menos un grupo de nodos con el ajuste de escala automático habilitado o de que tu clúster use el aprovisionamiento automático de nodos.
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:
- Grupos de nodos administrados por el aprovisionamiento automático de nodos: No se requiere configuración manual. El aprovisionamiento automático de nodos realiza los pasos de configuración de la clase de procesamiento de forma automática por ti. Para obtener más información, consulta Aprovisionamiento automático de nodos y clases de procesamiento.
- Grupos de nodos creados de forma manual: Se requiere la configuración manual. Debes agregar etiquetas de nodo y taints de nodo a tus grupos de nodos creados de forma manual para asociar los nodos con una clase de procesamiento específica. Para obtener más información, consulta Configura grupos de nodos creados de forma manual para el uso de clases de procesamiento.
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.
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
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.
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:
Crea un espacio de nombres:
kubectl create namespace cost-optimized-ns
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.
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"
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.