En esta página, se muestra cómo resolver problemas con las peleas de controladores. Estas luchas consumen una gran cantidad de recursos y pueden degradar tu rendimiento. Las batallas de 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 en competencia. 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 disputa, registra la deriva 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 conflictos entre varios objetos RootSync
y RepoSync
. En el caso de los objetos RepoSync
, si el agente de conciliación ve que otro agente ya administra el objeto, se omiten las actualizaciones adicionales.
En el caso de los objetos RootSync
, el agente de conciliación intenta adoptar cualquier objeto que esté configurado para administrar, a menos que lo administre otro objeto RootSync
. Esto evita que los agentes de conciliación del Sincronizador de configuración entren en conflicto entre sí y, además, informa errores en el estado de todos los objetos RootSync
y RepoSync
involucrados.
Identifica las luchas de los controladores
Puedes revisar los errores de la pelea con el comando nomos status
o verificando 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 de RootSync
ejecutando el siguiente comando:
kubectl logs -n config-management-system \
--selector "app=reconciler,configsync.gke.io/sync-name=root-sync" \
--container reconciler
Para filtrar reconciliadores 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 tu fuente de información centrada en el espacio de nombres.
Si ves KNV2005
en los resultados, significa que hay una competencia de controladores.
El siguiente mensaje de error es un ejemplo del tipo de error que podrías 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 controladores
Para obtener más información sobre cualquier conflicto de controlador, ejecuta el siguiente comando para ver 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 por el que se está luchando.OBJECT_NAME
: Es el nombre del objeto por el que se está luchando.NAMESPACE
: Es el espacio de nombres en el que se encuentra el recurso por el que se está luchando.
Los resultados del registro especifican el recurso, el nombre del objeto y el espacio de nombres que debes añadir.
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.
Cómo resolver conflictos de controladores
Existen varias formas de resolver las disputas entre controladores. Elige la opción que funcione mejor para tu 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 controlador.
- Quita el recurso de la fuente y adminístralo de forma manual o con un controlador personalizado que tolere cambios específicos o la coadministración.
- Si eres propietario del 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 esta manera, Sincronizador de configuración permitirá el cambio y no lo revertirá.
También hay algunos recursos que deberían 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 de tu 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 en los objetos administrados del clúster, puedes agregar la anotación client.lifecycle.config.k8s.io/mutation: ignore
al objeto en el que quieres que el Sincronizador de configuración ignore las mutaciones. Para obtener información sobre cómo hacerlo, consulta Ignora las mutaciones de objetos.
¿Qué sigue?
- Si los problemas persisten, verifica si se trata de un problema conocido.