Sincronizar objetos en varios espacios de nombres

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:

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:

  1. Añade o elige una etiqueta en los espacios de nombres en los que quieras implementar.
  2. Define un objeto de recurso NamespaceSelector en tu fuente de información veraz. Config Sync no sincroniza objetos NamespaceSelector con tu clúster.
  3. 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ón configmanagement.gke.io/namespace-selector con un valor que coincida con el metadata.name de tu NamespaceSelector.

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

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:

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

  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 de los espacios de nombres que tengan la etiqueta app: gamestore.

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

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

  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 aplicará a todos los espacios de nombres excepto a los que tengan el par clave-valor quota-exempt: exempt.

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

  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 espacios de nombres descendientes sí.

  2. En el directorio del espacio de nombres abstracto que has creado, crea una configuración para un rol que conceda permisos 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"]
    

    Sustituye 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:

    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.

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