Richtlinien für einen mehrmandantenfähigen Cluster erstellen

In dieser Anleitung erfahren Sie, wie Sie mit Config Sync und Kustomize Richtlinien für Namespaces in einem mehrmandantenfähigen Cluster konfigurieren.

In Kubernetes kann ein Mandant ein Team oder eine Arbeitslast sein. Für mehrmandantenfähige Cluster empfiehlt es sich, für jeden Mandanten einen Namespace zu erstellen. Anschließend kann jeder Namespace Richtlinien haben, die für seine verschiedenen Anforderungen geeignet sind. Sie können Config Sync verwenden, um diese Richtlinien konsistent auf jeden Ihrer verschiedenen Mandanten anzuwenden.

Repository-Architektur

In dieser Anleitung konfigurieren Sie Config Sync für die Synchronisierung mit den Konfigurationen im Verzeichnis namespace-specific-policy/ des Beispiel-Repositorys von Anthos Config Management. Dieses Verzeichnis enthält die folgenden Verzeichnisse und Dateien:

├── configsync
│   ├── tenant-a
│   │   ├── ~g_v1_namespace_default.yaml
│   │   ├── networking.k8s.io_v1_networkpolicy_deny-all.yaml
│   │   ├── rbac.authorization.k8s.io_v1_rolebinding_tenant-admin-rolebinding.yaml
│   │   └── rbac.authorization.k8s.io_v1_role_tenant-admin.yaml
│   ├── tenant-b
│   │   ├── ~g_v1_namespace_default.yaml
│   │   ├── networking.k8s.io_v1_networkpolicy_deny-all.yaml
│   │   ├── rbac.authorization.k8s.io_v1_rolebinding_tenant-admin-rolebinding.yaml
│   │   └── rbac.authorization.k8s.io_v1_role_tenant-admin.yaml
│   └── tenant-c
│       ├── ~g_v1_namespace_default.yaml
│       ├── networking.k8s.io_v1_networkpolicy_deny-all.yaml
│       ├── rbac.authorization.k8s.io_v1_rolebinding_tenant-admin-rolebinding.yaml
│       └── rbac.authorization.k8s.io_v1_role_tenant-admin.yaml
├── configsync-src
│   ├── base
│   │   ├── kustomization.yaml
│   │   ├── namespace.yaml
│   │   ├── networkpolicy.yaml
│   │   ├── rolebinding.yaml
│   │   └── role.yaml
│   ├── tenant-a
│   │   └── kustomization.yaml
│   ├── tenant-b
│   │   └── kustomization.yaml
│   └── tenant-c
│       └── kustomization.yaml
├── README.md
└── scripts
    └── render.sh

Dieses Repository ist ein unstrukturiertes Repository. Dies gibt Ihnen die Flexibilität, Ihre Konfigurationen so zu organisieren, wie Sie möchten. Dies ist besonders nützlich, wenn Sie mit Kustomize arbeiten.

In diesem Repository gibt es drei Namespaces für drei verschiedene Mandanten: tenant-a, tenant-b und tenant-c. Jedes Namespace-Verzeichnis enthält Konfigurationen für Roles, RoleBindings und NetworkPolicies. Das Verzeichnis configsync- src enthält die Konfiguration im Format kustomize. Das Verzeichnis "configsync-src" enthält die Konfiguration im Kustomize-Format. Es gibt ein Basis- und drei Overlayformate: tenant-a, tenant-b und tenant-c.

Ziele

  • Ein Kustomize-Overlay aktualisieren.

  • Erstellen Sie einen Cluster, den Sie mit Config Sync verwenden können.

  • Synchronisieren Sie die Richtlinien in Ihrem Git-Repository mit einem Cluster.

  • Prüfen Sie, ob der Cluster mit den Konfigurationen in Ihrem Repository synchronisiert wird.

Kosten

In dieser Anleitung werden die folgenden kostenpflichtigen Komponenten von Google Cloud verwendet:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss dieser Anleitung können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Neue Google Cloud-Nutzer sind möglicherweise für eine kostenlose Testversion berechtigt.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie mit dieser Anleitung beginnen:

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  3. Ein GitHub-Konto erstellen oder Zugriff darauf haben.
  4. Installieren Sie Kustomize, indem Sie den folgenden Befehl ausführen:

    gcloud components install kustomize
    

Es ist auch hilfreich, sich mit Git und Kustomize vertraut zu machen.

Kustomize-Datei aktualisieren

Im folgenden Abschnitt aktualisieren Sie eine Kustomize-Datei in Ihrem Repository, um die auf tenant-a angewendeten Richtlinien zu aktualisieren.

Umgebung vorbereiten

Führen Sie die folgenden Schritte aus, um die Umgebung vorzubereiten:

  1. Verzweigen Sie das Repository:

    1. Wechseln Sie in GitHub zum Repository-Verzeichnis Anthos Config Management.
    2. Klicken Sie auf Fork.
  2. Klonen Sie das verzweigte Repository:

    git clone https://github.com/GITHUB_USERNAME/anthos-config-management-samples
    

    Ersetzen Sie GITHUB_USERNAME durch Ihren GitHub-Nutzernamen.

  3. Wechseln Sie in das Verzeichnis mit den Beispielen, die in dieser Anleitung verwendet werden:

    cd anthos-config-management-samples/namespace-specific-policy
    

Overlay aktualisieren

In diesem Abschnitt aktualisieren Sie ein Overlay. Ein Overlay ist eine Kustomize-Anpassung, die von einer anderen Kustomize-Anpassung abhängt.

Die folgenden Schritte zeigen, wie Sie tenant-a eine neue Rolle durch Aktualisieren des Overlays,acm-samples/namespace-specific-policy/configsync-src/tenant-a, zuweisen. Da Sie nur eine Konfiguration aktualisieren, müssen Sie nur ein Overlay aktualisieren.

So weisen Sie tenant-a diese neue Rolle zu:

  1. Erstellen Sie eine neue Datei, indem Sie in GitHub die folgende Seite aufrufen:

    github.com/GITHUB_USERNAME/anthos-config-management-samples/new/main/namespace-specific-policy/configsync-src/tenant-a
    
  2. Benennen Sie die Datei mit another-role.yaml.

  3. Fügen Sie im Fenster Neue Datei bearbeiten das folgende YAML-Manifest für die neue Rolle ein:

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    
  4. Klicken Sie auf Commit für neue Datei ausführen.

    Fügen Sie nun die Konfiguration für die neue Rolle der Datei kustomization.yaml hinzu.

  5. Öffnen Sie im Ordner /namespace-specific-policy/configsync-src/tenant-a die Datei kustomization.yaml und klicken Sie auf das Symbol "Bearbeiten" (Stiftsymbol).

  6. Fügen Sie im Abschnitt "Ressourcen" von kustomization.yaml den Punkt - another-role.yaml hinzu:

    namespace: tenant-a
    
    resources:
    - ../base
    - another-role.yaml
    # The rest of the file is omitted
    
  7. Klicken Sie auf Änderungen übernehmen.

  8. Erstellen Sie nach der Aktualisierung die Kustomize-Ausgabe für jeden Namespace neu. Führen Sie dazu das Skript render.sh aus:

    ./scripts/render.sh
    
  9. Führen Sie ein Commit durch und übertragen Sie die Aktualisierung:

    git add .
    git commit -m 'update configuration'
    git push
    

GKE-Cluster erstellen und registrieren

In diesem Abschnitt erstellen und konfigurieren Sie einen Cluster, den Sie mit Config Sync verwenden können.

Cluster erstellen

Console

Führen Sie die folgenden Aufgaben aus, um einen Cluster mit der Google Cloud Console zu erstellen:

  1. Rufen Sie in der Cloud Console das Kubernetes Engine-Menü auf.

    Google Kubernetes Engine aufrufen

  2. Klicken Sie auf Erstellen.

  3. Klicken Sie unter Standard auf Konfigurieren.

  4. Geben Sie im Bereich Clustergrundlagen Folgendes ein:

    1. Geben Sie mt-cluster als Namen für den Cluster ein.
    2. Wählen Sie in der Drop-down-Liste Zone die Option us-central1-c aus.
    3. Übernehmen Sie für alle anderen Felder die empfohlenen Standardeinstellungen.
  5. Klicken Sie im linken Menü auf Standardpool und dann in der angezeigten Drop-down-Liste auf Knoten.

  6. Führen Sie im Bereich Nodes folgende Schritte aus:

    1. Wählen Sie in der Drop-down-Liste Maschinentyp die Option e2-standard-4 aus.
    2. Übernehmen Sie die Standardwerte der restlichen Felder.
  7. Wählen Sie im linken Menü die Option Sicherheit aus.

  8. Klicken Sie im Abschnitt Sicherheit das Kästchen Workload Identity aktivieren an.

  9. Klicken Sie auf Erstellen. Es kann einige Minuten dauern, bis der Cluster erstellt ist.

gcloud

Führen Sie die folgenden Aufgaben aus, um einen Cluster mit dem gcloud-Befehlszeilentool zu erstellen:

gcloud container clusters create mt-cluster \
    --project PROJECT_ID \
    --zone us-central1-c \
    --release-channel regular \
    --machine-type "e2-standard-4" \
    --workload-pool=PROJECT_ID.svc.id.goog

Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.

Authentifizierungsdaten für den Cluster abrufen

Nach dem Erstellen des Clusters müssen Sie Anmeldedaten für die Authentifizierung abrufen, damit Sie mit dem Cluster interagieren können.

gcloud container clusters get-credentials mt-cluster --zone us-central1-c

Eigene Administratorberechtigungen erteilen

Erteilen Sie sich nach dem Erstellen des Clusters sich selbst die Rolle GKE-Hub-Administrator, die Sie für Config Sync benötigen.

Console

Führen Sie die folgenden Aufgaben aus, um sich mit der Google Cloud Console Administratorberechtigungen zu erteilen:

  1. Rufen Sie in der Cloud Console die Seite IAM auf.

    Zur Seite "IAM"

  2. Klicken Sie auf Add.

  3. Geben Sie in das Feld Neue Mitglieder eine E-Mail-Adresse ein. Sie können Einzelpersonen, Dienstkonten oder Google Groups als Mitglieder hinzufügen.

  4. Suchen Sie in der Drop-down-Liste Rolle auswählen nach GKE Hub-Administrator und wählen Sie ihn aus.

  5. Klicken Sie auf Speichern.

gcloud

Führen Sie die folgenden Aufgaben aus, um sich mit dem gcloud-Befehlszeilentool Administratorberechtigungen zu gewähren:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=MEMBER \
    --role=roles/gkehub.admin

Dabei gilt:

  • PROJECT_ID: Ihre Projekt-ID
  • MEMBER: Kennung für das Mitglied, die normalerweise das folgende Format hat: member-type:id, z. B. user:my-user@example.com. Eine vollständige Liste der für member zulässigen Werte finden Sie in der Referenz zur Richtlinienbindung.

Cluster registrieren

Nachdem Ihr Cluster erstellt wurde, können Sie ihn bei einer Flotte registrieren.

Console

Führen Sie die folgenden Aufgaben aus, um Ihren Cluster bei der Google Cloud Console zu registrieren:

  1. Rufen Sie in der Google Cloud Console die Seite Anthos-Cluster auf.

    Zur Seite „Anthos-Cluster”

  2. Klicken Sie auf Vorhandenen Cluster registrieren.

  3. Klicken Sie neben mt-cluster auf Registrieren. Wenn dieser Cluster nicht in der Liste angezeigt wird, prüfen Sie, ob er erstellt wurde.

    Beispielausgabe:

    Cluster mt-cluster registered successfully as mt-cluster in project PROJECT_NAME.
    

gcloud

Führen Sie die folgenden Aufgaben aus, um einen Cluster mit dem gcloud-Befehlszeilentool zu registrieren:

gcloud beta container hub memberships register MEMBERSHIP_NAME \
 --gke-cluster=us-central1-c/mt-cluster \
 --enable-workload-identity

Dabei gilt:

  • MEMBERSHIP_NAME ist der Name der Mitgliedschaft, den Sie für den Cluster festlegen, der für eine Flotte registriert wird.

Config Sync konfigurieren

In diesem Abschnitt konfigurieren Sie Config Sync für die Synchronisierung mit den Richtlinien im Verzeichnis namespace-specific-policy/.

Führen Sie die folgenden Schritte aus, um Config Sync zu konfigurieren:

Console

Führen Sie die folgenden Aufgaben aus, um Config Sync mit der Google Cloud Console zu konfigurieren:

  1. Rufen Sie in der Cloud Console die Seite Anthos Config Management auf.

    Zu Anthos Config Management

  2. Wählen Sie mt-cluster aus und klicken Sie auf Konfigurieren.

  3. Wählen Sie im Abschnitt Authentifizierung beim Git-Repository für ACM die Option Keine aus und klicken Sie auf Weiter.

  4. Führen Sie im Bereich ACM-Einstellungen für Ihre Cluster die folgenden Schritte aus:

    1. Wählen Sie im Feld Version die Version 1.7 oder höher aus.
    2. Klicken Sie auf das Kästchen Config Sync aktivieren und füllen Sie die folgenden Felder aus:
      1. Fügen Sie im Feld URL https://github.com/GITHUB_USERNAME/anthos-config-management-samples hinzu.
      2. Fügen Sie im Feld Branch main hinzu.
      3. Geben Sie im Feld Tag/Commit den Wert HEAD ein.
      4. Fügen Sie im Feld Richtlinienverzeichnis namespace-specific-policy/configsync hinzu.
      5. Lassen Sie das Feld Synchronisierungswartezeit leer.
      6. Lassen Sie das Feld Git-Proxy leer.
      7. Wählen Sie in der Drop-down-Liste Quellformat die Option unstrukturiert aus.
  5. Klicken Sie auf Fertig. Sie werden zur Seite Anthos Config Management zurückgeleitet. Nach einigen Minuten sollte in der Statusspalte neben dem von Ihnen konfigurierten Cluster Synced angezeigt werden.

gcloud

Führen Sie die folgenden Aufgaben aus, um Config Sync mit dem gcloud-Befehlszeilentool zu konfigurieren:

  1. Erstellen Sie eine Datei mit dem Namen apply-spec.yaml und kopieren Sie die folgende YAML-Datei hinein:

    # apply-spec.yaml
    
    applySpecVersion: 1
    spec:
      configSync:
        # Set to true to install and enable Config Sync
        enabled: true
        sourceFormat: unstructured
        syncRepo: https://github.com/GITHUB_USERNAME/anthos-config-management-samples
        syncBranch: main
        secretType: none
        policyDir: namespace-specific-policy/configsync
    

    Ersetzen Sie GITHUB_USERNAME durch Ihren GitHub-Nutzernamen.

  2. Wenden Sie die Datei apply-spec.yaml an:

     gcloud beta container hub config-management apply \
         --membership=MEMBERSHIP_NAME \
         --config=CONFIG_YAML_PATH \
         --project=PROJECT_ID
    

    Dabei gilt:

    • MEMBERSHIP_NAME: Name der Mitgliedschaft, den Sie bei der Registrierung Ihres Clusters ausgewählt haben (kann mit gcloud container hub memberships list ermittelt werden).
    • CONFIG_YAML_PATH: Pfad zur Datei apply-spec.yaml
    • PROJECT_ID: Ihre Projekt-ID

Synchronisierung bestimmter Namespace-Richtlinien prüfen

Nachdem Sie Config Sync installiert haben, können Sie mit dem Befehl nomos status prüfen, ob die Namespace-spezifischen Richtlinien mit dem Cluster synchronisiert wurden:

nomos status

Die Ausgabe sollte in etwa dem folgenden Beispiel entsprechen:

gke_PROJECT_ID_us-central1-c_mt-cluster
  --------------------
  <root>   https:/github.com/GITHUB_USERNAME/anthos-config-management-samples/namespace-specific-policy/configsync@main
  SYNCED   bf8655aa
  Managed resources:
     NAMESPACE   NAME                                                             STATUS
                 namespace/foo                                                    Current
                 namespace/istio-system                                           Current
                 namespace/tenant-a                                               Current
                 namespace/tenant-b                                               Current
                 namespace/tenant-c                                               Current
     tenant-a    networkpolicy.networking.k8s.io/deny-all                         Current
     tenant-a    role.rbac.authorization.k8s.io/tenant-admin                      Current
     tenant-a    rolebinding.rbac.authorization.k8s.io/tenant-admin-rolebinding   Current
     tenant-b    networkpolicy.networking.k8s.io/deny-all                         Current
     tenant-b    role.rbac.authorization.k8s.io/tenant-admin                      Current
     tenant-b    rolebinding.rbac.authorization.k8s.io/tenant-admin-rolebinding   Current
     tenant-c    networkpolicy.networking.k8s.io/deny-all                         Current
     tenant-c    role.rbac.authorization.k8s.io/tenant-admin                      Current
     tenant-c    rolebinding.rbac.authorization.k8s.io/tenant-admin-rolebinding   Current

Prüfen Sie als Nächstes, ob die Ressourcen im Cluster vorhanden sind. Die folgenden Beispiele zeigen, wie Sie einige Ressourcen für tenant-a prüfen.

  1. Prüfen Sie, ob die RoleBinding für tenant-a vorhanden ist:

    kubectl get RoleBinding/tenant-admin-rolebinding -n tenant-a
    

    Beispielausgabe:

    NAME                       ROLE                AGE
    tenant-admin-rolebinding   Role/tenant-admin   23h
    
  2. Prüfen Sie, ob die Rolle für tenant-a vorhanden ist:

    kubectl get Role/tenant-admin -n tenant-a
    

    Beispielausgabe:

    NAME           CREATED AT
    tenant-admin   2021-05-24T21:49:06Z
    
  3. Prüfen Sie, ob die NetworkPolicy für tenant-a vorhanden ist:

    kubectl get NetworkPolicy/deny-all -n tenant-a
    

    Beispielausgabe:

    NAME       POD-SELECTOR   AGE
    deny-all   <none>         23h
    

Wenn Sie diese Befehle verwenden, können Sie sehen, dass jeder Namespace eigene Richtlinien hat. Dies erfolgt nach den Best Practices für mehrmandantenfähige Cluster.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Verzeichnis löschen

Zum Bereinigen der Namespaces und Richtlinien für die Mandanten empfehlen wir, die Verzeichnisse mit ihrer Konfiguration aus Ihrem Git-Repository zu entfernen:

rm -r acm-samples/namespace-specific-policy/configsync/tenant-*/*
git add .
git commit -m 'clean up'
git push

Wenn der letzte Commit aus dem Root-Repository synchronisiert wird, werden die drei Namespaces tenant-a, tenant-b und tenant-c aus dem Cluster gelöscht.

Nächste Schritte