En esta página se explica cómo solucionar problemas con las luchas de controladores. Estos combates consumen una gran cantidad de recursos y pueden afectar a tu rendimiento. Los conflictos de controladores también se conocen como contención de recursos.
Config Sync monitoriza los objetos que aplica en el clúster y revierte los cambios realizados en los valores declarados en la fuente de información veraz. Si otro responsable del tratamiento de datos realiza estos cambios, el recurso podría alternar entre los estados que quieran los responsables del tratamiento de datos competidores. Uno de los síntomas de este comportamiento es que los campos metadata.generation
y metadata.resourceVersion
aumentan rápidamente. Por este motivo, si un objeto gestionado se actualiza más de cinco veces por minuto, Config Sync detecta el conflicto, registra la desviación e informa del error en el estado del objeto RootSync
o RepoSync
.
Config Sync tiene una lógica especial para detectar conflictos entre varios objetos RootSync
y RepoSync
. En el caso de los objetos RepoSync
, si el reconciliador detecta que otro reconciliador ya gestiona el objeto, se omiten las actualizaciones posteriores.
En el caso de los objetos RootSync
, el reconciliador intenta adoptar cualquier objeto que esté configurado para gestionar, a menos que lo gestione otro objeto RootSync
. De esta forma, se evita que los reconciliadores de Config Sync se enfrenten entre sí y se informan los errores en el estado de todos los objetos RootSync
y RepoSync
implicados.
Identificar conflictos de controladores
Puedes revisar los errores de lucha con el comando nomos status
o consultando el campo de estado del objeto RootSync
o RepoSync
.
Si no tienes instalada la herramienta de línea de comandos nomos
, puedes consultar los registros del reconciliador 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
Sustituye NAMESPACE
por el espacio de nombres que has creado
tu fuente de información veraz con ámbito de espacio de nombres.
Si ves KNV2005
en los resultados, significa que hay un conflicto entre controladores.
El siguiente mensaje de error es un ejemplo del tipo de error que puede aparecer en sus registros:
KNV2005: detected excessive object updates, approximately 6 times per
minute. This may indicate Config Sync is fighting with another controller over
the object.
Investigar peleas de controladores
Para obtener más información sobre cualquier conflicto de controladores, consulta las actualizaciones del archivo YAML del recurso ejecutando el siguiente comando:
kubectl get RESOURCE OBJECT_NAME \
--namespace NAMESPACE \
--watch -o yaml
Haz los cambios siguientes:
RESOURCE
: el tipo de recurso por el que se está luchando.OBJECT_NAME
: el nombre del objeto por el que se está luchando.NAMESPACE
: el espacio de nombres en el que se encuentra el recurso en disputa.
En los resultados del registro se especifican el recurso, el nombre del objeto y el espacio de nombres que debes añadir.
Este comando devuelve un flujo del estado del recurso después de que se apliquen las actualizaciones al servidor de la API. Usa una herramienta de comparación de archivos para comparar el resultado.
Resolver conflictos de controladores
Hay varias formas de resolver los conflictos de controladores. Elige la opción que mejor se adapte a tu configuración de Config Sync:
- Actualiza el manifiesto de recursos en la fuente para que coincida con el valor que quiera el otro controlador.
- Quita el campo en cuestión de la fuente para que el otro controlador pueda gestionarlo.
- Inhabilita o desinstala el otro mando.
- Quita el recurso de la fuente y gestiónalo manualmente o con un controlador personalizado que permita cambios específicos o la cogestión.
- Si eres el propietario del controlador que está provocando la contención de recursos y el campo que se está modificando no está en la fuente de información veraz, actualiza tu controlador para que realice parches en lugar de actualizaciones. De esta forma, Config Sync permitirá el cambio y no se revertirá.
También hay algunos recursos que deberían pertenecer a otros controladores (por ejemplo, algunos operadores instalan o mantienen CRDs). Estos otros controladores eliminan automáticamente cualquier metadato específico de Config Sync. Si otro componente de tu clúster de Kubernetes elimina los metadatos de Config Sync, deja de gestionar el recurso con Config Sync. Para obtener información sobre cómo hacerlo, consulta Dejar de gestionar un objeto gestionado.
Si no quieres que Config Sync revierta los cambios en los objetos gestionados del clúster, puedes añadir la anotación client.lifecycle.config.k8s.io/mutation: ignore
al objeto en el que quieras que Config Sync ignore las mutaciones. Para obtener información sobre cómo hacerlo, consulta Ignorar mutaciones de objetos.
Resolver conflictos de controladores en espacios de nombres implícitos
De forma predeterminada, Config Sync crea un espacio de nombres implícito cuando un RootSync gestiona un objeto con espacio de nombres, pero el espacio de nombres en sí aún no existe. Si otro controlador intenta tomar la propiedad del espacio de nombres, puede producirse un conflicto de controladores con Config Sync. Puedes confirmar que se ha creado un espacio de nombres de forma implícita si nunca se ha declarado en el repositorio raíz y el espacio de nombres activo tiene la anotación para evitar la eliminación.
Hay varias formas de resolver conflictos sobre un espacio de nombres implícito. Elige la opción que mejor se adapte a tu configuración de Config Sync:
- Utiliza la estrategia de espacio de nombres explícito en tu objeto RootSync. Esta estrategia resuelve el conflicto de controladores e impide que Config Sync cree espacios de nombres implícitos adicionales.
- Añade el espacio de nombres al repositorio raíz con la anotación management disabled. Esta anotación indica a Config Sync que deje de gestionar el espacio de nombres, pero sigue permitiendo que Config Sync cree espacios de nombres implícitos.
Siguientes pasos
Si sigues teniendo problemas, comprueba si el problema que tienes es un problema conocido.
Si no encuentras una solución a tu problema en la documentación, consulta la sección Obtener asistencia para obtener más ayuda, incluidos consejos sobre los siguientes temas:
- Abrir un caso de asistencia poniéndose en contacto con el equipo de Atención al Cliente de Cloud.
- Recibir asistencia de la comunidad haciendo preguntas en Stack Overflow.
Si usas kpt o Kustomize, usa la etiqueta
kpt
okustomize
para buscar problemas similares. - Abrir errores o solicitudes de funciones mediante el sistema de seguimiento de problemas público en GitHub.