Soluciona problemas relacionados con el webhook de admisión

En esta página, se muestra cómo resolver problemas con el webhook de admisión del Sincronizador de configuración. Para obtener más información sobre el webhook, consulta Evita la deriva de configuración.

Soluciona problemas de KNV 2009

En las siguientes secciones, encontrarás ayuda para resolver errores KNV2009.

Se rechazó la conexión de webhook de admisión

Si tienes habilitada la protección contra la deriva, es posible que recibas el siguiente error cuando el conciliador intente aplicar una configuración al clúster:

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 error significa que el webhook de admisión aún no está listo o dejó de estar en buen estado. Por lo general, es un error transitorio que puedes ver cuando se inicializa el Sincronizador de configuración.

Si el problema persiste, describe la Deployment del webhook de admisión para ver si sus pods se pueden programar y están en buen estado:

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

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

Una Deployment con Pods en buen estado tiene un resultado similar al siguiente:

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

Tiempo de espera de E/S de la solicitud de webhook de admisión

Si recibes un error similar al siguiente cuando el conciliador intenta aplicar una configuración al clúster, el puerto de webhook de admisión 8676 podría ser bloqueado por el firewall a la red del plano de control:

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, agrega una regla de firewall a fin de admitir el puerto 8676, que el webhook de admisión del Sincronizador de configuración usa para la prevención de desvíos. El puerto 8676 debe estar abierto desde el plano de control a los nodos, ya que el plano de control debe poder llegar al backend del webhook en los nodos del clúster.

El webhook de admisión rechazó una solicitud

Si recibes el siguiente error cuando intentas aplicar un cambio en un campo que administra el Sincronizador de configuración, es posible que hayas realizado un cambio conflictivo:

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

Si tienes habilitada la protección contra desvíos, cuando declares un campo en una configuración y el repositorio se sincronice con un clúster, el Sincronizador de configuración administrará ese campo. Cualquier cambio que intentes hacer en ese campo es un cambio conflictivo.

Por ejemplo, si tienes una configuración de implementación en el repositorio con una etiqueta environment:prod y tratas de cambiar esa etiqueta a environment:dev en el clúster, habrá un cambio conflictivo y recibirás el mensaje de error anterior. Sin embargo, si agregas una etiqueta nueva (por ejemplo, tier:frontend) a la Deployment, no habrá un conflicto.

Si quieres que el Sincronizador de configuración ignore los cambios en un objeto, puedes agregar la anotación que se describe en Ignora las mutaciones de objetos.

No se pudieron borrar todos los tipos de recursos

Un espacio de nombres atascado en la fase de Terminating tiene la siguiente condición:

    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

Esto sucede cuando intentas borrar un objeto Namespace de un repositorio raíz, pero algunos objetos bajo el espacio de nombres todavía están administrados de manera activa por un conciliador de espacio de nombres. Cuando se borra un espacio de nombres, el controlador de espacio de nombres, cuya cuenta de servicio es system:serviceaccount:kube-system:namespace-controller, intenta borrar todos los objetos que se encuentran en ese espacio de nombres. Sin embargo, el webhook de admisión del Sincronizador de configuración solo permite que el conciliador raíz o de espacio de nombres borre estos objetos y no permite que el controlador de espacio de nombres los pueda borrar.

Para solucionar este problema, borra el webhook de admisión del Sincronizador de configuración:

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

El operador de ConfigManagement recrea el webhook de admisión del Sincronizador de configuración.

Si esta solución alternativa no funciona, es posible que debas reinstalar el Sincronizador de configuración.

Para evitar volver a encontrar el error, quita el repositorio del espacio de nombres antes de quitar el espacio de nombres.

¿Qué sigue?