Cette page explique comment utiliser Config Sync pour gérer des espaces de noms et choisir les objets que Config Sync synchronise avec vos espaces de noms.
Les objets de ressource Kubernetes peuvent être à l'échelle d'un cluster ou d'un espace de noms, selon le type de ressource. Vous sélectionnez le cluster en configurant votre client pour qu'il communique avec un cluster spécifique. Vous sélectionnez l'espace de noms en configurant le champ metadata.namespace dans le manifeste de l'objet. Config Sync ajoute des fonctionnalités supplémentaires : les sélecteurs de clusters et les sélecteurs d'espaces de noms, qui vous permettent d'affiner davantage les objets synchronisés.
Avant de lire cette page, vous devez déjà connaître les concepts Kubernetes suivants :
À propos de la définition du champ d'application des objets avec Config Sync
Par défaut, lorsque vous installez Config Sync sur un cluster ou en tant que valeur par défaut du parc, Config Sync synchronise tous les objets Kubernetes de votre source de référence avec les clusters sur lesquels Config Sync est installé ou avec tous les clusters d'un parc. Toutefois, en définissant le champ d'application des objets sur un cluster ou un espace de noms, vous pouvez contrôler les objets synchronisés avec un cluster ou un espace de noms.
Config Sync propose les méthodes suivantes pour définir le champ d'application de vos objets :
- Configurer des objets à l'échelle d'un cluster avec un sélecteur de cluster
- Configurer des objets à l'échelle d'un cluster avec des libellés de package de parc (aperçu)
- Configurer des objets à l'échelle d'un espace de noms avec un sélecteur d'espace de noms (cette page)
Utiliser des espaces de noms explicites
Nous vous recommandons d'utiliser une déclaration d'espace de noms explicite lorsque vous configurez Config Sync, car cela vous permet de gérer les métadonnées d'espace de noms et de supprimer des espaces de noms ultérieurement, si nécessaire.
Le paramètre par défaut est implicit, mais vous pouvez modifier la stratégie d'espace de noms dans votre objet RootSync ou RepoSync en définissant le champ namespaceStrategy sur explicit. Pour en savoir plus, consultez la section
Stratégie d'espace de noms.
À propos des sélecteurs d'espaces de noms
Les sélecteurs d'espaces de noms sont une fonctionnalité de Config Sync qui vous permet de déployer des objets de ressource identiques dans plusieurs espaces de noms.
L'utilisation de sélecteurs d'espaces de noms est semblable à l'utilisation de
sélecteurs de libellés Kubernetes
pour mapper un service à un ensemble de pods, mais avec une couche d'indirection supplémentaire.
Étant donné que vous ne pouvez pas ajouter de champs personnalisés à des types de ressources existants, vous définissez plutôt votre sélecteur dans un objet NamespaceSelector. Ensuite, vous référencez ce sélecteur par son nom dans une annotation sur les objets pour lesquels vous souhaitez l'utiliser.
Pour utiliser des sélecteurs d'espaces de noms :
- Ajoutez ou choisissez un libellé existant sur les espaces de noms dans lesquels vous souhaitez effectuer le déploiement.
- Définissez un objet de ressource
NamespaceSelectordans votre source de référence. Config Sync ne synchronise pas les objetsNamespaceSelectoravec votre cluster. - Pour chaque objet que vous souhaitez synchroniser avec un ou plusieurs espaces de noms, modifiez la configuration de l'objet
pour supprimer le champ
metadata.namespaceet ajoutez l'annotationconfigmanagement.gke.io/namespace-selectoravec une valeur qui correspond àmetadata.namede votreNamespaceSelector.
Les exemples de la section suivante fournissent plus d'informations sur la définition des objets NamespaceSelector et l'annotation d'autres objets pour utiliser le NamespaceSelector.
Avant de commencer
- Installer Config Sync.
- Créez ou assurez-vous d'avoir accès à une source de référence dans laquelle vous stockez vos fichiers de configuration.
- Si vous ne disposez pas déjà d'un ou de plusieurs espaces de noms, créez les espaces de noms dans lesquels vous souhaitez définir le champ d'application de vos ressources. Vous pouvez créer l'espace de noms directement dans votre cluster ou dans votre source de référence.
Utiliser des sélecteurs d'espaces de noms
Les sélecteurs d'espaces de noms sont définis avec des exigences basées sur l'égalité ou sur un ensemble. Vous pouvez combiner plusieurs exigences.
Exemple de sélecteur de libellés basé sur l'égalité
L'exemple suivant montre comment utiliser des sélecteurs basés sur l'égalité pour sélectionner les espaces de noms auxquels une configuration s'applique :
Ajoutez un libellé à un ou plusieurs espaces de noms :
kubectl label namespace NAMESPACE app=gamestoreRemplacez
NAMESPACEpar le nom de votre espace de noms.Exécutez cette commande pour chaque espace de noms que vous souhaitez libeller.
Créez un sélecteur d'espaces de noms appelé
gamestore-selector.kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestoreSi la configuration d'un autre objet référence ce sélecteur d'espaces de noms, cette configuration ne peut être appliquée qu'aux objets des espaces de noms portant le libellé
app: gamestore.Un sélecteur d'espaces de noms n'a aucun effet tant que vous ne le référencez pas dans une autre configuration. Créez un exemple de quota d'objet qui référence le sélecteur d'espaces de noms :
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: gamestore-selector spec: hard: pods: "1" cpu: "200m" memory: "200Mi"Le quota de ressources n'est créé que dans les espaces de noms portant le libellé
app: gamestore.
Exemple de sélecteur de libellés basé sur un ensemble
L'exemple suivant montre comment utiliser des sélecteurs basés sur un ensemble pour exempter des espaces de noms d'hériter d'objets :
Ajoutez un libellé à un ou plusieurs espaces de noms :
kubectl label namespace NAMESPACE quota-exempt=exemptRemplacez
NAMESPACEpar le nom de votre espace de noms.Exécutez cette commande pour chaque espace de noms que vous souhaitez libeller.
Créez un sélecteur d'espaces de noms appelé
exclude-exempt-namespaces:kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: excludes-exempt-namespaces spec: selector: matchExpressions: - key: quota-exempt operator: NotIn values: - exemptSi la configuration d'un autre objet référence ce sélecteur d'espaces de noms, cette configuration est appliquée à tous les espaces de noms à l'exception de ceux qui comportent la paire clé-valeur
quota-exempt: exempt.Un sélecteur d'espaces de noms n'a aucun effet tant que vous ne le référencez pas dans une autre configuration. Créez un exemple de quota d'objet qui référence le sélecteur d'espaces de noms :
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces spec: hard: pods: "1" cpu: "200m" memory: "200Mi"Le quota de ressources est créé dans tous les espaces de noms, à l'exception de ceux qui comportent la paire clé-valeur
quota-exempt: exempt.
Intégration aux champs d'application d'équipe et aux espaces de noms du parc
Les espaces de noms de parc créés dans Google Cloud portent automatiquement le
fleet.gke.io/fleet-scope: your-scope libellé. Tous les espaces de noms portent également le libellé Kubernetes kubernetes.io/metadata.name: your-namespace. Vous pouvez utiliser ces libellés par défaut pour configurer un sélecteur d'espaces de noms afin de sélectionner des espaces de noms de parc.
Le tutoriel sur la location de parc explique plus en détail comment utiliser des sélecteurs d'espaces de noms avec des parcs et des champs d'application d'équipe pour gérer de manière sélective des objets pour différentes équipes.
Objets à l'échelle d'un espace de noms avec le mode hiérarchique
Bien que les dépôts non structurés soient recommandés pour la plupart des cas d'utilisation, vous pouvez utiliser des sélecteurs d'espaces de noms pour définir le champ d'application de vos objets avec un dépôt hiérarchique. L'utilisation de sélecteurs d'espaces de noms est la même, mais il existe des limites et des exigences supplémentaires concernant l'organisation de la configuration de votre espace de noms dans votre source de référence.
Limites
Lorsque vous utilisez une configuration de sélecteur d'espaces de noms avec un dépôt hiérarchique, tenez compte des limites et exigences suivantes :
- Vous devez stocker tous les fichiers de configuration des espaces de noms et des objets à l'échelle d'un espace de noms dans le
namespaces/répertoire du dépôt hiérarchique et ses répertoires descendants. - Vous devez spécifier explicitement une configuration d'espace de noms dans
le
namespaces/NAMESPACEsous-répertoire, oùNAMESPACEcorrespond au nom de l'espace de noms. Tous les autres objets à l'échelle d'un espace de noms doivent être stockés dans le même sous-répertoire. Si une configuration d'espace de noms est manquante, Config Sync renvoie une erreur KNV1044. - Les ressources qui référencent un sélecteur d'espaces de noms sont appliquées aux espaces de noms qui héritent d'une configuration donnée d'un espace de noms abstrait, quelle que soit la structure du répertoire
namespaces/.
Emplacement du sélecteur d'espaces de noms
Dans un dépôt hiérarchique, vous pouvez placer une configuration de sélecteur d'espaces de noms dans n'importe quel répertoire d'espace de noms abstrait, mais pas dans un répertoire d'espace de noms.
L'exemple d'architecture de dépôt suivant montre les emplacements valides et non valides pour les sélecteurs d'espaces de noms :
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
Comme les répertoires namespaces, eng et rnd représentent des espaces de noms abstraits, vous pouvez y ajouter un sélecteur. Toutefois, du fait que les répertoires gamestore et incubator-1 représentent des espaces de noms réels, vous ne pouvez pas y inclure de sélecteur d'espaces de noms.
Configurer un espace de noms abstrait
Avec un dépôt hiérarchique, vous pouvez éventuellement utiliser des espaces de noms abstraits.
L'exemple suivant montre comment déplacer votre répertoire d'espace de noms dans un espace de noms abstrait contenant des configurations supplémentaires héritées par l'espace de noms :
Dans votre dépôt, créez un répertoire d'espace de noms abstrait. Le répertoire d'espace de noms abstrait ne contient aucune configuration pour les espaces de noms, contrairement aux répertoires d'espaces de noms descendants.
Dans le répertoire d'espace de noms abstrait que vous avez créé, créez une configuration pour un rôle qui accorde les autorisations
getetlistsur tous les objets de n'importe quel espace de noms qui hérite du rôle :apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ROLE_NAME rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]Remplacez
ROLE_NAMEpar le nom du rôle.Créez une configuration pour une liaison de rôle qui lie le rôle à un groupe de messagerie :
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.ioRemplacez
ROLEBINDING_NAMEpar le nom du rôle.Déplacez la configuration d'espace de noms que vous avez créée dans la section précédente du répertoire
namespaces/vers le répertoire d'espace de noms abstrait que vous avez créé dans cette section.
Désactiver l'héritage pour les objets
Vous pouvez désactiver de manière sélective l'héritage pour une configuration en définissant le champ hierarchyMode sur none. Les ressources HierarchyConfig sont stockées dans le répertoire system/ du dépôt. Cet exemple désactive l'héritage pour les liaisons de rôle :
# 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