No Container Service for Kubernetes, combine o agendamento gang e o agendamento com reconhecimento de topologia para permitir que os pods tentem novamente o agendamento em vários domínios de topologia até encontrar um adequado. Além disso, associe pools de nós ao recurso de conjunto de implantação do ECS para agendar pods em instâncias do ECS dentro do mesmo conjunto de implantação de baixa latência. Essa combinação viabiliza o agendamento por afinidade em domínios de topologia mais granulares. Este tópico explica como implementar o agendamento com reconhecimento de topologia.
Introdução
Em tarefas de machine learning e análise de big data, os pods frequentemente exigem alta comunicação de rede. Por padrão, o agendador nativo do Kubernetes distribui os pods uniformemente pelo cluster. Essa distribuição aumenta a distância de comunicação e eleva o tempo de conclusão das tarefas. Para otimizar a execução, implante os pods na mesma zona de disponibilidade ou no mesmo rack e reduza os saltos de rede e a latência. O Kubernetes oferece suporte nativo ao agendamento por afinidade por meio de NodeAffinity e PodAffinity. No entanto, esse mecanismo nativo apresenta as seguintes limitações:
Os pods não conseguem tentar novamente o agendamento em diferentes domínios de topologia. No agendamento por afinidade nativo do Kubernetes, o agendamento de uma tarefa inteira depende da alocação do primeiro pod. Se o local do primeiro pod não comportar todos os pods da tarefa, alguns permanecerão no estado Pending. O agendador não mudará automaticamente para outra zona de disponibilidade, mesmo que outro domínio de topologia possa acomodar toda a tarefa.
Atualmente, os nós possuem rótulos apenas no nível de zona de disponibilidade. Consequentemente, a afinidade de pods fica restrita a uma única zona de disponibilidade e impede a fixação em domínios de topologia mais granulares.
Tentar novamente o agendamento em vários domínios de topologia
Adicione um identificador de agendamento gang a uma tarefa para ativar a alocação simultânea de recursos para todos os pods e permitir novas tentativas de agendamento em múltiplos domínios de topologia.
-
Adicione um identificador de agendamento gang aos rótulos do pod. Para saber mais sobre agendamento gang, consulte Trabalhar com agendamento gang.
... labels: pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpu # tf-smoke-gpu is the name of the PodGroup. Specify a custom value. pod-group.scheduling.sigs.k8s.io/min-available: "3" # You can set this value to the number of pods in the job. ... -
Adicione a restrição de agendamento com reconhecimento de topologia à anotação do pod.
annotations: alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"kubernetes.io/hostname\"}],\"nodeSelectors\":[{\"matchLabels\":{\"test\":\"abc\"}}]}}O valor de
alibabacloud.com/topology-aware-constraintdeve ser uma string JSON válida com a seguinte estrutura:{ "name": xxx, # Any name. "required": { "topologies": [ { "key": xxx # The key that specifies the topology domain for affinity. } ], "nodeSelectors": [ { # This structure follows the labelSelector format in the native Kubernetes nodeAffinity. "matchLabels": {}, "matchExpressions": {} } ] } }Após aplicar essa configuração, o agendador aloca todos os pods com o rótulo
pod-group.scheduling.sigs.k8s.io/name: tf-smoke-gpuem nós correspondentes ao rótulotest=abc. A saída abaixo é um exemplo:kubectl get pod -ojson | jq '.items[] | {"name":.metadata.name,"ann":.metadata.annotations["alibabacloud.com/topology-aware-constraint"], "node": spec.nodeName}' { "name": "nginx-deployment-basic-69f47fc6db-6****", "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} ", "node": "cn-shenzhen.10.0.2.4" } { "name":"nginx-deployment-basic-69f47fc6db-h****", "ann": "{\"name\": \"test\", \"required\": {\"topologies\":[{\"key\": \"kubernetes.io/hostname\"}], \"nodeSelectors\": [{\"matchLabels\": {\"test\": \"a\"}}]}} ", "node": "cn-shenzhen.10.0.2.4" }
Agendar para um conjunto de implantação de baixa latência
Em alguns cenários, as tarefas exigem afinidade em domínios de topologia mais granulares para atingir o desempenho ideal. O ECS fornece conjuntos de implantação de baixa latência que restringem a alocação de nós do ECS. Para obter mais informações, consulte Práticas recomendadas para associar conjuntos de implantação a pools de nós.
Ao criar um pool de nós que utiliza um conjunto de implantação de baixa latência, adicione também um rótulo de nó personalizado para diferenciá-lo de outros pools de nós.
Depois de concluir as etapas anteriores, utilize a anotação e os rótulos a seguir para agendar uma tarefa dentro de um conjunto de implantação de baixa latência.
-
Adicione um identificador de agendamento gang aos rótulos do pod. Para saber mais sobre agendamento gang, consulte Trabalhar com agendamento gang.
labels: pod-group.scheduling.sigs.k8s.io/name: xxx # xxx is the name of the PodGroup. Specify a custom value. pod-group.scheduling.sigs.k8s.io/min-available: "x" # You can set this value to the number of pods in the job. -
Adicione a restrição de agendamento com reconhecimento de topologia à anotação do pod.
ImportanteSubstitua
matchLabelspelo rótulo de nó personalizado do seu conjunto de implantação de baixa latência e modifiquenameconforme necessário.annotations: alibabacloud.com/topology-aware-constraint: {\"name\":\"test\",\"required\":{\"topologies\":[{\"key\":\"alibabacloud.com/nodepool-id\"}],\"nodeSelectors\":[{\"matchLabels\":{\"np-type\":\"low-latency\"}}]}}