En este documento, se muestra cómo aplicar ComputeClasses de forma predeterminada a los Pods de Google Kubernetes Engine (GKE) que no seleccionan de forma explícita una ComputeClass. Puedes establecer una ComputeClass como predeterminada para un espacio de nombres o para un clúster completo. Este documento está dirigido a los administradores de clústeres que desean reducir la sobrecarga manual causada por la configuración individual de nodos y cargas de trabajo.
Ya deberías estar familiarizado con las ComputeClasses personalizadas.
Acerca de las ComputeClasses predeterminadas
Puedes configurar clústeres de GKE o espacios de nombres específicos para que tengan una ComputeClass predeterminada. La clase predeterminada que configures se aplica a cualquier Pod de ese clúster o espacio de nombres que no seleccione una ComputeClass diferente. Cuando implementas un Pod que no selecciona una ComputeClass, GKE aplica ComputeClasses predeterminadas en el siguiente orden:
- Si el espacio de nombres tiene una ComputeClass predeterminada, GKE modifica la especificación del Pod para seleccionar esa ComputeClass.
- Si el espacio de nombres no tiene una ComputeClass predeterminada, se aplica la clase predeterminada a nivel del clúster. GKE no modifica la especificación del Pod.
Cuando estableces una ComputeClass predeterminada para un clúster o un espacio de nombres, el cambio solo se aplica a los Pods nuevos. Los Pods existentes no se ven afectados hasta que se vuelven a crear. Este comportamiento se aplica incluso si tu ComputeClass tiene habilitada la migración activa.
Si tu ComputeClass predeterminada tiene el campo activeMigration.optimizeRulePriority establecido en true, esta configuración podría afectar las cargas de trabajo de tus clústeres. Para obtener más información,
consulta Migración activa en ComputeClasses predeterminadas.
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 the
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.
- Ten un clúster de GKE Autopilot o Standard que ejecute una versión que admita la configuración de una ComputeClass predeterminada a nivel del clúster o del espacio de nombres. Para obtener más información, consulta la sección Requisitos.
Si usas un clúster del modo Standard, asegúrate de cumplir con uno de los siguientes requisitos:
- Habilita el ajuste de escala automático en al menos un grupo de nodos del clúster.
- Si tu clúster estándar ejecuta una versión anterior a la 1.33.3-gke.1136000 y no está inscrito en el canal de lanzamiento rápido, habilita el aprovisionamiento automático de nodos a nivel del clúster.
Si deseas establecer una ComputeClass personalizada como predeterminada para un espacio de nombres, implementa una ComputeClass personalizada.
Requisitos
- Para establecer una ComputeClass como predeterminada a nivel del clúster, el clúster debe ejecutar la versión 1.33.1-gke.1744000 de GKE o una posterior.
- Para establecer una ComputeClass como predeterminada a nivel del espacio de nombres solo para Pods que no sean DaemonSet, el clúster debe ejecutar la versión 1.33.1-gke.1788000 de GKE o una posterior.
Roles y permisos requeridos
Para obtener los permisos que necesitas para configurar ComputeClasses predeterminadas a nivel del clúster o del espacio de nombres, pídele a tu administrador que te otorgue los siguientes roles de IAM en el Cloud de Confiance proyecto:
- Desarrollador de Kubernetes Engine (
roles/container.developer) -
Actualiza la ComputeClass predeterminada a nivel del clúster:
Administrador de clústeres de Kubernetes Engine (
roles/container.clusterAdmin)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
Estos roles predefinidos contienen los permisos necesarios para configurar ComputeClasses predeterminadas a nivel del clúster o del espacio de nombres. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:
Permisos necesarios
Se requieren los siguientes permisos para configurar ComputeClasses predeterminadas a nivel del clúster o del espacio de nombres:
-
container.customResourceDefinitions.create -
container.customResourceDefinitions.update -
container.customResourceDefinitions.get -
container.customResourceDefinitions.list -
container.namespaces.get -
container.namespaces.list -
container.pods.get -
container.nodes.get -
container.nodes.list -
container.deployments.create -
container.deployments.get -
Agrega etiquetas a los espacios de nombres:
container.namespaces.update -
Habilita la ComputeClass predeterminada a nivel del clúster:
container.clusters.update
También puedes obtener estos permisos con roles personalizados o otros roles predefinidos.
Configura una ComputeClass predeterminada para un espacio de nombres
Puedes anotar cualquier espacio de nombres de Kubernetes en tu clúster con el nombre de una ComputeClass para usarla como predeterminada. Si un Pod que se implementa en ese espacio de nombres aún no selecciona una ComputeClass, GKE modifica la especificación del Pod para seleccionar la clase predeterminada en el espacio de nombres. Puedes establecer cualquier ComputeClass personalizada o integrada como predeterminada.
Para aplicar una ComputeClass a todos los Pods de un espacio de nombres de forma predeterminada, agrega la etiqueta
cloud.google.com/default-compute-classa ese espacio de nombres:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class=COMPUTECLASS_NAMEReemplaza lo siguiente:
NAMESPACE_NAME: Es el nombre del espacio de nombres que se actualizará.COMPUTECLASS_NAME: Es el nombre de la ComputeClass que se establecerá como predeterminada para el espacio de nombres.
Si el comando falla con el siguiente mensaje de error, el espacio de nombres ya tiene una ComputeClass predeterminada:
error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is falsePara resolver este error, actualiza la ComputeClass predeterminada para el espacio de nombres.
Para aplicar una ComputeClass a todos los Pods que no sean DaemonSet en un espacio de nombres de forma predeterminada, agrega la etiqueta
cloud.google.com/default-compute-class-non-daemonseta ese espacio de nombres:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAMESi el comando falla con el siguiente mensaje de error, el espacio de nombres ya tiene una ComputeClass predeterminada para los Pods que no sean DaemonSet:
error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is falsePara resolver este error, actualiza la ComputeClass predeterminada para el espacio de nombres.
Los cambios se aplican a todos los Pods nuevos de ese espacio de nombres. Los Pods existentes no se ven afectados.
Actualiza la ComputeClass predeterminada existente en un espacio de nombres
Para anular la ComputeClass predeterminada existente para un espacio de nombres, ejecuta uno de los siguientes comandos:
Actualiza la ComputeClass predeterminada para todos los Pods del espacio de nombres:
kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class=COMPUTECLASS_NAME \ --overwriteReemplaza lo siguiente:
NAMESPACE_NAME: Es el nombre del espacio de nombres que se actualizará.COMPUTECLASS_NAME: Es el nombre de la ComputeClass que se establecerá como la nueva predeterminada para el espacio de nombres.
Anula la ComputeClass predeterminada para los Pods que no sean DaemonSet en el espacio de nombres:
kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \ --overwrite
Configura una ComputeClass predeterminada para espacios de nombres del sistema
GKE usa espacios de nombres del sistema para ejecutar varias cargas de trabajo administradas, como agentes de supervisión. Algunas de estas cargas de trabajo administradas son DaemonSets, que deben ejecutarse en cada nodo del clúster para proporcionar funcionalidad crítica. Sin embargo, puedes especificar una ComputeClass predeterminada para los Pods que no sean DaemonSet en espacios de nombres del sistema, de modo que esos Pods se ejecuten por separado de tus cargas de trabajo.
Para establecer una ComputeClass predeterminada para espacios de nombres del sistema, sigue estos pasos:
Guarda la siguiente secuencia de comandos como
apply-system-cc.sh. Esta secuencia de comandos te permite aplicar una ComputeClass recomendada o tu ComputeClass existente a los espacios de nombres del sistema.#!/bin/bash # The recommended default ComputeClass name for system pods. DEFAULT_SYSTEM_CC_NAME="system-default-computeclass" # The YAML manifest for the recommended default ComputeClass for system pods. read -r -d '' DEFAULT_CC_YAML << EOF apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: ${DEFAULT_SYSTEM_CC_NAME} spec: nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnyway priorities: - machineFamily: t2d EOF # The label key to apply to namespaces. LABEL_KEY="cloud.google.com/default-compute-class-non-daemonset" # List of GKE system namespaces. SYSTEM_NAMESPACES=( "kube-system" "gke-gmp-system" "gmp-system" "gke-managed-cim" "gke-managed-volumepopulator" "gke-managed-checkpointing" "gkebackup" "gke-managed-lustrecsi" ) # 1. Ask the user for their choice. echo "This script sets a default ComputeClass for GKE system namespaces." echo "--------------------------------------------------------------------" echo "The following ComputeClass is recommended for system Pods:" echo "" echo "$DEFAULT_CC_YAML" echo "--------------------------------------------------------------------" read -p "Do you want to use the recommended ComputeClass? (y/N): " user_choice CC_TO_APPLY="" # 2. Process the user's choice. if [[ "$user_choice" =~ ^[Yy]$ ]]; then # Path 1: User chose YES. echo "Installing the recommended default ComputeClass '${DEFAULT_SYSTEM_CC_NAME}'..." if ! echo "$DEFAULT_CC_YAML" | kubectl apply -f -; then # If kubectl apply fails, print an error and exit. echo "❌ Error: Failed to create the default ComputeClass. An internal error occurred." echo "Check for kubectl permissions or other cluster issues and re-run the script." exit 1 fi # If the command succeeded, set the name to be used for labeling. CC_TO_APPLY="$DEFAULT_SYSTEM_CC_NAME" else read -p "Specify the name of an existing ComputeClass to set as the default for system Pods: " custom_cc_name # Validate that the user entered a name. while [[ -z "$custom_cc_name" ]]; do echo "Error: Name cannot be empty." read -p "Specify the name of an existing ComputeClass: " custom_cc_name done # Check if the specified ComputeClass actually exists in the cluster. echo "--> Verifying that ComputeClass '${custom_cc_name}' exists..." if kubectl get computeclass "$custom_cc_name" > /dev/null 2>&1; then echo "Verified." CC_TO_APPLY="$custom_cc_name" else echo "Error: ComputeClass '${custom_cc_name}' doesn't exist in the cluster." echo "Create the ComputeClass, and then then re-run this script." exit 1 fi fi echo "" echo "Labelling system namespaces with ComputeClass: '${CC_TO_APPLY}'" echo "--------------------------------------------------------------------" # 3. Apply the label to all system namespaces. for ns in "${SYSTEM_NAMESPACES[@]}"; do # Gracefully handle namespaces that don't exist on this specific cluster. if kubectl get namespace "${ns}" > /dev/null 2>&1; then echo "--> Applying label to namespace: ${ns}" kubectl label namespace "${ns}" \ "${LABEL_KEY}=${CC_TO_APPLY}" --overwrite else echo "--> Skipping namespace ${ns} (does not exist)" fi done echo "" echo "✅ Script finished successfully."
Esta secuencia de comandos usa la etiqueta
cloud.google.com/default-compute-class-non-daemonset, que solo afecta a los Pods que no sean DaemonSet en espacios de nombres del sistema.Ejecuta la secuencia de comandos:
./apply-system-cc.sh
Después de que se complete la secuencia de comandos, todos los Pods nuevos del sistema que no sean DaemonSet usarán la ComputeClass especificada de forma predeterminada, a menos que ya tengan una ComputeClass. Los Pods existentes en esos espacios de nombres no se ven afectados. Si GKE agrega espacios de nombres del sistema nuevos, vuelve a ejecutar esta secuencia de comandos para aplicar cambios a esos espacios de nombres.
Para anular la ComputeClass predeterminada para espacios de nombres del sistema, sigue estos pasos:
Guarda la siguiente secuencia de comandos como
unset-system-cc.sh:#!/bin/bash # The recommended default ComputeClass name for system pods. DEFAULT_SYSTEM_CC_NAME="system-default-computeclass" # The YAML manifest for the recommended default ComputeClass for system pods. read -r -d '' DEFAULT_CC_YAML << EOF apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: ${DEFAULT_SYSTEM_CC_NAME} spec: nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnyway priorities: - machineFamily: t2d EOF # The label key to apply to namespaces. LABEL_KEY="cloud.google.com/default-compute-class-non-daemonset" # List of GKE system namespaces. SYSTEM_NAMESPACES=( "kube-system" "gke-gmp-system" "gmp-system" "gke-managed-cim" "gke-managed-volumepopulator" "gke-managed-checkpointing" "gkebackup" "gke-managed-lustrecsi" ) # 1. Ask the user for their choice. echo "This script sets a default ComputeClass for GKE system namespaces." echo "--------------------------------------------------------------------" echo "The following ComputeClass is recommended for system Pods:" echo "" echo "$DEFAULT_CC_YAML" echo "--------------------------------------------------------------------" read -p "Do you want to use the recommended ComputeClass? (y/N): " user_choice CC_TO_APPLY="" # 2. Process the user's choice. if [[ "$user_choice" =~ ^[Yy]$ ]]; then # Path 1: User chose YES. echo "Installing the recommended default ComputeClass '${DEFAULT_SYSTEM_CC_NAME}'..." if ! echo "$DEFAULT_CC_YAML" | kubectl apply -f -; then # If kubectl apply fails, print an error and exit. echo "❌ Error: Failed to create the default ComputeClass. An internal error occurred." echo "Check for kubectl permissions or other cluster issues and re-run the script." exit 1 fi # If the command succeeded, set the name to be used for labeling. CC_TO_APPLY="$DEFAULT_SYSTEM_CC_NAME" else read -p "Specify the name of an existing ComputeClass to set as the default for system Pods: " custom_cc_name # Validate that the user entered a name. while [[ -z "$custom_cc_name" ]]; do echo "Error: Name cannot be empty." read -p "Specify the name of an existing ComputeClass: " custom_cc_name done # Check if the specified ComputeClass actually exists in the cluster. echo "--> Verifying that ComputeClass '${custom_cc_name}' exists..." if kubectl get computeclass "$custom_cc_name" > /dev/null 2>&1; then echo "Verified." CC_TO_APPLY="$custom_cc_name" else echo "Error: ComputeClass '${custom_cc_name}' doesn't exist in the cluster." echo "Create the ComputeClass, and then then re-run this script." exit 1 fi fi echo "" echo "Labelling system namespaces with ComputeClass: '${CC_TO_APPLY}'" echo "--------------------------------------------------------------------" # 3. Apply the label to all system namespaces. for ns in "${SYSTEM_NAMESPACES[@]}"; do # Gracefully handle namespaces that don't exist on this specific cluster. if kubectl get namespace "${ns}" > /dev/null 2>&1; then echo "--> Applying label to namespace: ${ns}" kubectl label namespace "${ns}" \ "${LABEL_KEY}=${CC_TO_APPLY}" --overwrite else echo "--> Skipping namespace ${ns} (does not exist)" fi done echo "" echo "✅ Script finished successfully."
Ejecuta la secuencia de comandos:
./unset-system-cc.sh
Configura una ComputeClass predeterminada para un clúster
Puedes establecer cualquier ComputeClass personalizada como predeterminada para todo el clúster.
Este proceso implica habilitar ComputeClasses predeterminadas a nivel del clúster en tu clúster y, luego, crear una ComputeClass llamada default. Incluso puedes
obtener el comportamiento de las
ComputeClasses integradas de Autopilot
si especificas las mismas reglas de prioridad en una ComputeClass llamada default.
Debes realizar los siguientes pasos para usar correctamente una ComputeClass predeterminada en tu clúster:
Para habilitar la configuración de una ComputeClass predeterminada a nivel del clúster, usa la
--enable-default-compute-classmarca cuando crees o actualices un clúster:Crea un clúster:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-default-compute-classReemplaza lo siguiente:
CLUSTER_NAME: Es un nombre para tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control del clúster, comous-central1.
Actualiza un clúster:
gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --enable-default-compute-classReemplaza lo siguiente:
CLUSTER_NAME: El nombre de tu clúster.CONTROL_PLANE_LOCATION: Es la ubicación del plano de control del clúster, comous-central1.
Después de completar este paso, GKE busca una ComputeClass llamada
defaulten tu clúster. No notarás ningún cambio en tus cargas de trabajo hasta que configures la ComputeClassdefault.Crea una ComputeClass llamada
default, como en los siguientes ejemplos:La siguiente ComputeClass solicita series de máquinas específicas:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: default spec: priorities: - machineFamily: n4 - machineFamily: n2 whenUnsatisfiable: ScaleUpAnyway nodePoolAutoCreation: enabled: trueEsta ComputeClass solicita nodos que usan instancias N4. Si las instancias N4 no están disponibles, la ComputeClass solicita instancias N2 en su lugar. Puedes configurar la
defaultComputeClass con cualquiera de los campos disponibles en la ComputeClass CustomResourceDefinition.La siguiente ComputeClass solicita la plataforma de procesamiento optimizada para contenedores de Autopilot:
apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: default spec: autopilot: enabled: true priorities: - podFamily: general-purpose whenUnsatisfiable: ScaleUpAnywayEsta ComputeClass coincide con el comportamiento de la ComputeClass integrada
autopilot, con la excepción del campowhenUnsatisfiable, que tiene un valor deScaleUpAnywayen lugar deDoNotScaleUp. Esta modificación ayuda a evitar situaciones en las que los Pods que usan un selector de nodos para hardware específico permanecen en estado pendiente porque se aplicó la ComputeClass predeterminada a nivel del clúster a esos Pods.La regla de prioridad
podFamilycoloca los Pods en la plataforma de procesamiento optimizada para contenedores de Autopilot. Esta regla de prioridad requiere la versión 1.35.2-gke.1485000 de GKE o una posterior.
Crea la ComputeClass
defaulten tu clúster:kubectl apply -f PATH_TO_MANIFESTReemplaza
PATH_TO_MANIFESTpor la ruta de acceso al manifiesto de la ComputeClass.Opcional: Si tu clúster estándar ya tiene grupos de nodos creados de forma manual que usas como predeterminados para tus cargas de trabajo de uso general, puedes mover esas cargas de trabajo para que se ejecuten en el modo Autopilot después de establecer una ComputeClass de Autopilot como predeterminada a nivel del clúster. Para mover esas cargas de trabajo, acordonan y desvían todos los nodos de los grupos de nodos. GKE usa la ComputeClass predeterminada a nivel del clúster para programar los nuevos Pods pendientes.
Después de establecer una ComputeClass predeterminada a nivel del clúster, GKE escala los grupos de nodos que cumplen con los siguientes requisitos:
- La configuración del nodo es la misma que la configuración de la ComputeClass
default. - El grupo de nodos no tiene taints ni etiquetas para una ComputeClass diferente.
GKE puede escalar grupos de nodos que tienen un taint y una etiqueta para la ComputeClass
default.
Por ejemplo, si la ComputeClass default especifica la serie de máquinas N4, GKE puede escalar un grupo de nodos existente que usa instancias N4 y no tiene taints ni etiquetas para una ComputeClass diferente.
Los cambios se aplican a todos los Pods nuevos del clúster que aún no tienen una ComputeClass. Los Pods existentes pueden verse afectados según la configuración de migración activa de la ComputeClass predeterminada a nivel del clúster. Para obtener más información, consulta Migración activa en ComputeClasses predeterminadas.
Verifica el comportamiento predeterminado de ComputeClass
Para verificar si la ComputeClass predeterminada que estableciste para un espacio de nombres o para un clúster funciona como se espera, haz lo siguiente:
Revisa el siguiente ejemplo de Deployment:
Este Deployment no solicita de forma explícita una ComputeClass.
Crea el Deployment:
kubectl apply --namespace=NAMESPACE_NAME \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/refs/heads/main/quickstarts/hello-app/manifests/helloweb-deployment.yamlReemplaza
NAMESPACE_NAMEpor uno de los siguientes valores, según lo que quieras verificar:- El nombre de un espacio de nombres que tiene una ComputeClass predeterminada.
- El nombre de un espacio de nombres que no tiene una ComputeClass predeterminada.
Es posible que GKE tarde un poco en crear nodos nuevos para ejecutar los Pods.
Identifica los nodos que ejecutan los Pods del ejemplo de Deployment:
kubectl get pods --namespace=NAMESPACE_NAME \ --selector=app=hello -o=wideEl resultado es similar a este:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES helloweb-7795fbf856-58n5l 1/1 Running 0 9m21s 10.52.2.3 gke-cluster-1-nap-n2-highcpu-2-3muqi8-f213e529-rx7d <none> <none>Obtén las etiquetas de nodo:
kubectl get node NODE_NAME --show-labels \ | grep "cloud.google.com/compute-class"Reemplaza
NODE_NAMEpor el nombre del nodo del resultado del paso anterior.El resultado es similar a este:
NODE_NAME Ready <none> 22m v1.32.4-gke.1236007 # lines are omitted from this output cloud.google.com/compute-class=COMPUTECLASS_NAME,cloud.google.com/gke-boot-disk=pd-balanced,cloud.google.com/gke-container-runtime=containerdEl valor de
COMPUTECLASS_NAMEes uno de los siguientes:- ComputeClass predeterminada a nivel del clúster:
defaultpara los nodos que creó GKE Autopilot o la creación automática de grupos de nodos. Es posible que los nodos de los grupos de nodos existentes creados de forma manual no tengan la etiquetacloud.google.com/compute-class. - ComputeClass predeterminada a nivel del espacio de nombres: El nombre de la ComputeClass que configuraste como predeterminada para el espacio de nombres.
- ComputeClass predeterminada a nivel del clúster:
Inhabilita la ComputeClass predeterminada
Para inhabilitar la ComputeClass predeterminada en un espacio de nombres o un clúster, haz una de las siguientes acciones:
Para inhabilitar la ComputeClass predeterminada a nivel del espacio de nombres para todos los Pods, quita la etiqueta
cloud.google.com/default-compute-classdel espacio de nombres:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-El carácter
-al final de la clave de la etiqueta quita cualquier etiqueta con esa clave del objetoNamespaceen la API de Kubernetes.Para inhabilitar la ComputeClass predeterminada a nivel del espacio de nombres para los Pods que no sean DaemonSet, quita la etiqueta
cloud.google.com/default-compute-class-non-daemonsetdel espacio de nombres:kubectl label namespaces NAMESPACE_NAME \ cloud.google.com/default-compute-class-non-daemonset-Para inhabilitar la ComputeClass predeterminada a nivel del clúster, usa el comando
gcloud container clusters updatecon la marca--no-enable-default-compute-class:gcloud container clusters update CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --no-enable-default-compute-class
¿Qué sigue?
- Obtén más información sobre las ComputeClasses personalizadas en GKE.