Configura espacios de nombres y objetos con alcance 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. También puedes leer sobre cómo configurar clústeres y objetos con alcance de clúster.

Configura un espacio de nombres

Formato no estructurado

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

Sigue estos pasos para configurar un espacio de nombres llamado gamestore en cada clúster inscrito. Solo necesitas crear un archivo YAML que contenga el archivo de configuración del espacio de nombres. En este ejemplo, se agrega el archivo al directorio raíz. Puedes moverlo a cualquier subdirectorio.

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

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    
  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 [NAME-OF-REMOTE] [BRANCH-NAME]
    

Formato 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 descendientes.

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

  1. En el clon local del 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. El metadata.name debe coincidir con el nombre del espacio de nombres (y con el nombre del directorio de espacio de nombres).

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    
  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 [NAME-OF-REMOTE] [BRANCH-NAME]
    

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 enviarlo al repositorio remoto.

Configura un espacio de nombres abstracto

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

    mkdir namespaces/eng
    
  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 la función.

    # 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. 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 del espacio de nombres.

Para limitar los clústeres que afecta un archivo de configuración específico según las etiquetas de cada clúster, consulta Aplica archivos de configuración a un subconjunto de clústeres.

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

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

  • Formato no estructurado: En un repositorio no estructurado, puedes colocar NamespaceSelectors en cualquier directorio o subdirectorio.
  • Formato jerárquico: en un repositorio jerárquico, puedes colocar NamespaceSelectors en cualquier directorio de espacio de nombres abstracto, pero no en un espacio de nombres.

    En el siguiente repositorio de ejemplo, se muestran ubicaciones válidas y no válidas para los NamespaceSelectors:

    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.

Usa un 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

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?