Cuando Config Sync gestiona un objeto de clúster, monitoriza el objeto y el conjunto de configuraciones del repositorio que afectan al objeto, y se asegura de que estén sincronizados. En este tema se describe cómo empezar a gestionar un objeto y cómo dejar de gestionar un objeto que se está gestionando sin eliminarlo.
Config Sync gestiona un objeto de un clúster si tiene la anotación configmanagement.gke.io/managed: enabled
y la anotación configsync.gke.io/resource-id
, que registra la información del grupo, el tipo, el espacio de nombres y el nombre del objeto, es correcta.
El formato de la anotación configsync.gke.io/resource-id
es GROUP_KIND_NAMESPACE_NAME
para un objeto centrado en un espacio de nombres y GROUP_KIND_NAME
para un objeto centrado en un clúster.
En el siguiente diagrama de flujo se describen algunas situaciones que provocan que un objeto se convierta en gestionado o no gestionado:
El diagrama contiene tres flujos independientes: 1) empezar a gestionar un objeto, 2) dejar de gestionar un objeto y 3) eliminar un objeto gestionado.
- Quiero empezar a gestionar un objeto. ¿Tiene un manifiesto el objeto? En otras palabras, ¿el objeto tiene una configuración en el repositorio?
- No: crea una configuración para el objeto. Config Sync define la anotación
configmanagement.gke.io/managed: enabled
, define la anotaciónconfigsync.gke.io/resource-id
para que coincida con el objeto y empieza a gestionar el objeto. - Sí: ¿la configuración define la siguiente anotación?
configmanagement.gke.io/managed: disabled
- No: el objeto se gestiona de forma predeterminada.
- Sí: edita la configuración para quitar la anotación
configmanagement.gke.io/managed: disabled
. Cuando el cambio se envía al repositorio de origen, Config Sync detecta el cambio, aplica las anotacionesconfigmanagement.gke.io/managed: enabled
yconfigsync.gke.io/resource-id
, y aplica la configuración.
- No: crea una configuración para el objeto. Config Sync define la anotación
- Quiero dejar de gestionar un objeto, pero no eliminarlo.
- Edita la configuración del objeto en el repositorio y define la anotación
configmanagement.gke.io/managed: disabled
. Cuando se detecta el cambio de configuración, Config Sync deja de gestionar el objeto.
- Edita la configuración del objeto en el repositorio y define la anotación
- Quiero dejar de gestionar un objeto y eliminarlo.
- Elimina la configuración del objeto del repositorio. Cuando eliminas una configuración de un objeto que se gestionaba anteriormente, Config Sync elimina el objeto de todos los clústeres o espacios de nombres a los que se aplica la configuración.
Además de las anotaciones configmanagement.gke.io/managed: enabled
y configsync.gke.io/resource-id
, Config Sync aplica la etiqueta app.kubernetes.io/managed-by: configmanagement.gke.io
a todos los objetos que gestiona. Esta etiqueta le permite enumerar fácilmente todos los objetos por Config Sync.
¿Por qué no aplicas la anotación manualmente?
Config Sync usa un modelo declarativo para aplicar los cambios de configuración a tus clústeres leyendo la configuración que quieras de tu repositorio.
Si intentas aplicar la anotación manualmente (ya sea con el comando kubectl
o con la API de Kubernetes), Config Sync sobrescribe automáticamente la anotación manual con el contenido de tu repositorio.
Antes de empezar
Los siguientes ejemplos se basan en el artículo Primeros pasos con Config Sync. Antes de seguir los pasos que se indican a continuación, consulta la guía de inicio rápido y completa todos los pasos antes de explorar y probar la instalación de Config Sync.
Mostrar todos los objetos gestionados
Para obtener una lista de todos los objetos gestionados por Config Sync en un clúster o espacio de nombres determinado, usa un selector de etiquetas como el siguiente:
kubectl get object-type -n namespace -l "app.kubernetes.io/managed-by=configmanagement.gke.io"
Para obtener una lista de todos los objetos que no gestiona Config Sync, usa un selector de etiquetas como este:
kubectl get object-type -n namespace -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"
Por ejemplo, este comando muestra los RoleBindings del espacio de nombres gamestore
que gestiona Config Sync:
kubectl get rolebindings -n gamestore \ -l "app.kubernetes.io/managed-by=configmanagement.gke.io"
El resultado debería ser similar al siguiente:
NAME ROLE AGE
configsync.gke.io:ns-reconciler ClusterRole/configsync.gke.io:ns-reconciler 34h
gamestore-admin ClusterRole/admin 34h
gamestore-webstore-admin ClusterRole/webstore-admin 34h
Este comando muestra los RoleBindings del espacio de nombres kube-system
que no gestiona Config Sync:
kubectl get rolebindings -n kube-system \ -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"
El resultado debería ser similar al siguiente:
NAME AGE
fluentd-gcp-scaler-binding 2d21h
gce:cloud-provider 2d21h
heapster-binding 2d21h
metrics-server-auth-reader 2d21h
system::leader-locking-kube-controller-manager 2d21h
system::leader-locking-kube-scheduler 2d21h
system:controller:bootstrap-signer 2d21h
system:controller:cloud-provider 2d21h
system:controller:token-cleaner 2d21h
Empezar a gestionar un objeto
Puedes crear una configuración para un objeto de Kubernetes, como un espacio de nombres, que ya exista en tu clúster antes de instalar Config Sync.
Sin embargo, esta configuración se ignora a menos que el objeto tenga la anotación configmanagement.gke.io/managed: enabled
y la anotación configsync.gke.io/resource-id
correcta. En el caso de los objetos que ya existen, debes aplicar la anotación manualmente.
En el caso de los espacios de nombres, Config Sync sí aplica configuraciones
que crean objetos nuevos en un espacio de nombres sin anotaciones y aplica las
anotaciones configmanagement.gke.io/managed: enabled
y configsync.gke.io/resource-id
a esos objetos. Sin embargo, Config Sync no modifica ni elimina ningún objeto sin anotaciones con ámbito de clúster de un clúster. Esto se ilustra en el diagrama de la sección Trabajar con configuraciones a lo largo del tiempo.
En el siguiente ejemplo se muestra cómo gestionar un objeto Role. Primero, crea un rol manualmente y, después, empieza a gestionarlo con Config Sync.
Crea el rol
myrole
en el espacio de nombresgamestore
:kubectl create role -n gamestore myrole --verb=get --resource=pods
Consulta los permisos concedidos por el rol
myrole
:kubectl describe role -n gamestore myrole
Name: myrole Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get]
El rol solo tiene permiso para
get
pods.En este punto, el rol existe en el clúster, pero Config Sync no lo conoce.
- En un terminal, ve a la copia local de tu repositorio.
Usa el siguiente comando para crear un manifiesto YAML para
myrole
y guardar el manifiesto en un archivo nuevo llamadogamestore-myrole.yaml
.kubectl get role myrole -n gamestore -o yaml > gamestore-myrole.yaml
Edita el archivo
gamestore-myrole.yaml
.- Elimina todos los campos de la clave
metadata
, exceptoname
ynamespace
. - Añade el verbo
list
después deget
en el campo de listarules.verbs
.
Guarda los cambios. El archivo resultante tiene el siguiente contenido:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: myrole namespace: gamestore rules: - apiGroups: - "" resources: - pods verbs: - get - list
- Elimina todos los campos de la clave
Confirma el cambio en el repositorio.
Espera unos instantes a que el operador ConfigManagement detecte la confirmación. Para verificar que el rol
myrole
ahora está gestionado por Config Sync, vuelve a ejecutarkubectl describe
.kubectl describe role myrole -n gamestore
Fíjate en la anotación configmanagement.gke.io/managed: enabled
, que indica que Config Sync gestiona el objeto, y en la anotación configsync.gke.io/resource-id
, que registra la información del grupo, el tipo, el espacio de nombres y el nombre. También puedes ver las anotaciones que muestran la ruta y el nombre del archivo del repositorio que ha provocado el cambio de configuración más reciente en el objeto, así como el hash de Git que representa la confirmación.
Name: myrole
Labels: app.kubernetes.io/managed-by=configmanagement.gke.io
configsync.gke.io/declared-version=v1
Annotations: config.k8s.io/owning-inventory: config-management-system_root-sync
configmanagement.gke.io/cluster-name: my-cluster
configmanagement.gke.io/managed: enabled
configmanagement.gke.io/source-path: config-sync-quickstart/multirepo/root/gamestore-myrole.yaml
configmanagement.gke.io/token: 747b843a7ddbd945c0616034a935cf648b58e7b5
configsync.gke.io/declared-fields: {"f:rules":{}}
configsync.gke.io/git-context: {"repo":"https://github.com/GoogleCloudPlatform/anthos-config-management-samples","branch":"main","rev":"HEAD"}
configsync.gke.io/manager: :root
configsync.gke.io/resource-id: rbac.authorization.k8s.io_role_gamestore_myrole
PolicyRule:
Resources Non-Resource URLs Resource Names Verbs
--------- ----------------- -------------- -----
pods [] [] [get list]
Dejar de gestionar un objeto gestionado
En este ejemplo se muestra cómo dejar de gestionar un objeto que Config Sync está gestionando, como el rol myrole
en Empezar a gestionar un objeto.
Edita el archivo
config-sync-quickstart/multirepo/root/rolebinding-gamestore-webstore-admin.yaml
en la copia local de tu repositorio y añade una secciónannotations:
que coincida con el texto en negrita que aparece a continuación:kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: annotations: configmanagement.gke.io/managed: disabled name: gamestore-webstore-admin namespace: gamestore subjects: - kind: ServiceAccount name: ns-reconciler-gamestore namespace: config-management-system roleRef: kind: ClusterRole name: webstore-admin apiGroup: rbac.authorization.k8s.io
Guarda el archivo.
Crea una confirmación de Git con los cambios y envíala a tu repositorio.
Espera unos instantes a que Config Sync detecte y aplique la nueva confirmación.
Usa el siguiente comando para verificar que las anotaciones y las etiquetas del recurso
gamestore-webstore-admin
RoleBinding están vacías. Config Sync no asigna el valordisabled
a la anotaciónconfigmanagement.gke.io/managed
del objeto.kubectl get rolebinding gamestore-webstore-admin -n gamestore -o yaml
apiVersion: rbac.authorization.k8s.io/v1 metadata: annotations: name: gamestore-webstore-admin namespace: gamestore subjects: - kind: ServiceAccount name: ns-reconciler-gamestore namespace: config-management-system roleRef: kind: ClusterRole name: webstore-admin apiGroup: rbac.authorization.k8s.io
Después de verificar que el objeto está inhabilitado, puedes quitar la configuración del repositorio y comprobar que el objeto no gestionado no se ha eliminado del espacio de nombres. Si quieres volver a gestionar el objeto, debes volver a añadir su configuración al repositorio. Por este motivo, puede que quieras dejar de gestionar objetos y dejar sus configuraciones en el repositorio.
Ahora que el objeto no está gestionado, no se crea ni se vuelve a crear en clústeres nuevos o ya creados, y no se elimina aunque exista. Para volver a gestionar un objeto que has dejado de gestionar, consulta el siguiente ejemplo: Volver a gestionar un objeto que no se gestionaba.
Reanudar la gestión de un objeto que no se gestionaba anteriormente
En este ejemplo se muestra cómo volver a gestionar un objeto que has quitado de la gestión, como se explica en Dejar de gestionar un objeto. Se da por hecho que no has quitado la configuración de gamestore-webstore-admin
RoleBinding.
Si has eliminado el recurso
gamestore-webstore-admin
RoleBinding de tu repositorio en la última confirmación, sigue estos pasos.Usa
git revert
para revertir la última confirmación:git revert HEAD~1
Se te pedirá que confirmes la operación de restauración.
Envía la confirmación de reversión a tu repositorio.
git push
Edita el archivo
config-sync-quickstart/multirepo/root/rolebinding-gamestore-webstore-admin.yaml
en la clonación local de tu repositorio y elimina la anotaciónconfigmanagement.gke.io/managed: disabled
. Guarda el archivo.Confirma y envía el cambio. Config Sync hace lo siguiente:
- Detecta el cambio
- Aplica la anotación
configmanagement.gke.io/managed: enabled
y la anotaciónconfigsync.gke.io/resource-id
. El objeto ahora está gestionado. - Aplica la configuración, como ocurriría con cualquier objeto gestionado.
Para verificar que el objeto ahora está gestionado, enumera sus anotaciones:
kubectl get rolebinding gamestore-webstore-admin -n gamestore -o yaml
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: annotations: configmanagement.gke.io/cluster-name: my-cluster configmanagement.gke.io/managed: enabled configsync.gke.io/resource-id: rbac.authorization.k8s.io_rolebinding_gamestore_gamestore-webstore-admin ...
Dejar de gestionar un espacio de nombres
Puedes dejar de gestionar un espacio de nombres de la misma forma que dejas de gestionar cualquier tipo de objeto. Si quieres dejar de gestionar otros recursos en el espacio de nombres, sigue estos pasos:
Añade la anotación
configmanagement.gke.io/managed:disabled
a la configuración del espacio de nombres y a todas las configuraciones del mismo espacio de nombres. Todos los objetos del espacio de nombres deben tener esta anotación.Confirma y envía los cambios al repositorio. Espera a que el operador se sincronice con el repositorio.
Elimina los recursos no gestionados del repositorio.
Si hay configuraciones de configuraciones gestionadas en un directorio de espacio de nombres no gestionado, el reconciliador registra errores, pero otras configuraciones siguen sincronizándose con normalidad.
Eliminar recursos gestionados
Cuando eliminas un recurso de una fuente de información veraz, ese objeto se elimina del clúster la próxima vez que Config Sync se sincronice con la fuente de información veraz. También puedes habilitar la propagación de la eliminación, que te permite eliminar objetos en bloque.
Eliminar objetos concretos
Con el comportamiento predeterminado de Config Sync, cuando eliminas un objeto de una fuente de información veraz, ese objeto se elimina del clúster cuando Config Sync se sincroniza con la fuente de información veraz.
Hay varias formas de comprobar el estado de Config Sync o el estado de objetos específicos:
- Usa
nomos status
. - Usa
kubectl
para examinar los recursos. - Utiliza el panel de control de Config Sync.
Eliminar objetos en bloque
De forma predeterminada, si se elimina un objeto RootSync o RepoSync, Config Sync abandona los objetos que se habían aplicado anteriormente desde la fuente de información veraz. También puedes habilitar la propagación de la eliminación para eliminar todos los objetos aplicados anteriormente.
Si habilitas la propagación de la eliminación en un objeto RootSync o RepoSync y, a continuación, eliminas ese objeto, Config Sync eliminará automáticamente todos los objetos que gestionaba ese RootSync o RepoSync.
La propagación de la eliminación puede facilitar la limpieza de recursos, por ejemplo, si vas a migrar a un nuevo espacio de nombres o clúster, si quieres limpiar después de una demostración o un experimento, o si vas a desinstalar una aplicación.
Opciones de propagación de la eliminación
La propagación de la eliminación está inhabilitada de forma predeterminada. Para habilitar la propagación de la eliminación, añade la anotación configsync.gke.io/deletion-propagation-policy: Foreground
al objeto RootSync o RepoSync, como en el siguiente ejemplo:
# example-rootsync.yaml
apiVersion: configsync.gke.io/v1beta1
kind: RootSync
metadata:
name: example-rootsync
namespace: config-management-system
annotations:
configsync.gke.io/deletion-propagation-policy: Foreground
spec:
sourceType: git
sourceFormat: unstructured
git:
repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
branch: main
dir: config-sync-quickstart/multirepo/root
auth: none
period: 30s
También puedes actualizar un RootSync o RepoSync para que use la propagación de la eliminación ejecutando el siguiente comando:
RootSync
kubectl patch RootSync ROOTSYNC_NAME \
--namespace config-management-system \
--type merge \
--patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'
Sustituye ROOTSYNC_NAME
por el nombre del RootSync que quieras actualizar.
RepoSync
kubectl patch RepoSync REPOSYNC_NAME \
--namespace config-management-system \
--type merge \
--patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'
Sustituye REPOSYNC_NAME
por el nombre del RepoSync que quieras actualizar.
Para inhabilitar la propagación de la eliminación, quita la anotación o cambia el valor a configsync.gke.io/deletion-propagation-policy: Orphan
:
RootSync
kubectl patch RootSync ROOTSYNC_NAME \
--namespace config-management-system \
--type merge \
--patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Orphan"}}}'
Sustituye ROOTSYNC_NAME
por el nombre del RootSync que quieras actualizar.
RepoSync
kubectl patch RepoSync REPOSYNC_NAME \
--namespace config-management-system \
--type merge \
--patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Orphan"}}}'
Propagar la eliminación de objetos
En este ejemplo se muestra cómo aplicar la propagación de la eliminación a un objeto RootSync o RepoSync y, a continuación, eliminar el objeto RootSync o RepoSync para eliminar todos los objetos que gestionaba.
RootSync
Aplica la anotación a un objeto RootSync para habilitar la propagación de la eliminación:
kubectl patch RootSync example-rootsync \ --namespace config-management-system \ --type merge \ --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'
Elimina el objeto RootSync y espera a que Config Sync lo elimine:
kubectl delete RootSync example-rootsync --namespace config-management-system --wait
El proceso de eliminación de RootSync puede tardar unos minutos.
RepoSync
Aplica la anotación a un objeto RepoSync para habilitar la propagación de la eliminación:
kubectl patch RepoSync example-reposync \ --namespace example-namespace \ --type merge \ --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'
Elimina el objeto RepoSync y espera a que Config Sync lo elimine:
kubectl delete RepoSync example-reposync --namespace example-namespace --wait
El proceso de eliminación de RepoSync puede tardar unos minutos en completarse.
Impedir la eliminación de objetos de Kubernetes
Después de eliminar un objeto de Kubernetes de un repositorio de Git gestionado por Config Sync, este objeto también se elimina del clúster cuando la nueva confirmación se sincroniza con el clúster.
Si quieres evitar que Config Sync elimine el objeto cuando se quite su configuración del repositorio de Git, puedes seguir estos pasos:
Añade la anotación
client.lifecycle.config.k8s.io/deletion: detach
a la configuración del objeto en el repositorio de Git.Confirma e inserta el cambio en el repositorio de Git.
Espera a que el cambio se sincronice con el clúster.
Una vez que hayas completado estos pasos, Config Sync no eliminará este objeto del clúster cuando se quite su configuración del repositorio de Git, pero otros clientes sí podrán eliminarlo.
Ignorar un objeto en la fuente de información veraz
Puede que quieras que Config Sync ignore un objeto de tu fuente de información veraz. Por ejemplo, una configuración de función kpt nunca se debe aplicar al clúster.
En los objetos que quieras que ignore Config Sync, añade la anotación config.kubernetes.io/local-config: "true"
al objeto. Después de añadir esta anotación, Config Sync ignora este objeto como si se hubiera quitado de la fuente de información veraz. Los recursos con la anotación local-config
definida en cualquier valor que no sea "false"
se tratan como si estuviera definida en "true"
y se ignoran.