Usa un repositorio jerárquico

En esta página, se describe cómo el Sincronizador de configuración lee la configuración de una fuente de confianza jerárquica y aplica la configuración resultante a tus clústeres automáticamente.

Si deseas más flexibilidad estructural (por ejemplo, deseas crear subcarpetas de recursos), puedes crear una fuente de confianza no estructurada. Para la mayoría de los casos de uso, se recomiendan fuentes de confianza no estructuradas. Si ya usas una fuente de información jerárquica, puedes convertirla en una fuente de información no estructurada.

Para comprender cómo el Sincronizador de configuración usa un repositorio jerárquico, resulta útil si conoces los repositorios de Git y la interfaz de línea de comandos de git.

Estructura del directorio

En el caso de las fuentes jerárquicas, el Sincronizador de configuración aprovecha las estructuras similares al sistema de archivos y usa el directorio para determinar a qué clústeres o espacios de nombres es relevante una configuración.

namespaces/

El directorio namespaces/ contiene opciones de configuración para espacios de nombres y objetos con alcance de espacio de nombres. La estructura dentro de namespaces/ es el mecanismo que dirige la herencia del espacio de nombres. Puedes limitar los espacios de nombres que pueden heredar un archivo de configuración mediante un NamespaceSelector.

cluster/

El directorio cluster/ contiene opciones de configuración que se aplican a clústeres enteros, en lugar de a espacios de nombres. De forma predeterminada, cualquier configuración del directorio cluster/ se aplica a todos los clústeres inscritos en el Sincronizador de configuración. Puedes limitar los clústeres a los que una configuración puede afectar mediante un ClusterSelector.

clusterregistry/

El directorio clusterregistry/ es opcional y contiene opciones de configuración para ClusterSelectors. Los ClusterSelectors limitan los clústeres a los que se aplica una configuración y se mencionan en las opciones de configuración que se encuentran en los directorios cluster/ y namespaces/.

system/

El directorio system/ contiene opciones de configuración para el operador.

Ejemplo de fuente de confianza jerárquica

En la siguiente estructura de directorios, se muestra cómo usar una fuente de información jerárquica del Sincronizador de configuración para configurar un clúster de Kubernetes que comparten dos equipos diferentes, team-1 y team-2.

  • Cada equipo tiene su propio espacio de nombres y cuenta de servicio de Kubernetes, así como cuotas de recursos, políticas de red y vinculaciones de funciones.
  • El administrador del clúster configura una política en namespaces/limit-range.yaml para restringir las asignaciones de recursos (a Pods o contenedores) en ambos espacios de nombres.
  • El administrador del clúster también configura ClusterRoles y ClusterRoleBindings.

Una fuente jerárquica del Sincronizador de configuración válida debe incluir tres subdirectorios: cluster/, namespaces/ y system/.

El directorio cluster/ contiene archivos de configuración que se aplican a clústeres enteros (como ClusterRole, ClusterRoleBinding), en lugar de a espacios de nombres.

El directorio namespaces/ contiene opciones de configuración para los objetos de espacio de nombres y los objetos con alcance de espacio de nombres. Cada subdirectorio de namespaces/ incluye la configuración para un objeto de espacio de nombres y todos los objetos con permisos de espacio de nombres del espacio de nombres. El nombre de un subdirectorio debe ser el mismo que el nombre del objeto del espacio de nombres. Los objetos con permisos de espacios de nombres que se deben crear en cada espacio de nombres se pueden colocar directamente en namespaces/ (por ejemplo, namespaces/limit-range.yaml).

El directorio system/ contiene archivos de configuración para el operador ConfigManagement.

├── cluster
│   ├── clusterrolebinding-namespace-reader.yaml
│   ├── clusterrole-namespace-reader.yaml
│   ├── clusterrole-secret-admin.yaml
│   └── clusterrole-secret-reader.yaml
├── namespaces
│   ├── limit-range.yaml
│   ├── team-1
│   │   ├── namespace.yaml
│   │   ├── network-policy-default-deny-egress.yaml
│   │   ├── resource-quota-pvc.yaml
│   │   ├── rolebinding-secret-reader.yaml
│   │   └── sa.yaml
│   └── team-2
│       ├── namespace.yaml
│       ├── network-policy-default-deny-all.yaml
│       ├── resource-quota-pvc.yaml
│       ├── rolebinding-secret-admin.yaml
│       └── sa.yaml
├── README.md
└── system
    └── repo.yaml

Usa la herencia de espacios de nombres y espacios de nombres abstractos

Con una fuente de información jerárquica, puedes usar el concepto de herencia de espacios de nombres para aplicar de forma automática los archivos de configuración a grupos de espacios de nombres en todos los clústeres en los que existen (o deberían existir) esos espacios de nombres.

La herencia del espacio de nombres se aplica al directorio namespaces/ del repositorio jerárquico y a todos sus subdirectorios. Los archivos de configuración en otros directorios del repositorio, como cluster/, no están sujetos a la herencia.

En una fuente de confianza jerárquica, el directorio namespaces/ puede contener dos tipos diferentes de subdirectorios:

  • Un directorio de espacio de nombres contiene un archivo de configuración para un espacio de nombres. El nombre del archivo que contiene la configuración no es importante, pero la configuración debe tener kind: Namespace. Un directorio de espacio de nombres también puede contener archivos de configuración para otros tipos de objetos de Kubernetes. Sin embargo, no puede contener subdirectorios. Un archivo de configuración de espacio de nombres representa un espacio de nombres real en un clúster.

  • Un directorio de espacio de nombres abstracto contiene directorios de espacio de nombres. También puede contener archivos de configuración para otros objetos de Kubernetes, pero no puede contener un archivo de configuración para un espacio de nombres directamente. Un directorio de espacio de nombres abstracto no representa un objeto en un clúster de Kubernetes, pero sí lo hacen sus directorios de espacio de nombres descendientes.

Para garantizar que las fuentes del espacio de nombres y las fuentes de espacio de nombres abstractos tienen el tipo correcto de configuración y estructura, el error KNV1003: IllegalnamespaceSubdirectoryError informa cuando hay un problema.

Los archivos de configuración en un directorio de espacio de nombres solo se aplican a ese espacio de nombres. Sin embargo, los archivos de configuración en un directorio de espacio de nombres abstracto se aplican a todos los directorios de espacio de nombres descendientes del espacio de nombres abstracto (o a esos espacios de nombres descendientes que coincidan con el NamespaceSelector de un archivo de configuración, si es que existe uno).

La herencia de una configuración en el directorio namespaces/ se basa en gran medida en su ubicación dentro del árbol de directorios de la fuente de confianza. Para comprender qué archivos de configuración se aplican a un espacio de nombres determinado en un clúster determinado, puedes explorar el repositorio de ejemplo de herencia de espacios de nombres.

Espacios de nombres restringidos

config-management-system es un espacio de nombres restringido. No puedes usarlo como un directorio de espacio de nombres abstracto. Puedes definir un espacio de nombres config-management-system, pero el único tipo de recurso permitido para el espacio de nombres config-management-system es RootSync.

Hacer cambios en tu fuente de información

Cuando realizas un cambio en tu fuente de confianza que crea o borra directorios de espacio de nombres desde el directorio namespaces/, es posible que obtengas resultados inesperados según la acción:

  • Crear un directorio: Cuando una jerarquía namespaces/ válida se confirma con la fuente de información, el Sincronizador de configuración crea espacios de nombres y, luego, crea objetos de Kubernetes en esos espacios para cada configuración que contiene o hereda el directorio de espacios de nombres.
  • Borrar un directorio: Borrar un directorio de espacio de nombres es una operación destructiva. El espacio de nombres y su contenido se borran en cada clúster administrado por el Sincronizador de configuración en el que existe el espacio de nombres. Si borras un directorio de espacio de nombres abstracto que contiene directorios de espacio de nombres descendientes, todos esos espacios de nombres y su contenido se borran de todos los clústeres que administra el Sincronizador de configuración.
  • Cambiar el nombre de un directorio: Cambiar el nombre de un directorio de espacio de nombres es una eliminación, seguida de una creación y se considera una operación destructiva. El cambio de nombre de un directorio de espacio de nombres abstracto no tiene ningún efecto visible externamente.

  • Mueve un directorio: Mover un espacio de nombres o un directorio de espacio de nombres abstracto dentro de namespaces/ no borra el espacio de nombres ni los objetos dentro de él, excepto cuando el espacio de nombres comienza o deja de heredar una configuración de un directorio de espacio de nombres abstracto debido a un cambio en su jerarquía.

¿Qué sigue?