Aplicar clases de computación a los pods de forma predeterminada


En esta página se explica cómo aplicar clases de computación de forma predeterminada a los pods de Google Kubernetes Engine (GKE) que no seleccionan explícitamente una clase de computación. En esta página se explica cómo definir una clase de computación como predeterminada en un espacio de nombres y en todo un clúster. Estas instrucciones están dirigidas a administradores de clústeres que quieran reducir la sobrecarga manual causada por la configuración de nodos y cargas de trabajo individuales.

Antes de leer esta página, familiarízate con las clases de computación personalizadas.

Acerca de las clases de cálculo predeterminadas

Puedes configurar clústeres de GKE o espacios de nombres específicos para que tengan una clase de computación predeterminada. La clase predeterminada que configures se aplicará a cualquier pod de ese clúster o espacio de nombres que no seleccione otra clase de computación. Cuando implementas un pod que no selecciona una clase de computación, GKE aplica las clases de computación predeterminadas en el siguiente orden:

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

Antes de empezar

Antes de empezar, asegúrate de haber 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 gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.

Requisitos

  • Para definir una clase de computación 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 clase de computación 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 clases de Compute 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 proyecto Google Cloud :

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

Estos roles predefinidos contienen los permisos necesarios para configurar clases de cálculo 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 clases de cálculo 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 clase de cálculo predeterminada a nivel de clúster: container.clusters.update

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

Configurar una clase de computación predeterminada para un espacio de nombres

Puede anotar cualquier espacio de nombres de Kubernetes de su clúster con el nombre de una clase de cálculo para usarla como predeterminada. Si un pod implementado en ese espacio de nombres aún no ha seleccionado una clase de computación, GKE modifica la especificación del pod para seleccionar la clase predeterminada del espacio de nombres. Puedes definir cualquier clase de cálculo personalizada o integrada como predeterminada.

  • Para aplicar una clase de computación 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: el nombre de la clase de cálculo que se va a definir como predeterminada para el espacio de nombres.

    Si el comando falla y muestra el siguiente mensaje de error, significa que el espacio de nombres ya tiene una clase de cálculo predeterminada:

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

    Para solucionar este error, actualice la clase de computación predeterminada del espacio de nombres.

  • Para aplicar una clase de computación a todos los pods que no sean 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 una clase de cálculo predeterminada 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 la clase de computación predeterminada del espacio de nombres.

Actualizar la clase de cálculo predeterminada de un espacio de nombres

Para sobrescribir la clase de cálculo predeterminada de un espacio de nombres, ejecuta uno de los siguientes comandos:

  • Actualiza la clase de computación predeterminada de 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: el nombre de la clase de cálculo que se va a definir como nuevo valor predeterminado del espacio de nombres.
  • Sobrescribe la clase de computación predeterminada de los pods que no son DaemonSet en el espacio de nombres:

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

Configurar una clase de computación predeterminada para un clúster

En esta sección se muestra cómo definir una clase de cálculo como predeterminada para tu clúster. En el caso de las clases de computación predeterminadas a nivel de clúster, no especifiques manualmente las taints ni las etiquetas de los nodos de los grupos de nodos del clúster. GKE no escala los grupos de nodos que tienen taints de nodos para clases de cálculo. Si añades manualmente una etiqueta para la clase de computación default, GKE puede escalar ese grupo de nodos. Sin embargo, esta configuración manual no es necesaria para usar una clase de cálculo predeterminada a nivel de clúster.

  1. Para habilitar la configuración de una clase de computación 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, la clase de computación solicita instancias N2. Puedes configurar la clase de cálculo default con cualquiera de los campos disponibles en la CustomResourceDefinition de ComputeClass.

  3. Aplica el manifiesto a tu clúster:

    kubectl apply -f PATH_TO_MANIFEST
    

    Sustituye PATH_TO_MANIFEST por la ruta al manifiesto de la clase de cálculo.

Después de definir una clase de cálculo 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 la clase de computación default.
  • El grupo de nodos no tiene marcas ni etiquetas para una clase de computación diferente. GKE puede escalar grupos de nodos que tengan un taint y una etiqueta para la clase de computación default.

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

Verificar el comportamiento predeterminado de la clase de cálculo

Para comprobar si la clase de computación 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 una clase de computación.

  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 una clase de computación predeterminada.
    • El nombre de un espacio de nombres que no tiene una clase de cálculo predeterminada.

    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:

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

Inhabilitar la clase de computación predeterminada

Para inhabilitar la clase de cálculo predeterminada en un espacio de nombres o un clúster, haga lo siguiente:

  • Para inhabilitar la clase de cálculo 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 la clase de cálculo predeterminada 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 clase de Compute 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