Configurer des espaces de noms et des objets à l'échelle d'un espace de noms

Cette page explique comment utiliser Config Sync pour gérer des objets Namespace et des objets à l'échelle d'un espace de noms. Vous pouvez également découvrir comment configurer des clusters et des objets à l'échelle d'un cluster.

Configurer un objet Namespace

Format non structuré

Les configurations des espaces de noms et des objets définis à leur échelle peuvent être situées n'importe où dans le répertoire ou dans les sous-répertoires.

Procédez comme suit pour configurer un objet Namespace appelé gamestore dans chaque cluster enregistré. Il vous suffit de créer un fichier YAML contenant la configuration de l'espace de noms. Cet exemple ajoute le fichier au répertoire racine. Vous pouvez le déplacer dans n'importe quel sous-répertoire.

  1. Créez un fichier namespace-gamestore.yaml avec le contenu suivant :

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    
  2. Créez un commit incluant la configuration namespace-gamestore.yaml, puis transférez le commit vers le dépôt distant.

    git add multirepo/root/namespace-gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push [NAME-OF-REMOTE] [BRANCH-NAME]
    

Format hiérarchique

Toutes les configurations des objets Namespace et des objets définis à l'échelle d'un espace de noms se trouvent dans le répertoire namespaces/ du dépôt hiérarchique et ses répertoires descendants.

Procédez comme suit pour configurer un objet Namespace appelé gamestore dans chaque cluster enregistré.

  1. Dans le clone local du dépôt, créez un répertoire d'espace de noms. Un répertoire d'espace de noms contient une configuration pour un objet Namespace. Le nom du répertoire d'espace de noms doit correspondre au nom de l'objet Namespace. Dans cet exemple, le répertoire est appelé namespaces/gamestore :

    mkdir namespaces/gamestore
    
  2. Dans le répertoire d'espace de noms, créez un fichier gamestore.yaml avec le contenu suivant. Le champ metadata.name doit correspondre au nom de l'espace de noms et au nom du répertoire d'espace de noms.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: gamestore
    
  3. Créez un commit incluant la configuration gamestore.yaml, puis transférez le commit vers le dépôt distant.

    git add namespaces/gamestore/gamestore.yaml
    git commit -m "Created gamestore namespace config"
    git push [NAME-OF-REMOTE] [BRANCH-NAME]
    

Après quelques instants, l'objet Namespace gamestore est créé dans chaque cluster enregistré. Pour le valider, décrivez l'objet Namespace :

kubectl describe namespace gamestore

Pour supprimer la configuration et supprimer l'objet Namespace gamestore des clusters enregistrés, vous pouvez créer un commit qui supprime le fichier, puis le transférer vers le dépôt distant.

Configurer un espace de noms abstrait

Cet exemple élargit l'exemple de la section Configurer un espace de noms en déplaçant le répertoire d'espace de noms gamestore dans un espace de noms abstrait contenant des configurations supplémentaires héritées par l'espace de noms gamestore.

  1. Dans le clone local du dépôt, créez un répertoire d'espace de noms abstrait appelé eng. Un répertoire d'espace de noms abstrait ne contient pas de configuration pour un objet Namespace, contrairement à ses répertoires d'espaces de noms descendants.

    mkdir namespaces/eng
    
  2. Dans le répertoire d'espace de noms abstrait eng, créez une configuration pour un rôle appelé eng-viewer qui accorde les autorisations get et list sur toutes les ressources de n'importe quel objet Namespace qui hérite du rôle.

    # namespaces/eng/eng-role.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: eng-viewer
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["get", "list"]
    
  3. Créez une configuration pour un objet RoleBinding appelé eng-admin qui lie le rôle eng-viewer au groupe 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. Déplacez le répertoire d'espaces de noms gamestore du répertoire namespaces/ vers le répertoire namespaces/eng/ :

    mv namespaces/gamestore/ namespaces/eng/
    
  5. Validez toutes vos modifications et transférez-les vers le dépôt distant.

Config Sync Operator remarque la modification et applique le nouveau rôle et l'objet RoleBinding à l'objet Namespace gamestore sur tous les clusters enregistrés.

Pour supprimer les configurations et supprimer l'objet Namespace gamestore des clusters enregistrés, vous pouvez créer un commit qui supprime la totalité de l'espace de noms abstrait eng, puis le transférer vers le dépôt distant.

Limiter les clusters affectés par une configuration

Généralement, Config Sync applique une configuration à chaque cluster enregistré. Si la configuration se trouve dans le sous-répertoire namespaces/ d'un dépôt hiérarchique, Config Sync crée d'abord l'espace de noms dans chaque cluster, puis applique toutes les configurations héritées à cet espace de noms.

Pour limiter les clusters affectés par une configuration donnée en fonction des libellés de chaque cluster, consultez la section Appliquer des configurations à un sous-ensemble de clusters.

Limiter les objets Namespace affectés par une configuration

NamespaceSelector est un type de configuration spécial qui utilise les objets labelSelector Kubernetes. Vous pouvez déclarer des objets NamespaceSelector en association avec des configurations pour des objets à l'échelle d'un espace de noms dans un dépôt non structuré ou dans un dépôt hiérarchique afin de limiter les espace de noms pouvant hériter de cette configuration.

Les objets NamespaceSelector ressemblent aux objets ClusterSelectors, mais sont légèrement différents. L'objet NamespaceSelector limite le pool d'espaces de noms auxquels une configuration s'applique. Dans un dépôt non structuré, les objets qui déclarent l'annotation NamespaceSelector sont appliqués à tous les espaces de noms qui satisfont aux conditions de l'objet NamespaceSelector. Dans un dépôt hiérarchique, les objets qui déclarent l'annotation NamespaceSelector sont appliqués 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/. Un objet ClusterSelector limite le groupe de clusters auquel une configuration s'applique, que la configuration cible un objet à l'échelle d'un cluster ou à l'échelle d'un espace de noms.

Emplacement de l'objet NamespaceSelector

  • Format non structuré : dans un dépôt non structuré, vous pouvez placer les objets NamespaceSelector dans n'importe quel répertoire ou sous-répertoires.
  • Format hiérarchique : dans un dépôt hiérarchique, vous pouvez placer des objets NamespaceSelector dans n'importe quel répertoire d'espace de noms abstrait, mais pas dans un répertoire d'espace de noms. .

    L'exemple de dépôt suivant montre les emplacements valides et non valides pour les objets NamespaceSelector :

    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 d'objet NamespaceSelector.

Utiliser un objet NamespaceSelector

La configuration suivante crée un objet NamespaceSelector appelé gamestore-selector. Si une autre configuration référence cet objet NamespaceSelector, elle ne peut être appliquée qu'aux objets présents dans les objets Namespace portant le libellé app: gamestore.

kind: NamespaceSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: gamestore-selector
spec:
  selector:
    matchLabels:
      app: gamestore

Pour référencer un objet NamespaceSelector dans une configuration, définissez l'annotation configmanagement.gke.io/namespace-selector sur le nom de l'objet NamespaceSelector.

Un objet NamespaceSelector n'a aucun effet tant que vous ne le référencez pas dans une autre configuration. Si l'objet NamespaceSelector gamestore-selector se trouve dans la même hiérarchie que l'objet ResourceQuota suivant, quota, l'objet ResourceQuota n'est créé que dans les espaces de noms auxquels le libellé app: gamestore est appliqué :

kind: ResourceQuota
apiVersion: v1
metadata:
  name: quota
  annotations:
    configmanagement.gke.io/namespace-selector: gamestore-selector
spec:
  hard:
    pods: "1"
    cpu: "200m"
    memory: 200Mi

En résumé, vous devez suivre les trois étapes suivantes pour utiliser un objet NamespaceSelector :

  1. Ajouter des libellés aux objets Namespace
  2. Créer une configuration d'objet NamespaceSelector
  3. Référencer l'objet NamespaceSelector dans une autre configuration

Désactiver l'héritage pour un type d'objet

Vous pouvez désactiver de manière sélective l'héritage de toute configuration en définissant le champ hierarchyMode sur none. Les ressources HierarchyConfig sont stockées dans le répertoire system/ du dépôt. Dans l'exemple ci-dessous, l'héritage est désactivé pour les objets RoleBinding.

# 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

Étapes suivantes