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.
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
-
Crie um arquivo chamado
resource-policy.yamlcom o conteúdo a seguir. O exemplo abaixo define uma política para pods com o rótuloapp: stress. Ela tenta primeirogeneral-purpose+best-efforte, em seguida, recorre ageneral-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 -
Aplique o ResourcePolicy no cluster.
kubectl apply -f resource-policy.yaml -
Crie uma carga de trabalho. Defina os rótulos do pod para corresponder ao
selectorno ResourcePolicy. O exemplo a seguir usa um Job. O modelo de pod contémapp: 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.
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 |
|
|
|
Pods com todos os rótulos listados seguem este ResourcePolicy. |
|
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 |
|
|
string |
Tipo de recurso. Obrigatório. |
|
|
|
|
Filtra nós virtuais por rótulo, como zona. Consulte agendamento por afinidade de nó. |
|
|
|
string |
Classe de computação para o pod. |
|
|
|
string |
Nível de QoS de computação para o pod. |
|
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.
-
Crie o arquivo
resource-policy.yamlcom 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 -
Aplique o ResourcePolicy.
kubectl apply -f resource-policy.yaml -
Crie o arquivo
stress-dep.yamlpara 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 -
Implante a aplicação.
kubectl apply -f stress-dep.yaml -
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-qosSaí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 -
Atualize o arquivo
resource-policy.yamlpara adicionar uma unidade de fallback. A política atualizada tentageneral-purpose+best-effortprimeiro e, em seguida, recorre aperformance+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 -
Aplique o ResourcePolicy atualizado. A alteração entra em vigor para pods criados posteriormente.
kubectl apply -f resource-policy.yaml -
Dimensione o Deployment para duas réplicas.
kubectl scale deployment stress --replicas=2 -
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-qosSaí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-effortA nova réplica usa
general-purpose+best-effort, confirmando que a política atualizada foi aplicada ao pod recém-criado.
Próximos passos
Agendamento Prioritário Personalizado de Recursos Elásticos — referência completa dos campos do ResourcePolicy
Agendamento por afinidade de nó — rótulos compatíveis com
nodeSelectorClasses de computação — classes de computação disponíveis para agendamento prioritário personalizado