Em comparação com o agendador nativo do Kubernetes, o ACK estende o agendamento com recursos como Gang Scheduling, agendamento ciente de topologia de CPU e agendamento elástico de ECI. Instale o complemento ack-co-scheduler em um cluster registrado para usar os recursos de agendamento do ACK no seu cluster local e aumentar a eficiência de workloads intensivos em computação, como big data e IA.
Pré-requisitos
Certifique-se de que:
Seu cluster Kubernetes autogerenciado esteja conectado a um cluster registrado do ACK One.
-
Os componentes do sistema estejam nas seguintes versões:
Componente
Versão
Kubernetes
1.18.8 ou posterior
Helm
3.0 ou posterior
Docker
19.03.5
Sistema operacional
CentOS 7.6, CentOS 7.7, Ubuntu 16.04, Ubuntu 18.04, Alibaba Cloud Linux
Observações de uso
Defina .template.spec.schedulerName como ack-co-scheduler na especificação do job para rotear os pods pelo co-scheduler do ACK em vez do agendador padrão.
Instale o componente ack-co-scheduler
Use o onectl para ambientes automatizados por script. Para uma abordagem baseada em interface gráfica, use o console.
Instalação via onectl
Instale o onectl na sua máquina.
-
Instale o ack-co-scheduler:
onectl addon install ack-co-schedulerSaída esperada:
Addon ack-co-scheduler, version **** installed.
Instalação via console
Faça login no Console de Gerenciamento do Container Service. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do cluster. No painel de navegação à esquerda, clique em Add-ons.
Na página Add-ons, clique na aba Others. Localize o ack-co-scheduler e clique em Install.
Na caixa de diálogo, clique em OK.
Gang scheduling
O Gang scheduling impõe uma política de alocação "tudo ou nada": todos os pods de um grupo são agendados juntos ou nenhum deles é agendado. Isso evita deadlocks de recursos em jobs distribuídos, como treinamento de IA e MPI, nos quais todos os workers precisam ser executados simultaneamente.
Envie um job distribuído do TensorFlow
Este exemplo envia um job de treinamento distribuído do TensorFlow com Gang Scheduling. Os pods PS e Worker usam rótulos pod-group.scheduling.sigs.k8s.io para formar um grupo de pods.
apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
name: "tf-smoke-gpu"
spec:
tfReplicaSpecs:
PS:
replicas: 1
template:
metadata:
creationTimestamp: null
labels:
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
pod-group.scheduling.sigs.k8s.io/min-available: "2"
spec:
schedulerName: ack-co-scheduler # Route pods through the ACK co-scheduler.
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=cpu
- --data_format=NHWC
image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
ports:
- containerPort: 2222
name: tfjob-port
resources:
limits:
cpu: '10'
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
Worker:
replicas: 4
template:
metadata:
creationTimestamp: null
labels:
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu
pod-group.scheduling.sigs.k8s.io/min-available: "2"
spec:
schedulerName: ack-co-scheduler
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=gpu
- --data_format=NHWC
image: registry.cn-hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
ports:
- containerPort: 2222
name: tfjob-port
resources:
limits:
cpu: 10
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
Campos principais:
|
Campo |
Descrição |
|
|
Agrupa os pods em um grupo de pods. Pods com o mesmo nome são agendados juntos. |
|
|
Quantidade mínima de pods que devem ter condições de agendamento antes que qualquer pod do grupo inicie. Neste exemplo, pelo menos 2 dos 5 pods (1 PS + 4 Workers) precisam estar aptos para agendamento. |
|
|
Roteia o pod pelo co-scheduler do ACK. Defina este campo em cada modelo de pod do job. |
Verifique o Gang scheduling
Após enviar o job, verifique se os pods entram em estado pendente simultaneamente:
kubectl get pods -l pod-group.scheduling.sigs.k8s.io/name=tf-smoke-gpu
Os pods permanecem em Pending até que pelo menos min-available pods possam ser agendados ao mesmo tempo. Esse comportamento é esperado. Caso os pods continuem pendentes, consulte os Eventos para verificar mensagens de agendamento:
kubectl describe pod <pod-name>
Consulte Usar Gang scheduling.
Agendamento ciente de topologia de CPU
O agendamento ciente de topologia de CPU fixa os núcleos de CPU do contêiner no mesmo nó de Non-Uniform Memory Access (NUMA), o que reduz a latência de memória entre nós. Essa configuração beneficia workloads intensivos em CPU, como inferência em tempo real e serviços sensíveis a latência.
Pré-requisitos
O componente resource-controller deve estar implantado. Consulte Gerenciar complementos.
Ative o agendamento ciente de topologia de CPU
Adicione a anotação cpuset-scheduler: "true" ao modelo de pod do Deployment e defina schedulerName como ack-co-scheduler:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-numa
labels:
app: nginx-numa
spec:
replicas: 2
selector:
matchLabels:
app: nginx-numa
template:
metadata:
annotations:
cpuset-scheduler: "true" # Enable CPU topology-aware scheduling.
labels:
app: nginx-numa
spec:
schedulerName: ack-co-scheduler # Route pods through the ACK co-scheduler.
containers:
- name: nginx-numa
image: nginx:1.13.3
ports:
- containerPort: 80
resources:
requests:
cpu: 4
limits:
cpu: 4
Campos principais:
|
Campo |
Descrição |
|
|
Fixa os núcleos de CPU do pod em um único nó NUMA. Configure em |
|
|
Roteia o pod pelo co-scheduler do ACK. |
|
|
Solicitações e limites de recursos de CPU para o contêiner. |
Verifique o agendamento ciente de topologia de CPU
Com os pods em execução, confirme se o agendamento ocorreu com fixação de cpuset:
kubectl get pods -l app=nginx-numa -o wide
Para confirmar a fixação NUMA, acesse o nó e verifique o cpuset do contêiner:
cat /sys/fs/cgroup/cpuset/kubepods/pod<pod-uid>/<container-id>/cpuset.cpus
Se todos os núcleos listados pertencerem ao mesmo nó NUMA, a fixação de cpuset estará ativa.
Agendamento elástico de ECI
O agendamento elástico de ECI controla se os pods são executados em nós do Elastic Compute Service (ECS), em recursos do Elastic Container Instance (ECI) ou se usam burst para ECI apenas quando a capacidade do ECS for insuficiente. Use esse recurso para workloads com picos de demanda de recursos e evitar o provisionamento excessivo de nós ECS.
Pré-requisitos
O componente ack-virtual-node deve estar implantado. Consulte Usar ECI no ACK.
Ative o agendamento elástico de ECI
Adicione a anotação alibabacloud.com/burst-resource ao modelo de pod do Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
annotations:
alibabacloud.com/burst-resource: eci # Use ECI when ECS capacity is insufficient.
labels:
app: nginx
spec:
schedulerName: ack-co-scheduler # Route pods through the ACK co-scheduler.
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 2
requests:
cpu: 2
Valores da anotação alibabacloud.com/burst-resource:
|
Valor |
Comportamento |
|
Não definido |
Usa apenas nós ECS no cluster. |
|
|
Prioriza nós ECS; faz burst para ECI quando a capacidade do ECS for insuficiente. |
|
|
Usa exclusivamente recursos ECI. |
Verifique o agendamento elástico de ECI
Após a implantação, verifique em quais nós os pods estão sendo executados:
kubectl get pods -l app=nginx -o wide
Consulte Usar ElasticResource para implementar agendamento elástico de ECI (descontinuado).
Agendamento compartilhado de GPU
O agendamento compartilhado de GPU permite que vários pods compartilhem uma única GPU, o que melhora a utilização para inferência e workloads que não exigem uma GPU dedicada.
Consulte: