Auf dieser Seite wird erläutert, wie Sie mit Config Sync Namespaces verwalten und auswählen, welche Objekte Config Sync mit Ihren Namespaces synchronisiert.
Kubernetes-Ressourcenobjekte können je nach Ressourcentyp clusterbezogen oder namespacebezogen sein. Sie wählen den Cluster aus, indem Sie Ihren Client so konfigurieren, dass er mit einem bestimmten Cluster kommuniziert. Sie wählen den Namespace aus, indem Sie das Feld metadata.namespace im Objektmanifest konfigurieren. Config Sync bietet zusätzliche Funktionen: Cluster-Selektoren und Namespace-Selektoren, mit denen Sie weiter festlegen können, welche Objekte synchronisiert werden.
Bevor Sie diese Seite lesen, sollten Sie mit den folgenden Kubernetes-Konzepten vertraut sein:
Objekte mit Config Sync eingrenzen
Wenn Sie Config Sync in einem Cluster oder als Standard für die Flotte installieren, synchronisiert Config Sync standardmäßig alle Kubernetes-Objekte in Ihrer Source of Truth mit Clustern, auf denen Config Sync installiert ist, oder mit allen Clustern in einer Flotte. Wenn Sie Objekte jedoch auf einen Cluster oder Namespace eingrenzen , können Sie steuern, welche Objekte mit einem Cluster oder Namespace synchronisiert werden.
Config Sync bietet die folgenden Methoden zum Eingrenzen von Objekten:
- Clusterbezogene Objekte mit einem Cluster-Selektor konfigurieren
- Clusterbezogene Objekte mit Flottenpaket-Labels konfigurieren (Vorschau)
- Namespace-bezogene Objekte mit einem Namespace-Selektor konfigurieren (diese Seite)
Explizite Namespaces verwenden
Wir empfehlen, bei der Konfiguration von Config Sync eine explizite Namespace-Deklaration zu verwenden, da Sie damit Namespace-Metadaten verwalten und Namespaces später bei Bedarf löschen können.
Die Standardeinstellung ist implicit. Sie können die Namespace-Strategie jedoch in Ihrem RootSync- oder RepoSync-Objekt ändern, indem Sie das Feld namespaceStrategy auf explicit setzen. Weitere Informationen finden Sie unter
Namespace-Strategie.
Namespace-Selektoren
Namespace-Selektoren sind eine Funktion von Config Sync, mit der Sie ansonsten identische Ressourcenobjekte in mehreren Namespaces bereitstellen können.
Die Verwendung von Namespace-Selektoren ähnelt der Verwendung von
Kubernetes-Label-Selektoren
, um einen Dienst einer Reihe von Pods zuzuordnen, jedoch mit einer zusätzlichen Ebene der Indirektion.
Da Sie vorhandenen Ressourcentypen keine benutzerdefinierten Felder hinzufügen können, definieren Sie den Selektor stattdessen in einem NamespaceSelector-Objekt. Anschließend verweisen Sie in einer Annotation auf den Objekten, für die Sie diesen Selektor verwenden möchten, auf diesen Selektor.
So verwenden Sie Namespace-Selektoren:
- Fügen Sie den Namespaces, in denen Sie die Bereitstellung vornehmen möchten, ein Label hinzu oder wählen Sie ein vorhandenes Label aus.
- Definieren Sie in Ihrer Source of Truth ein
NamespaceSelector-Ressourcenobjekt.NamespaceSelector-Objekte werden von Config Sync nicht mit Ihrem Cluster synchronisiert. - Ändern Sie für jedes Objekt, das Sie mit einem oder mehreren Namespaces synchronisieren möchten, die Konfiguration des Objekts, um das
metadata.namespaceFeld zu entfernen und dieconfigmanagement.gke.io/namespace-selectorAnnotation mit einem Wert hinzuzufügen, der mit demmetadata.nameIhresNamespaceSelectorübereinstimmt.
Die Beispiele im folgenden Abschnitt enthalten weitere Informationen zum Definieren von NamespaceSelector-Objekten und zum Annotieren anderer Objekte, um den NamespaceSelector zu verwenden.
Hinweis
- Installieren Sie Config Sync.
- Erstellen Sie eine Source of Truth, in der Sie Ihre Konfigurationsdateien speichern, oder greifen Sie darauf zu.
- Wenn Sie noch keine Namespaces haben, erstellen Sie die Namespaces, auf die Sie Ihre Ressourcen eingrenzen möchten. Sie können den Namespace direkt in Ihrem Cluster oder in Ihrer Source of Truth erstellen.
Namespace-Selektoren verwenden
Namespace-Selektoren werden entweder mit gleichheitsbasierten Anforderungen oder setzbasierten Anforderungen definiert. Sie können mehrere Anforderungen kombinieren.
Beispiel für einen gleichheitsbasierten Label-Selektor
Im folgenden Beispiel wird gezeigt, wie Sie mit gleichheitsbasierten Selektoren auswählen, auf welche Namespaces eine Konfiguration angewendet wird:
Fügen Sie einem oder mehreren Namespaces ein Label hinzu:
kubectl label namespace NAMESPACE app=gamestoreErsetzen Sie
NAMESPACEdurch den Namen Ihres Namespace.Führen Sie diesen Befehl für jeden Namespace aus, den Sie labeln möchten.
Erstellen Sie einen Namespace-Selektor mit dem Namen
gamestore-selector:kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: gamestore-selector spec: selector: matchLabels: app: gamestoreWenn die Konfiguration eines anderen Objekts auf diesen Namespace-Selektor verweist, kann diese Konfiguration nur auf Objekte in Namespaces mit dem Label
app: gamestoreangewendet werden.Ein Namespace-Selektor hat erst dann eine Wirkung, wenn Sie in einer anderen Konfiguration darauf verweisen. Erstellen Sie ein Beispielobjektkontingent, das auf den Namespace-Selektor verweist:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: gamestore-selector spec: hard: pods: "1" cpu: "200m" memory: "200Mi"Das Ressourcenkontingent wird nur in Namespaces mit dem Label
app: gamestoreerstellt.
Beispiel für einen setzbasierten Label-Selektor
Im folgenden Beispiel wird gezeigt, wie Sie mit setzbasierten Selektoren Namespaces von der Übernahme von Objekten ausschließen:
Fügen Sie einem oder mehreren Namespaces ein Label hinzu:
kubectl label namespace NAMESPACE quota-exempt=exemptErsetzen Sie
NAMESPACEdurch den Namen Ihres Namespace.Führen Sie diesen Befehl für jeden Namespace aus, den Sie labeln möchten.
Erstellen Sie einen Namespace-Selektor mit dem Namen
exclude-exempt-namespaces:kind: NamespaceSelector apiVersion: configmanagement.gke.io/v1 metadata: name: excludes-exempt-namespaces spec: selector: matchExpressions: - key: quota-exempt operator: NotIn values: - exemptWenn die Konfiguration eines anderen Objekts auf diesen Namespace-Selektor verweist, wird diese Konfiguration auf alle Namespaces angewendet, außer auf die mit dem Schlüssel-Wert-Paar
quota-exempt: exempt.Ein Namespace-Selektor hat erst dann eine Wirkung, wenn Sie in einer anderen Konfiguration darauf verweisen. Erstellen Sie ein Beispielobjektkontingent, das auf den Namespace-Selektor verweist:
kind: ResourceQuota apiVersion: v1 metadata: name: quota annotations: configmanagement.gke.io/namespace-selector: exclude-exempt-namespaces spec: hard: pods: "1" cpu: "200m" memory: "200Mi"Das Ressourcenkontingent wird in allen Namespaces erstellt, außer in denen mit dem Schlüssel-Wert-Paar
quota-exempt: exempt.
Integration mit Teambereichen und Flotten-Namespaces
Flotten-Namespaces, die in Google Cloud automatisch das
fleet.gke.io/fleet-scope: your-scope Label haben. Alle Namespaces haben auch das Kubernetes-Label kubernetes.io/metadata.name: your-namespace. Mit diesen Standardlabels können Sie einen Namespace-Selektor zum Auswählen von Flotten-Namespaces einrichten.
Im Flotten-Tenancy-Tutorial wird ausführlicher erläutert, wie Sie Namespace-Selektoren mit Flotten und Teambereichen verwenden, um Objekte für verschiedene Teams selektiv zu verwalten.
Namespace-bezogene Objekte im hierarchischen Modus
Obwohl unstrukturierte Repositories für die meisten Anwendungsfälle empfohlen werden, können Sie Namespace-Selektoren verwenden, um Ihre Objekte mit einem hierarchischen Repository einzugrenzen. Die Verwendung von Namespace-Selektoren ist dieselbe, es gibt jedoch zusätzliche Einschränkungen und Anforderungen für die Organisation Ihrer Namespace-Konfiguration in Ihrer Source of Truth.
Beschränkungen
Wenn Sie eine Namespace-Selektorkonfiguration mit einem hierarchischen Repository verwenden, beachten Sie die folgenden Einschränkungen und Anforderungen:
- Sie müssen alle Konfigurationsdateien für Namespaces und namespacebezogene Objekte im
namespaces/Verzeichnis des hierarchischen Repositorys und in den untergeordneten Verzeichnissen speichern. - Sie müssen eine Namespace-Konfiguration explizit in
dem
namespaces/NAMESPACEUnterverzeichnis angeben, wobeiNAMESPACEmit dem Namen des Namespace übereinstimmt. Alle anderen namespacebezogenen Objekte müssen im selben Unterverzeichnis gespeichert werden. Wenn eine Namespace-Konfiguration fehlt, gibt Config Sync den Fehler KNV1044 zurück. - Ressourcen, die auf einen Namespace-Selektor verweisen, werden auf Namespaces angewendet, die eine bestimmte Konfiguration von einem abstrakten Namespace übernehmen, unabhängig von der Verzeichnisstruktur des Verzeichnisses
namespaces/.
Speicherort des Namespace-Selektors
In einem hierarchischen Repository können Sie eine Namespace-Selektorkonfiguration in einem beliebigen Verzeichnis für abstrakte Namespaces platzieren, jedoch nicht in einem Verzeichnis für Namespaces.
Die folgende Beispiel-Repository-Architektur zeigt gültige und ungültige Speicherorte für Namespace-Selektoren:
namespace-inheritance
...
├── namespaces
│ ├── eng
│ │ ├── gamestore
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
│ ├── ns_selector.yaml # valid
│ ├── rnd
│ │ ├── incubator-1
│ │ │ ├── namespace.yaml
│ │ │ └── ns_selector.yaml # invalid
│ │ └── ns_selector.yaml # valid
Da die Verzeichnisse namespaces, eng und rnd abstrakte Namespaces darstellen, können Sie in diese einen Selektor einfügen. Da die Verzeichnisse gamestore und incubator-1 jedoch tatsächliche Namespaces darstellen, können Sie in diese keinen Namespace-Selektor platzieren.
Abstrakten Namespace konfigurieren
Mit einem hierarchischen Repository können Sie optional abstrakte Namespaces verwenden.
Im folgenden Beispiel wird gezeigt, wie Sie Ihr Namespace-Verzeichnis in einen abstrakten Namespace verschieben, der zusätzliche Konfigurationen enthält, die vom Namespace übernommen werden:
Erstellen Sie in Ihrem Repository ein Verzeichnis für abstrakte Namespaces. Das Verzeichnis für abstrakte Namespaces enthält keine Konfigurationen für Namespaces, die untergeordneten Namespace-Verzeichnisse jedoch schon.
Erstellen Sie im Verzeichnis für abstrakte Namespaces, das Sie erstellt haben, eine Konfiguration für eine Rolle, die die Berechtigungen
getundlistfür alle Objekte in einem Namespace gewährt, der schließlich die Rolle übernimmt:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: ROLE_NAME rules: - apiGroups: [""] resources: ["*"] verbs: ["get", "list"]Ersetzen Sie
ROLE_NAMEdurch den Namen der Rolle.Erstellen Sie eine Konfiguration für eine Rollenbindung, die die Rolle an eine E-Mail-Gruppe bindet:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ROLE_NAME subjects: - kind: Group name: group@example.com apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: ROLEBINDING_NAME apiGroup: rbac.authorization.k8s.ioErsetzen Sie
ROLEBINDING_NAMEdurch den Namen der Rolle.Verschieben Sie die Namespace-Konfiguration, die Sie im vorherigen Abschnitt erstellt haben, aus dem Verzeichnis
namespaces/in das Verzeichnis für abstrakte Namespaces, das Sie in diesem Abschnitt erstellt haben.
Übernahme für Objekte deaktivieren
Sie können die Übernahme für jede Konfiguration selektiv deaktivieren, indem Sie das Feld hierarchyMode auf none setzen. HierarchyConfigs werden im Verzeichnis system/ des Repositorys gespeichert. In diesem Beispiel wird die Übernahme für Rollenbindungen deaktiviert:
# system/hierarchy-config.yaml
kind: HierarchyConfig
apiVersion: configmanagement.gke.io/v1
metadata:
name: rbac
spec:
resources:
# Configure role to only be allowed in leaf namespaces.
- group: rbac.authorization.k8s.io
kinds: [ "RoleBinding" ]
hierarchyMode: none