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 besten 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 dafür sorgen 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 jedoch eine Konfiguration nur auf einen Teil der Cluster anwenden möchten, können Sie entwedercluster-name-selector Annotation oderClusterSelector Konfiguration für Ihr Repository hinzufügen.
Die Annotation cluster-name-selector
bietet eine einfache Möglichkeit, eine Teilmenge von Clustern anzugeben, auf die eine Konfiguration angewendet werden soll. Diese Option unterstützt nur die Auswahl von Clustern nach Namen.
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. Sie können mit der Annotation 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 angewandt, 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
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 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. In unstrukturierten Repositories können Clusterkonfigurationen beliebig im Konfigurationsverzeichnis oder in seinen untergeordneten Verzeichnissen gespeichert werden.
In hierarchischen Repositories werden Clusterkonfigurationen im Verzeichnis clusterregistry/
gespeichert.
Zum Anwenden von Konfigurationen auf einen Cluster 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.
Einen ClusterSelector empfehlen
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 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
.