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_UNSAFE
eK8S_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
,SubjectAccessReviews
eCertificateSigningRequests
.
- 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. Caso tenha se passado menos de 24 horas desde que você implementou a orientação da recomendação, marque-a como resolvida. 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_NAMESPACE
Substitua 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_NAMESPACE
Ou execute este comando:
kubectl get pods -n SERVICE_NAMESPACE -o wide
Para 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
kubectl
a seguir para conseguir a configuração do webhook, substituindo CONFIGURATION_NAME pelo nome da configuração do webhook:kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
Se esse comando não retornar nada, execute o comando novamente, substituindo
validatingwebhookconfigurations
pormutatingwebhookconfigurations
.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
scope
for*
. Ou um webhook será sinalizado se o escopo forNamespaced
e uma das seguintes condições for verdadeira:A condição
operator
éNotIn
, evalues
omitekube-system
ekube-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: 3
Verifique se
scope
está definido comoNamespaced
(e não*
), para que o webhook opere apenas em namespaces específicos. Além disso, seoperator
forNotIn
, incluakube-system
ekube-node-lease
emvalues
(neste exemplo, comblue-system
).A condição
operator
éIn
evalues
incluikube-system
ekube-node-lease
, como no exemplo a seguir:namespaceSelector: matchExpressions: - key: kubernetes.io/metadata.name operator: In values: - blue-system - kube-system - kube-node-lease
Verifique se
scope
está definido comoNamespaced
(não*
), para que o webhook opere apenas em namespaces específicos. Seoperator
forIn
, não incluakube-system
ekube-node-lease
emvalues
. Neste exemplo, somenteblue-system
precisa estar emvalues
, já queoperator
éIn
.
Excluir recursos correspondentes
Um webhook também será sinalizado se
nodes
,tokenreviews
,subjectaccessreviews
oucertificatesigningrequests
estiverem listados em "Recursos", como no seguinte exemplo:- admissionReviewVersions: ... resources: - 'pods' - 'nodes' - 'tokenreviews' - 'subjectacessreviews' - 'certificatesigningrequests' scope: '*' sideEffects: None timeoutSeconds: 3
Remova
nodes
,tokenreviews
,subjectaccessreviews
ecertificatesigningrequests
da seção de recursos. Você pode manterpods
emresources
.