Resolva problemas do webhook de admissão

Esta página mostra como resolver problemas com o webhook de admissão do Config Sync. Para saber mais sobre o webhook, consulte o artigo Evite a deriva da configuração.

Resolva problemas de erros KNV 2009

As secções seguintes ajudam a resolver os erros KNV2009.

Ligação de webhook de admissão recusada

Se tiver a proteção contra desvio ativada, pode receber o seguinte erro quando o reconciliador tenta aplicar uma configuração ao cluster:

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post "https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s": dial tcp 10.92.2.14:8676: connect: connection refused

Este erro significa que o webhook de admissão ainda não está pronto ou ficou indisponível. Normalmente, trata-se de um erro transitório que pode ver quando inicia o Config Sync.

Se o problema persistir, descreva a implementação do webhook de admissão para ver se os respetivos pods podem ser agendados e estão em bom estado:

kubectl describe deploy admission-webhook -n config-management-system

kubectl get pods -n config-management-system -l app=admission-webhook

Uma implementação com pods em bom estado tem uma saída semelhante à seguinte:

Replicas:               2 desired | 2 updated | 2 total | 2 available | 0 unavailable
...
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
...

Tempo limite de E/S do pedido de webhook de admissão

Se receber um erro semelhante ao seguinte quando o reconciliador tenta aplicar uma configuração ao cluster, a porta do webhook de admissão 8676 pode estar bloqueada pela firewall à rede do plano de controlo:

KNV2009: Internal error occurred: failed calling webhook "v1.admission-webhook.configsync.gke.io": Post https://admission-webhook.config-management-system.svc:8676/admission-webhook?timeout=3s: dial tcp 10.1.1.186:8676: i/o timeout

Para resolver este problema, adicione uma regra de firewall para permitir a porta 8676, que o webhook de admissão da sincronização de configuração usa para prevenção de desvio. A porta 8676 tem de estar aberta do plano de controlo para os nós, porque o plano de controlo tem de conseguir alcançar o back-end do webhook nos nós do cluster.

O webhook de admissão recusou um pedido

Se receber o seguinte erro quando tentar aplicar uma alteração a um campo que o Config Sync gere, pode ter feito uma alteração em conflito:

error: OBJECT could not be patched: admission webhook "v1.admission-webhook.configsync.gke.io"
denied the request: fields managed by Config Sync can not be modified

Se tiver a proteção contra desvio ativada, quando declara um campo numa configuração e o seu repositório está sincronizado com um cluster, o Config Sync gere esse campo. Qualquer alteração que tente fazer a esse campo é uma alteração em conflito.

Por exemplo, se tiver uma configuração de implementação no seu repositório com uma etiqueta de environment:prod e tentar alterar essa etiqueta para environment:dev no seu cluster, haveria uma alteração em conflito e receberia a mensagem de erro anterior. No entanto, se adicionar uma nova etiqueta (por exemplo, tier:frontend) à implementação, não haverá conflito.

Se quiser que o Config Sync ignore quaisquer alterações a um objeto, pode adicionar a anotação descrita em Ignorar mutações de objetos.

Falha ao eliminar todos os tipos de recursos

Um espaço de nomes bloqueado na fase Terminating tem a seguinte condição:

    message: 'Failed to delete all resource types, 1 remaining: admission webhook
      "v1.admission-webhook.configsync.gke.io" denied the request: system:serviceaccount:kube-system:namespace-controller
      is not authorized to delete managed resource "_configmap_bookstore_cm1"'
    reason: ContentDeletionFailed
    status: "True"
    type: NamespaceDeletionContentFailure

Este erro ocorre quando está a tentar eliminar um objeto Namespace de um repositório raiz, mas alguns objetos no espaço de nomes ainda estão ativamente geridos por um reconciliador de espaço de nomes. Quando um espaço de nomes é eliminado, o controlador do espaço de nomes, cuja conta de serviço é system:serviceaccount:kube-system:namespace-controller, tenta eliminar todos os objetos nesse espaço de nomes. No entanto, o webhook de admissão do Config Sync só permite que o reconciliador de raiz ou de espaço de nomes elimine estes objetos e impede que o controlador de espaço de nomes elimine estes objetos.

Para contornar este problema, elimine o webhook de admissão do Config Sync:

kubectl delete deployment.apps/admission-webhook -n config-management-system

O operador ConfigManagement recria o webhook de admissão do Config Sync.

Se esta solução alternativa não funcionar, pode ter de reinstalar o Config Sync.

Para evitar voltar a receber o erro, remova o repositório do espaço de nomes antes de remover o espaço de nomes.

O que se segue?

  • Se continuar a ter problemas, verifique se o seu problema é um problema conhecido.

  • Se não conseguir encontrar uma solução para o seu problema na documentação, consulte a secção Obter apoio técnico para obter mais ajuda, incluindo aconselhamento sobre os seguintes tópicos: