Soluciona problemas del 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 el desvío de configuración.

Cómo solucionar errores 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 cambios, 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 está en mal estado. Por lo general, es un error transitorio que puedes ver cuando inicias el Sincronizador de configuración.

Si el problema persiste, describe el 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

Un 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 firewall podría bloquear el puerto del webhook de admisión 8676 en 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 acceder al backend de 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 cambios, cuando declaras un campo en una configuración y tu repositorio se sincroniza con un clúster, el Sincronizador de configuración administra ese campo. Cualquier cambio que intentes realizar 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 Deployment, no se generaría 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 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

Este error ocurre cuando intentas borrar un objeto Namespace de un repositorio raíz, pero un conciliador de espacios de nombres aún administra de forma activa algunos objetos en el 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, intentará borrar todos los objetos de ese espacio de nombres. Sin embargo, el webhook de admisión del Sincronizador de configuración solo permite que el conciliador de espacio de nombres o raíz borre estos objetos y rechaza que el controlador de espacio de nombres los borre.

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 no funciona, es posible que debas reinstalar el Sincronizador de configuración.

Para evitar que se vuelva a producir el error, quita el repositorio del espacio de nombres antes de quitar el espacio de nombres.

¿Qué sigue?