Resolver problemas do webhook de admissão

Nesta página, mostramos como resolver problemas com o webhook de admissão do Config Sync. Para saber mais sobre o webhook, consulte Evitar desvio de configuração.

Resolver erros do KNV 2009

As seções a seguir ajudam você a resolver erros KNV2009.

Conexão do webhook de entrada recusada

Se a proteção contra desvio estiver ativada, você poderá receber o seguinte erro quando o reconciliador tentar 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

Esse erro significa que o webhook de admissão ainda não está pronto ou não está íntegro. Em geral, é um erro temporário que você talvez você veja ao inicializar o Config Sync.

Se o problema persistir, consulte a implantação do webhook de admissão para ver se os pods podem ser programados e estão íntegros.

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

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

Uma implantação com pods íntegros tem uma saída semelhante a esta:

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

Tempo limite de solicitação de webhook de admissão

Se você receber um erro semelhante ao seguinte quando o reconciliador tentar aplicar uma configuração ao cluster, a porta do webhook de admissão 8676 poderá ser bloqueada pelo firewall na rede do plano de controle:

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 esse problema, adicione uma regra de firewall para autorizar a porta 8676, que o webhook de admissão do Config Sync usa para a prevenção de deslocamento. A porta 8676 precisa estar aberta no plano de controle para os nós porque o plano de controle precisa ser capaz de alcançar o back-end do webhook nos nós do cluster.

O webhook de admissão negou uma solicitação

Se você receber o seguinte erro ao tentar aplicar uma alteração a um campo que o Config Sync gerencia, é possível que tenha feito uma alteração conflitante:

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 a proteção contra desvio estiver ativada, quando você declarar um campo em uma configuração e seu repositório estiver sincronizado com um cluster, o Config Sync gerenciará esse campo. Qualquer alteração que você tentar fazer nesse campo será uma alteração conflitante.

Por exemplo, se você tiver uma configuração de implantação no seu repositório com um rótulo environment:prod e tentar alterar esse rótulo para environment:dev no seu cluster, haverá um conflito e a mensagem de erro anterior. No entanto, se você adicionar um novo rótulo (por exemplo, tier:frontend) à implantação, não haverá conflito.

Para que o Config Sync ignore qualquer alteração em um objeto, adicione a anotação descrita em Como ignorar mutações de objetos.

Falha ao excluir todos os tipos de recursos

Um namespace preso 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

Esse erro acontece quando você tenta excluir um objeto Namespace de um repositório raiz, mas alguns objetos no namespace ainda são gerenciados ativamente por um reconciliador de namespace. Quando um namespace é excluído, o controlador de namespace, que tem a conta de serviço system:serviceaccount:kube-system:namespace-controller, tenta excluir todos os objetos nesse namespace. No entanto, o webhook de admissão do Config Sync só permite que o reconciliador de raiz ou de namespace exclua esses objetos e nega o controlador de namespaces para excluí-los.

Para resolver esse problema, exclua o webhook de admissão do Config Sync:

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

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

Se essa solução alternativa não funcionar, talvez seja necessário reinstalar o Config Sync.

Para evitar que o erro se repita, remova o repositório de namespace antes de remover o namespace.

A seguir