Distribuir cargas de trabalho uniformemente entre várias zonas é uma estratégia fundamental para construir uma arquitetura de alta disponibilidade. Conforme a demanda aumenta, uma política de agendamento balanceado entre zonas dimensiona automaticamente as instâncias para atender aos requisitos de capacidade do cluster.
Pré-requisitos
Crie pelo menos um vSwitch em cada zona onde deseja dimensionar instâncias. Para mais informações, consulte Create and manage vSwitches. Após a criação, selecione o vSwitch correspondente ao create and manage node pools.
Contexto
O autoscaler do cluster verifica se um service pode ser implantado em um grupo de dimensionamento e envia uma solicitação de scale-out para um grupo de dimensionamento do ESS especificado para criar novas instâncias. No entanto, surge um problema ao configurar vSwitches de várias zonas dentro de um único grupo de dimensionamento do ESS. Quando os pods da carga de trabalho não podem ser agendados devido à insuficiência de recursos no cluster, o ACK aciona o grupo de dimensionamento do ESS para realizar o scale-out. Sem um mecanismo que associe a solicitação de scale-out a uma zona específica, o grupo de dimensionamento do ESS não sabe qual zona precisa de mais capacidade. Isso pode concentrar as novas instâncias em uma única zona, em vez de distribuí-las por várias zonas, impedindo o atendimento à demanda por dimensionamento simultâneo e multizona.
Para resolver essa questão, o ACK fornece o componente ack-autoscaling-placeholder. Com uma pequena quantidade de recursos reservados, esse componente transforma o dimensionamento automático genérico multizona em um dimensionamento direcionado e simultâneo de node pools específicos. Para mais informações, consulte Achieve Container Scaling in Seconds Using ack-autoscaling-placeholder. O funcionamento é o seguinte:
Crie um node pool separado para cada zona e aplique um rótulo de zona exclusivo a cada node pool.
Use o componente ack-autoscaling-placeholder para criar pods de placeholder em cada zona por meio de um
nodeSelectorque tenha como alvo os rótulos específicos da zona. Por padrão, esses pods de placeholder possuem umaPriorityClassde baixa prioridade, o que lhes confere uma prioridade inferior à dos pods da sua aplicação.Quando um pod de carga de trabalho de alta prioridade fica pendente, ele preempta um pod de placeholder em uma das zonas. O pod de placeholder preemptado, que possui um
nodeSelectorespecífico da zona, também fica pendente. Isso sinaliza ao autoscaler do cluster para dimensionar um novo nó especificamente naquela zona, transformando uma necessidade geral de dimensionamento em uma solicitação direcionada.
O exemplo a seguir usa duas zonas para ilustrar como alcançar o dimensionamento simultâneo em várias zonas.
O componente ack-autoscaling-placeholder atua como uma ponte entre suas aplicações e o autoscaler do cluster ao criar um pod de placeholder em cada zona. A prioridade de agendamento desses pods de placeholder é menor que a dos pods da sua aplicação.
Assim que um pod da aplicação fica pendente, ele preempta imediatamente um pod de placeholder e executa em um nó existente em uma das zonas. O pod de placeholder preemptado entra então no estado Pending.
Como cada pod de placeholder é configurado com um
nodeSelectorespecífico da zona, o autoscaler do cluster identifica exatamente qual zona deve ser dimensionada, permitindo o dimensionamento simultâneo nas zonas corretas.
Etapa 1: Criar node pools e adicionar rótulos
Faça login no ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do cluster desejado. No painel de navegação à esquerda, escolha .
-
Clique em Create Node Pool e configure os parâmetros conforme solicitado.
Este exemplo cria um node pool chamado auto-zone-I com o dimensionamento automático ativado na zona I. A tabela a seguir descreve os principais parâmetros. Para mais informações, consulte Create and manage node pools.
Parâmetro
Descrição
Node Pool Name
auto-zone-I
Scaling Mode
Selecione Auto para ativar o dimensionamento automático.
vSwitch
Selecione o vSwitch da zona I.
Node Labels
Defina a Key como
available_zonee o Value comoi.Na lista de node pools, a criação é confirmada quando o status muda para Active.
-
Repita essas etapas para cada zona onde deseja ativar o dimensionamento automático.
Após a criação, os node pools de cada zona (por exemplo, auto-zone-I, auto-zone-K e auto-zone-H) aparecem na lista de node pools. Escolha diferentes tipos de instância conforme necessário (como
ecs.hfc7.xlarge,ecs.c7.xlargeouecs.s6-c1m2.xlarge). O método de faturamento é pagamento conforme o uso, e o status de cada node pool é Active com o dimensionamento automático ativado.
Etapa 2: Implantar o componente de placeholder e os Deployments
No painel de navegação à esquerda, escolha .
Pesquise por ack-autoscaling-placeholder, clique no cartão do componente e, em seguida, clique em Deploy.
-
Selecione um Cluster e um Namespace, clique em Next, selecione uma Chart Version, edite o Parameter e clique em OK.
Após a criação da aplicação, acesse a página . O status da aplicação será Deployed.
No painel de navegação à esquerda da página de gerenciamento do cluster, escolha .
Na página Helm, localize ack-autoscaling-placeholder-default e clique em Update na coluna Actions.
-
No painel Update Release, atualize a configuração YAML conforme o exemplo a seguir e clique em OK. É necessário definir um Deployment de placeholder para cada zona.
Este exemplo mostra como criar Deployments de placeholder nas zonas I, K e H.
deployments: - affinity: {} annotations: {} containers: - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1 imagePullPolicy: IfNotPresent name: placeholder resources: requests: cpu: 3500m # CPU request for the placeholder pod. memory: 6 # Memory request for the placeholder pod. imagePullSecrets: {} labels: {} name: ack-place-holder-I # The name of the placeholder Deployment. nodeSelector: {"available_zone":"i"} # The zone label. It must match the label configured for the node pool in Step 1. replicaCount: 10 # The number of pods to create in each scale-out event. tolerations: [] - affinity: {} annotations: {} containers: - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1 imagePullPolicy: IfNotPresent name: placeholder resources: requests: cpu: 3500m # CPU request for the placeholder pod. memory: 6 # Memory request for the placeholder pod. imagePullSecrets: {} labels: {} name: ack-place-holder-K # The name of the placeholder Deployment. nodeSelector: {"available_zone":"k"} # The zone label. It must match the label configured for the node pool in Step 1. replicaCount: 10 # The number of pods to create in each scale-out event. tolerations: [] - affinity: {} annotations: {} containers: - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1 imagePullPolicy: IfNotPresent name: placeholder resources: requests: cpu: 3500m # CPU request for the placeholder pod. memory: 6 # Memory request for the placeholder pod. imagePullSecrets: {} labels: {} name: ack-place-holder-H # The name of the placeholder Deployment. nodeSelector: {"available_zone":"h"} # The zone label. It must match the label configured for the node pool in Step 1. replicaCount: 10 # The number of pods to create in each scale-out event. tolerations: [] fullnameOverride: "" nameOverride: "" podSecurityContext: {} priorityClassDefault: enabled: true name: default-priority-class value: -1Uma atualização bem-sucedida cria um Deployment de placeholder para cada zona.
Etapa 3: Criar uma PriorityClass para a carga de trabalho
-
Crie um arquivo chamado priorityClass.yaml usando o modelo YAML a seguir.
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 # Set a priority value higher than the default priority of the placeholder pods from Step 2. globalDefault: false description: "This priority class should be used for XYZ service pods only."Caso não seja necessário configurar uma PriorityClass específica para cada pod, defina um padrão global. Após a configuração, qualquer pod sem uma
priorityClassNameespecificada usará automaticamente essa prioridade.apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: global-high-priority value: 1 # Set a priority value higher than the default priority of the placeholder pods from Step 2. globalDefault: true description: "This priority class should be used for XYZ service pods only." -
Crie a PriorityClass.
kubectl apply -f priorityClass.yamlSaída esperada:
priorityclass.scheduling.k8s.io/high-priority created
Etapa 4: Criar a carga de trabalho real
O exemplo a seguir cria uma carga de trabalho na zona I.
-
Crie um arquivo chamado workload.yaml usando o modelo YAML a seguir.
apiVersion: apps/v1 kind: Deployment metadata: name: placeholder-test labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: # Node selector. available_zone: "i" priorityClassName: high-priority # The name of the PriorityClass created in Step 3. This field is optional if you have configured a global default. containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 resources: requests: cpu: '3' # Resource requests for the actual workload. memory: 5Gi -
Implante a carga de trabalho real.
kubectl apply -f workload.yamlSaída esperada:
deployment.apps/placeholder-test createdApós a implantação da carga de trabalho, acesse a página . Como a carga de trabalho possui uma PriorityClass superior, ela preempta um pod de placeholder e executa em seu nó. O pod de placeholder preemptado, por sua vez, aciona o autoscaler do cluster para executar um scale-out simultâneo, preparando a capacidade para futuros dimensionamentos da carga de trabalho.
Na página , observe que o pod da carga de trabalho agora executa no nó anteriormente ocupado por um pod de placeholder. Verifique também se o cluster dimensionou novos nós de trabalho. Por exemplo, dois novos nós
ecs.c6e.xlarge(4 vCPU, 8 GiB) em estado de execução confirmam que o autoscaler do cluster executou o scale-out simultâneo com sucesso.