Gestão automática do Pod Disruption Budget no AKS (pré-visualização)

Important

Os recursos de pré-visualização do AKS estão disponíveis numa base de autosserviço e adesão voluntária. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões de teste do AKS são parcialmente cobertas pelo suporte ao cliente numa base de melhor esforço. Assim sendo, estas funcionalidades não se destinam ao uso em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Durante as atualizações do cluster AKS, o processo de atualização esvazia os nós através da expulsão de pods, para poder recriar a imagem dos nós ou substituí-los. Os Orçamentos de Disrupção de Pods (PDBs) protegem a disponibilidade de aplicações durante este processo, limitando o número de pods que podem estar indisponíveis ao mesmo tempo. No entanto, PDBs mal configurados também podem impedir totalmente a expulsão ou as implantações podem não ter réplicas suficientes para cumprir o orçamento. Implementações sem nenhum PDB têm o problema oposto: nada protege os seus pods de serem desalojados simultaneamente, o que cria o risco de indisponibilidade durante as atualizações.

A gestão automática do PDB é uma extensão do AKS, baseada no projeto open-source, que automatiza a gestão do PDB durante as atualizações. Isso:

  • Cria PDBs automaticamente para implementações que não têm um PDB, para que as respetivas cargas de trabalho fiquem protegidas durante interrupções voluntárias.
  • Aumenta temporariamente o número de réplicas quando um PDB bloqueia a expulsão de pods num nó colocado em isolamento, para que o orçamento de indisponibilidade seja respeitado e a drenagem possa prosseguir.
  • Reduz novamente o número de réplicas depois de concluídas as remoções, para que não pague por capacidade adicional além da necessária para a atualização.

O resultado é que as atualizações são concluídas com fiabilidade sem ser necessário contornar à força as proteções do PDB ou resolver manualmente nós em quarentena. Para obter contexto sobre como as atualizações do AKS esvaziam os nós e como os PDBs afetam esse processo, consulte Como funcionam as atualizações do cluster do AKS.

Quando usar a gestão automática de PDB

Considere ativar a gestão automática do PDB quando:

  • As implantações não têm PDBs. Os pods são despejados sem garantias de disponibilidade durante as atualizações, o que pode levar a tempos de inatividade.
  • Os PDBs bloqueiam o dreno do nó. Um PDB com minAvailable igual ao número de réplicas (ou maxUnavailable: 0) impede que qualquer pod seja despejado, fazendo com que a atualização falhe com um erro como Cannot evict pod as it would violate the pod's disruption budget.
  • As réplicas não são suficientes para cumprir o orçamento de indisponibilidade. O PDB existe e está configurado corretamente, mas a implementação não tem réplicas suficientes para absorver sequer uma expulsão.
  • Enfrenta falhas frequentes ao escoar durante as atualizações e pretende uma resolução automatizada e proativa em vez de limpeza manual.

Antes de ativar a gestão automática do PDB, verifique se o seu cluster está a sofrer falhas de drenagem relacionadas com o PDB:

  • Azure Activity Log. No portal Azure, abra o recurso do seu cluster AKS e selecione Registo de atividade. Procure por operações de atualização falhadas com o estado Failed e mensagens que façam referência a orçamentos de interrupção dos pods ou erros de expulsão.

  • Eventos Kubernetes. Execute o seguinte comando para encontrar eventos recentes de expulsão e drenagem:

    kubectl get events --sort-by='.lastTimestamp' -A | grep -i "disruption\|evict\|drain"
    

    Para um guia completo sobre como trabalhar com eventos Kubernetes, consulte eventos Kubernetes.

Como se compara com outras opções

Approach Comportamento Compromisso
Atualização da força Ignora completamente as proteções do PDB Risco de despejo simultâneo do pod e interrupção do serviço
Comportamento do nó não drenável Cordões e quarentenas bloqueavam os nós; A atualização continua noutros nós Requer limpeza manual dos nós em quarentena após a atualização
Sobreabastecimento Executar permanentemente réplicas adicionais da implementação (mais pods do que a carga de trabalho necessita) para que um PDB disponha sempre de capacidade disponível para permitir a remoção Custo permanente da capacidade do pod da aplicação que apenas é necessária durante as atualizações
Gestão automática de PDB (pré-visualização) Cria PDBs para implementações não protegidas e escala temporariamente as réplicas para satisfazer as restrições do PDB, depois reduz a escala Requer a extensão; adiciona capacidade transitória apenas durante o dreno

Como funciona

A gestão automática de PDB tem dois comportamentos complementares: criação automática de PDB (proativo) e escalonamento de réplicas durante o dreno (reativo).

Criação automática de PDB

Quando ativas a criação automática de PDB (controllerConfig.pdb.create=true), a extensão observa continuamente implementações que não tenham PDB. A extensão determina se existe correspondência comparando o seletor de rótulos do PDB com os rótulos do modelo de pod do Deployment. Esta comparação garante que cada implementação está protegida apenas uma vez e evita PDBs duplicados. Quando encontra uma implementação não protegida num namespace habilitado, cria um PDB. Para implementações sem HPA nem KEDA, minAvailable é definido como o número atual de réplicas da implementação. Para implementações com HPA ou KEDA, minAvailable acompanha o limite mínimo de réplicas do autoscaler para que o comportamento do PDB se mantenha alinhado com as restrições do autoscaler. A extensão reconcilia continuamente PDBs criados automaticamente, por isso, se a contagem de réplicas da implementação mudar (por exemplo, através de uma atualização manual ou de um escalador externo), o valor do minAvailable PDB é atualizado para corresponder. Esta proteção garante que os pods não sejam expulsos simultaneamente durante interrupções voluntárias.

Os PDBs auto-criados são geridos pela extensão ao longo do seu ciclo de vida. Para obter detalhes sobre a posse, a limpeza e como assumir manualmente o controlo, consulte Posse e limpeza do PDB.

Observação

A gestão automática de PDB coordena-se de forma segura com HPA e KEDA quando cada implantação é gerida por apenas um escalador automático. Para detalhes sobre como a extensão interage com cada uma, incluindo uma configuração não suportada, veja Coordenação com autoescaladores (HPA e KEDA).

Réplica de descascamento durante o dreno

A extensão monitoriza o cluster para detetar situações em que os pods protegidos por PDB não podem ser expulsos durante operações de drenagem de nós. Isto é o que acontece durante uma atualização típica:

  1. O AKS isola um nó como parte do processo de atualização, marcando-o como não programável.
  2. A extensão deteta o cordão e verifica se algum pod protegido por PDB nesse nó não tem qualquer perturbação permitida.
  3. Se o PDB bloquear a expulsão, a extensão aumenta temporariamente a contagem de réplicas da implementação pelo número de pods protegidos pelo PDB em nós cordonados (até ao limite configurado maxSurge da implementação), garantindo que o pico tem o tamanho correto e que não se sobre-provisiona. As réplicas adicionais são programadas noutros nós disponíveis.
  4. As perturbações permitidas pelo PDB aumentam acima de zero, porque o número total de grupos saudáveis agora ultrapassa o limiar do minAvailable PDB.
  5. A drenagem dos nós decorre normalmente. A API de expulsão pode agora remover pods do nó isolado sem violar o PDB.
  6. Depois de cessarem os sinais de expulsão e de as interrupções permitidas voltarem a ser superiores a zero, a extensão repõe a implementação para o número original de réplicas. A redução de escala não avança se ainda houver mais nós cercados ou se a drenagem estiver em curso. Esta condição evita a rotatividade desnecessária durante operações de drenagem de vários nós. A redução de escala acontece automaticamente após um período de recarga (padrão 60 segundos), sem necessidade de intervenção manual.

Observação

A gestão automática do PDB atua apenas em perturbações voluntárias , como atualizações de drenos e operações manuais de cordão/drenagem. Não responde a falhas de nós, quebras de pods ou outras perturbações involuntárias.

Coordenação com escaladores automáticos (HPA e KEDA)

As implantações são frequentemente geridas por um dimensionador automático. Para evitar condições de corrida em que o autoescalador reduz novamente a implantação antes de as expulsões terminarem, a extensão ajusta o mínimo do autoescalador (não apenas a contagem de réplicas) e reverte a alteração quando a drenagem estiver concluída.

Configuration Como surge a extensão Como a extensão reverte Notes
Apenas implantação Aumenta diretamente a implantação replicas. Restaura o número original de réplicas após o período de arrefecimento. Comportamento padrão quando não há autoescalador associado.
Implementação + HPA Eleva o limite mínimo do minReplicas HPA e adiciona imediatamente uma réplica, para que o HPA não reduza novamente a escala a meio da drenagem e não aguarde o seu ciclo de métricas. Restaura o original minReplicas; o HPA lida naturalmente com a redução de escala. Coordenação segura com um único HPA.
Implementação + KEDA Eleva o minReplicaCount no ScaledObject e adiciona uma réplica imediatamente, porque o KEDA tem um salto extra de latência (o KEDA sincroniza com o seu HPA, depois o HPA sincroniza com a implantação). Restaura o original minReplicaCount; a KEDA e o respetivo HPA tratam da redução da escala. Coordenação segura com um único KEDA ScaledObject.
Implementação + KEDA + um HPA separado Não suportado. O KEDA já cria o seu próprio HPA, pelo que um segundo HPA produz escritas conflitantes para a mesma implementação. A extensão assinala-se como Degraded no estado EvictionAutoScaler e não aumenta, porque não consegue coordenar com segurança dois autoscaladores a escrever no mesmo alvo. Inspecione o estado do recurso EvictionAutoScaler e remova o HPA adicional para corrigir o problema.

Para verificar a perspetiva da extensão sobre uma implementação, incluindo qualquer estado Degraded resultante de uma configuração de autoescalador não suportada:

kubectl get evictionautoscalers -A -o yaml

Pré-requisitos

Antes de instalar a extensão automática de gestão do PDB, certifique-se de que tem o seguinte:

  • Um cluster AKS a correr uma versão Kubernetes suportada.
  • Cargas de trabalho que utilizam Deployments. Os StatefulSets não são suportados, e não é recomendado usar gestão automática de PDB com StatefulSets.
  • CLI do Azure versão 2.64.0 ou posterior. Executa az --version para verificar. Para instalar ou atualizar, consulte Install CLI do Azure.
  • O Microsoft.KubernetesConfiguration fornecedor registou-se na sua subscrição.
  • O seu cluster AKS tem de usar uma identidade gerida (não um principal de serviço). As extensões de cluster não funcionam com clusters que utilizam um principal de serviço. Para mais informações, consulte extensões de cluster AKS.

Observação

A gestão automática de PDB incide apenas nos orçamentos de indisponibilidade de pods e no número de réplicas das implementações. É independente das definições de atualização do conjunto de nós, como max-surge, o tempo limite de drenagem do nó, o tempo de estabilização do nó e a estratégia de atualização (progressiva versus azul-verde). Qualquer configuração de pool de nós que funcione para o seu cluster continua a funcionar com esta extensão ativada.

Permissões de extensão

A extensão automática de gestão do PDB requer permissões para ler e escrever Deployments, Pod Disruption Budgets e Events nos namespaces que gere. A extensão instala a sua própria conta de serviço e funções RBAC durante a configuração. Para a lista completa de funções e permissões, consulte o repositório do projeto no GitHub.

Registar o fornecedor de configuração

Se nunca usou extensões do Azure Kubernetes antes, registe-se no fornecedor necessário:

az feature register --namespace Microsoft.KubernetesConfiguration --name Extensions

# Verify registration status
az feature show --namespace Microsoft.KubernetesConfiguration --name Extensions

# After the feature shows "Registered", refresh the provider
az provider register -n Microsoft.KubernetesConfiguration

Instalar gestão automática de PDB

A gestão automática do PDB está instalada como uma extensão no seu cluster AKS. Escolha uma opção de instalação conforme as suas necessidades.

Instalação básica

Instala a extensão com as definições predefinidas. Neste modo, a extensão observa expulsões bloqueadas por PDB no kube-system namespace, mas não cria automaticamente PDBs para implementações não protegidas. O espaço de nomes kube-system é incluído por predefinição porque os componentes do sistema geridos pelo AKS também utilizam PDBs que podem bloquear a drenagem de nós durante as atualizações:

az k8s-extension create \
    --cluster-name <cluster-name> \
    --cluster-type managedClusters \
    --extension-type microsoft.evictionautoscaler \
    --name eviction-autoscaler \
    --resource-group <resource-group-name> \
    --release-train stable \
    --auto-upgrade-minor-version true

Instalar com a criação automática de PDB para namespaces específicos

Ative a criação automática de PDB e especifique quais os namespaces que a extensão deve proteger. Esta é a configuração recomendada para a maioria dos clusters:

az k8s-extension create \
    --cluster-name <cluster-name> \
    --cluster-type managedClusters \
    --extension-type microsoft.evictionautoscaler \
    --name eviction-autoscaler \
    --resource-group <resource-group-name> \
    --release-train stable \
    --configuration-settings controllerConfig.pdb.create=true controllerConfig.namespaces.actionedNamespaces="{kube-system,production}" \
    --auto-upgrade-minor-version true

Instalar com proteção ao nível de todo o cluster

Ative a criação automática de PDB em todos os namespaces:

az k8s-extension create \
    --cluster-name <cluster-name> \
    --cluster-type managedClusters \
    --extension-type microsoft.evictionautoscaler \
    --name eviction-autoscaler \
    --resource-group <resource-group-name> \
    --release-train stable \
    --configuration-settings controllerConfig.pdb.create=true controllerConfig.namespaces.enabledByDefault=true \
    --auto-upgrade-minor-version true

Opções de configuração

As seguintes definições controlam como a gestão automática do PDB se comporta:

Setting Descrição Default
controllerConfig.pdb.create Criar automaticamente PDBs para implementações que não têm um. false
controllerConfig.namespaces.enabledByDefault Ative a gestão automática de PDB em todos os namespaces, incluindo os namespaces já existentes e quaisquer namespaces criados posteriormente. false
controllerConfig.namespaces.actionedNamespaces Lista de espaços de nomes separados por vírgulas a ativar quando enabledByDefault é false. Não existe um limite rígido para o número de namespaces, mas aplica-se o limite de tamanho dos objetos da API Kubernetes (~1 MiB por objeto). {kube-system}

Padrões de configuração comuns

Pattern Settings Caso de utilização
Conservador pdb.create=false, enabledByDefault=false, actionedNamespaces={kube-system} Geres os PDBs manualmente e queres o autoscaling apenas para cargas de trabalho do sistema.
Proteção automática direcionada (recomendado) pdb.create=true, enabledByDefault=false, actionedNamespaces={production,staging} Queres criação automática de PDB e autoescalonamento em namespaces específicos.
Proteção em todo o cluster pdb.create=true, enabledByDefault=true Queres que todos os espaços de nomes sejam protegidos automaticamente.
Apenas monitorização pdb.create=false, enabledByDefault=true Queres autoescalar em todos os namespaces, mas gere os PDBs tu mesmo.

Controlo de espaço de nomes

A extensão opera em dois modos, dependendo da enabledByDefault definição.

Dois controlos complementares governam em que namespaces a extensão atua:

  • controllerConfig.namespaces.actionedNamespaces define a lista base no momento da instalação e é a forma mais fácil de ativar um conjunto conhecido de namespaces.
  • A anotação de namespace eviction-autoscaler.azure.com/enable (ou disable) permite aos operadores do cluster incluir ou excluir namespaces em tempo de execução sem reinstalar a extensão.

Modo opt-in (por defeito)

Quando enabledByDefault é false, apenas os namespaces listados em actionedNamespaces estão ativados. Pode ativar namespaces adicionais individualmente adicionando uma anotação:

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
  annotations:
    eviction-autoscaler.azure.com/enable: "true"

Modo de desativação

Quando enabledByDefault é true, todos os namespaces estão ativados. Pode excluir espaços de nomes específicos adicionando uma anotação:

apiVersion: v1
kind: Namespace
metadata:
  name: my-excluded-namespace
  annotations:
    eviction-autoscaler.azure.com/enable: "false"

Excluir implementações específicas

Para evitar que a extensão crie um PDB para uma implementação específica, adicione a seguinte anotação à implementação:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
  annotations:
    eviction-autoscaler.azure.com/pdb-create: "false"

Observação

A gestão automática de PDBs ignora automaticamente a criação de PDB para implementações que tenham maxUnavailable (exceto 0) na sua estratégia de atualizações contínuas, porque tais implementações já toleram algum nível de tempo de inatividade.

Criação automática de PDB

Quando controllerConfig.pdb.create está definido como true, a extensão cria PDBs para implementações que cumprem todos os seguintes critérios:

  • A implementação ainda não tem um PDB correspondente.
  • A implementação está num namespace habilitado.
  • A implementação não é excluída através da eviction-autoscaler.azure.com/pdb-create: "false" anotação.

Os PDBs criados automaticamente são definidos minAvailable com base na origem do dimensionamento da carga de trabalho. Para implementações sem HPA ou KEDA, minAvailable corresponde à contagem atual de réplicas da implementação (excluindo quaisquer réplicas de pico adicionadas pela extensão). Para implementações com HPA ou KEDA, minAvailable corresponde ao limite mínimo de réplicas do autoescalador. Isto significa que a expulsão é bloqueada até que a extensão aumente a implantação, altura em que as réplicas extra satisfazem o orçamento e permitem que o dreno prossiga.

Propriedade e limpeza do PDB

Os PDBs criados pela extensão são assinalados com uma ownedBy: EvictionAutoScaler anotação. Estes PDBs detidos pelo controlador são automaticamente eliminados quando:

  • A implementação principal é eliminada.
  • O namespace é removido do âmbito da extensão.
  • A extensão é removida do cluster. Os PDBs com a ownedBy: EvictionAutoScaler anotação são limpos através da recolha de lixo do Kubernetes.

Os PDBs que crias manualmente nunca são modificados ou eliminados pela extensão.

Para assumir o controlo manual de um PDB criado pela extensão, remova a anotação de proprietário. Depois de remover esta anotação, a extensão deixa de gerir esse PDB, e você é responsável por atualizá-lo ou eliminá-lo:

kubectl annotate pdb <pdb-name> -n <namespace> ownedBy-

Verifique a instalação

Depois de instalar a extensão, verifique se a gestão automática do PDB está a funcionar corretamente.

  1. Verifique se os PDBs foram criados para implementações em namespaces habilitados. Filtro para PDBs criados pela extensão:

    kubectl get pdb -A -o custom-columns=NAME:.metadata.name,NAMESPACE:.metadata.namespace,MIN-AVAILABLE:.spec.minAvailable,OWNER:.metadata.annotations.ownedBy | grep EvictionAutoScaler
    
  2. Verifique os recursos personalizados de gestão automática do PDB:

    kubectl get evictionautoscalers --all-namespaces
    
  3. Teste com um cordão de nós (opcional). Num ambiente de teste ou de pré-produção, marque um nó como indisponível para agendamento e verifique se a extensão aumenta a escala da implementação e se as interrupções permitidas pelo PDB ficam acima de zero:

    # Cordon a node
    NODE=$(kubectl get pods -n <namespace> -l app=<app-label> -o=jsonpath='{.items[0].spec.nodeName}')
    kubectl cordon $NODE
    
    # Watch for automatic PDB management events
    kubectl get events -n <namespace> --sort-by='.lastTimestamp'
    
    # Check that the deployment scaled up
    kubectl get pods -n <namespace>
    
    # Verify PDB allowed disruptions
    kubectl get poddisruptionbudget <pdb-name> -n <namespace> -o yaml
    
    # After verification, uncordon the node
    kubectl uncordon $NODE
    

Atualize ou remova a extensão

Atualizar configuração

Para alterar as definições, apague e recrie a extensão com as novas definições:

# Delete the existing extension
az k8s-extension delete \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --cluster-type managedClusters \
    --name eviction-autoscaler \
    --yes

# Recreate with new configuration
az k8s-extension create \
    --cluster-name <cluster-name> \
    --cluster-type managedClusters \
    --extension-type microsoft.evictionautoscaler \
    --name eviction-autoscaler \
    --resource-group <resource-group-name> \
    --release-train stable \
    --configuration-settings controllerConfig.pdb.create=true controllerConfig.namespaces.enabledByDefault=true \
    --auto-upgrade-minor-version true

Remover a extensão

Para desinstalar a gestão automática do PDB:

az k8s-extension delete \
    --resource-group <resource-group-name> \
    --cluster-name <cluster-name> \
    --cluster-type managedClusters \
    --name eviction-autoscaler \
    --yes

Observação

Quando removes a extensão, os PDBs criados automaticamente (marcados com a ownedBy: EvictionAutoScaler anotação) são limpos automaticamente. Para mais detalhes, consulte a titularidade e limpeza do PDB.

Limitações e considerações

  • As atualizações de configuração exigem a eliminação e recriação da extensão.
  • A gestão automática do PDB funciona apenas com Deployments. Os StatefulSets não são suportados, e não é recomendado usar esta extensão com o StatefulSets.
  • A gestão automática dos PDBs não sobrepõe nem modifica os PDBs existentes. Funciona a par deles, ajustando o número de réplicas.
  • A gestão automática do PDB coordena-se com um único escalador automático por implantação (HPA ou KEDA). Uma implantação gerida pela KEDA e um HPA separado não é suportada; A extensão marca sozinha Degraded e evita o aumento de intensidade. Ver Coordenação com autoescaladores (HPA e KEDA).
  • A gestão automática do PDB é independente das definições de atualização do pool de nós. Definições como max-surge, o tempo limite de drenagem do nó, o tempo de absorção do nó e a estratégia de atualização (rolar versus azul-verde) não precisam de ser alteradas para que esta extensão funcione, e a extensão não altera o comportamento dessas definições.
  • A ampliação temporária da réplica requer capacidade disponível no cluster. Se nenhum nó tiver espaço para os pods adicionais, considere ativar o autoescalador do cluster ou o aprovisionamento automático de nós (NAP) para que novos nós possam ser aprovisionados.

Troubleshooting

Para sintomas, causas e resoluções, consulte o AKS troubleshooting hub: Troubleshoot Azure Kubernetes Service.

Para inspecionar a atividade das extensões diretamente no cluster, execute:

kubectl get evictionautoscalers -A -o yaml
kubectl get events -A --sort-by='.lastTimestamp'