En esta página se explica cómo usar Config Sync para gestionar espacios de nombres y elegir qué objetos sincroniza Config Sync con tus espacios de nombres.
Los objetos de recursos de Kubernetes pueden tener un ámbito de clúster o de espacio de nombres, según el tipo de recurso. Para seleccionar el clúster, configura tu cliente para que se comunique con un clúster específico. Para seleccionar el espacio de nombres, configura el campo metadata.namespace
en el manifiesto del objeto. Config Sync añade funciones adicionales: selectores de clúster y selectores de espacio de nombres, que te permiten definir con más precisión qué objetos se sincronizan.
Antes de leer esta página, debes familiarizarte con los siguientes conceptos de Kubernetes:
Información sobre el ámbito de los objetos con Config Sync
De forma predeterminada, cuando instalas Config Sync en un clúster o como valor predeterminado de una flota, Config Sync sincroniza todos los objetos de Kubernetes de tu fuente de verdad con los clústeres en los que está instalado Config Sync o con todos los clústeres de una flota. Sin embargo, si limitas el ámbito de los objetos a un clúster o espacio de nombres, puedes controlar qué objetos se sincronizan con un clúster o espacio de nombres.
Config Sync ofrece los siguientes métodos para acotar los objetos:
- Configurar objetos centrados en clústeres con un selector de clústeres
- Configurar objetos centrados en clústeres con etiquetas de paquetes de flota (Vista previa)
- Configurar objetos centrados en espacios de nombres con un selector de espacio de nombres (esta página)
Usar espacios de nombres explícitos
Te recomendamos que uses una declaración de espacio de nombres explícita al configurar Config Sync, ya que te permite gestionar los metadatos del espacio de nombres y eliminar espacios de nombres más adelante, si es necesario.
El valor predeterminado es implicit
, pero puedes cambiar la estrategia de espacio de nombres en tu objeto RootSync
o RepoSync
asignando el valor explicit
al campo namespaceStrategy
. Para obtener más información, consulta la estrategia de espacio de nombres.
Acerca de los selectores de espacios de nombres
Los selectores de espacio de nombres son una función de Config Sync que te permite desplegar objetos de recursos idénticos en varios espacios de nombres.
Usar selectores de espacio de nombres es similar a usar selectores de etiquetas de Kubernetes para asignar un servicio a un conjunto de pods, pero con una capa adicional de indirección.
Como no puedes añadir campos personalizados a los tipos de recursos, debes definir el selector en un objeto NamespaceSelector
. Después, haces referencia a ese selector por su nombre en una anotación de los objetos que quieras usar con ese selector.
Para usar selectores de espacio de nombres, sigue estos pasos:
- Añade o elige una etiqueta en los espacios de nombres en los que quieras implementar.
- Define un objeto de recurso
NamespaceSelector
en tu fuente de información veraz. Config Sync no sincroniza objetosNamespaceSelector
con tu clúster. - En cada objeto que quieras sincronizar con uno o varios espacios de nombres, modifica la configuración del objeto para quitar el campo
metadata.namespace
y añade la anotaciónconfigmanagement.gke.io/namespace-selector
con un valor que coincida con elmetadata.name
de tuNamespaceSelector
.
En los ejemplos de la sección siguiente se explica con más detalle cómo definir objetos NamespaceSelector
y cómo anotar otros objetos para usar el NamespaceSelector
.
Antes de empezar
- Instala Config Sync.
- Crea o ten acceso a una fuente de información veraz donde almacenar tus archivos de configuración.
- Si aún no tienes uno o varios espacios de nombres, crea los que quieras usar para definir el ámbito de tus recursos. Puedes crear el espacio de nombres directamente en tu clúster o en tu fuente de información veraz.
Usar selectores de espacio de nombres
Los selectores de espacio de nombres se definen con requisitos basados en la igualdad o requisitos basados en conjuntos. Puedes combinar varios requisitos.
Ejemplo de selector de etiquetas basado en la igualdad
En el siguiente ejemplo se muestra cómo usar selectores basados en la igualdad para seleccionar los espacios de nombres a los que se aplica una configuración:
Añade una etiqueta a uno o varios espacios de nombres:
kubectl label namespace NAMESPACE app=gamestore
Sustituye
NAMESPACE
por el nombre de tu espacio de nombres.Ejecuta este comando para cada espacio de nombres que quieras etiquetar.
Crea un selector de espacio de nombres llamado
gamestore-selector
.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestore
Si la configuración de otro objeto hace referencia a este selector de espacio de nombres, esa configuración solo se puede aplicar a los objetos de los espacios de nombres que tengan la etiqueta
app: gamestore
.Un selector de espacio de nombres no tiene ningún efecto hasta que lo referencias en otra configuración. Crea una cuota de objeto de ejemplo que haga referencia al selector de espacio de nombres:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: gamestore-selector spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
La cuota de recursos solo se crea en los espacios de nombres que tienen la etiqueta
app: gamestore
.
Ejemplo de selector de etiquetas basado en conjuntos
En el siguiente ejemplo se muestra cómo usar selectores basados en conjuntos para eximir a los espacios de nombres de la herencia de objetos:
Añade una etiqueta a uno o varios espacios de nombres:
kubectl label namespace NAMESPACE quota-exempt=exempt
Sustituye
NAMESPACE
por el nombre de tu espacio de nombres.Ejecuta este comando para cada espacio de nombres que quieras etiquetar.
Crea un selector de espacio de nombres llamado
exclude-exempt-namespaces
:kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: excludes-exempt-namespaces spec: selector: matchExpressions: - key: quota-exempt operator: NotIn values: - exempt
Si la configuración de otro objeto hace referencia a este selector de espacio de nombres, esa configuración se aplicará a todos los espacios de nombres excepto a los que tengan el par clave-valor
quota-exempt: exempt
.Un selector de espacio de nombres no tiene ningún efecto hasta que lo referencias en otra configuración. Crea una cuota de objeto de ejemplo que haga referencia al selector de espacio de nombres:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces spec: hard: pods: "1" cpu: "200m" memory: "200Mi"
La cuota de recursos se crea en todos los espacios de nombres, excepto en aquellos que tienen el par clave-valor
quota-exempt: exempt
.
Integración con permisos de equipo y espacios de nombres de flota
Los espacios de nombres de flota creados en Google Cloud tienen automáticamente la etiqueta fleet.gke.io/fleet-scope: your-scope
. Todos los espacios de nombres también tienen la etiqueta Kubernetes
kubernetes.io/metadata.name: your-namespace
. Puedes usar estas etiquetas predeterminadas para configurar un selector de espacio de nombres que te permita seleccionar espacios de nombres de la flota.
En el tutorial sobre el uso de flotas se explica con más detalle cómo usar selectores de espacio de nombres con flotas y permisos de equipo para gestionar objetos de forma selectiva para diferentes equipos.
Objetos centrados en espacios de nombres con modo jerárquico
Aunque los repositorios sin estructurar se recomiendan para la mayoría de los casos prácticos, puedes usar selectores de espacio de nombres para acotar tus objetos con un repositorio jerárquico. El uso de selectores de espacio de nombres es el mismo, pero hay limitaciones y requisitos adicionales sobre cómo organizar la configuración del espacio de nombres en tu fuente de información veraz.
Limitaciones
Cuando usas una configuración de selector de espacio de nombres con un repositorio jerárquico, ten en cuenta las siguientes limitaciones y requisitos:
- Debes almacenar todos los archivos de configuración de los espacios de nombres y los objetos con ámbito de espacio de nombres en el directorio
namespaces/
del repositorio jerárquico y sus directorios descendientes. - Debes especificar explícitamente una configuración de espacio de nombres en el subdirectorio
namespaces/NAMESPACE
, dondeNAMESPACE
coincide con el nombre del espacio de nombres. Todos los demás objetos con ámbito de espacio de nombres deben almacenarse en el mismo subdirectorio. Si falta una configuración de espacio de nombres, Config Sync devuelve un error KNV1044. - Los recursos que hacen referencia a un selector de espacio de nombres se aplican a los espacios de nombres que heredan una configuración determinada de un espacio de nombres abstracto, independientemente de la estructura de directorios del directorio
namespaces/
.
Ubicación del selector de espacio de nombres
En un repositorio jerárquico, puedes colocar una configuración de selector de espacio de nombres en cualquier directorio de espacio de nombres abstracto, pero no en un directorio de espacio de nombres.
La siguiente arquitectura de repositorio de ejemplo muestra ubicaciones válidas y no válidas para los selectores de espacio de nombres:
namespace-inheritance
...
├── namespaces
│ ├── eng
│ │ ├── gamestore
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
│ ├── ns_selector.yaml # valid
│ ├── rnd
│ │ ├── incubator-1
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
Como los directorios namespaces
, eng
y rnd
representan espacios de nombres abstractos, puedes colocar un selector en ellos. Sin embargo, como los directorios gamestore
y incubator-1
representan espacios de nombres reales, no puedes colocar un selector de espacio de nombres en ellos.
Configurar un espacio de nombres abstracto
Con un repositorio jerárquico, puedes usar espacios de nombres abstractos de forma opcional.
En el siguiente ejemplo se muestra cómo mover el directorio de espacio de nombres a un espacio de nombres abstracto que contenga configuraciones adicionales heredadas por el espacio de nombres:
En tu repositorio, crea un directorio de espacio de nombres abstracto. El directorio de espacio de nombres abstracto no contiene ninguna configuración para espacios de nombres, pero los directorios de espacios de nombres descendientes sí.
En el directorio del espacio de nombres abstracto que has creado, crea una configuración para un rol que conceda permisos
get
ylist
en todos los objetos de cualquier espacio de nombres que herede el rol:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ROLE_NAME rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]
Sustituye
ROLE_NAME
por el nombre del rol.Crea una configuración para una vinculación de rol que vincule el rol a un grupo de correo:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ROLE_NAME subjects: - kind: Group name: group@example.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: ROLEBINDING_NAME apiGroup: rbac.authorization.k8s.io
Sustituye
ROLEBINDING_NAME
por el nombre del rol.Mueve la configuración del espacio de nombres que has creado en la sección anterior del directorio
namespaces/
al directorio del espacio de nombres abstracto que has creado en esta sección.
Inhabilitar la herencia de objetos
Para inhabilitar la herencia de forma selectiva en cualquier configuración, asigna el valor none
al campo hierarchyMode
. Los HierarchyConfigs se almacenan en el directorio system/
del repositorio. En este ejemplo se inhabilita la herencia de las vinculaciones de roles:
# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
name: rbac
spec:
resources:
# Configure role to only be allowed in leaf namespaces.
- group: rbac.authorization.k8s.io
kinds: [ "RoleBinding" ]
hierarchyMode: none