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 espacio de nombres abstracto

Esta sección solo se aplica a los repositorios jerárquicos. Los espacios de nombres abstractos no son compatibles con los repositorios no estructurados. Si usas un repositorio no estructurado y deseas una funcionalidad similar, usa espacios de nombres jerárquicos.

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 operador de Anthos Config Management detecta el cambio y aplica el Role y el RoleBinding nuevos 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 Configura un subconjunto de clústeres.

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.

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. Antes de crear un repositorio no estructurado con objetos que se usaron con anterioridad en un repositorio jerárquico, verifica que tus NamespaceSelectors no se apliquen 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.

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 un archivo de configuración, ya sea que el archivo de configuración se oriente a un objeto con permisos 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.

Ejemplo de NamespaceSelector

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 NamespaceSelector gamestore-selector está en la misma jerarquía que la siguiente ResourceQuota, quota, la ResourceQuota solo se creará 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.

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?