Para melhorar a utilização de recursos, reduzir custos e evitar desperdícios, o Container Compute Service (ACS) oferece o componente ack-kubernetes-cronhpa-controller, que dimensiona recursos automaticamente com base em cronogramas predefinidos. Este tópico descreve como usar o Cron Horizontal Pod Autoscaler (CronHPA) para dimensionar cargas de trabalho em um cluster ACS conforme um cronograma. Também explica como configurar a interação entre CronHPA e Horizontal Pod Autoscaler (HPA) sem conflitos.
Pré-requisitos
Você já criou um cluster ACS.
Você já se conectou a um cluster Kubernetes usando kubectl.
Informações básicas
O ack-kubernetes-cronhpa-controller é um controlador Kubernetes que dimensiona cargas de trabalho em um cluster com base em um cronograma semelhante ao crontab. É possível usar o CronHPA com qualquer objeto Kubernetes compatível com o sub-recurso scale, como Deployment ou StatefulSet. Para mais informações, visite o repositório kubernetes-cronhpa-controller.
A tabela a seguir descreve os parâmetros da configuração do CronHPA.
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
excludeDates:
# exclude November 15th
- "* * * 15 11 *"
# exclude every Friday
- "* * * * * 5"
jobs:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "0 */1 * * * *"
targetSize: 3
runOnce: false
Parâmetro | Descrição |
scaleTargetRef | scaleTargetRef especifica o objeto a ser dimensionado. Se os sub-recursos do objeto forem dimensionáveis, será possível ativar o CronHPA para ele. |
excludeDates | O valor de excludeDates deve ser uma matriz de datas. Os jobs de dimensionamento não são executados nas datas especificadas em excludeDates. Nota A menor unidade de tempo que pode ser excluída é um Day. O formato é Por exemplo, para não executar jobs de dimensionamento em 15 de novembro, defina excludeDates com o seguinte valor: |
jobs | É possível definir vários jobs do CronHPA dentro de um único
|
Instale o controlador CronHPA
Instale o controlador CronHPA ack-kubernetes-cronhpa-controller usando um dos métodos a seguir.
Faça login no console do ACS. 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, clique em Add-ons.
Na página Add-ons, clique na aba Applications. Localize ack-kubernetes-cronhpa-controller, clique em Install e, em seguida, clique em OK na caixa de diálogo exibida.
Caso o CronHPA não seja mais utilizado, desinstale o controlador. Para mais detalhes sobre como desinstalar o ack-kubernetes-cronhpa-controller, consulte Gerenciar add-ons.
Crie jobs do CronHPA
Antes de criar e executar jobs do CronHPA para sua aplicação, certifique-se de que o controlador CronHPA esteja funcionando normalmente no cluster e que exista apenas uma tarefa HPA criada para a aplicação. Para saber como permitir que CronHPA e HPA interajam sem conflitos, consulte Permitir que CronHPA e HPA interajam sem conflitos. Crie jobs do CronHPA usando um dos métodos abaixo:
Método 1: Crie um job durante a criação da aplicação
Na página Advanced do assistente de criação de aplicações, localize a seção Scaling. Selecione Enable ao lado de CronHPA. Para etapas detalhadas sobre a criação de aplicações, consulte Criar uma carga de trabalho stateless (Deployment) ou Criar uma carga de trabalho stateful (StatefulSet).
Se aparecer uma mensagem informando que o componente ack-kubernetes-cronhpa-controller não está instalado, clique em Install para instalá-lo.
O console ACK verifica automaticamente se o componente CronHPA está instalado. Caso não esteja, um botão Install será exibido. Após instalar o componente CronHPA, as configurações do job de dimensionamento agendado serão mostradas. A tabela a seguir descreve os parâmetros.
|
Parâmetro |
Descrição |
|
Job Name: |
Insira um nome para o job do CronHPA. O nome de cada job deve ser exclusivo. |
|
Desired Number of Replicas |
Os pods replicados serão dimensionados para a quantidade desejada no horário agendado. |
|
Scaling Schedule |
Defina o cronograma de dimensionamento. Para mais informações sobre como configurar o cronograma de um job CronHPA, consulte predefined-schedules. |
Método 2: Crie um job para uma aplicação existente
O exemplo a seguir demonstra como criar um job do CronHPA para uma aplicação existente. Neste exemplo, utiliza-se uma aplicação stateless.
Faça login no console do ACS. 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 Workloads > Deployments.
Na página Deployments, localize a aplicação e clique em Details na coluna Actions.
-
Clique na aba Pod Scaling e configure o job de dimensionamento agendado.
Se o componente CronHPA não estiver instalado, um botão Install será exibido. Clique em Install e prossiga para a próxima etapa.
Se o controlador CronHPA já estiver instalado, siga as etapas abaixo.
-
Clique em Create à direita de CronHPA. Na caixa de diálogo Create, defina os parâmetros do job.
A tabela a seguir descreve os parâmetros.
Parâmetro
Descrição
Job Name
Insira um nome para o job do CronHPA. O nome de cada job deve ser exclusivo.
Desired Number of Replicas
Os pods replicados serão dimensionados para a quantidade desejada no horário agendado.
Scaling Schedule
Defina o cronograma de dimensionamento. Para mais informações sobre como configurar o cronograma de um job CronHPA, consulte predefined-schedules.
Criar ou modifique jobs do CronHPA
Siga as etapas em Criar jobs do CronHPA para acessar a página Pod Scaling.
Na aba Pod Scaling, dentro da seção CronHPA, localize o job desejado e clique em Add or Modify Job na coluna Actions.
-
Na caixa de diálogo Edit, clique em Add Task para criar um novo job ou clique em um job existente para modificá-lo. Ao terminar, clique em OK.
O formulário de configuração do job inclui os seguintes campos: Job Name, Desired Number of Replicas e Scaling Schedule (que suporta cinco métodos: By Hour, By Day, By Week, By Month ou cron expression). Se selecionar cron expression, insira a expressão na caixa de entrada no formato:
Seconds Minutes Hours Day-of-month Month Day-of-week(por exemplo,1 2 3 4 * *significa 03:02:01 no dia 4 de cada mês).NotaÉ possível excluir um job do CronHPA. Na caixa de diálogo Edit, os jobs existentes aparecem como tags. Remova um job clicando no ícone de exclusão ao lado do nome dele. Para adicionar um novo job, insira um nome na caixa de entrada Job Name e clique em Add Job. Após fazer as alterações, clique em OK.
Modelos de CronHPA e HPA
CronHPA
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
jobs:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
- name: "scale-up"
schedule: "0 */1 * * * *"
targetSize: 11
HPA
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-deployment-basic-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment-basic
minReplicas: 4
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Permitir que CronHPA e HPA interajam sem conflitos
Tanto o CronHPA quanto o HPA atuam sobre cargas de trabalho, como Deployments ou StatefulSets. Se ambos forem usados simultaneamente para dimensionar a mesma carga de trabalho, podem ocorrer conflitos. Para resolver isso, o CronHPA permite usar o próprio HPA como objeto de dimensionamento, garantindo compatibilidade com seus recursos.
As configurações do CronHPA e do HPA indicam as seguintes informações:
Ambos utilizam o campo
spec.scaleTargetRefpara identificar o alvo do dimensionamento.O CronHPA usa regras crontab em
spec.jobspara agendar o dimensionamento das réplicas.O HPA dispara atividades de dimensionamento com base no uso de recursos.
Quando ambos estão implantados, podem tentar dimensionar pods da mesma aplicação especificada por scaleTargetRef. Como operam de forma independente e sem conhecimento mútuo, os controladores dimensionam os pods separadamente, fazendo com que a atividade posterior sobrescreva a anterior.
Solução de compatibilidade entre CronHPA e HPA
Conforme mencionado, o conflito pode ser resolvido se o CronHPA tiver ciência do estado atual do HPA. Para isso, o ACK configura o scaleTargetRef no CronHPA para apontar diretamente para o objeto HPA, e não para a carga de trabalho final. Ao realizar uma operação de dimensionamento, o CronHPA primeiro localiza o verdadeiro scaleTargetRef através do objeto HPA e então ajusta a carga de trabalho com base nesse estado. Isso evita que os controladores se sobrescrevam e garante um dimensionamento consistente e previsível.
O modelo YAML a seguir mostra as configurações que permitem a interação sem conflitos entre CronHPA e HPA:
apiVersion: autoscaling.alibabacloud.com/v1beta1
kind: CronHorizontalPodAutoscaler
metadata:
labels:
controller-tools.k8s.io: "1.0"
name: cronhpa-sample
spec:
scaleTargetRef:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
name: nginx-deployment-basic-hpa
jobs:
- name: "scale-down"
schedule: "30 */1 * * * *"
targetSize: 1
runOnce: false
- name: "scale-up"
schedule: "0 */1 * * * *"
targetSize: 3
runOnce: false
Com base na definição do CronHPA, um objeto CronHPA consegue determinar os valores de spec.minReplicas, spec.maxReplicas e status.desiredReplicas no HPA. Ele também conhece a contagem atual de réplicas da carga de trabalho especificada por spec.scaleTargetRef. O CronHPA interage com o HPA ajustando-o. Ele usa o maior valor entre sua contagem alvo de réplicas e a contagem atual para decidir se deve dimensionar a carga de trabalho ou aumentar o limite superior do HPA. Da mesma forma, usa o menor valor entre sua contagem alvo e a configuração do HPA para decidir se deve modificar o limite inferior do HPA.
A tabela a seguir descreve as regras que permitem a interação sem conflitos entre CronHPA e HPA.
HPA (min/max) | CronHPA | Deployment | Resultado do dimensionamento | Descrição |
1/10 | 5 | 5 |
| Se o número de pods desejado pelo CronHPA for igual ao número atual, o CronHPA não altera os limites máximo e mínimo na configuração do HPA. Além disso, nenhuma atividade de dimensionamento é disparada. |
1/10 | 4 | 5 |
| Quando o número de pods desejado pelo CronHPA é menor que o número atual, nenhuma atividade de dimensionamento ocorre. |
1/10 | 6 | 5 |
|
|
5/10 | 4 | 5 |
|
|
5/10 | 11 | 5 |
|
|
A lista a seguir descreve os parâmetros da tabela:
HPA (min/max): As quantidades mínima e máxima de pods especificadas na configuração do HPA.
CronHPA: A quantidade desejada de pods especificada na configuração do CronHPA.
Deployment: O número de réplicas da aplicação antes do dimensionamento.
O CronHPA não altera diretamente o número de pods do Deployment. Em vez disso, ele aciona o HPA para realizar o dimensionamento. Essa abordagem resolve o conflito entre CronHPA e HPA.