Aplicar ComputeClasses a los pods de forma predeterminada

En este documento se muestra cómo aplicar ComputeClasses de forma predeterminada a los pods de Google Kubernetes Engine (GKE) que no seleccionan explícitamente una ComputeClass. En esta página se explica cómo definir una ComputeClass como predeterminada en un espacio de nombres y en todo un clúster. Este documento está dirigido a administradores de clústeres que quieran reducir la sobrecarga manual causada por la configuración individual de cargas de trabajo y nodos.

Ya deberías conocer las clases de Compute personalizadas.

Acerca de las ComputeClasses predeterminadas

Puedes configurar clústeres de GKE o espacios de nombres específicos para que tengan un ComputeClass predeterminado. La clase predeterminada que configures se aplicará a cualquier pod de ese clúster o espacio de nombres que no seleccione otra ComputeClass. Cuando implementas un pod que no selecciona un ComputeClass, GKE aplica los ComputeClasses predeterminados en el siguiente orden:

  1. Si el espacio de nombres tiene un ComputeClass predeterminado, GKE modifica la especificación del pod para seleccionar ese ComputeClass.
  2. Si el espacio de nombres no tiene un ComputeClass predeterminado, se aplica la clase predeterminada a nivel de clúster. GKE no modifica la especificación de Pod.

Si tu ComputeClass predeterminado tiene el campo activeMigration.optimizeRulePriority definido como true, este ajuste puede afectar a las cargas de trabajo de tus clústeres. Para obtener más información, consulta Migración activa en ComputeClasses predeterminadas.

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
  • Tener un clúster Autopilot o Standard de GKE que ejecute una versión que admita la configuración de una ComputeClass predeterminada a nivel de clúster o de espacio de nombres. Para obtener más información, consulta la sección Requisitos.
  • Si usas un clúster en modo Estándar, asegúrate de que cumples uno de los siguientes requisitos:

  • Si quieres definir una ComputeClass personalizada como predeterminada para un espacio de nombres, implementa una ComputeClass personalizada.

Requisitos

  • Para definir una ComputeClass como predeterminada a nivel de clúster, el clúster debe ejecutar la versión 1.33.1-gke.1744000 de GKE o una posterior.
  • Para definir una ComputeClass como predeterminada a nivel de espacio de nombres solo para los 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 necesarios

Para obtener los permisos que necesitas para configurar ComputeClasses predeterminadas a nivel de clúster o de espacio de nombres, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en el Google Cloud proyecto:

Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.

Estos roles predefinidos contienen los permisos necesarios para configurar ComputeClasses predeterminadas a nivel de clúster o de espacio de nombres. Para ver los permisos exactos que se necesitan, despliega la sección Permisos necesarios:

Permisos obligatorios

Para configurar ComputeClasses predeterminadas a nivel de clúster o de espacio de nombres, se necesitan los siguientes permisos:

  • 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
  • Añadir etiquetas a espacios de nombres: container.namespaces.update
  • Habilita la ComputeClass predeterminada a nivel de clúster: container.clusters.update

También puedes obtener estos permisos con roles personalizados u otros roles predefinidos.

Configurar una ComputeClass predeterminada para un espacio de nombres

Puedes anotar cualquier espacio de nombres de Kubernetes de tu clúster con el nombre de una ComputeClass para usarla como predeterminada. Si un pod implementado en ese espacio de nombres aún no ha seleccionado una ComputeClass, GKE modifica la especificación del pod para seleccionar la clase predeterminada del espacio de nombres. Puedes definir cualquier ComputeClass personalizado o integrado como predeterminado.

  • Para aplicar una ComputeClass a todos los pods de un espacio de nombres de forma predeterminada, añade la etiqueta cloud.google.com/default-compute-class a ese espacio de nombres:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME
    

    Haz los cambios siguientes:

    • NAMESPACE_NAME: el nombre del espacio de nombres que se va a actualizar.
    • COMPUTECLASS_NAME: nombre de la clase ComputeClass que se va a definir como predeterminada para el espacio de nombres.

    Si el comando falla y aparece el siguiente mensaje de error, significa que el espacio de nombres ya tiene un ComputeClass predeterminado:

    error: 'cloud.google.com/default-compute-class' already has a value, and --overwrite is false
    

    Para solucionar este error, actualice el valor predeterminado de ComputeClass del espacio de nombres.

  • Para aplicar una ComputeClass a todos los pods que no sean de DaemonSet de un espacio de nombres de forma predeterminada, añade la etiqueta cloud.google.com/default-compute-class-non-daemonset a ese espacio de nombres:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME
    

    Si el comando falla y muestra el siguiente mensaje de error, significa que el espacio de nombres ya tiene un ComputeClass predeterminado para los pods que no son DaemonSet:

    error: 'cloud.google.com/default-compute-class-non-daemonset' already has a value, and --overwrite is false
    

    Para solucionar este error, actualice el valor predeterminado de ComputeClass del espacio de nombres.

Los cambios se aplicarán a los nuevos pods de ese espacio de nombres. Los Pods que ya tengas no se verán afectados.

Actualizar la ComputeClass predeterminada de un espacio de nombres

Para sobrescribir el valor predeterminado de ComputeClass de un espacio de nombres, ejecuta uno de los siguientes comandos:

  • Actualiza el valor predeterminado de ComputeClass para todos los pods del espacio de nombres:

    kubectl label namespaces NAMESPACE_NAME   \
        cloud.google.com/default-compute-class=COMPUTECLASS_NAME \
        --overwrite
    

    Haz los cambios siguientes:

    • NAMESPACE_NAME: el nombre del espacio de nombres que se va a actualizar.
    • COMPUTECLASS_NAME: nombre de la clase ComputeClass que se va a definir como nuevo valor predeterminado del espacio de nombres.
  • Sobrescribe el valor predeterminado de ComputeClass para los pods que no sean de tipo DaemonSet en el espacio de nombres:

    kubectl label namespaces NAMESPACE_NAME \
        cloud.google.com/default-compute-class-non-daemonset=COMPUTECLASS_NAME \
        --overwrite
    

Los cambios se aplicarán a los nuevos pods de ese espacio de nombres. Los pods que ya tengas no se verán afectados.

Configurar una ComputeClass predeterminada para un clúster

En esta sección se muestra cómo definir una ComputeClass como predeterminada para tu clúster. En el caso de las ComputeClasses predeterminadas a nivel de clúster, no especifiques manualmente las etiquetas de nodo y las etiquetas de nodo de los grupos de nodos del clúster. GKE no escala los grupos de nodos que tienen taints de nodos para ComputeClasses. Si añades manualmente una etiqueta para default ComputeClass, GKE puede escalar ese grupo de nodos. Sin embargo, no es necesario realizar esta configuración manual para usar un ComputeClass predeterminado a nivel de clúster.

  1. Para habilitar la configuración de una ComputeClass predeterminada a nivel de clúster, ejecuta el comando gcloud container clusters update con la marca --enable-default-compute-class:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-default-compute-class
    

    Haz los cambios siguientes:

    • CLUSTER_NAME: el nombre de tu clúster.
    • CONTROL_PLANE_LOCATION: la ubicación de tu plano de control del clúster, como us-central1.

    También puedes especificar esta marca al crear un clúster de Autopilot o estándar.

  2. Guarda el siguiente archivo de manifiesto, que define un ComputeClass llamado default:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: default
    spec:
      priorities:
      - machineFamily: n4
      - machineFamily: n2
      whenUnsatisfiable: ScaleUpAnyway
      nodePoolAutoCreation:
        enabled: true
    

    Este archivo de manifiesto de ejemplo solicita nodos que usen instancias N4. Si las instancias N4 no están disponibles, ComputeClass solicita instancias N2. Puedes configurar defaultComputeClass con cualquiera de los campos disponibles en ComputeClass CustomResourceDefinition.

  3. Aplica el manifiesto a tu clúster:

    kubectl apply -f PATH_TO_MANIFEST
    

    Sustituye PATH_TO_MANIFEST por la ruta al manifiesto de ComputeClass.

Después de definir una ComputeClass predeterminada a nivel de clúster, GKE escala los grupos de nodos que cumplen los dos requisitos siguientes:

  • La configuración del nodo es la misma que la de default ComputeClass.
  • El grupo de nodos no tiene taints ni etiquetas para una ComputeClass diferente. GKE puede escalar grupos de nodos que tengan un taint y una etiqueta para default ComputeClass.

Por ejemplo, si default ComputeClass especifica la serie de máquinas N4, GKE puede escalar un grupo de nodos que utilice instancias N4 y que no tenga taints ni etiquetas para otra ComputeClass.

Los cambios se aplican a todos los pods nuevos del clúster que aún no tengan un ComputeClass. Es posible que los pods se vean afectados en función de los ajustes de migración activos de la ComputeClass predeterminada a nivel de clúster. Para obtener más información, consulta Migración activa en ComputeClasses predeterminadas.

Verificar el comportamiento predeterminado de ComputeClass

Para comprobar si la ComputeClass predeterminada que has definido para un espacio de nombres o un clúster funciona correctamente, haz lo siguiente:

  1. Revisa el siguiente ejemplo de Deployment:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: helloweb
      labels:
        app: hello
    spec:
      selector:
        matchLabels:
          app: hello
          tier: web
      template:
        metadata:
          labels:
            app: hello
            tier: web
        spec:
          containers:
          - name: hello-app
            image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
            ports:
            - containerPort: 8080
            resources:
              requests:
                cpu: 200m

    Esta implementación no solicita explícitamente un ComputeClass.

  2. Crea el despliegue:

    kubectl apply --namespace=NAMESPACE_NAME \
        -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/refs/heads/main/quickstarts/hello-app/manifests/helloweb-deployment.yaml
    

    Sustituye NAMESPACE_NAME por una de las siguientes opciones, en función de lo que quieras verificar:

    • Nombre de un espacio de nombres que tiene un ComputeClass predeterminado.
    • El nombre de un espacio de nombres que no tiene un ComputeClass predeterminado.

    GKE puede tardar un tiempo en crear nodos para ejecutar los pods.

  3. Identifica los nodos que ejecutan los pods de la implementación de ejemplo:

    kubectl get pods --namespace=NAMESPACE_NAME \
        --selector=app=hello -o=wide
    

    El resultado debería ser similar al siguiente:

    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>
    
  4. Obtén las etiquetas del nodo:

    kubectl get node NODE_NAME --show-labels \
        | grep "cloud.google.com/compute-class"
    

    Sustituye NODE_NAME por el nombre del nodo de la salida del paso anterior.

    El resultado debería ser similar al siguiente:

    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=containerd
    

    El valor de COMPUTECLASS_NAME es uno de los siguientes:

    • ComputeClass predeterminada a nivel de clúster: default para los nodos que se han creado con Autopilot de GKE o con la creación automática de grupos de nodos. Es posible que los nodos de los grupos de nodos creados manualmente no tengan la etiqueta cloud.google.com/compute-class.
    • ComputeClass predeterminado a nivel de espacio de nombres: el nombre de ComputeClass que has configurado como predeterminado del espacio de nombres.

Inhabilitar 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 de espacio de nombres para todos los pods, quita la etiqueta cloud.google.com/default-compute-class del 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 elimina todas las etiquetas con esa clave del objeto Namespace en la API de Kubernetes.

  • Para inhabilitar el valor predeterminado de ComputeClass a nivel de espacio de nombres para los pods que no son DaemonSet, elimina la etiqueta cloud.google.com/default-compute-class-non-daemonset del espacio de nombres:

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-non-daemonset-
    
  • Para inhabilitar la ComputeClass predeterminada a nivel de clúster, usa el comando gcloud container clusters update con la marca --no-enable-default-compute-class:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --no-enable-default-compute-class
    

Siguientes pasos