Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-11-28 GMT+08:00

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.

Figura 1 Excesso de assinaturas de recursos

Recursos

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

Especificações
  • 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
Restrições
  • 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.

Assegure-se de que você tenha configurado corretamente as etiquetas porque o agendador não verifica o complemento e as configurações do nó.
Tabela 1 Configurar rótulos de excesso de assinatura para agendamento

Excesso de assinatura no complemento

Rótulo de excesso de assinatura no nó

Agendamento

Sim

Sim

Acionado por excesso de assinatura

Sim

Não

Acionado

Não

Não

Acionado

Não

Sim

Não foi acionado ou falhou. Evite essa configuração.

  1. Configure o complemento volcano.

    1. Use o kubectl para se conectar ao cluster.
    2. 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

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

    1. Crie um pool de nós.
    2. Escolha More > Manage na coluna Operation do pool de nós criado.
    3. Na janela Manage Components exibida, defina over-subscription-resource em kubelet como true e clique em OK.

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

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

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

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

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

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

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

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