Excesso de assinaturas de recursos dinâmicos
Muitos serviços apresentam picos de tráfego. Para garantir o desempenho e a estabilidade, os recursos são frequentemente solicitados no máximo necessário. No entanto, os surtos podem diminuir muito em breve e os recursos, se não forem liberados, são desperdiçados em horas fora do horário de pico. Especialmente para trabalhos on-line que solicitam uma grande quantidade de recursos para garantir SLA, a utilização de recursos pode ser tão baixa quanto possível.
Excesso de assinaturas de recursos é o processo de fazer uso de recursos solicitados ociosos. Os recursos com excesso de assinatura são adequados para a implementação de tarefas off-line, que se concentram na taxa de transferência, mas têm baixos requisitos de SLA e podem tolerar certas falhas.
A implementação híbrida de tarefas on-line e off-line em um cluster pode utilizar melhor os recursos do cluster.
![Clique para ampliar](https://support.huaweicloud.com/intl/pt-br/usermanual-cce/pt-br_image_0000001378942548.png)
Recursos
![](https://support.huaweicloud.com/intl/pt-br/usermanual-cce/public_sys-resources/note_3.0-pt-br.png)
Depois que o excesso de assinaturas de recursos dinâmicos e o dimensionamento elástico são habilitados em um pool de nós, os recursos com excesso de assinaturas mudam rapidamente porque o uso de recursos de aplicações de alta prioridade muda em tempo real. Para evitar reduções e expansões frequentes do nó, não considere recursos com excesso de assinatura ao avaliar as reduções do nó.
A implementação híbrida é suportada e os recursos da CPU e da memória podem ser excedidos. As principais características são as seguintes:
- Tarefas off-line são executadas preferencialmente em nós com excesso de assinatura.
Se ambos os nós com excesso de assinatura e sem excesso de assinatura existirem, o primeiro terá uma pontuação maior do que o último e as tarefas off-line são preferencialmente programadas para nós com excesso de assinatura.
- As tarefas on-line podem usar somente recursos não de excesso de assinatura se programadas para um nó com assinatura em excesso.
As tarefas off-line podem usar recursos com e sem assinatura em excesso de um nó com assinatura em excesso.
- No mesmo período de agendamento, as tarefas on-line têm precedência sobre as tarefas off-line.
Se houver tarefas on-line e off-line, as tarefas on-line serão agendadas primeiro. Quando o uso de recursos do nó exceder o limite superior e as solicitações do nó excederem 100%, as tarefas off-line serão despejadas.
- O isolamento da CPU/memória é fornecido pelos kernels.
Isolamento da CPU: as tarefas on-line podem rapidamente antecipar os recursos da CPU de tarefas off-line e suprimir o uso da CPU das tarefas off-line.
Isolamento da memória: quando os recursos de memória do sistema são usados e o OOM Kill é acionado, o kernel despeja as tarefas off-line primeiro.
- Regras de admissão das tarefas off-line do kubelet:
Depois que o pod for programado para um nó, o kubelet iniciará o pod somente quando os recursos do nó puderem atender à solicitação do pod (predicateAdmitHandler.Admit). O kubelet iniciará o pod quando ambas as condições a seguir forem atendidas:
- A solicitação total de pods a serem iniciados e tarefas em execução on-line < nós alocáveis
- A solicitação total de pods a serem iniciados e tarefas on-line/off-line em execução < nós alocáveis + nós com excesso de assinatura
- Excesso de assinatura de recursos e implementação híbrida:
Se apenas a implementação híbrida for usada, configure o rótulo volcano.sh/colocation=true para o nó e exclua o rótulo do nó volcano.sh/oversubscription ou defina seu valor como false.
Se o rótulo volcano.sh/colocation=true estiver configurado para um nó, a implementação híbrida será ativada. Se o rótulo volcano.sh/oversubscription=true estiver configurado, o excesso de assinatura de recursos será ativado. A tabela a seguir lista as combinações de recursos disponíveis após a implementação híbrida ou excesso de assinatura de recursos estar ativado.Implementação híbrida ativada (volcano.sh/colocation=true)
Excesso de assinatura de recurso ativado (volcano.sh/oversubscription=true)
Usar recursos de excesso de assinatura
Condições para despejar pods off-line
Não
Não
Não
Nenhuma
Sim
Não
Não
O uso de recursos do nó excede o limite alto.
Não
Sim
Sim
O uso de recursos do nó excede o limite alto e a solicitação do nó excede 100%.
Sim
Sim
Sim
O uso de recursos do nó excede o limite alto.
Excesso de assinatura de kubelet
![](https://support.huaweicloud.com/intl/pt-br/usermanual-cce/public_sys-resources/notice_3.0-pt-br.png)
- Versão do cluster
- v1.19: v1.19.16-r4 ou mais recente
- v1.21: v1.21.7-r0 ou mais recente
- v1.23: v1.23.5-r0 ou mais recente
- v1.25 ou mais recente
- Tipo do cluster: CCE ou CCE Turbo
- Sistema operacional do nó: EulerOS 2.9 (kernel-4.18.0-147.5.1.6.h729.6.eulerosv2r9.x86_64) ou Huawei Cloud EulerOS 2.0
- Tipo do nó: ECS
- A versão do complemento volcano: 1.7.0 ou mais recente
- Antes de ativar excesso de assinaturas, certifique-se de que o complemento overcommit não está ativado no volcano.
- Modificar o rótulo de um nó com excesso de assinatura não afeta os pods em execução.
- Os pods em execução não podem ser convertidos entre serviços on-line e off-line. Para converter serviços, você precisa reconstruir pods.
- Se o rótulo volcano.sh/oversubscription=true estiver configurado para um nó no cluster, a configuração de oversubscription deverá ser adicionada ao complemento volcano. Caso contrário, o agendamento de nós com excesso de demanda será anormal. Assegure-se de que você tenha configurado corretamente as etiquetas porque o agendador não verifica o complemento e as configurações do nó. Para obter detalhes sobre os rótulos, consulte Tabela 1.
- Para desativar o excesso de assinatura, execute as seguintes operações:
- Remova o rótulo volcano.sh/oversubscription do nó com excesso de assinatura.
- Defina over-subscription-resource como false.
- Modifique o configmap do volcano scheduler chamado volcano-scheduler-configmap e remova o complemento de excesso de assinatura.
- Se cpu-manager-policy estiver definida para a vinculação de núcleo estática em um nó, não atribua a classe de QoS Guaranteed aos pods off-line. Se a vinculação do núcleo for necessária, altere os pods para pods on-line. Caso contrário, os pods off-line podem ocupar as CPUs dos pods on-line, causando falhas de inicialização dos pods on-line e os pods off-line não podem ser iniciados, embora tenham sido programados com êxito.
- Se cpu-manager-policy estiver definida como vinculação de núcleo estática em um nó, não vincule núcleos a todos os pods on-line. Caso contrário, os pods on-line ocupam todos os recursos de CPU ou memória, deixando um pequeno número de recursos com excesso de assinatura.
Se o rótulo volcano.sh/oversubscription=true estiver configurado para um nó no cluster, a configuração de oversubscription deverá ser adicionada ao complemento volcano. Caso contrário, o agendamento de nós com excesso de demanda será anormal. Para obter detalhes sobre a configuração relacionada, consulte Tabela 1.
- Configure o complemento volcano.
- Use o kubectl para se conectar ao cluster.
- Instale o complemento volcano e adicione o complemento de excesso de assinatura para volcano-scheduler-configmap. Certifique-se de que a configuração do complemento não contém o complemento overcommit. Se - name: overcommit existir, exclua esta configuração. Além disso, defina enablePreemptable e enableJobStarving do complementogang como false e configure uma ação de preempção.
# kubectl edit cm volcano-scheduler-configmap -n kube-system apiVersion: v1 data: volcano-scheduler.conf: | actions: "enqueue, allocate, preempt" # Configure a preemption action. tiers: - plugins: - name: gang enablePreemptable: false enableJobStarving: false - name: priority - name: conformance - name: oversubscription - plugins: - name: drf - name: predicates - name: nodeorder - name: binpack - plugins: - name: cce-gpu-topology-predicate - name: cce-gpu-topology-priority - name: cce-gpu
- Ative o recurso de excesso de assinatura do nó.
Um rótulo pode ser configurado para usar recursos com excesso de assinatura somente depois que o recurso de excesso de assinatura estiver ativado para um nó. Os nós relacionados podem ser criados somente em um pool de nós. Para ativar o recurso de excesso de assinatura, execute as seguintes etapas:
- Crie um pool de nós.
- Escolha More > Manage na coluna Operation do pool de nós criado.
- Na janela Manage Components exibida, defina over-subscription-resource em kubelet como true e clique em OK.
- Defina o rótulo de excesso de assinatura do nó.
O rótulo volcano.sh/oversubscription precisa ser configurado para um nó com excesso de assinatura. Se esse rótulo for definido para um nó e o valor for true, o nó é um nó com excesso de assinatura. Caso contrário, o nó não é um nó com excesso de assinatura.
kubectl label node 192.168.0.0 volcano.sh/oversubscription=true
Um nó com excesso de assinatura também suporta os limites de excesso de assinatura, conforme listado em Tabela 2. Por exemplo:
kubectl annotate node 192.168.0.0 volcano.sh/evicting-cpu-high-watermark=70
Consultar as informações do nó
# kubectl describe node 192.168.0.0 Name: 192.168.0.0 Roles: <none> Labels: ... volcano.sh/oversubscription=true Annotations: ... volcano.sh/evicting-cpu-high-watermark: 70
Tabela 2 Anotações de excesso de assinatura de nó Nome
Descrição
volcano.sh/evicting-cpu-high-watermark
Quando o uso da CPU de um nó excede o valor especificado, o despejo de trabalho off-line é acionado e o nó se torna não programável.
O valor padrão é 80, indicando que a remoção de tarefas off-line é acionada quando o uso da CPU de um nó excede 80%.
volcano.sh/evicting-cpu-low-watermark
Depois que o despejo é acionado, o agendamento começa novamente quando o uso da CPU de um nó é menor do que o valor especificado.
O valor padrão é 30, indicando que o agendamento é iniciado novamente quando o uso da CPU de um nó é inferior a 30%.
volcano.sh/evicting-memory-high-watermark
Quando o uso de memória de um nó excede o valor especificado, a remoção de trabalho off-line é acionada e o nó se torna não programável.
O valor padrão é 60, indicando que a remoção de tarefas off-line é acionada quando o uso de memória de um nó excede 60%.
volcano.sh/evicting-memory-low-watermark
Depois que o despejo é acionado, o agendamento é iniciado novamente quando o uso de memória de um nó é menor do que o valor especificado.
O valor padrão é 30, indicando que o agendamento é iniciado novamente quando o uso de memória de um nó é inferior a 30%.
volcano.sh/oversubscription-types
Tipo de recurso de excesso de assinatura. As opções são as seguintes:
- CPU (CPU de excesso excesso de assinatura)
- memory (memória de excesso de assinatura)
- cpu,memory (CPU e memória de excesso de assinatura)
O valor padrão é cpu,memory.
- Crie recursos em uma classe de alta e baixa prioridade, respectivamente.
cat <<EOF | kubectl apply -f - apiVersion: scheduling.k8s.io/v1 description: Used for high priority pods kind: PriorityClass metadata: name: production preemptionPolicy: PreemptLowerPriority value: 999999 --- apiVersion: scheduling.k8s.io/v1 description: Used for low priority pods kind: PriorityClass metadata: name: testing preemptionPolicy: PreemptLowerPriority value: -99999 EOF
- Implemente tarefas on-line e off-line e configure priorityClasses para essas tarefas.
O rótulo volcano.sh/qos-level precisa ser adicionado à anotação para distinguir tarefas off-line. O valor é um número inteiro que varia de -7 a 7. Se o valor for menor que 0, a tarefa é uma tarefa off-line. Se o valor for maior ou igual a 0, a tarefa é uma tarefa de alta prioridade, ou seja, tarefa on-line. Você não precisa definir esse rótulo para tarefas on-line. Para ambos as tarefas on-line e off-line, defina schedulerName para volcano para ativar o volcano scheduler.
As prioridades das tarefas on-line/on-line e off-line/off-line não são diferenciadas e a validade do valor não é verificada. Se o valor de volcano.sh/qos-level de uma tarefa off-line não for um número inteiro negativo variando de -7 a 0, a tarefa é processada como uma tarefa on-line.
Para uma tarefa off-line:
kind: Deployment apiVersion: apps/v1 spec: replicas: 4 template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' volcano.sh/qos-level: "-1" # Offline job label spec: schedulerName: volcano # The volcano scheduler is used. priorityClassName: testing # Configure the testing priorityClass. ...
Para uma tarefa on-line:
kind: Deployment apiVersion: apps/v1 spec: replicas: 4 template: metadata: annotations: metrics.alpha.kubernetes.io/custom-endpoints: '[{"api":"","path":"","port":"","names":""}]' spec: schedulerName: volcano # The volcano scheduler is used. priorityClassName: production # Configure the production priorityClass. ...
- Execute o seguinte comando para verificar o número de recursos de excesso de assinatura e o uso de recursos:
kubectl describe node <nodeIP>
# kubectl describe node 192.168.0.0 Name: 192.168.0.0 Roles: <none> Labels: ... volcano.sh/oversubscription=true Annotations: ... volcano.sh/oversubscription-cpu: 2335 volcano.sh/oversubscription-memory: 341753856 Allocatable: cpu: 3920m memory: 6263988Ki Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 4950m (126%) 4950m (126%) memory 1712Mi (27%) 1712Mi (27%)
Exemplo de implementação
O exemplo a seguir é usado para descrever como implementar tarefas on-line e off-line no modo híbrido.
- Suponha que um cluster tem dois nós: um nó com excesso de assinatura e um nó sem excesso de assinatura.
# kubectl get node NAME STATUS ROLES AGE VERSION 192.168.0.173 Ready <none> 4h58m v1.19.16-r2-CCE22.5.1 192.168.0.3 Ready <none> 148m v1.19.16-r2-CCE22.5.1
- 192.168.0.173 é um nó com excesso de assinatura (com o rótulo volcano.sh/oversubscription=true).
- 192.168.0.3 é um nó sem excesso de assinatura (sem o rótulo volcano.sh/oversubscription=true).
# kubectl describe node 192.168.0.173 Name: 192.168.0.173 Roles: <none> Labels: beta.kubernetes.io/arch=amd64 ... volcano.sh/oversubscription=true
- Envie solicitações de criação de tarefa off-line. Se os recursos forem suficientes, todos os tarefas off-line serão agendados para o nó com excesso de assinatura.
O modelo de tarefa off-line é o seguinte:
apiVersion: apps/v1 kind: Deployment metadata: name: offline namespace: default spec: replicas: 2 selector: matchLabels: app: offline template: metadata: labels: app: offline annotations: volcano.sh/qos-level: "-1" # Offline job label spec: schedulerName: volcano # The volcano scheduler is used. priorityClassName: testing # Configure the testing priorityClass. containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent resources: requests: cpu: 500m memory: 512Mi limits: cpu: "1" memory: 512Mi imagePullSecrets: - name: default-secret
As tarefas off-line são agendadas para o nó com excesso de assinatura.# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE offline-69cdd49bf4-pmjp8 1/1 Running 0 5s 192.168.10.178 192.168.0.173 offline-69cdd49bf4-z8kxh 1/1 Running 0 5s 192.168.10.131 192.168.0.173
- Envie solicitações de criação de tarefa on-line. Se os recursos forem suficientes, as tarefas on-line serão agendadas para o nó sem excesso de assinatura.
O modelo de tarefa on-line é o seguinte:
apiVersion: apps/v1 kind: Deployment metadata: name: online namespace: default spec: replicas: 2 selector: matchLabels: app: online template: metadata: labels: app: online spec: schedulerName: volcano # The volcano scheduler is used. priorityClassName: production # Configure the production priorityClass. containers: - name: container-1 image: resource_consumer:latest imagePullPolicy: IfNotPresent resources: requests: cpu: 1400m memory: 512Mi limits: cpu: "2" memory: 512Mi imagePullSecrets: - name: default-secret
As tarefas on-line são agendadas para o nó sem excesso de assinatura.# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE online-ffb46f656-4mwr6 1/1 Running 0 5s 192.168.10.146 192.168.0.3 online-ffb46f656-dqdv2 1/1 Running 0 5s 192.168.10.67 192.168.0.3
- Melhore o uso de recursos do nó com excesso de assinatura e observe se o despejo de tarefas off-line é acionado.
Implemente tarefas on-line no nó com excesso de assinatura (192.168.0.173).
apiVersion: apps/v1 kind: Deployment metadata: name: online namespace: default spec: replicas: 2 selector: matchLabels: app: online template: metadata: labels: app: online spec: affinity: # Submit an online job to an oversubscribed node. nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - 192.168.0.173 schedulerName: volcano # The volcano scheduler is used. priorityClassName: production # Configure the production priorityClass. containers: - name: container-1 image: resource_consumer:latest imagePullPolicy: IfNotPresent resources: requests: cpu: 700m memory: 512Mi limits: cpu: 700m memory: 512Mi imagePullSecrets: - name: default-secret
Submeta as tarefas on-line ou off-line ao nó com excesso de assinatura (192.168.0.173) ao mesmo tempo.# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE offline-69cdd49bf4-pmjp8 1/1 Running 0 13m 192.168.10.178 192.168.0.173 offline-69cdd49bf4-z8kxh 1/1 Running 0 13m 192.168.10.131 192.168.0.173 online-6f44bb68bd-b8z9p 1/1 Running 0 3m4s 192.168.10.18 192.168.0.173 online-6f44bb68bd-g6xk8 1/1 Running 0 3m12s 192.168.10.69 192.168.0.173
Observe o nó com excesso de assinatura (192.168.0.173). Você pode descobrir que existem recursos de excesso de assinatura e a taxa de alocação de CPU excede 100%.# kubectl describe node 192.168.0.173 Name: 192.168.0.173 Roles: <none> Labels: … volcano.sh/oversubscription=true Annotations: … volcano.sh/oversubscription-cpu: 2343 volcano.sh/oversubscription-memory: 3073653200 … Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 4750m (121%) 7350m (187%) memory 3760Mi (61%) 4660Mi (76%) …
Aumentar o uso da CPU de tarefas on-line no nó. Remoção de tarefa off-line é acionada.# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE offline-69cdd49bf4-bwdm7 1/1 Running 0 11m 192.168.10.208 192.168.0.3 offline-69cdd49bf4-pmjp8 0/1 Evicted 0 26m <none> 192.168.0.173 offline-69cdd49bf4-qpdss 1/1 Running 0 11m 192.168.10.174 192.168.0.3 offline-69cdd49bf4-z8kxh 0/1 Evicted 0 26m <none> 192.168.0.173 online-6f44bb68bd-b8z9p 1/1 Running 0 24m 192.168.10.18 192.168.0.173 online-6f44bb68bd-g6xk8 1/1 Running 0 24m 192.168.10.69 192.168.0.173
Sugestões de manipulação
- Depois que o kubelet do nó com excesso de assinatura é reiniciado, a visualização de recursos do Volcano scheduler não é sincronizada com a do kubelet. Como resultado, OutOfCPU ocorre em algumas tarefas recém-agendados, o que é normal. Depois de um período de tempo, o Volcano scheduler pode programar corretamente tarefas on-line e off-line.
- Depois que as tarefas on-line e off-line forem enviadas, não é aconselhável alterar dinamicamente o tipo de tarefa (adicionando ou excluindo a anotação volcano.sh/qos-level: "-1") porque o kernel atual não suporta a mudança de uma tarefa offline para uma tarefa online.
- O CCE coleta o uso de recursos (CPU/memória) de todos os pods em execução em um nó com base nas informações de status no sistema cgroups. O uso de recursos pode ser diferente do uso de recursos monitorados, por exemplo, as estatísticas de recursos exibidas executando o comando top.
- Você pode adicionar recursos de excesso de assinatura (como CPU e memória) a qualquer momento.
Você pode reduzir os tipos de recursos de excesso de assinatura somente quando a taxa de alocação de recursos não exceder 100%.
- Se uma tarefa off-line for implementada em um nó antes de uma tarefa on-line e a tarefa on-line não puder ser agendada devido a recursos insuficientes, configure uma classe de prioridade mais alta para a tarefa on-line do que para a tarefa off-line.
- Se houver apenas tarefas on-line em um nó e o limite de despejo for alcançado, as tarefas off-line agendadas para o nó atual serão despejadas em breve. Isto é normal.