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 se trouvent dans le répertoire cluster/. Toutes les configurations de cluster/ s'appliquent à chaque cluster enregistré dans Config Sync.

Configurer des objets CustomResourceDefinition

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 ne devez appliquer une configuration qu'à 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 n'accepte que la sélection de clusters par nom.

L'objet ClusterSelector accepte la sélection de 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 leur nom. La valeur de l'annotation est une liste de noms de clusters cibles séparés par une virgule. Vous pouvez appliquer l'annotation aux objets à l'échelle d'un cluster et à ceux à l'échelle d'un espace de noms. Les objets d'espace de noms sont sélectionnés lorsque l'annotation correspond au nom du cluster et lorsque l'espace de noms auquel les clusters appartiennent est également sélectionné.

Sélectionner un seul cluster

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. Ce rôle n'est appliqué qu'au cluster portant le nom 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 celui-ci n'est appliqué qu'aux clusters portant le nom 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 labelSelectors 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.

Pour que vous puissiez utiliser des objets ClusterSélecteur, chaque cluster doit avoir un nom unique et un ensemble d'étiquettes pouvant être sélectionnées. Les métadonnées du cluster sont spécifiées dans une configuration de cluster de votre source de référence.

Ensuite, vous ajoutez des étiquettes à un cluster, créez l'objet ClusterSelect, puis le référencez dans une autre configuration.

Ajouter des étiquettes à 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 arbitrairement dans le répertoire de configuration ou ses répertoires descendants. Dans les dépôts hiérarchiques, les configurations 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 objet ClusterSélecteur

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 objet ClusterSélecteur

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