Aplica clases de procesamiento a los Pods de forma predeterminada


En esta página, se muestra cómo aplicar clases de procesamiento de forma predeterminada a los Pods de Google Kubernetes Engine (GKE) que no seleccionan una clase de procesamiento de forma explícita. En esta página, se incluyen instrucciones para establecer una clase de procesamiento como la predeterminada en un espacio de nombres y para todo un clúster. Estas instrucciones están dirigidas a los administradores de clústeres que desean reducir la sobrecarga manual causada por la configuración individual de nodos y cargas de trabajo.

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

Acerca de las clases de procesamiento predeterminadas

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

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

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 quieres 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.

Requisitos

  • Para establecer una clase de procesamiento como predeterminada a nivel del clúster, este debe ejecutar la versión 1.33.1-gke.1744000 de GKE o una posterior.
  • Para establecer una clase de procesamiento como predeterminada a nivel del espacio de nombres solo para los Pods que no son de 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 clases de procesamiento 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 proyecto de Google Cloud :

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 clases de procesamiento 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 clases de procesamiento 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 clase de procesamiento predeterminada a nivel del clúster: container.clusters.update

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

Configura una clase de procesamiento predeterminada para un espacio de nombres

Puedes anotar cualquier espacio de nombres de Kubernetes en tu clúster con el nombre de una clase de procesamiento para usarla como predeterminada. Si un Pod implementado en ese espacio de nombres aún no selecciona una clase de procesamiento, GKE modifica la especificación del Pod para seleccionar la clase predeterminada en el espacio de nombres. Puedes establecer cualquier clase de procesamiento personalizada o integrada como la predeterminada.

  • Para aplicar una clase de procesamiento a todos los Pods de un espacio de nombres de forma predeterminada, agrega 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
    

    Reemplaza lo siguiente:

    • NAMESPACE_NAME: Es el nombre del espacio de nombres que se actualizará.
    • COMPUTECLASS_NAME: Es el nombre de la clase de procesamiento 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 clase de procesamiento predeterminada:

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

    Para resolver este error, actualiza la clase de procesamiento predeterminada para el espacio de nombres.

  • Para aplicar una clase de procesamiento a todos los Pods que no son de DaemonSet en un espacio de nombres de forma predeterminada, agrega 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 con el siguiente mensaje de error, el espacio de nombres ya tiene una clase de procesamiento predeterminada para los Pods que no son de DaemonSet:

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

    Para resolver este error, actualiza la clase de procesamiento predeterminada para el espacio de nombres.

Actualiza la clase de procesamiento predeterminada existente en un espacio de nombres

Para anular la clase de procesamiento predeterminada existente para un espacio de nombres, ejecuta uno de los siguientes comandos:

  • Actualiza la clase de procesamiento predeterminada para todos los Pods en el espacio de nombres:

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

    Reemplaza lo siguiente:

    • NAMESPACE_NAME: Es el nombre del espacio de nombres que se actualizará.
    • COMPUTECLASS_NAME: Es el nombre de la clase de procesamiento que se establecerá como la nueva predeterminada para el espacio de nombres.
  • Anula la clase de procesamiento predeterminada para los Pods que no son de DaemonSet en el espacio de nombres:

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

Configura una clase de procesamiento predeterminada para un clúster

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

  1. Para habilitar la configuración de una clase de procesamiento predeterminada a nivel del 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
    

    Reemplaza lo siguiente:

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

    También puedes especificar esta marca cuando creas un clúster de Autopilot o Standard.

  2. Guarda el siguiente 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
    

    En este manifiesto de ejemplo, se solicitan nodos que usan instancias N4. Si las instancias de N4 no están disponibles, la clase de procesamiento solicita instancias de N2. Puedes configurar la clase de procesamiento default con cualquiera de los campos disponibles en la CustomResourceDefinition de ComputeClass.

  3. Aplica el manifiesto al clúster:

    kubectl apply -f PATH_TO_MANIFEST
    

    Reemplaza PATH_TO_MANIFEST por la ruta de acceso al manifiesto de la clase de procesamiento.

Después de que establezcas una clase de procesamiento predeterminada a nivel del clúster, GKE ajustará la escala de los grupos de nodos que cumplan con los siguientes requisitos:

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

Por ejemplo, si la clase de procesamiento default especifica la serie de máquinas N4, GKE puede ajustar la escala de un grupo de nodos existente que use instancias N4 y no tenga marcas o etiquetas para una clase de procesamiento diferente.

Verifica el comportamiento predeterminado de la clase de procesamiento

Para verificar si la clase de procesamiento predeterminada que estableciste para un espacio de nombres o un clúster funciona según lo esperado, 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 procesamiento.

  2. 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.yaml
    

    Reemplaza NAMESPACE_NAME por uno de los siguientes valores, según lo que quieras verificar:

    • Es el nombre de un espacio de nombres que tiene una clase de procesamiento predeterminada.
    • Es el nombre de un espacio de nombres que no tiene una clase de procesamiento predeterminada.

    Es posible que GKE tarde en crear nodos nuevos para ejecutar los Pods.

  3. Identifica los nodos que ejecutan los Pods de la Deployment de ejemplo:

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

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

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

    Reemplaza NODE_NAME por 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=containerd
    

    El valor en COMPUTECLASS_NAME es uno de los siguientes:

    • Clase de procesamiento predeterminada a nivel del clúster: default para los nodos que creó GKE Autopilot o el aprovisionamiento automático de nodos. Es posible que los nodos de los grupos de nodos existentes creados de forma manual no tengan la etiqueta cloud.google.com/compute-class.
    • Clase de procesamiento predeterminada a nivel del espacio de nombres: Es el nombre de la clase de procesamiento que configuraste como predeterminada para el espacio de nombres.

Inhabilita la clase de procesamiento predeterminada

Para inhabilitar la clase de procesamiento predeterminada en un espacio de nombres o un clúster, haz una de las siguientes acciones:

  • Para inhabilitar la clase de procesamiento predeterminada a nivel del 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 quita todas las etiquetas con esa clave del objeto Namespace en la API de Kubernetes.

  • Para inhabilitar la clase de procesamiento predeterminada a nivel del espacio de nombres para los Pods que no son de DaemonSet, quita 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 procesamiento predeterminada a nivel del 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
    

¿Qué sigue?