En esta página, se explica cómo usar Sincronizador de configuración para administrar espacios de nombres y elegir qué objetos sincronizará Sincronizador de configuración con tus espacios de nombres.
Los objetos de recursos de Kubernetes pueden tener alcance de clúster o de espacio de nombres, según el tipo de recurso. Para seleccionar el clúster, debes configurar 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. Sincronizador de configuración agrega capacidades adicionales: selectores de clústeres y selectores de espacios de nombres, que te permiten definir con mayor precisión qué objetos se sincronizan.
Antes de leer esta página, ya deberías estar familiarizado con los siguientes conceptos de Kubernetes:
Acerca del alcance de los objetos con Sincronizador de configuración
De forma predeterminada, cuando instalas el Sincronizador de configuración en un clúster o como valor predeterminado de la flota, el Sincronizador de configuración sincroniza todos los objetos de Kubernetes en tu fuente de información con los clústeres en los que se instaló el Sincronizador de configuración o con todos los clústeres de una flota. Sin embargo, si defines el alcance de los objetos en un clúster o espacio de nombres, puedes controlar qué objetos se sincronizan con un clúster o espacio de nombres.
El Sincronizador de configuración ofrece los siguientes métodos para definir el alcance de tus objetos:
- Configura objetos con alcance de clúster con un selector de clúster
- Configura objetos con alcance de clúster con etiquetas de paquetes de la flota (vista previa)
- Configura objetos con permisos de espacio de nombres con un selector de espacio de nombres (esta página)
Usa espacios de nombres explícitos
Te recomendamos que uses la declaración explícita del espacio de nombres cuando configures el Sincronizador de configuración, ya que te permite administrar los metadatos del espacio de nombres y borrar espacios de nombres más adelante, si es necesario.
El parámetro de configuración predeterminado es implicit
, pero puedes cambiar la estrategia de espacio de nombres en tu objeto RootSync
o RepoSync
configurando el campo namespaceStrategy
en explicit
. Para obtener más información, consulta la estrategia de espacio de nombres.
Acerca de los selectores de espacios de nombres
Los selectores de espacios de nombres son una función de Sincronizador de configuración que te permite implementar objetos de recursos idénticos en varios espacios de nombres.
El uso de selectores de espacio de nombres es similar al uso de 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 agregar campos personalizados a los tipos de recursos existentes, debes definir tu selector en un objeto NamespaceSelector
. Luego, haces referencia a ese selector por su nombre en una anotación sobre los objetos que deseas usar con ese selector.
Para usar selectores de espacios de nombres, haz lo siguiente:
- Agrega o elige una etiqueta existente en los espacios de nombres en los que deseas realizar la implementación.
- Define un objeto de recurso
NamespaceSelector
en tu fuente de verdad. El Sincronizador de configuración no sincroniza objetosNamespaceSelector
con tu clúster. - Para cada objeto que desees sincronizar con uno o más espacios de nombres, modifica la configuración del objeto para quitar el campo
metadata.namespace
y agregar la anotaciónconfigmanagement.gke.io/namespace-selector
con un valor que coincida con elmetadata.name
de tuNamespaceSelector
.
En los ejemplos de la siguiente sección, se proporcionan más detalles sobre cómo definir objetos NamespaceSelector
y anotar otros objetos para usar el NamespaceSelector
.
Antes de comenzar
- Instala Config Sync.
- Crea una fuente de información o asegúrate de tener acceso a ella para almacenar tus archivos de configuración.
- Si aún no tienes uno o más espacios de nombres, crea los espacios de nombres a los que deseas limitar el alcance de tus recursos. Puedes crear el espacio de nombres directamente en tu clúster o en tu fuente de verdad.
Usa selectores de espacios de nombres
Los selectores de espacios 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:
Agrega una etiqueta a uno o más espacios de nombres:
kubectl label namespace NAMESPACE app=gamestore
Reemplaza
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 en espacios de nombres que tengan la etiqueta
app: gamestore
.Un selector de espacio de nombres no tiene efecto hasta que haces referencia a él en otra configuración. Crea una cuota de objetos 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:
Agrega una etiqueta a uno o más espacios de nombres:
kubectl label namespace NAMESPACE quota-exempt=exempt
Reemplaza
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 aplica a todos los espacios de nombres excepto a aquellos con el par clave-valor
quota-exempt: exempt
.Un selector de espacio de nombres no tiene efecto hasta que haces referencia a él en otra configuración. Crea una cuota de objetos 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 del equipo y espacios de nombres de la flota
Los espacios de nombres de flota creados en Google Cloud tienen automáticamente la etiquetafleet.gke.io/fleet-scope: your-scope
. Todos los espacios de nombres también tienen la etiqueta kubernetes.io/metadata.name: your-namespace
de Kubernetes. Puedes usar estas etiquetas predeterminadas para configurar un selector de espacios de nombres y seleccionar espacios de nombres de la flota.
En el instructivo sobre la tenencia de flotas, se explica con más detalle cómo usar selectores de espacios de nombres con flotas y permisos de equipo para administrar objetos de forma selectiva para diferentes equipos.
Objetos con alcance de espacio de nombres con modo jerárquico
Si bien los repositorios no estructurados se recomiendan para la mayoría de los casos de uso, puedes usar selectores de espacios de nombres para definir el alcance de tus objetos con un repositorio jerárquico. El uso de selectores de espacios de nombres es el mismo, pero existen limitaciones y requisitos adicionales sobre cómo organizar la configuración de espacios de nombres en tu fuente de información.
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 espacios de nombres y objetos con permisos de espacios de nombres dentro del directorio
namespaces/
del repositorio jerárquico y sus directorios subordinados. - Debes especificar de forma explícita una configuración de espacio de nombres en el subdirectorio
namespaces/NAMESPACE
, en el queNAMESPACE
coincide con el nombre del espacio de nombres. Todos los demás objetos con alcance de espacio de nombres deben almacenarse en el mismo subdirectorio. Si falta una configuración de espacio de nombres, Sincronizador de configuración 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, sin importar la estructura del directorio
namespaces/
.
Ubicación del selector de espacios 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.
En la siguiente arquitectura de repositorio de ejemplo, se muestran ubicaciones válidas y no válidas para los selectores de espacios 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
Dado que los directorios namespaces
, eng
y rnd
representan espacios de nombres abstractos, puedes colocar un selector en ellos. Sin embargo, debido a que los directorios gamestore
y incubator-1
representan espacios de nombres reales, no puedes colocar un selector de espacio de nombres en ellos.
Configura 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 tu directorio de espacio de nombres a un espacio de nombres abstracto que contiene 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 espacio de nombres descendientes sí contienen configuraciones.
En el directorio de espacio de nombres abstracto que creaste, crea una configuración para un rol que otorgue permisos de
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"]
Reemplaza
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 electrónico:
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
Reemplaza
ROLEBINDING_NAME
por el nombre del rol.Mueve la configuración del espacio de nombres que creaste en la sección anterior del directorio
namespaces/
al directorio del espacio de nombres abstracto que creaste en esta sección.
Inhabilita la herencia para los objetos
Para inhabilitar la herencia de cualquier configuración de forma selectiva, configura el campo hierarchyMode
en none
. Los HierarchyConfigs se almacenan en el directorio system/
del repositorio. En este ejemplo, se inhabilita la herencia para 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