Em determinadas condições, as políticas de PodDisruptionBudgets (PDB) podem impedir que os nós sejam removidos com êxito dos conjuntos de nós.
Nestas condições, o estado do nó indica Ready,SchedulingDisabled
apesar de ter sido removido. Este documento mostra como remover nós dos seus clusters do Google Distributed Cloud que estão atualmente bloqueados por problemas de PDB.
Esta página destina-se a administradores, arquitetos e operadores que gerem o ciclo de vida da infraestrutura tecnológica subjacente e respondem a alertas e páginas quando os objetivos de nível de serviço (SLOs) não são cumpridos ou as aplicações falham. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no Google Cloud conteúdo, consulte o artigoFunções e tarefas comuns do utilizador do GKE.
O PDB está em conflito com o número de agrupamentos disponíveis
As políticas de PDB ajudam a garantir o desempenho da app, impedindo que os pods fiquem inativos ao mesmo tempo quando faz alterações ao sistema. Consequentemente, as políticas de PDB limitam o número de pods simultaneamente indisponíveis numa aplicação replicada.
No entanto, a política de PDB pode, por vezes, impedir as eliminações de nós que quer fazer se violar a política ao remover um nó.
Por exemplo, uma política de PDB pode definir que devem estar sempre disponíveis dois pods no sistema (.spec.minAvailable
é 2). No entanto, se tiver apenas dois pods e tentar remover o nó que contém um deles, a política PDB entra em vigor e impede a remoção do nó.
Da mesma forma, quando a política PDB define que nenhum Pod deve estar indisponível
(.spec.maxUnavailable
é 0), a política também impede que quaisquer nós associados sejam eliminados. Mesmo que tente remover um único pod de cada vez, a política PDB impede a eliminação do nó afetado.
Desative e reative a política de PDB
Para resolver um conflito de PDB, faça uma cópia de segurança e, em seguida, remova a política de PDB. Depois de o PDB ser eliminado com êxito, o nó é esvaziado e os pods associados são removidos. Em seguida, pode fazer as alterações pretendidas e reativar a política de PDB.
O exemplo seguinte mostra como eliminar um nó nesta condição, o que pode afetar todos os tipos de clusters do Google Distributed Cloud: clusters de administrador, híbridos, autónomos e de utilizador.
O mesmo procedimento geral funciona para todos os tipos de clusters. No entanto, os comandos específicos para eliminar um nó de um conjunto de nós do cluster de administrador (para clusters de administrador, híbridos ou autónomos) variam ligeiramente dos comandos para eliminar um nó de um conjunto de nós do cluster de utilizador.
Para facilitar a leitura, a variável
${KUBECONFIG}
é usada nos seguintes comandos.Consoante o tipo de cluster, exporte o caminho kubeconfig do cluster de administrador (
ADMIN_KUBECONFIG
) ou o caminho kubeconfig do cluster de utilizador (USER_CLUSTER_CONFIG
) para$(KUBECONFIG)
e conclua os seguintes passos:- Para eliminar um nó de um cluster de utilizadores, defina
export KUBECONFIG=USER_CLUSTER_CONFIG
- Para eliminar o nó de um cluster de administrador, defina
export KUBECONFIG=ADMIN_KUBECONFIG
.
- Para eliminar um nó de um cluster de utilizadores, defina
Opcional: se estiver a eliminar um nó de um grupo de nós do cluster de utilizadores, execute o seguinte comando para extrair o ficheiro kubeconfig do cluster de utilizadores:
kubectl --kubeconfig ADMIN_KUBECONFIG -n cluster-USER_CLUSTER_NAME \ get secret USER_CLUSTER_NAME-kubeconfig \ -o 'jsonpath={.data.value}' | base64 -d > USER_CLUSTER_CONFIG
Substitua as seguintes entradas por informações específicas do seu ambiente de cluster:
ADMIN_KUBECONFIG
: o caminho para o ficheiro kubeconfig do cluster de administrador.CLUSTER_NAME
: o nome do cluster do qual quer tirar uma captura de ecrã.USER_CLUSTER_CONFIG
: o caminho para o ficheiro de configuração do cluster do utilizador.
Depois de remover o nó do conjunto de nós, verifique o estado do nó. O nó afetado comunica
Ready, SchedulingDisabled
:kubectl get nodes --kubeconfig ${KUBECONFIG}
O estado do nó tem um aspeto semelhante ao seguinte exemplo de resultado:
NAME STATUS ROLES AGE VERSION CP2 Ready Master 11m v.1.18.6-gke.6600 CP3 Ready,SchedulingDisabled <none> 9m22s v.1.18.6-gke.6600 CP4 Ready <none> 9m18s v.1.18.6-gke.6600
Verifique os PDBs no seu cluster:
kubectl get pdb --kubeconfig ${KUBECONFIG} -A
O sistema comunica PDBs semelhantes aos apresentados no seguinte exemplo de resultado:
NAMESPACE NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE gke-system istio-ingress 1 N/A 1 19m gke-system istiod 1 N/A 1 19m kube-system coredns 1 N/A 0 19m kube-system log-aggregator N/A 0 0 19m kube-system prometheus N/A 0 0 19m
Inspecione a PDB. Encontrar uma correspondência entre a etiqueta Pod no PDB e os Pods correspondentes no nó. Esta correspondência garante que desativa a PDB correta para remover o nó com êxito:
kubectl --kubeconfig ${KUBECONFIG} get pdb log-aggregator -n kube-system -o 'jsonpath={.spec}'
O sistema devolve resultados de etiquetas correspondentes na política de PDB:
{"maxUnavailable":0,"selector":{"matchLabels":{"app":"stackdriver-log-aggregator"}}}
Encontre pods que correspondam à etiqueta da política de PDB:
kubectl --kubeconfig ${KUBECONFIG} get pods -A --selector=app=stackdriver-log-aggregator \ -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}'
O comando devolve uma lista de pods que correspondem à etiqueta PDB e valida a política PDB que tem de remover:
stackdriver-log-aggregator-0 CP3 stackdriver-log-aggregator-1 CP3
Depois de confirmar o Pod afetado, faça uma cópia de segurança da política de PDB. O exemplo seguinte apoia a política
log-aggregator
:kubectl get pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system \ -o yaml >> log-aggregator.yaml
Elimine a política de PDB específica. Mais uma vez, os exemplos seguintes eliminam a política
log-aggregator
:kubectl delete pdb log-aggregator --kubeconfig ${KUBECONFIG} -n kube-system
Depois de eliminar a política de PDB, o nó começa a esvaziar-se. No entanto, a eliminação completa do nó pode demorar até 30 minutos. Continue a verificar o estado do nó para confirmar que o processo foi concluído com êxito.
Se quiser remover o nó permanentemente e também remover os recursos de armazenamento associados ao nó, pode fazê-lo antes de restaurar a política de PDB. Para mais informações, consulte o artigo Remova recursos de armazenamento.
Restaure a política de PDB a partir da sua cópia:
kubectl apply -f log-aggregator.yaml --kubeconfig ${KUBECONFIG}
Confirme se os pods eliminados são recriados com êxito. Neste exemplo, se existissem dois
stackdriver-log-aggregator-x
Pods, estes seriam recriados:kubectl get pods -o wide --kubeconfig ${KUBECONFIG} -A
Se quiser restaurar o nó, edite a configuração do conjunto de nós adequada e restaure o endereço IP do nó.
Remova recursos de armazenamento de nós eliminados permanentemente
Se eliminar permanentemente um nó e não quiser restaurá-lo no seu sistema, também pode eliminar os recursos de armazenamento associados a esse nó.
Verifique e obtenha o nome do volume persistente (PV) associado ao nó:
kubectl get pv --kubeconfig ${KUBECONFIG} \ -A -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{.spec.claimRef.name}{":\t"} \ {.spec.nodeAffinity.required.nodeSelectorTerms[0].matchExpressions[0].values}{"\n"}{end}'
Elimine o PV associado ao nó:
kubectl delete pv PV_NAME --kubeconfig ${KUBECONFIG}
Substitua
PV_NAME
pelo nome do volume persistente a eliminar.
O que se segue?
Se precisar de assistência adicional, contacte o apoio ao cliente do Google Cloud. Também pode consultar o artigo Receber apoio técnico para mais informações sobre recursos de apoio técnico, incluindo o seguinte:
- Requisitos para abrir um registo de apoio ao cliente.
- Ferramentas para ajudar a resolver problemas, como a configuração do ambiente, os registos e as métricas.
- Componentes suportados.