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.

Cluster und clusterbezogene Objekte konfigurieren

In unstrukturierten Repositories können Sie Konfigurationen für Cluster und clusterbezogene Objekte so organisieren, wie es für Sie am praktischsten ist. Alle auf diese Weise organisierten Konfigurationen gelten für jeden in Config Sync registrierten Cluster.

In hierarchischen Repositories befinden sich alle Konfigurationen für Cluster und clusterbezogene Objekte im Verzeichnis cluster/. Alle Konfigurationen in cluster/ gelten für jeden in Config Sync registrierten Cluster.

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.

Konfiguration auf bestimmte Cluster begrenzen

Standardmäßig wendet Config Sync eine Konfiguration auf jeden registrierten Cluster an. Wenn Sie eine Konfiguration jedoch nur auf einen Teil der Cluster anwenden müssen, können Sie Ihrem Repository entweder eine Annotation cluster-name-selector oder eine ClusterSelector-Konfiguration hinzufügen.

Die Annotation cluster-name-selector bietet eine einfache Möglichkeit, eine Teilmenge von Clustern anzugeben, auf die eine Konfiguration angewendet werden soll. Mit dieser Option können Cluster nur nach Namen ausgewählt werden.

Das ClusterSelector-Objekt unterstützt die Auswahl von Clustern nach Labels, erfordert jedoch komplexere Konfigurationen.

Mit der Annotation cluster-name-selector 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 Gruppe von Clustern anwenden, die durch Clusternamen angegeben werden. 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 übereinstimmt und wenn auch der Namespace, zu dem die Cluster gehören, ausgewählt ist.

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 den Cluster mit dem Namen cluster-1 angewendet.

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 Role wie im vorherigen Beispiel erstellt. Diese Rolle wird jedoch nur auf die Cluster mit dem Namen cluster-1, cluster-2 oder cluster-3 angewendet.

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

Mit dem Objekt ClusterSelector konfigurieren

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 und einen Satz Labels haben, die ausgewählt werden können. Die Clustermetadaten werden in einer Clusterkonfiguration in Ihrer „Source of Truth“ angegeben.

Als Nächstes fügen Sie einem Cluster Labels hinzu, erstellen den ClusterSelector und verweisen dann in einer anderen Konfiguration darauf.

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. In unstrukturierten Repositories können Clusterkonfigurationen beliebig im Konfigurationsverzeichnis oder in den untergeordneten Verzeichnissen gespeichert werden. In hierarchischen Repositories werden Clusterkonfigurationen im Verzeichnis clusterregistry/ gespeichert.

Wenn Sie Konfigurationen auf einen Cluster anwenden möchten, muss das Feld metadata.name der Clusterkonfiguration mit dem Feld clusterName Ihres ConfigManagement-Objekts übereinstimmen.

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.

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 beschränken, auf die sich eine Namespace-bezogene Konfiguration auswirkt

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

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