Evita el desvío de la configuración

El Sincronizador de configuración reduce el riesgo de “operaciones paralelas” a través de la autorreparación automática, la resincronización periódica y la prevención de desvío opcional. Cuando el Sincronizador de configuración detecta un desvío entre el clúster y la fuente de confianza, se puede permitir y revertir con rapidez o rechazarse por completo.

La autorreparación analiza los recursos administrados, detecta el desvío de la fuente de información y revierte ese desvío. La autorreparación siempre está habilitada.

La resincronización periódica se sincroniza automáticamente una hora después de la última sincronización correcta, incluso si no se realizó ningún cambio en la fuente de información. La resincronización periódica siempre está habilitada.

Si bien la autorreparación y las resincronizaciones periódicas ayudan a corregir los desvíos, la prevención de desvíos intercepta las solicitudes para cambiar los objetos administrados y valida si el cambio debe permitirse. Si el cambio no coincide con la fuente de confianza, se rechaza. La prevención de desvíos está inhabilitada de forma predeterminada. Cuando está habilitada, protege los objetos RootSync de forma predeterminada y también se puede configurar para proteger objetos RepoSync.

Para usar la prevención de desvíos, debes habilitar las APIs de RootSync y RepoSync.

Habilita la prevención de desvíos

  1. Establece el campo preventDrift en el archivo de configuración como true y aplica el archivo de configuración:

    gcloud

    Habilita la prevención de desvíos mediante la CLI de gcloud si instalaste el Sincronizador de configuración con la consola de Google Cloud o la CLI de gcloud. Asegúrate de actualizar tu CLI de gcloud a la versión más reciente. Establece el campo spec.configSync.preventDrift del archivo de configuración de gcloud en true y, luego, aplica el archivo de configuración de gcloud.

    kubectl

    Habilita la prevención de desvíos con kubectl si instalaste el Sincronizador de configuración de forma manual con kubectl. Establece el campo spec.preventDrift del objeto ConfigManagement en true y, luego, aplica el objeto ConfigManagement.

  2. Espera hasta que el operador de ConfigManagement cree el objeto ValidateWebhookConfiguration del Sincronizador de configuración:

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    Deberías ver un resultado similar al siguiente:

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  3. Confirma un cambio nuevo en la fuente de información que se sincronizará para que el Deployment root-reconciler pueda agregar webhooks en el objeto ValidatingWebhookConfiguration del Sincronizador de configuración. Una alternativa es borrar el Deployment root-reconcilier para activar una conciliación. La nueva Deployment root-reconciler actualizaría el objeto ValidatingWebhookConfiguration del Sincronizador de configuración.

  4. Espera hasta que el servidor de webhook esté listo. El registro de implementación del webhook de admisión de Sincronizador de configuración debe incluir serving webhook server. Esto puede tomar varios minutos.

    kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"
    

    Deberías ver un resultado similar al siguiente:

    I1201 18:05:41.805531       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    I1201 18:07:04.626199       1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server"  "host"="" "port"=10250
    

Inhabilita la prevención de desvíos

gcloud

Inhabilita el prevención de desvío mediante la CLI de gcloud si instalaste el Sincronizador de configuración con la consola de Google Cloud o la CLI de gcloud. Asegúrate de actualizar tu CLI de gcloud a la versión más reciente. Establece el campo spec.configSync.preventDrift del archivo de configuración de gcloud en false o quita el campo y, luego, aplica el archivo de configuración de gcloud.

kubectl

Inhabilita la prevención de desvíos con kubectl si instalaste el Sincronizador de configuración de forma manual con kubectl. Configura el campo spec.preventDrift del objeto ConfigManagement como false o quita el campo y, luego, aplica el objeto ConfigManagement.

Esto borra todos los recursos de webhook de admisión del Sincronizador de configuración. Debido a que el objeto ValidatingWebhookConfiguration del Sincronizador de configuración ya no existe, los conciliadores del Sincronizador de configuración ya no generan los parámetros de configuración del webhook para los recursos administrados.

Habilita el webhook de admisión en las fuentes con permiso de espacio de nombres

Las fuentes de confianza con alcance de espacio de nombres no están protegidas por completo por el webhook. El conciliador del Sincronizador de configuración de cada fuente de espacio de nombres no tiene permiso para leer o actualizar los objetos ValidatingWebhookConfiguration a nivel de clúster.

Esta falta de permiso da como resultado un error para los registros de conciliación del espacio de nombres similar al siguiente ejemplo:

Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope

Puedes ignorar este error si no deseas usar la protección de webhook para tu fuente de confianza con alcance de espacio de nombres. Sin embargo, si deseas usar el webhook, otorga permiso al conciliador para cada fuente de información con alcance de espacio de nombres después de configurar la sincronización desde más de una fuente de confianza. Es posible que no necesites realizar estos pasos si ya existe un RoleBinding para ns-reconciler-NAMESPACE con permisos cluster-admin de ClusterRole.

  1. En la fuente raíz de confianza, declara una configuración de ClusterRole nueva que otorgue permiso al webhook de admisión del Sincronizador de configuración. Este ClusterRole solo se debe definir una vez por clúster:

    # ROOT_SOURCE/cluster-roles/webhook-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: admission-webhook-role
    rules:
    - apiGroups: ["admissionregistration.k8s.io"]
      resources: ["validatingwebhookconfigurations"]
      resourceNames: ["admission-webhook.configsync.gke.io"]
      verbs: ["get", "update"]
    
  2. Para cada fuente con alcance de espacio de nombres en la que se deba otorgar el permiso del webhook de admisión, declara una configuración de ClusterRoleBinding para otorgar acceso al webhook de admisión:

    # ROOT_SOURCE/NAMESPACE/sync-webhook-rolebinding.yaml
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: syncs-webhook
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-NAMESPACE
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: admission-webhook-role
      apiGroup: rbac.authorization.k8s.io
    

    Reemplaza NAMESPACE por el espacio de nombres en el que creaste la fuente con permiso de espacio de nombres.

  3. Confirma los cambios en la fuente raíz de confianza, por ejemplo, si realizas la sincronización desde un repositorio de Git:

    git add .
    git commit -m 'Providing namespace repository the permission to update the admission webhook.'
    git push
    
    
  4. Para verificar, usa kubectl get a fin de asegurarte de que se hayan creado ClusterRole y ClusterRoleBinding:

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook
    

Inhabilita la prevención de desvíos para recursos abandonados

Cuando borras un objeto RootSync o RepoSync, de forma predeterminada, el Sincronizador de configuración no modifica los recursos que antes administraba ese objeto RootSync o RepoSync. Esto puede dejar atrás varias etiquetas y anotaciones que el Sincronizador de configuración usa para realizar un seguimiento de estos objetos de recursos. Si la protección contra cambios está habilitada, esto puede hacer que se rechacen cualquier cambio en los recursos administrados con anterioridad.

Si no usaste la propagación de eliminación, es posible que los objetos de recursos que se hayan guardado aún retengan etiquetas y anotaciones que agregó el Sincronizador de configuración.

Si deseas conservar estos recursos administrados, deja de administrarlos antes de borrar los objetos RootSync o RepoSync mediante la configuración de la anotación configmanagement.gke.io/managed como disabled en cada recurso administrado declarado en la fuente de información. Esto le indica al Sincronizador de configuración que quite sus etiquetas y anotaciones de los recursos administrados, sin borrar esos recursos. Una vez completada la sincronización, puedes quitar el objeto RootSync o RepoSync.

Si quieres borrar estos recursos administrados, tienes dos opciones:

  • Borra los recursos administrados de la fuente de confianza. Luego, el Sincronizador de configuración borrará los objetos administrados del clúster. Una vez completada la sincronización, puedes quitar el objeto RootSync o RepoSync.
  • Habilita la propagación de eliminación en el objeto RootSync o RepoSync antes de borrarlo. Luego, el Sincronizador de configuración borrará los objetos administrados del clúster.

Si el objeto RootSync o RepoSync se borra antes de dejar de administrar o borrar sus recursos administrados, puedes volver a crear el objeto RootSync o RepoSync, y este adopte los recursos en el clúster que coinciden con la fuente de información. Luego, puedes dejar de administrar o borrar los recursos, esperar a que se sincronicen los cambios y volver a borrar el objeto RootSync o RepoSync.

¿Qué sigue?