Configura espacios de nombres y objetos con permiso de espacio de nombres

En esta página, se ilustra cómo usar el Sincronizador de configuración para administrar los espacios de nombres y objetos con permisos de espacios de nombres.

Configura un espacio de nombres

La configuración de un espacio de nombres funciona de manera diferente para los repositorios no estructurados y jerárquicos. En los siguientes ejemplos, se destacan las diferencias.

Repositorio no estructurado

Los archivos de configuración para espacios de nombres y objetos con permisos de espacios de nombres se pueden encontrar en cualquier lugar del directorio o los subdirectorios del repositorio.

Completa los siguientes pasos para configurar un espacio de nombres llamado gamestore en cada clúster inscrito:

  1. Crea un archivo namespace-gamestore.yaml con el siguiente contenido:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    Solo necesitas crear un archivo YAML que contenga el archivo de configuración del espacio de nombres.

  2. Crea una confirmación que incluya el archivo de configuración namespace-gamestore.yaml y envíala al repositorio remoto.

    git add multirepo/root/namespace-gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push REMOTE_NAME BRANCH_NAME
    

    Reemplaza lo siguiente:

    • REMOTE_NAME: Es el nombre de tu repositorio remoto.
    • BRANCH_NAME: La rama en la que deseas confirmar.

    En este ejemplo, se agrega el archivo al directorio raíz, pero puedes moverlo a cualquiera de los subdirectorios del repositorio.

Repositorio jerárquico

Todos los archivos de configuración de espacios de nombres y objetos con permisos de espacios de nombres se encuentran dentro del directorio namespaces/ del repositorio jerárquico y sus directorios subordinados.

Sigue estos pasos para configurar un espacio de nombres llamado gamestore en cada clúster inscrito.

  1. En el clon local de tu repositorio, crea un directorio de espacio de nombres. Un directorio de espacio de nombres contiene un archivo de configuración para un espacio de nombres. El nombre del directorio del espacio de nombres debe coincidir con el nombre del espacio de nombres. En el siguiente ejemplo, el directorio se denomina namespaces/gamestore:

    mkdir namespaces/gamestore
    
  2. En el directorio de espacio de nombres, crea un archivo gamestore.yaml con el siguiente contenido.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    

    El metadata.name debe coincidir con el nombre del directorio del espacio de nombres.

  3. Crea una confirmación que incluya el archivo de configuración gamestore.yaml y envíala al repositorio remoto.

    git add namespaces/gamestore/gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push REMOTE_NAME BRANCH_NAME
    

    Reemplaza lo siguiente:

    • REMOTE_NAME: Es el nombre de tu repositorio remoto.
    • BRANCH_NAME: La rama en la que deseas confirmar.

En unos instantes, se crea el espacio de nombres gamestore en cada clúster inscrito. Para verificarlo, describe el espacio de nombres:

kubectl describe namespace gamestore

Para quitar el archivo de configuración y borrar el espacio de nombres gamestore de los clústeres inscritos, puedes crear una confirmación nueva que quite el archivo y enviarla al repositorio remoto. No quites el archivo de configuración si deseas configurar un espacio de nombres abstracto para un repositorio jerárquico.

Configura un objeto con permiso de espacio de nombres

En los repositorios no estructurados, puedes almacenar objetos con alcance de espacio de nombres en cualquier directorio o subdirectorio sin necesidad de una configuración de espacio de nombres. Si falta un archivo de configuración de espacio de nombres, el Sincronizador de configuración crea automáticamente un objeto de espacio de nombres implícito y aplica todos los archivos de configuración a ese espacio de nombres.

Este comportamiento se puede modificar con el campo namespaceStrategy. Si namespaceStrategy se configura como explicit, el Sincronizador de configuración no creará automáticamente un objeto de espacio de nombres implícito. Para obtener más información, consulta la estrategia de espacio de nombres.

En los repositorios jerárquicos, debes especificar de forma explícita una configuración de espacio de nombres en el subdirectorio namespaces/NAMESPACE, en la que NAMESPACE debe coincidir con el nombre del espacio de nombres. Todos los demás archivos de configuración con permiso de espacio de nombres también se deben almacenar en el mismo subdirectorio. Si falta una configuración de espacio de nombres, el Sincronizador de configuración muestra un error KNV1044, lo que indica que falta una configuración de espacio de nombres.

Configura un espacio de nombres abstracto

Esta sección solo se aplica a los repositorios jerárquicos porque los espacios de nombres abstractos no son compatibles con los repositorios no estructurados.

En este ejemplo, se amplía el ejemplo de Configura un espacio de nombres. Para ello, se mueve el directorio de espacio de nombres gamestore a un espacio de nombres abstracto que contiene archivos de configuración adicionales heredados del espacio de nombres gamestore.

  1. En el clon local del repositorio, crea un directorio de espacio de nombres abstracto llamado eng:

    mkdir namespaces/eng
    

    Un directorio de espacio de nombres abstracto no contiene un archivo de configuración para un espacio de nombres, pero sí sus directorios de espacio de nombres descendientes.

  2. En el directorio de espacio de nombres abstracto eng, crea un archivo de configuración para una función llamada eng-viewer, que concede get y list a todos los recursos de cualquier espacio de nombres que herede el rol:

    # namespaces/eng/eng-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: eng-viewer
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    
  3. Crea un archivo de configuración para un RoleBinding llamado eng-admin que vincule la función eng-viewer al grupo eng@example.com:

    # namespaces/eng/eng-rolebinding.yaml
    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: eng-admin
    subjects:
    - kind: Group
      name: eng@example.com
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: eng-viewer
      apiGroup: rbac.authorization.k8s.io
    
  4. Mueve el directorio de espacio de nombres gamestore del directorio namespaces/ al namespaces/eng/:

    mv namespaces/gamestore /namespaces/eng/
    
  5. Confirma todos los cambios y envíalos a un repositorio remoto.

El Sincronizador de configuración detecta el cambio y aplica la función nueva y el RoleBinding al espacio de nombres gamestore en todos los clústeres inscritos.

Para quitar los archivos de configuración y borrar el espacio de nombres gamestore de los clústeres inscritos, puedes crear una confirmación nueva que quite todo el espacio de nombres abstracto eng y enviarlo al repositorio remoto.

Limita los clústeres a los que afecta un archivo de configuración

Por lo general, Config Sync aplica una configuración a cada clúster inscrito. Sin embargo, si la configuración está dentro del subdirectorio namespaces/ de un repositorio jerárquico, el Sincronizador de configuración primero crea el espacio de nombres dentro de cada clúster y, luego, aplica todos los archivos de configuración heredados a ese espacio de nombres. Para limitar a qué clústeres afecta un archivo de configuración en particular según las etiquetas de cada clúster, usa un ClusterSelector. Para obtener más información, consulta Cómo usar ClusterSelectors.

Limita los espacios de nombres a los que afecta un archivo de configuración

Para limitar los espacios de nombres a los que afecta un archivo de configuración, usa un NamespaceSelector. Un NamespaceSelector es un tipo de archivo de configuración especial que usa labelSelectors de Kubernetes. Puedes declarar NamespaceSelectors en combinación con archivos de configuración para objetos con alcance de espacios de nombres en un repositorio no estructurado o un repositorio jerárquico a fin de limitar los espacios de nombres pueden heredar esa configuración. Los NamespaceSelectors son similares a los ClusterSelectors, pero no son idénticos. Un NamespaceSelector reduce el grupo de espacios de nombres a los que se aplica un archivo de configuración.

Para declarar un NamespaceSelector, agrega la anotación metadata.namespace o NamespaceSelector. La declaración de ambas anotaciones no es válida. Si los recursos con alcance de espacio de nombres no declaran metadata.namespace o la anotación NamespaceSelector, el Sincronizador de configuración usa el espacio de nombres “predeterminado” del clúster.

NamespaceSelectors en repositorios no estructurados

Un repositorio no estructurado no tiene que declarar todos los espacios de nombres de los objetos con alcance de espacio de nombres del repositorio. Un objeto puede definir un metadata.namespace sin tener un objeto de espacio de nombres coincidente en un repositorio no estructurado. Si el espacio de nombres ya existe en el clúster, el Sincronizador de configuración crea el objeto dentro de ese espacio de nombres. Si el espacio de nombres aún no existe en el clúster, el Sincronizador de configuración crea el espacio de nombres de manera implícita.

Antes de crear un repositorio no estructurado con objetos que se usaron antes en un repositorio jerárquico, verifica que tu NamespaceSelectors no se aplique a recursos adicionales.

Cuando quitas objetos con alcance de espacio de nombres de un repositorio no estructurado, el Sincronizador de configuración borra esos objetos, pero no quita los espacios de nombres que se hayan creado de manera implícita para ellos. Este comportamiento se produce porque el Sincronizador de configuración no puede inferir cuándo es seguro borrar un espacio de nombres que se creó de forma implícita, así que siempre se deja en el clúster.

Modo Espacio de nombresSelector

En un repositorio no estructurado, los objetos que declaran la anotación NamespaceSelector se aplican a todos los espacios de nombres que cumplan con las condiciones de un NamespaceSelector. En las versiones del Sincronizador de configuración anteriores a la 1.17.0, la anotación NamespaceSelector solo se aplica a los espacios de nombres coincidentes que se declaran de forma estática en la fuente de información. En la versión 1.17.0 y en versiones posteriores, el objeto NamespaceSelector admite el modo dinámico estableciendo spec.mode en dynamic. En el modo dinámico, la selección se extiende a los espacios de nombres declarados de forma estática y a los que están presentes de forma dinámica en el clúster. Los espacios de nombres elegidos de forma dinámica ya existen en el clúster y, por lo tanto, el Sincronizador de configuración no los administra. El modo predeterminado es static.

NamespaceSelectors en repositorios jerárquicos

En un repositorio jerárquico, los objetos que declaran la anotación NamespaceSelector se aplican a los espacios de nombres que heredan un archivo de configuración determinado de un espacio de nombres abstracto, sin importar la estructura del directorio namespaces/. Un ClusterSelector reduce el grupo de clústeres a los que se aplica una configuración, ya sea que la configuración se oriente a un objeto con permiso de clúster o de espacio de nombres.

Ubicación del NamespaceSelector

En un repositorio no estructurado, puedes colocar los NamespaceSelectors en cualquier directorio o subdirectorio.

En un repositorio jerárquico, puedes colocar NamespaceSelectors 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 NamespaceSelectors si usas un repositorio jerárquico:

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 NamespaceSelector en ellos.

Ejemplos de namespaceSelector

Puedes usar un NamespaceSelector con selectores de etiquetas para incluir o excluir espacios de nombres. Kubernetes admite selectores basados en la igualdad y en conjuntos. Puedes combinar ambos tipos de selectores para definir mejor los espacios de nombres seleccionados.

Selector de etiquetas basado en la igualdad

El siguiente archivo de configuración crea un NamespaceSelector llamado gamestore-selector. Si otro archivo de configuración hace referencia a este NamespaceSelector, ese archivo de configuración solo se puede aplicar a los objetos en espacios de nombres que tengan la etiqueta app: gamestore.

kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: gamestore-selector
spec:
  selector:
    matchLabels:
      app: gamestore

Para hacer referencia a un NamespaceSelector en un archivo de configuración, debes establecer la anotación configmanagement.gke.io/namespace-selector en el nombre del NamespaceSelector.

Un NamespaceSelector no tiene ningún efecto hasta que haces referencia a él en otro archivo de configuración. Si el Espacio de nombres gamestore-selector tiene la misma jerarquía que el siguiente ResourceQuota, quota, ResourceQuota solo se crea en los espacios de nombres que tengan la etiqueta app: gamestore:

kind: ResourceQuota
apiVersion: v1
metadata:
  name: quota
  annotations:
    configmanagement.gke.io/namespace-selector: gamestore-selector
spec:
  hard:
    pods: "1"
    cpu: "200m"
    memory: "200Mi"

En resumen, usar un NamespaceSelector es un proceso de tres pasos:

  1. Agrega etiquetas a los espacios de nombres.
  2. Crea un archivo de configuración de NamespaceSelector.
  3. Haz referencia al objeto NamespaceSelector en otro archivo de configuración.

Selector de etiquetas basado en el parámetro de configuración

Puedes usar selectores de espacios de nombres para eximir a determinados espacios de nombres de heredar un recurso en el árbol mediante los selectores de etiquetas basados en conjuntos.

En este ejemplo, cuando ResourceQuota se anota con NamespaceSelector mediante la configuración de la anotación configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces, se crea ResourceQuota en todos los espacios de nombres, excepto en los que tienen la etiqueta quota-exempt: exempt:

kind: NamespaceSelector
 apiVersion: configmanagement.gke.io/v1
 metadata:
   name: excludes-exempt-namespaces
 spec:
   selector:
     matchExpressions:
       - key: quota-exempt
         operator: NotIn
          values:
            - exempt

Integración en los permisos del equipo y los espacios de nombres de la flota

Los espacios de nombres de flotas 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.io/metadata.name: your-namespace de Kubernetes. Puedes usar estas etiquetas predeterminadas a fin de configurar el NamespaceSelector para seleccionar espacios de nombres de flotas.

Inhabilita la herencia para un tipo de objeto

Los objetos de Kubernetes de HierarchyConfig no son compatibles con los repositorios no estructurados. El siguiente ejemplo solo se aplica a los repositorios jerárquicos.

Para inhabilitar la herencia de cualquier archivo de 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 RoleBindings.

# 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

¿Qué sigue?