Aplicar classes de computação aos pods por predefinição


Esta página mostra-lhe como aplicar classes de computação por predefinição aos pods do Google Kubernetes Engine (GKE) que não selecionam explicitamente uma classe de computação. Esta página tem instruções para definir uma classe de computação como predefinição num espaço de nomes e para um cluster inteiro. Estas instruções destinam-se a administradores de clusters que pretendam reduzir a sobrecarga manual causada pela configuração individual da carga de trabalho e do nó.

Antes de ler esta página, familiarize-se com as classes de computação personalizadas.

Acerca das classes de computação predefinidas

Pode configurar clusters do GKE ou namespaces específicos para terem uma classe de computação predefinida. A classe predefinida que configurar aplica-se a qualquer Pod nesse cluster ou espaço de nomes que não selecione uma classe de computação diferente. Quando implementa um Pod que não seleciona uma classe de computação, o GKE aplica as classes de computação predefinidas pela seguinte ordem:

  1. Se o espaço de nomes tiver uma classe de computação predefinida, o GKE modifica a especificação do pod para selecionar essa classe de computação.
  2. Se o espaço de nomes não tiver uma classe de computação predefinida, aplica-se a classe predefinida ao nível do cluster. O GKE não modifica a especificação do pod.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Requisitos

  • Para definir uma classe de computação como predefinição ao nível do cluster, o cluster tem de executar a versão 1.33.1-gke.1744000 ou posterior do GKE.
  • Para definir uma classe de computação como predefinição ao nível do espaço de nomes apenas para pods não DaemonSet, o cluster tem de executar a versão 1.33.1-gke.1788000 ou posterior do GKE.

Funções e autorizações necessárias

Para receber as autorizações de que precisa para configurar classes de computação predefinidas ao nível do cluster ou do espaço de nomes, peça ao seu administrador para lhe conceder as seguintes funções da IAM no Google Cloud projeto:

Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

Estas funções predefinidas contêm as autorizações necessárias para configurar classes de computação predefinidas ao nível do cluster ou do espaço de nomes. Para ver as autorizações exatas que são necessárias, expanda a secção Autorizações necessárias:

Autorizações necessárias

São necessárias as seguintes autorizações para configurar classes de computação predefinidas ao nível do cluster ou do espaço de nomes:

  • 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
  • Adicione etiquetas a espaços de nomes: container.namespaces.update
  • Ative a classe de computação predefinida ao nível do cluster: container.clusters.update

Também pode conseguir estas autorizações com funções personalizadas ou outras funções predefinidas.

Configure uma classe de computação predefinida para um espaço de nomes

Pode anotar qualquer espaço de nomes do Kubernetes no seu cluster com o nome de uma classe de computação a usar como predefinição. Se um pod implementado nesse espaço de nomes ainda não selecionar uma classe de computação, o GKE modifica a especificação do pod para selecionar a classe predefinida no espaço de nomes. Pode predefinir qualquer classe de computação personalizada ou integrada.

  • Para aplicar uma classe de computação a todos os pods num espaço de nomes por predefinição, adicione a etiqueta cloud.google.com/default-compute-class a esse espaço de nomes:

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

    Substitua o seguinte:

    • NAMESPACE_NAME: o nome do espaço de nomes a atualizar.
    • COMPUTECLASS_NAME: o nome da classe de computação a definir como predefinição para o espaço de nomes.

    Se o comando falhar com a seguinte mensagem de erro, o espaço de nomes já tem uma classe de computação predefinida:

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

    Para resolver este erro, atualize a classe de computação predefinida para o espaço de nomes.

  • Para aplicar uma classe de computação a todos os pods não DaemonSet num espaço de nomes por predefinição, adicione a etiqueta cloud.google.com/default-compute-class-non-daemonset a esse espaço de nomes:

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

    Se o comando falhar com a seguinte mensagem de erro, o espaço de nomes já tem uma classe de computação predefinida para pods que não sejam DaemonSet:

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

    Para resolver este erro, atualize a classe de computação predefinida para o espaço de nomes.

Atualize a classe de computação predefinida existente num espaço de nomes

Para substituir a classe de computação predefinida existente de um espaço de nomes, execute um dos seguintes comandos:

  • Atualize a classe de computação predefinida para todos os pods no espaço de nomes:

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

    Substitua o seguinte:

    • NAMESPACE_NAME: o nome do espaço de nomes a atualizar.
    • COMPUTECLASS_NAME: o nome da classe de computação a definir como a nova predefinição para o espaço de nomes.
  • Substitua a classe de computação predefinida para pods que não sejam DaemonSet no espaço de nomes:

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

Configure uma classe de computação predefinida para um cluster

Esta secção mostra como definir uma classe de computação como predefinição para o seu cluster. Para as classes de computação predefinidas ao nível do cluster, não especifique manualmente as contaminações de nós nem as etiquetas de nós para os node pools existentes no cluster. O GKE não dimensiona pools de nós que tenham taints de nós para classes de computação. Se adicionar manualmente uma etiqueta para a classe de computação default, o GKE pode dimensionar esse conjunto de nós. No entanto, esta configuração manual não é necessária para usar uma classe de computação predefinida ao nível do cluster.

  1. Para ativar a definição de uma classe de computação predefinida ao nível do cluster para um cluster, execute o comando gcloud container clusters update com a flag --enable-default-compute-class:

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

    Substitua o seguinte:

    • CLUSTER_NAME: o nome do cluster.
    • CONTROL_PLANE_LOCATION: a localização do seu plano de controlo do cluster, como us-central1.

    Também pode especificar esta flag quando cria um cluster do Autopilot ou Standard.

  2. Guarde o seguinte manifesto, que define um ComputeClass com o nome default:

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

    Este manifesto de exemplo pede nós que usam instâncias N4. Se as instâncias N4 não estiverem disponíveis, a classe de computação pede instâncias N2. Pode configurar a classe de computação com qualquer um dos campos disponíveis na ComputeClass CustomResourceDefinition.default

  3. Aplique o manifesto ao cluster:

    kubectl apply -f PATH_TO_MANIFEST
    

    Substitua PATH_TO_MANIFEST pelo caminho para o manifesto da classe de computação.

Depois de definir uma classe de computação predefinida ao nível do cluster, o GKE dimensiona os conjuntos de nós que cumprem os seguintes requisitos:

  • A configuração do nó é igual à configuração da defaultclasse de computação.
  • O conjunto de nós não tem restrições nem etiquetas para uma classe de computação diferente. O GKE pode dimensionar pools de nós que tenham uma restrição e uma etiqueta para a classe de computação default.

Por exemplo, se a classe de computação default especificar a série de máquinas N4, o GKE pode dimensionar um conjunto de nós existente que use instâncias N4 e não tenha restrições ou etiquetas para uma classe de computação diferente.

Valide o comportamento predefinido da classe de computação

Para verificar se a classe de computação predefinida que definiu para um espaço de nomes ou para um cluster funciona como esperado, faça o seguinte:

  1. Reveja o exemplo de implementação seguinte:

    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 implementação não pede explicitamente uma classe de computação.

  2. Crie a implementação:

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

    Substitua NAMESPACE_NAME por uma das seguintes opções, consoante o que quer validar:

    • O nome de um espaço de nomes que tem uma classe de computação predefinida.
    • O nome de um espaço de nomes que não tem uma classe de computação predefinida.

    O GKE pode demorar algum tempo a criar novos nós para executar os pods.

  3. Identifique os nós que executam os pods da implementação de exemplo:

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

    O resultado é semelhante ao seguinte:

    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. Obtenha as etiquetas dos nós:

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

    Substitua NODE_NAME pelo nome do nó da saída do passo anterior.

    O resultado é semelhante ao seguinte:

    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
    

    O valor em COMPUTECLASS_NAME é um dos seguintes:

    • Classe de computação predefinida ao nível do cluster: default para nós criados pelo GKE Autopilot ou pelo aprovisionamento automático de nós. Os nós em conjuntos de nós criados manualmente existentes podem não ter a etiqueta cloud.google.com/compute-class.
    • Classe de computação predefinida ao nível do espaço de nomes: o nome da classe de computação que configurou como predefinição do espaço de nomes.

Desative a classe de computação predefinida

Para desativar a classe de computação predefinida num espaço de nomes ou num cluster, faça o seguinte:

  • Para desativar a classe de computação predefinida ao nível do espaço de nomes para todos os pods, remova a etiqueta cloud.google.com/default-compute-class do espaço de nomes:

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

    O caráter - no final da chave da etiqueta remove todas as etiquetas com essa chave do objeto Namespace na API Kubernetes.

  • Para desativar a classe de computação predefinida ao nível do espaço de nomes para Pods que não sejam DaemonSet, remova a etiqueta cloud.google.com/default-compute-class-non-daemonset do espaço de nomes:

    kubectl label namespaces NAMESPACE_NAME \
      cloud.google.com/default-compute-class-non-daemonset-
    
  • Para desativar a classe de computação predefinida ao nível do cluster, use o comando gcloud container clusters update com a flag --no-enable-default-compute-class:

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

O que se segue?