Synchroniser des objets avec plusieurs espaces de noms

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 :

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 :

  1. Ajoutez ou choisissez un libellé existant sur les espaces de noms dans lesquels vous souhaitez effectuer le déploiement.
  2. Définissez un objet de ressource NamespaceSelector dans votre source de référence. Config Sync ne synchronise pas les objets NamespaceSelector avec votre cluster.
  3. 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.namespace et ajoutez l'annotation configmanagement.gke.io/namespace-selector avec une valeur qui correspond à metadata.name de votre NamespaceSelector.

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

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 :

  1. Ajoutez un libellé à un ou plusieurs espaces de noms :

    kubectl label namespace NAMESPACE app=gamestore
    

    Remplacez NAMESPACE par le nom de votre espace de noms.

    Exécutez cette commande pour chaque espace de noms que vous souhaitez libeller.

  2. 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: gamestore
    

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

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

  1. Ajoutez un libellé à un ou plusieurs espaces de noms :

    kubectl label namespace NAMESPACE quota-exempt=exempt
    

    Remplacez NAMESPACE par le nom de votre espace de noms.

    Exécutez cette commande pour chaque espace de noms que vous souhaitez libeller.

  2. 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:
                - exempt
    

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

  3. 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/NAMESPACE sous-répertoire, où NAMESPACE correspond 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 :

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

  2. 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 get et list sur 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_NAME par le nom du rôle.

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

    Remplacez ROLEBINDING_NAME par le nom du rôle.

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