Solucionar problemas del webhook de admisión

En esta página se explica cómo resolver problemas con el webhook de admisión de Config Sync. Para obtener más información sobre el webhook, consulta Evitar la deriva de la configuración.

Solucionar errores de KNV 2009

En las siguientes secciones se explica cómo solucionar los errores KNV2009.

Conexión rechazada del webhook de admisión

Si tienes habilitada la protección contra la deriva, es posible que recibas el siguiente error cuando el reconciliador 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 que no funciona correctamente. Normalmente, se trata de un error transitorio que puede aparecer al iniciar Config Sync.

Si el problema persiste, describe el Deployment del webhook de admisión para ver si se pueden programar sus pods y si 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 reconciliador intenta aplicar una configuración al clúster, es posible que el firewall bloquee el puerto 8676 del webhook de admisión 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, añada una regla de cortafuegos para permitir el puerto 8676, que el webhook de admisión de Config Sync usa para evitar las desviaciones. 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 del webhook en los nodos del clúster.

Webhook de admisión ha denegado una solicitud

Si recibes el siguiente error al intentar aplicar un cambio a un campo que gestiona Config Sync, es posible que hayas hecho 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 desviaciones, cuando declares un campo en una configuración y tu repositorio se sincronice con un clúster, Config Sync gestionará ese campo. Cualquier cambio que intentes hacer en ese campo será un cambio conflictivo.

Por ejemplo, si tienes una configuración de implementación en tu repositorio con la etiqueta environment:prod e intentas cambiarla a environment:dev en tu clúster, se producirá un cambio conflictivo y recibirás el mensaje de error anterior. Sin embargo, si añades una etiqueta nueva (por ejemplo, tier:frontend) al despliegue, no habrá ningún conflicto.

Si quiere que Config Sync ignore los cambios en un objeto, puede añadir la anotación que se describe en Ignorar mutaciones de objetos.

No se han podido eliminar todos los tipos de recursos

Un espacio de nombres que se ha quedado bloqueado 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 se produce cuando intentas eliminar un objeto Namespace de un repositorio raíz, pero un reconciliador de espacio de nombres sigue gestionando activamente algunos objetos del espacio de nombres. Cuando se elimina un espacio de nombres, el controlador del espacio de nombres, cuya cuenta de servicio es system:serviceaccount:kube-system:namespace-controller, intentaría eliminar todos los objetos de ese espacio de nombres. Sin embargo, el webhook de admisión de Config Sync solo permite que el reconciliador raíz o de espacio de nombres elimine estos objetos, y deniega al controlador de espacio de nombres la eliminación de estos objetos.

Para solucionar este problema, elimina el webhook de admisión de Config Sync:

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

El operador ConfigManagement vuelve a crear el webhook de admisión de Config Sync.

Si esta solución alternativa no funciona, es posible que tengas que volver a instalar Config Sync.

Para evitar que se produzca de nuevo el error, elimina el repositorio del espacio de nombres antes de eliminar el espacio de nombres.

Siguientes pasos