Webhooks de admissãowebhooks no Kubernetes, são um tipo decontrolador
de admissão ,
que pode ser usado em clusters do Kubernetes para validar ou modificar solicitações para o
plano de controle antes que uma solicitação seja mantida. É comum que aplicativos de terceiros usem webhooks que operam em recursos e namespaces críticos para o sistema. Os webhooks configurados incorretamente podem afetar o desempenho e a confiabilidade
do plano de controle. Por exemplo, um webhook configurado incorretamente,
criado por um aplicativo de terceiros, pode impedir que o GKE crie e
modifique recursos no namespace kube-system gerenciado, o que pode prejudicar
a funcionalidade do cluster.
O Google Kubernetes Engine (GKE) monitora os clusters e usa o serviço do recomendador para fornecer orientações sobre como otimizar o uso da plataforma. Para garantir que o cluster permaneça estável e funcionando, consulte as recomendações do GKE para os seguintes cenários:
- Webhooks que funcionam, mas não têm endpoints disponíveis.
- Webhooks considerados não seguros quando operam em recursos e namespaces críticos do sistema.
Com essa orientação, é possível ver instruções sobre como verificar e atualizar webhooks potencialmente mal configurados, se necessário.
Para saber mais sobre como gerenciar insights e recomendações dos Recommenders, consulte Otimizar o uso do GKE com insights e recomendações.
Identifique webhooks mal configurados que podem afetar o cluster
Para conseguir insights que identificam webhooks que podem afetar o desempenho e a estabilidade do cluster, siga as instruções para ver insights e recomendações. É possível conseguir insights das seguintes maneiras:
- Use o console do Google Cloud .
- Use a Google Cloud CLI ou a API Recommender filtrando com os
subtipos
K8S_ADMISSION_WEBHOOK_UNSAFEeK8S_ADMISSION_WEBHOOK_UNAVAILABLE.
Depois de identificar os webhooks com os insights, siga as instruções para resolver problemas com os webhooks detectados.
Quando o GKE detecta webhooks mal configurados
O GKE gera um insight e uma recomendação se um dos critérios a seguir for verdadeiro para um cluster:
K8S_ADMISSION_WEBHOOK_UNAVAILABLE: o cluster do GKE tem um ou mais webhooks que relatam que não há endpoints disponíveis. Siga as instruções para verificar os webhooks que relatam que não há endpoints disponíveis.K8S_ADMISSION_WEBHOOK_UNSAFE: o cluster do GKE tem um ou mais webhooks que são considerados não seguros com base nos recursos que interceptam. Siga as instruções para verificar os webhooks que são considerados perigosos. Os webhooks abaixo são considerados não seguros:- Webhooks que interceptam recursos, incluindo pods e leases, no namespace
kube-system. - Webhooks que interceptam leases no namespace
kube-node-lease. - Webhooks que interceptam recursos do sistema com escopo de cluster, incluindo
Nodes,TokenReviews,SubjectAccessReviewseCertificateSigningRequests.
- Webhooks que interceptam recursos, incluindo pods e leases, no namespace
Resolver problemas dos webhooks detectados
As seções a seguir têm instruções para você solucionar problemas de webhooks que o GKE detectou como possivelmente configurados incorretamente.
Depois que você implementar as instruções e os webhooks forem configurados corretamente, a recomendação será resolvida em até 24 horas e não aparecerá mais no console.
Se você não quiser implementar a recomendação, dispense-a.
Não há endpoints disponíveis nos relatórios de webhooks
Se um webhook informar que não tem endpoints disponíveis, o serviço que está apoiando o endpoint do webhook terá um ou mais pods que não estão em execução. Para disponibilizar os endpoints do webhook, siga as instruções para encontrar e resolver problemas de pods do serviço que fazem isso:
Acesse insights e recomendações escolhendo um insight de cada vez para resolver problemas. O GKE gera um insight por cluster, que lista um ou mais webhooks com um endpoint corrompido que precisam ser investigados. Para cada um desses webhooks, o insight também informa o nome do serviço, qual endpoint está corrompido e a última vez em que o endpoint foi chamado.
Encontre os pods de exibição do serviço associado ao webhook:
Console
No painel da barra lateral do insight, confira a tabela de webhooks configurados incorretamente. Clique no nome do Serviço.
kubectl
Execute o comando a seguir para descrever o Serviço:
kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACESubstitua SERVICE_NAME e SERVICE_NAMESPACE pelo nome e namespace do serviço, respectivamente.
Se você não encontrar o nome do serviço listado no webhook, o endpoint indisponível poderá ser causado por uma incompatibilidade entre o nome listado na configuração e o nome real do serviço. Para corrigir a disponibilidade do endpoint, atualize o nome do serviço na configuração do webhook para corresponder ao objeto de serviço correto.
Inspecione os pods de exibição para este serviço:
Console
Em Como exibir pods, em Detalhes do serviço, consulte a lista de pods que dão suporte a esse serviço.
kubectl
Identifique quais pods não estão em execução listando a implantação ou os pods:
kubectl get deployment -n SERVICE_NAMESPACEOu execute este comando:
kubectl get pods -n SERVICE_NAMESPACE -o widePara qualquer pod que não esteja em execução, inspecione os registros do pod para ver por que o pod não está em execução. Para instruções sobre problemas comuns com pods, consulte Como solucionar problemas com cargas de trabalho implantadas.
Webhooks considerados não seguros
Se um webhook estiver interceptando qualquer recurso em namespaces gerenciados pelo sistema ou determinados tipos de recursos, o GKE considerará isso não seguro e recomenda que você atualize os webhooks para evitar a interceptação recursos.
- Siga as instruções para acessar insights e recomendações, escolhendo um insight de cada vez para resolver problemas. O GKE só gera um insight por cluster, que lista uma ou mais configurações de webhook, cada uma listando um ou mais webhooks. Para cada configuração de webhook listada, o insight indica o motivo da sinalização da configuração.
Inspecione a configuração do webhook:
Console
No painel da barra lateral do insight, acesse a tabela. Em cada linha está o nome da configuração do webhook e o motivo da sinalização dessa configuração.
Para inspecionar cada configuração, clique no nome para acessá-la no painel do Navegador de objetos do GKE.
kubectl
Execute o comando
kubectla seguir para conseguir a configuração do webhook, substituindo CONFIGURATION_NAME pelo nome da configuração do webhook:kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yamlSe esse comando não retornar nada, execute o comando novamente, substituindo
validatingwebhookconfigurationspormutatingwebhookconfigurations.Na seção
webhooks, há um ou mais webhooks listados.Edite a configuração, dependendo do motivo da sinalização do webhook:
Excluir namespaces kube-system e kube-node-lease
Um webhook será sinalizado se
scopefor*. Ou um webhook será sinalizado se o escopo forNamespacede uma das seguintes condições for verdadeira:A condição
operatoréNotIn, evaluesomitekube-systemekube-node-lease, como no exemplo a seguir:webhooks: - admissionReviewVersions: ... namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: NotIn values: - blue-system objectSelector: {} rules: - apiGroups: ... scope: '*' sideEffects: None timeoutSeconds: 3Verifique se
scopeestá definido comoNamespaced(e não*), para que o webhook opere apenas em namespaces específicos. Além disso, seoperatorforNotIn, incluakube-systemekube-node-leaseemvalues(neste exemplo, comblue-system).A condição
operatoréInevaluesincluikube-systemekube-node-lease, como no exemplo a seguir:namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - blue-system - kube-system - kube-node-leaseVerifique se
scopeestá definido comoNamespaced(não*), para que o webhook opere apenas em namespaces específicos. SeoperatorforIn, não incluakube-systemekube-node-leaseemvalues. Neste exemplo, somenteblue-systemprecisa estar emvalues, já queoperatoréIn.
Excluir recursos correspondentes
Um webhook também será sinalizado se
nodes,tokenreviews,subjectaccessreviewsoucertificatesigningrequestsestiverem listados em "Recursos", como no seguinte exemplo:- admissionReviewVersions: ... resources: - 'pods' - 'nodes' - 'tokenreviews' - 'subjectaccessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3Remova
nodes,tokenreviews,subjectaccessreviewsecertificatesigningrequestsda seção de recursos. Você pode manterpodsemresources.
Webhooks que bloqueiam componentes essenciais do sistema
Os webhooks que interceptam solicitações para criar ou atualizar ClusterRoles e ClusterRoleBindings podem interferir na capacidade do plano de controle de reconciliar esses recursos críticos do sistema. Por exemplo, durante um upgrade de cluster, o
kube-apiserver pode precisar atualizar as funções do sistema. Se um webhook indisponível ou configurado incorretamente bloquear essa atualização, o kube-apiserver não ficará íntegro, o que vai impedir o upgrade do cluster.
O GKE não detecta se os webhooks interceptam ClusterRoles e
ClusterRoleBindings. Portanto, nenhum insight é gerado para esse cenário.
O exemplo a seguir mostra uma configuração de webhook problemática que intercepta ClusterRoles:
- admissionReviewVersions:
...
resources:
- 'clusterroles'
- 'clusterrolebindings'
scope: '*'
sideEffects: None
timeoutSeconds: 3
Para evitar essa situação, verifique se os webhooks não interceptam solicitações de
ClusterRoles e ClusterRoleBindings que têm a configuração system: prefix.
Impasse de admissão
Quando um webhook é configurado para falhar fechado, ele pode criar uma situação em que o cluster não consegue se recuperar automaticamente. Por exemplo, se todos os nós de um cluster forem excluídos, o webhook também ficará inativo. Como a adição de um novo nó exige validação de admissão, o webhook precisa estar disponível para aprovar a solicitação. Isso cria uma dependência circular que pode impedir a recuperação do plano de controle do cluster.
O GKE não detecta cenários de deadlock de admissão, então nenhum insight é gerado para esse cenário. No entanto, um impasse de admissão pode ocorrer se
os pods de webhook estiverem inativos. Nesse caso, o GKE detecta que o
webhook não tem endpoints disponíveis e gera um insight K8S_ADMISSION_WEBHOOK_UNAVAILABLE.
Para evitar isso, exclua o ValidatingWebhookConfiguration para interromper
a dependência circular e permitir que o cluster seja recuperado.
Disponibilidade do plano de controle do cluster
Quando um webhook é configurado para falhar fechado, a disponibilidade do plano de controle do Kubernetes depende da disponibilidade do webhook. Para melhorar a disponibilidade do plano de controle, considere o seguinte:
O GKE não detecta problemas de disponibilidade do plano de controle do cluster causados por webhooks. Portanto, não é possível gerar insights para esse cenário.
Limite o escopo do webhook:é possível isentar recursos críticos da validação pelo webhook para evitar que ele interfira em processos sensíveis. É possível isentar namespaces ou tipos específicos de recursos. No entanto, fique atento a dependências não óbvias. Por exemplo, um
ConfigMappode ser um recurso essencial para a eleição de líderes no Kubernetes.Reforce a implantação do webhook:executar o webhook em vários pods pode aumentar a resiliência e o tempo de atividade dele. É possível usar seletores de nós para distribuir os pods em diferentes domínios de falha.
A seguir
- Otimize seu uso do GKE com insights e recomendações
- Como solucionar problemas comuns
- Autenticar nas APIs do Google Cloud com cargas de trabalho do GKE
- Saiba mais sobre a descontinuação de recursos e APIs