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:
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.
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.
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
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.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 permisos 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 una 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 establece en 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
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
, donde NAMESPACE
debe coincidir con el nombre del espacio de nombres. Todos los demás parámetros de configuración centrados en el espacio de nombres también deben almacenarse en el mismo subdirectorio. Si falta una configuración de espacio de nombres, el Sincronizador de configuración muestra un error KNV1044 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, ya que 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
.
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.
En el directorio de espacio de nombres abstracto
eng
, crea un archivo de configuración para una función llamadaeng-viewer
, que concedeget
ylist
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"]
Crea un archivo de configuración para un RoleBinding llamado
eng-admin
que vincule la funcióneng-viewer
al grupoeng@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
Mueve el directorio de espacio de nombres
gamestore
del directorionamespaces/
alnamespaces/eng/
:mv namespaces/gamestore /namespaces/eng/
Confirma todos los cambios y envíalos a un repositorio remoto.
El Sincronizador de configuración 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 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 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.
Modo NamespaceSelector
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
. Los espacios de nombres se pueden declarar de forma estática en la fuente de verdad o pueden ser dinámicos. Para habilitar la selección dinámica, establece 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 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.
Ejemplos de NamespaceSelector
Puedes usar un NamespaceSelector
con selectores de etiquetas para incluir o excluir espacios de nombres. Kubernetes admite selectores basados en igualdad y en conjuntos.
Puedes combinar ambos tipos de selectores para definir mejor qué espacios de nombres se seleccionan.
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 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:
- Agrega etiquetas a los espacios de nombres.
- Crea un archivo de configuración de NamespaceSelector.
- Haz referencia al objeto NamespaceSelector en otro archivo de configuración.
Selector de etiquetas basado en conjuntos
Puedes usar selectores de espacios de nombres para eximir a determinados espacios de nombres de heredar un recurso en el árbol con selectores de etiquetas basados en conjuntos.
En este ejemplo, cuando se anota ResourceQuota
con NamespaceSelector
configurando la anotación configmanagement.gke.io/namespace-selector: excludes-exempt-namespaces
, se crea ResourceQuota
en todos los espacios de nombres, excepto en los que están etiquetados como 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 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.io/metadata.name: your-namespace
de Kubernetes. Puedes usar estas etiquetas predeterminadas para configurar NamespaceSelector
y seleccionar espacios de nombres de flota.
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?
- Obtén información sobre cómo configurar clústeres y objetos con permisos de clúster