Configurer des clusters et des objets à l'échelle d'un cluster

Cette page explique comment configurer des clusters et des objets à l'échelle d'un cluster. Vous pouvez également en savoir plus sur la configuration des espaces de noms et des objets à l'échelle d'un espace de noms.

Configurer des clusters et des objets à l'échelle d'un cluster

Dans les dépôts non structurés, vous pouvez organiser les configurations des clusters et des objets à l'échelle d'un cluster de la manière qui vous convient le mieux. Toutes les configurations organisées de cette manière s'appliquent à chaque cluster enregistré dans Config Sync.

Dans les dépôts hiérarchiques, toutes les configurations des clusters et des objets à l'échelle d'un cluster sont situées dans le répertoire cluster/. Toutes les configurations dans cluster/ s'appliquent à chaque cluster enregistré dans Config Sync.

Configurer des objets CustomResourceDefinitions

Config Sync vous permet de synchroniser des objets CustomResourceDefinitions (CRD) de la même manière que n'importe quelle autre ressource. Quelques points sont à garder à l'esprit lors de la synchronisation des objets CRD :

  • Les objets CRD de dépôts hiérarchiques, même lors de la déclaration d'une ressource personnalisée associée à un espace de noms, doivent être placés dans le répertoire cluster/.

  • Les mises à jour des objets CRD et de leurs ressources personnalisées correspondantes ne s'effectuent pas dans un ordre prévisible. Si vous modifiez des objets CRD et leurs ressources personnalisées correspondantes dans le même commit, les objets CRD ne seront pas nécessairement mis à jour avant les ressources personnalisées. Les nomos status peuvent alors signaler une erreur temporaire pendant une courte période, jusqu'à ce que les ressources personnalisées et les objets CRD soient présents dans le cluster.

  • Config Sync n'autorise pas la suppression d'un objet CRD si une ressource personnalisée du dépôt en dépend. Pour supprimer un objet CRD, vous devez également supprimer sa ressource personnalisée. Nous vous recommandons de les supprimer dans le même commit pour le dépôt.

  • Vous pouvez synchroniser une ressource personnalisée sans synchroniser son objet CRD, à condition de garantir que ce dernier existe déjà dans le cluster.

Limiter les clusters affectés par une configuration

Par défaut, Config Sync applique une configuration à chaque cluster enregistré. Toutefois, si vous devez appliquer une configuration à un sous-ensemble de clusters, vous pouvez ajouter une annotation cluster-name-selector ou une configuration ClusterSelector à votre dépôt.

L'annotation cluster-name-selector fournit un moyen simple de spécifier un sous-ensemble de clusters auquel appliquer une configuration. Cette option permet uniquement de sélectionner des clusters par nom.

L'objet ClusterSelector permet de sélectionner des clusters par libellé, mais il nécessite des configurations plus complexes.

Configurer à l'aide de l'annotation cluster-name-selector

Vous pouvez appliquer une configuration à un sous-ensemble de clusters avec l'annotation configsync.gke.io/cluster-name-selector. Vous pouvez utiliser cette annotation pour appliquer une configuration à un ensemble de clusters, désignés par des noms de cluster. La valeur de l'annotation est une liste de noms de clusters cibles séparés par une virgule. Vous pouvez appliquer l'annotation à des objets à l'échelle d'un cluster et à des objets à l'échelle d'un espace de noms. Les objets Namespace sont sélectionnés lorsque l'annotation correspond au nom du cluster et que l'espace de noms auquel les clusters appartiennent est également sélectionné.

Sélectionner un cluster unique

La configuration suivante crée un objet Role appelé namespace-reader qui définit un ensemble d'autorisations pour la lecture des espaces de noms. Cet objet Role n'est appliqué que sur le cluster dont le nom est cluster-1.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

Sélectionner une liste de clusters

La configuration suivante crée le même objet Role que l'exemple précédent, mais cet objet Role n'est appliqué que sur les clusters portant les noms cluster-1, cluster-2 ou cluster-3.

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: my-namespace
  name: namespace-reader
  annotations:
    configsync.gke.io/cluster-name-selector: cluster-1,cluster-2,cluster-3
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

Configurer à l'aide de l'objet ClusterSelector

ClusterSelector est un type de configuration spécial qui utilise les objets labelSelector Kubernetes. Vous pouvez utiliser un objet ClusterSelector pour limiter les clusters auxquels s'applique une configuration particulière, en fonction des libellés des clusters. Vous pouvez également utiliser des objets ClusterSelector pour limiter les clusters qui instancient un objet à l'échelle d'un espace de noms.

Comme les autres objets labelSelector, les objets ClusterSelector fonctionnent à l'aide de la logique ET. Comme les objets ClusterSelector utilisent la logique ET, les objets ne sont sélectionnés que s'ils correspondent à tous les libellés que vous définissez.

Une configuration ClusterSelector ne persiste pas dans un cluster. À la place, vous la référencez dans une autre configuration à l'aide d'une annotation, et cette configuration ne s'applique qu'aux clusters qui correspondent à l'objet ClusterSelector.

Avant de pouvoir utiliser des objets ClusterSelector, chaque cluster doit avoir un nom unique et un ensemble de libellés pouvant être sélectionnés. Les métadonnées du cluster sont spécifiées dans une configuration de cluster de votre source fiable.

Ensuite, ajoutez des libellés à un cluster, créez l'objet ClusterSelector, puis référencez-le dans une autre configuration.

Ajouter des libellés à un cluster

Pour utiliser des objets ClusterSelector, chaque cluster doit avoir un ensemble de libellés pouvant être sélectionnés. Dans les dépôts non structurés, les configurations Cluster peuvent être stockées de manière arbitraire dans le répertoire de configuration ou dans ses répertoires enfants. Dans les dépôts hiérarchiques, les configurations de cluster sont stockées dans le répertoire clusterregistry/.

Pour appliquer des configurations à un cluster, le champ metadata.name de la configuration du cluster doit correspondre au champ clusterName de votre objet ConfigManagement.

L'exemple de configuration de cluster suivant déclare que cluster-2 possède les libellés environment: prod et location: central.

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-2
  labels:
    environment: prod
    location: central

Vous pouvez également appliquer des annotations à l'aide d'une configuration Cluster.

Créer un ClusterSelector

Un objet ClusterSelector ne sélectionne que les clusters associés à un libellé ou à une combinaison de libellés donnés. Dans les dépôts non structurés, les objets ClusterSelector peuvent être stockés de manière arbitraire dans le répertoire de synchronisation ou dans ses répertoires descendants. Dans les dépôts hiérarchiques, les objets ClusterSelector sont stockés dans le répertoire clusterregistry/ de premier niveau du dépôt.

L'objet ClusterSelector suivant ne sélectionne que les clusters dotés du libellé environment: prod.

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-env-prod
spec:
  selector:
    matchLabels:
      environment: prod

L'objet ClusterSelector suivant sélectionne tous les clusters portant les libellés location: central ou location: west.

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-central-or-west
spec:
  selector:
    matchExpressions:
      - key: location
        operator: In
        values:
        - central
        - west 

Un objet ClusterSelector n'a aucun effet tant que vous ne le référencez pas dans une autre configuration.

Référencer un ClusterSelector

Pour référencer un objet ClusterSelector dans une autre configuration, définissez l'annotation configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME.

La configuration suivante crée un objet ClusterRole appelé namespace-reader qui définit un ensemble d'autorisations pour la lecture des espaces de noms. Cet objet ClusterRole n'est instancié que sur les clusters qui correspondent à l'objet ClusterSelector selector-env-prod.

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-reader
  annotations:
    configmanagement.gke.io/cluster-selector: selector-env-prod
rules:
- apiGroups: [""]
  resources: ["namespaces"]
  verbs: ["get", "watch", "list"]

Limiter les clusters affectés par une configuration à l'échelle d'un espace de noms

Par défaut, Config Sync applique des configurations héritées par un espace de noms à cet espace de noms, dans chaque cluster où il existe. Vous pouvez utiliser un objet ClusterSelector pour n'appliquer la configuration qu'à un sous-ensemble de ces clusters.

Par exemple, vous pouvez configurer les clusters différemment en fonction de leur emplacement géographique ou de l'emplacement géographique de leurs clients. Cette configuration peut être utile pour la localisation ou la conformité légale. Les exemples de cette section n'appliquent des configurations spécifiques aux paramètres régionaux qu'aux clusters portant le libellé location: france.

La configuration Cluster suivante ajoute un libellé location: france à un cluster appelé cluster-1 :

kind: Cluster
apiVersion: clusterregistry.k8s.io/v1alpha1
metadata:
  name: cluster-1
  labels:
    location: france

Créez une configuration ClusterSelector référençant les libellés que vous souhaitez sélectionner. L'objet ClusterConfig suivant sélectionne le libellé location: france :

kind: ClusterSelector
apiVersion: configmanagement.gke.io/v1
metadata:
  name: selector-location-france
spec:
  selector:
    matchLabels:
      location: france

Un objet ClusterSelector n'a aucun effet tant que vous ne le référencez pas dans une autre configuration. La configuration RoleBinding suivante ne sélectionne que les clusters correspondant à l'objet ClusterSelector selector-location-france. Cette configuration peut être utile, par exemple si une directive de conformité n'autorise qu'un compte de service particulier à afficher des informations sur les clusters de sa région géographique désignée.

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: viewers
  annotations:
    configmanagement.gke.io/cluster-selector: selector-location-france
subjects:
- kind: Group
  name: system:serviceaccounts:foo
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io

Si vous placez cette configuration dans un espace de noms abstrait ou un répertoire d'espaces de noms, tel que namespaces/eng, elle est appliquée aux espaces de noms qui en héritent, mais uniquement sur les clusters avec le libellé location: france.

Étapes suivantes