Sincroniza objetos con varios espacios de nombres

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:

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:

  1. Agrega o elige una etiqueta existente en los espacios de nombres en los que deseas realizar la implementación.
  2. Define un objeto de recurso NamespaceSelector en tu fuente de verdad. El Sincronizador de configuración no sincroniza objetos NamespaceSelector con tu clúster.
  3. 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ón configmanagement.gke.io/namespace-selector con un valor que coincida con el metadata.name de tu NamespaceSelector.

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

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:

  1. 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.

  2. 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.

  3. 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:

  1. 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.

  2. 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.

  3. 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 que NAMESPACE 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:

  1. 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.

  2. En el directorio de espacio de nombres abstracto que creaste, crea una configuración para un rol que otorgue permisos de get y list 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.

  3. 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.

  4. 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