Evita el desvío de la configuración

El Sincronizador de configuración proporciona dos formas de administrar el desvío:

  • Usa la autorecuperación integrada del Sincronizador de configuración (recomendado, no se necesita configuración): El Sincronizador de configuración detecta y revierte automáticamente el desvío. No puedes inhabilitar la autorecuperación del Sincronizador de configuración. La autorecuperación tiene un impacto mínimo en el rendimiento.
  • Habilita la función de prevención de desvíos (esta página): La prevención de desvíos usa un webhook de admisión para bloquear los cambios en conflicto. Esta función puede causar un uso elevado de la memoria y errores de falta de memoria (OOM), en especial en clústeres con muchas CustomResourceDefinitions (CRD).

El webhook de admisión requiere que el Sincronizador de configuración cargue el esquema de OpenAPI de Kubernetes para validar las solicitudes. En clústeres con muchos recursos o CRD, este procesamiento de esquema puede exceder los límites de memoria, lo que provoca fallas en los componentes. Para la mayoría de los casos de uso, la autorecuperación integrada del Sincronizador de configuración proporciona protección contra desvíos sin los riesgos de estabilidad del webhook.

Cuando está habilitada, la prevención de desvíos protege los objetos RootSync de forma predeterminada. Puedes configurar la función para proteger objetos RepoSync. Para usar la prevención de desvíos, debes habilitar las RootSync y RepoSync APIs.

Antes de comenzar

Si ya instalaste Google Cloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente.

Habilita la prevención de desvíos

Puedes habilitar la prevención de desvíos con gcloud CLI. No puedes habilitar la prevención de desvíos en la Cloud de Confiance consola.

Para habilitar la prevención de desvíos, completa los siguientes pasos:

  1. Actualiza el manifiesto de especificación de aplicación para establecer el campo spec.configSync.preventDrift en true:

    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        ... existing content ...
        preventDrift: true
    
  2. Aplica el manifiesto actualizado:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • MEMBERSHIP_NAME: Es el nombre de la membresía de flota que elegiste cuando registraste el clúster. Obtén el nombre con el comando gcloud container fleet memberships list.
    • MANIFEST_NAME: Es el nombre del manifiesto de especificación de aplicación, por lo general, apply-spec.yaml.
    • PROJECT_ID: ID del proyecto
  3. 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
    
  4. Confirma un cambio nuevo en la fuente de información para que se sincronice a fin de que la implementación de root-reconciler pueda agregar webhooks en el objeto ValidatingWebhookConfiguration del Sincronizador de configuración. Una alternativa es borrar la implementación root-reconcilier para activar una conciliación. El nuevo Deployment de root-reconciler actualizaría el objeto ValidtingWebhookConfiguration del Sincronizador de configuración.

  5. 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

Cuando inhabilitas la prevención de desvíos, el Sincronizador de configuración 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 archivos de configuración de webhook para los recursos administrados.

Para inhabilitar la prevención de desvíos, completa los siguientes pasos:

  1. Actualiza el manifiesto de especificación de aplicación para establecer el campo spec.configSync.preventDrift en false:

    applySpecVersion: 1
    spec:
      configSync:
        enabled: false
        ... existing content ...
        preventDrift: false
    
  2. Aplica el manifiesto actualizado:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Reemplaza lo siguiente:

    • MEMBERSHIP_NAME: Es el nombre de la membresía de flota que elegiste cuando registraste el clúster. Obtén el nombre con el comando gcloud container fleet memberships list.
    • MANIFEST_NAME: Es el nombre del manifiesto de especificación de aplicación, por lo general, apply-spec.yaml.
    • PROJECT_ID: ID del proyecto

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

Las fuentes de información con alcance de espacio de nombres no están protegidas por completo por el webhook. El conciliador del Sincronizador de configuración para 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 información con alcance de espacio de nombres. Sin embargo, si deseas usar el webhook, otórgale permiso al conciliador por 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 información. Es posible que no debas realizar estos pasos si ya existe un RoleBinding para ns-reconciler-NAMESPACE con permisos cluster-admin de ClusterRole.

  1. En la fuente de información raíz, declara una nueva configuración de ClusterRole que otorgue permiso al webhook de admisión de sincronizació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 el que se debe otorgar el permiso de webhook de admisión, declara una configuración ClusterRoleBinding para otorgar el acceso:

    # 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 alcance de espacio de nombres.

  3. Confirma los cambios en la fuente de información raíz, por ejemplo, si se sincroniza 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
    

¿Qué sigue?