Soluciona problemas de conflictos de controles

En esta página, se muestra cómo resolver problemas relacionados con las peleas de controles. Este tipo de conflictos consumen una gran cantidad de recursos y pueden degradar tu rendimiento. Las competencias de los controladores también se conocen como contención de recursos.

El Sincronizador de configuración supervisa los objetos que aplica en el clúster y revierte los cambios realizados en los valores declarados en la fuente de información. Si otro controlador realiza estos cambios, el recurso puede alternar entre los estados que desean los controladores competidores. Un síntoma de este comportamiento es que los campos metadata.generation y metadata.resourceVersion aumentan rápidamente. Por este motivo, si un objeto administrado se actualiza más de cinco veces por minuto, el Sincronizador de configuración detecta la pelea, registra el desvío y, luego, informa el error en el estado del objeto RootSync o RepoSync.

El Sincronizador de configuración tiene una lógica especial para detectar competencias entre varios objetos RootSync y RepoSync. En el caso de los objetos RepoSync, si el conciliador ve que otro conciliador ya administra el objeto, se omiten las actualizaciones adicionales. En el caso de los objetos RootSync, el conciliador intenta adoptar cualquier objeto que esté configurado para administrar, a menos que lo administre otro objeto RootSync. Esto evita que los conciliadores del Sincronizador de configuración compitan entre ellos. Además, informa errores en el estado de todos los objetos RootSync y RepoSync involucrados.

Identifica peleas de los controladores

Puedes revisar los errores de combate con el comando nomos status o revisando el campo de estado en el objeto RootSync o RepoSync.

Si no tienes instalada la herramienta de línea de comandos de nomos, puedes revisar los registros del reconciliador RootSync mediante la ejecución del siguiente comando:

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
    --container reconciler

Para filtrar los conciliadores RepoSync específicos, ejecuta el siguiente comando:

kubectl logs -n config-management-system \
    --selector "app=reconciler,configsync.gke.io/sync-namespace=NAMESPACE" \
    --container reconciler

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

Si ves KNV2005 en los resultados, significa que hay una pelea de controles.

El siguiente mensaje de error es un ejemplo del tipo de error que puedes ver en tus registros:

KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.

Investiga las peleas de los controladores

Para obtener más información sobre cualquier competencia de controles, ejecuta el siguiente comando para mirar las actualizaciones del archivo YAML del recurso:

 kubectl get RESOURCE OBJECT_NAME \
     --namespace NAMESPACE \
     --watch -o yaml

Reemplaza lo siguiente:

  • RESOURCE: Es el tipo de recurso que se está disputando.
  • OBJECT_NAME: Es el nombre del objeto en cuestión.
  • NAMESPACE: Es el espacio de nombres en el que se encuentra el recurso en disputa.

Los resultados del registro especifican el recurso, el nombre del objeto y el espacio de nombres que debes agregar.

Con este comando, se muestra una transmisión del estado del recurso después de aplicar las actualizaciones al servidor de API. Usa una herramienta de comparación de archivos para comparar el resultado.

Resuelve las peleas de los controles

Existen varias formas de resolver las peleas de los controles. Elige la opción que mejor se adapte a la configuración del Sincronizador de configuración:

  • Actualiza el manifiesto de recursos en la fuente para que coincida con el valor que desea el otro controlador.
  • Quita el campo en cuestión de la fuente para permitir que el otro controlador lo administre.
  • Inhabilita o desinstala el otro control.
  • Quita el recurso de la fuente y adminístralo de forma manual o con un controlador personalizado que tolera cambios específicos o la administración conjunta.
  • Si posees el controlador que causa la contención de recursos y el campo que se cambia no está en la fuente de información, actualiza el controlador para aplicar parches en lugar de actualizarlo. De esa manera, el Sincronizador de configuración permitirá el cambio y no se revertirá.

También hay algunos recursos que deben pertenecer a otros controladores (por ejemplo, algunos operadores instalan o mantienen CRD). Estos otros controladores quitan los metadatos específicos del Sincronizador de configuración de forma automática. Si otro componente del clúster de Kubernetes quita los metadatos del Sincronizador de configuración, deja de administrar el recurso con el Sincronizador de configuración. Para obtener información sobre cómo hacerlo, consulta Deja de administrar un objeto administrado.

Como alternativa, si no quieres que el Sincronizador de configuración revierta los cambios a los objetos administrados del clúster, puedes agregar la anotación client.lifecycle.config.k8s.io/mutation: ignore al objeto en el que deseas que el Sincronizador de configuración ignore las mutaciones. Para obtener información sobre cómo hacer esto, consulta Cómo ignorar mutaciones de objetos.

¿Qué sigue?