Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Cluster und clusterbezogene Objekte konfigurieren

Auf dieser Seite wird erläutert, wie Sie Cluster und clusterbezogene Objekte konfigurieren. Sie erhalten auch Informationen zum Thema Namespaces und Namespace-bezogene Objekte konfigurieren.

In unstrukturierten Repositories können Sie Konfigurationen für Cluster und clusterbezogene Objekte in Ihrem Repository auf die für Sie am besten geeignete Weise organisieren. Wenn Sie in Ihrem Repository keinen ClusterSelector angeben, gelten alle Konfigurationen für clusterbezogene Objekte für jeden in Config Sync registrierten Cluster.

In hierarchischen Repositories befinden sich alle configs für Cluster und clusterbezogene Objekte im Verzeichnis cluster/ eines hierarchischen Repositories. Wenn Sie keinen ClusterSelector in Ihr Repository aufnehmen, gilt eine Konfiguration in cluster/ für jeden in Config Sync registrierten Cluster.

Konfiguration auf bestimmte Cluster begrenzen

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.

Wenn Sie jedoch eine Konfiguration auf eine Teilmenge von Clustern anwenden müssen, können Sie Ihren Konfigurationen eine Annotation oder einen ClusterSelector hinzufügen. Informationen zur Verwendung dieser Features finden Sie unter ClusterSelectors verwenden.

Labels des Clusters konfigurieren

Sie können eine Clusterkonfiguration verwenden, um die Labels und Annotationen eines Clusters zu konfigurieren. Wenn Sie ClusterSelectors verwenden, benötigt jeder Cluster eine Reihe von Labels, die der ClusterSelector auswählen kann. Sie können Cluster zwar manuell mit Labels versehen, wir empfehlen jedoch, Labels mit einer Clusterkonfiguration zu konfigurieren.

CustomResourceDefinitions konfigurieren

Config Sync ermöglicht die Synchronisierung von CustomResourceDefinitions (CRDs) auf die gleiche Weise, wie Sie jede andere Ressource synchronisieren würden. Folgendes sollten Sie bei der Synchronisierung von CRDs bedenken:

  • CRDs in hierarchischen Repositories müssen im Verzeichnis cluster/ abgelegt werden, auch wenn eine benutzerdefinierte Namespace-Ressource deklariert wird.

  • Aktualisierungen von CRDs und der zugehörigen CustomResources erfolgen nicht in einer vorhersehbaren Reihenfolge. Wenn Sie CRDs und die entsprechenden CustomResources im selben Commit ändern, kann nicht davon ausgegangen werden, dass CRD-Aktualisierungen vor benutzerdefinierten Ressourcen aktualisiert werden. Das kann dazu führen, dass der nomos status kurz einen vorübergehenden Fehler meldet, bis sowohl die CustomResource als auch die CRD im Cluster vorhanden sind.

  • Config Sync lässt das Entfernen einer CRD nicht zu, wenn eine CustomResource im Repository davon abhängt. Zum Entfernen einer CRD müssen Sie auch deren CustomResource entfernen. Deshalb sollten Sie beide im selben Commit an das Repository entfernen.

  • Sie können eine CustomResource synchronisieren, ohne dabei ihre CRD zu synchronisieren, solange Sie garantieren können, dass die CRD bereits im Cluster vorhanden ist.

Teilmenge von Clustern konfigurieren

Mit der Annotation configsync.gke.io/cluster-name-selector können Sie eine Konfiguration auf eine Teilmenge von Clustern anwenden. Mit dieser Annotation können Sie 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 Cluster- und Namespace-bezogene Objekte anwenden. Namespace-Objekte werden ausgewählt, wenn die Annotation mit dem Clusternamen übereinstimmt und wenn auch der Namespace ausgewählt ist, zu dem die Cluster gehören.

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 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 Synchronisierungsverzeichnis oder in seinen 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 sowohl im Synchronisierungsverzeichnis als auch in den 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.

ClusterSelector referenzieren

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 einschränken, die von einer Namespace-bezogenen Konfiguration betroffen sind

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 damit 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