Nur eine Teilmenge von Clustern konfigurieren

Im Normalfall wendet Config Sync eine Konfiguration auf jeden registrierten Cluster an. Befindet sich die Konfiguration innerhalb des Unterverzeichnisses namespaces/ eines hierarchischen Repositorys, erstellt Config Sync zuerst den Namespace in jedem Cluster und wendet dann alle übernommenen Konfigurationen auf diesen Namespace an.

Sie können aber eine Konfiguration auf eine Teilmenge von Clustern anwenden. Ab Version 1.6.1 können Sie Ihren Konfigurationen die Annotation configsync.gke.io/cluster-name-selector hinzufügen. Wenn Sie eine ältere Version als 1.6.1 verwenden, können Sie einen ClusterSelector verwenden.

Annotation für die Clusterauswahl verwenden

Sie können mit der Annotation configsync.gke.io/cluster-name-selector eine Konfiguration auf eine Reihe von Clustern anwenden, die durch Clusternamen gekennzeichnet sind. Der Wert der Annotation ist eine durch Kommas getrennte Liste von Zielclusternamen. Sie können die Annotation auf clusterbezogene Objekte und Namespace-bezogene Objekte anwenden. Namespace-Objekte werden ausgewählt, wenn die Annotation mit dem Clusternamen und dem Namespace, zu dem die Cluster gehören, ausgewählt wird.

Einzelnen Cluster auswählen

Mit der folgenden Konfiguration wird eine ClusterRole mit dem Namen namespace-reader erstellt, die eine Reihe von Berechtigungen zum Lesen von Namespaces definiert. Diese Rolle wird nur auf dem Cluster instanziiert, der den Namen cluster-1 hat.

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"]

Liste von Clustern auswählen

Mit der folgenden Konfiguration wird die gleiche Rolle wie im vorherigen Beispiel erstellt, aber diese Rolle wird nur in Clustern mit dem Namen cluster-1, cluster-2 oder cluster-3 instanziiert.

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"]

ClusterSelectors verwenden

Ein ClusterSelector ist ein spezieller Konfigurationstyp, der labelSelectors von Kubernetes verwendet. Mit einem ClusterSelector können Sie anhand der Clusterlabels einschränken, für welche Cluster eine Konfiguration gilt. Sie können mit ClusterSelectors auch einschränken, welche Cluster ein Namespace-bezogenes Objekt instanziieren.

Wie andere labelSelectors funktionieren ClusterSelectors mit AND-Logik. Da ClusterSelector die AND-Logik verwendet, werden Objekte nur dann ausgewählt, wenn sie mit allen von Ihnen definierten Labels übereinstimmen.

Eine ClusterSelector-Konfiguration bleibt nicht dauerhaft in einem Cluster erhalten. Stattdessen verweisen Sie in einer anderen Konfiguration mithilfe einer Annotation darauf und diese Konfiguration gilt nur für Cluster, die dem ClusterSelector entsprechen.

Damit Sie ClusterSelectors verwenden können, muss jeder Cluster einen eindeutigen Namen haben. Sie legen den Namen des Clusters fest, wenn Sie den Config Sync Operator konfigurieren. Sie können jedem Cluster manuell Labels zuweisen. Wir empfehlen jedoch, dafür eine Clusterkonfiguration zu nutzen.

Als Nächstes erstellen Sie den ClusterSelector und verweisen dann in einer anderen Konfiguration auf ihn.

Labels zu einem Cluster hinzufügen

Wenn Sie ClusterSelectors verwenden möchten, muss jeder Cluster mit einem Satz Labels versehen sein, die ausgewählt werden können. Sie können Cluster manuell mit Labels versehen, es wird jedoch empfohlen, für jeden Cluster eine Clusterkonfiguration zu verwenden. In unstrukturierten Repositories können Clusterkonfigurationen beliebig im Sync-Verzeichnis oder in den zugehörigen untergeordneten Verzeichnissen gespeichert werden. In hierarchischen Repositories werden Clusterkonfigurationen im Verzeichnis clusterregistry/ des Git-Repositories gespeichert.

Das Feld clusterName Ihrer config-management.yaml-Datei sollte dem Feld metadata.name von mindestens einer Clusterkonfiguration entsprechen.

In folgender Beispielkonfiguration für Cluster wird deklariert, dass cluster-2 die Labels environment: prod und location: central hat.

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

Sie können mithilfe einer Clusterkonfiguration auch Annotationen festlegen.

ClusterSelector erstellen

Ein ClusterSelector wählt nur Cluster mit einem bestimmten Label oder einer Kombination von Labels aus. In unstrukturierten Repositories können ClusterSelectors beliebig im Sync-Verzeichnis oder in den zugehörigen untergeordneten Verzeichnissen gespeichert werden. In hierarchischen Repositories werden ClusterSelectors im übergeordneten Verzeichnis clusterregistry/ des Repositorys gespeichert.

Mit dem folgenden ClusterSelector werden nur Cluster mit dem Label environment: prod ausgewählt.

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

Mit folgendem ClusterSelector werden alle Cluster mit den Labels location: central oder location: west ausgewählt.

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

Ein ClusterSelector hat erst dann Auswirkungen, wenn Sie in einer anderen Konfiguration auf ihn verweisen.

Auf einen ClusterSelector verweisen

Wenn Sie auf einen ClusterSelector in einer anderen Konfiguration verweisen möchten, legen Sie die Annotation configmanagement.gke.io/cluster-selector: CLUSTERSELECTOR-NAME fest.

Mit der folgenden Konfiguration wird eine ClusterRole mit dem Namen namespace-reader erstellt, die eine Reihe von Berechtigungen zum Lesen von Namespaces definiert. Diese ClusterRole wird nur in Clustern instanziiert, die dem ClusterSelector selector-env-prod entsprechen.

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"]

Cluster für eine Namespace-bezogene Konfiguration beschränken

Standardmäßig wendet Config Sync die von einem Namespace übernommenen Konfigurationen auf diesen Namespace in jedem Cluster an, in dem er vorhanden ist. Mit einem ClusterSelector können Sie die Konfiguration auf nur einen Teil dieser Cluster anwenden.

Sie können Cluster beispielsweise anhand ihres geografischen Standorts oder des geografischen Standorts ihrer Clients unterschiedlich konfigurieren. Diese Konfiguration kann für die Lokalisierung oder die Einhaltung gesetzlicher Vorschriften nützlich sein. In den Beispielen in diesem Abschnitt werden Konfigurationen für ein bestimmtes Gebiet nur auf Cluster mit dem Label location: france angewendet.

Bei der folgenden Clusterkonfiguration wird einem Cluster namens cluster-1 das Label location: france hinzugefügt:

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

Sie könnten auch jeden der relevanten Cluster manuell mit einem Label versehen, aber dieser Prozess erhöht die Fehleranfälligkeit und wird nicht empfohlen.

Erstellen Sie eine ClusterSelector-Konfiguration, die auf die Labels verweist, die Sie auswählen möchten. Mit der folgenden ClusterConfig wird das Label location: france ausgewählt:

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

Ein ClusterSelector hat erst dann Auswirkungen, wenn Sie in einer anderen Konfiguration auf ihn verweisen. Mit der folgenden RoleBinding-Konfiguration werden nur Cluster ausgewählt, die dem ClusterSelector selector-location-france entsprechen. Diese Konfiguration kann nützlich sein, wenn eine Compliancerichtlinie beispielsweise nur einem bestimmten Dienstkonto erlaubt hat, sich Informationen zu Clustern in der entsprechenden geografischen Region anzusehen.

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

Wenn Sie diese Konfiguration in einem abstrakten Namespace-Verzeichnis oder in einem Namespace-Verzeichnis wie namespaces/eng platzieren, wird sie auf die Namespaces angewendet, die sie übernehmen, aber ausschließlich in Clustern mit dem Label location: france.

Nächste Schritte