Todos os produtos
Search
Central de documentação

Container Compute Service:Custom resource priority scheduling

Última atualização: Jun 29, 2026

O ACS fornece recursos por meio de nós virtuais, o que torna a disponibilidade de instâncias dinâmica. Quando uma classe de computação ou nível de QoS específico está indisponível, os pods permanecem no estado Pending, a menos que exista uma estratégia de fallback. O agendamento prioritário personalizado permite definir uma lista ordenada de combinações de classes de computação e QoS. O agendador tenta cada opção em sequência até obter sucesso e usa a mesma ordem — invertida — para determinar quais pods remover primeiro durante o scale-in.

Pré-requisitos

Antes de começar, verifique se você tem:

  • kube-scheduler instalado em uma versão que atenda aos seguintes requisitos:

    Versão do cluster ACS

    Versão mínima do agendador

    1.31

    v1.31.0-aliyun-1.2.0

    1.30

    v1.30.3-aliyun-1.1.1

    1.28

    v1.28.9-aliyun-1.1.0

  • acs-virtual-node instalado na versão v2.12.0-acs.4 ou posterior

Como funciona

Um ResourcePolicy é um recurso personalizado (CRD) que atua como intermediário entre o cluster e as cargas de trabalho individuais. Ele seleciona um grupo de pods por rótulo e define uma lista ordenada de propriedades de recursos. Quando um pod correspondente ao seletor precisa ser agendado, o agendador tenta cada entrada da lista em ordem. Se o inventário de uma entrada for insuficiente, ele passa para a próxima. Caso todas as entradas estejam indisponíveis, o pod permanece no estado Pending e o agendador tenta continuamente até que os recursos fiquem disponíveis.

As alterações no ResourcePolicy afetam apenas os pods criados após a atualização. Pods em execução não são reagendados.

Ordem de scale-in

O ACS utiliza o recurso de custo de exclusão de pod do Kubernetes para controlar a ordem de scale-in. Teoricamente, um pod com o menor custo de exclusão é removido primeiro durante o scale-in. No entanto, o algoritmo de scale-in considera vários fatores que dependem da implementação do controlador de pods.

O ACS define automaticamente controller.kubernetes.io/pod-deletion-cost com base na prioridade de agendamento de cada pod. Se seus pods já possuírem essa anotação, o ACS substituirá seu valor.

Classes de computação compatíveis

Para consultar as classes de computação compatíveis com o agendamento prioritário personalizado, consulte Classes de computação.

Aviso

Não utilize alibabacloud.com/compute-class ou alibabacloud.com/compute-qos no campo spec.selector.matchLabels de uma carga de trabalho (como um Deployment). O ACS pode modificar esses rótulos durante o agendamento, fazendo com que o controlador recrie pods repetidamente e desestabilize a aplicação.

Crie um ResourcePolicy

  1. Crie um arquivo chamado resource-policy.yaml com o conteúdo a seguir. O exemplo abaixo define uma política para pods com o rótulo app: stress. Ela tenta primeiro general-purpose + best-effort e, em seguida, recorre a general-purpose + default.

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: rp-demo
      namespace: default
    spec:
      selector:
        app: stress        # Applies to pods with this label
      units:
      - resource: acs      # First choice: general-purpose, best-effort
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: best-effort
      - resource: acs      # Fallback: general-purpose, default
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: default
  2. Aplique o ResourcePolicy no cluster.

    kubectl apply -f resource-policy.yaml
  3. Crie uma carga de trabalho. Defina os rótulos do pod para corresponder ao selector no ResourcePolicy. O exemplo a seguir usa um Job. O modelo de pod contém app: stress, o que o associa à política definida acima.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: demo-job
      namespace: default
    spec:
      parallelism: 3
      template:
        metadata:
          labels:
            app: stress    # Must match spec.selector in the ResourcePolicy
        spec:
          containers:
          - name: demo-job
            image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            args:
              - 'infinity'
            command:
              - sleep
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
              limits:
                cpu: "1"
                memory: "1Gi"
          restartPolicy: Never
      backoffLimit: 4

Configuração avançada

O YAML anotado a seguir mostra a estrutura completa de um ResourcePolicy para clusters ACS.

Nota

Esta página aborda configurações comuns do ACS. Para obter a referência completa dos campos do ResourcePolicy, consulte Agendamento Prioritário Personalizado de Recursos Elásticos.

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
  name: rp-demo
  namespace: default
spec:
  # Selector: identifies which pods follow this policy
  selector:
    app: stress

  # Units: ordered list of resource options
  units:
  - resource: acs        # Must be set to "acs"
    podLabels:
      alibabacloud.com/compute-class: general-purpose
      alibabacloud.com/compute-qos: best-effort
    nodeSelector:        # Optional: restrict to a specific zone
      topology.kubernetes.io/zone: cn-hangzhou-i
  - resource: acs
    podLabels:
      alibabacloud.com/compute-class: general-purpose
      alibabacloud.com/compute-qos: default
  # Fields not listed here apply to non-ACS clusters and can be ignored.

Configuração da aplicação

Campo

Tipo

Descrição

Exemplo

selector

map[string]string

Pods com todos os rótulos listados seguem este ResourcePolicy.

app: stress

Configuração de recursos

Cada entrada em units descreve uma opção de recurso. O agendador tenta as entradas em ordem.

Campo

Tipo

Descrição

Valores permitidos

resource

string

Tipo de recurso. Obrigatório.

acs

nodeSelector

map[string]string

Filtra nós virtuais por rótulo, como zona. Consulte agendamento por afinidade de nó.

topology.kubernetes.io/zone: cn-hangzhou-i

podLabels[alibabacloud.com/compute-class]

string

Classe de computação para o pod.

general-purpose (padrão), performance

podLabels[alibabacloud.com/compute-qos]

string

Nível de QoS de computação para o pod.

default (padrão), best-effort

Exemplo: fallback de prioridade com scale-out

Este exemplo demonstra como usar um ResourcePolicy para solicitar recursos performance + default primeiro, recorrendo a general-purpose + best-effort conforme a capacidade escala horizontalmente.

  1. Crie o arquivo resource-policy.yaml com uma política inicial de unidade única.

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: stress-demo
      namespace: default
    spec:
      selector:
        app: stress
      units:
      - resource: acs
        podLabels:
          alibabacloud.com/compute-class: performance
          alibabacloud.com/compute-qos: default
  2. Aplique o ResourcePolicy.

    kubectl apply -f resource-policy.yaml
  3. Crie o arquivo stress-dep.yaml para o Deployment.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stress
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: stress
      template:
        metadata:
          labels:
            app: stress    # Keep this consistent with the ResourcePolicy selector
        spec:
          containers:
          - name: stress
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
            resources:
              limits:
                cpu: '1'
                memory: 1Gi
              requests:
                cpu: '1'
                memory: 1Gi
  4. Implante a aplicação.

    kubectl apply -f stress-dep.yaml
  5. Verifique se o pod está em execução com a classe de computação e o QoS esperados.

    kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos

    Saída esperada:

    # Actual output depends on resource availability.
    NAME               READY   STATUS    RESTARTS   AGE   COMPUTE-CLASS   COMPUTE-QOS
    stress-xxxxxxxx1   1/1     Running   0          53s   performance     default
  6. Atualize o arquivo resource-policy.yaml para adicionar uma unidade de fallback. A política atualizada tenta general-purpose + best-effort primeiro e, em seguida, recorre a performance + default.

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: stress-demo
      namespace: default
    spec:
      selector:
        app: stress
      units:
      - resource: acs
        podLabels:
          alibabacloud.com/compute-class: general-purpose
          alibabacloud.com/compute-qos: best-effort
      - resource: acs
        podLabels:
          alibabacloud.com/compute-class: performance
          alibabacloud.com/compute-qos: default
  7. Aplique o ResourcePolicy atualizado. A alteração entra em vigor para pods criados posteriormente.

    kubectl apply -f resource-policy.yaml
  8. Dimensione o Deployment para duas réplicas.

    kubectl scale deployment stress --replicas=2
  9. Verifique se ambos os pods estão em execução e se a nova réplica utilizou os recursos de primeira escolha.

    kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos

    Saída esperada:

    # Actual output depends on resource availability.
    NAME                     READY   STATUS    RESTARTS   AGE     COMPUTE-CLASS     COMPUTE-QOS
    stress-xxxxxxxx1         1/1     Running   0          2m14s   performance       default
    stress-xxxxxxxx2         1/1     Running   0          33s     general-purpose   best-effort

    A nova réplica usa general-purpose + best-effort, confirmando que a política atualizada foi aplicada ao pod recém-criado.

Próximos passos