Projektübergreifende Mehrmandantenfähigkeit für Cloud Run for Anthos

In dieser Anleitung werden Sie durch die Konfiguration von Cloud Run for Anthos geführt, damit ein oder mehrere Google Cloud-Projekte die Arbeitslasten ausführen und verwalten können, die auf einem Google Kubernetes Engine-Cluster in einem anderen Cloud-Projekt ausgeführt werden.

Ein gängiges Betriebsmodell für Cloud Run for Anthos ist, dass ein Team von Anwendungsentwicklern seine Cloud-Projekte verwendet, um Dienste bereitzustellen und zu verwalten, die in unterschiedlichen Google Kubernetes Engine-Clustern in Google Cloud-Projekten anderer Teams ausgeführt werden. Diese Funktion heißt Mehrmandantenfähigkeit und ermöglicht es Ihnen als Plattformbetreiber, den Zugriff Ihrer Entwicklungsteams allein auf die Dienste abzustimmen, die in den verschiedenen Umgebungen Ihrer Organisationen ausgeführt werden (z. B. Produktions- und Staging-Umgebung).

Cloud Run for Anthos unterstützt speziell die Mehrmandantenfähigkeit in Unternehmen. Diese Art von Mehrmandantenfähigkeit ermöglicht ein Cluster-Cloud-Projekt, um den Zugriff auf bestimmte Ressourcen des Google Kubernetes Engine-Clusters zu gewähren. Das Cloud-Projekt, dem der Zugriff auf das Cluster-Cloud-Projekt gewährt wird, ist das Mandanten-Cloud-Projekt. Mandanten des Cluster-Cloud-Projekts können Cloud Run for Anthos nutzen, um auf diese Dienste und Ressourcen zuzugreifen, für die ihnen Zugriff gewährt wurde. Außerdem können sie mit diesen arbeiten und ihr Inhaber sein.

Konzeptionell lässt sich die Mehrmandantenfähigkeit in Unternehmen mit Cloud Run for Anthos in vier Schritten konfigurieren:

  1. Den Mandantenzugriff auf das Cluster-Cloud-Projekt mit einer Google-Gruppe und der Identitäts- und Zugriffsverwaltung konfigurieren.
  2. Jedes Mandanten-Cloud-Projekt dem Cluster-Cloud-Projekt zuordnen.
  3. Die Logdaten des Cluster-Cloud-Projekts mithilfe von Log-Buckets und Logsenken an das Mandanten-Cloud-Projekt weiterleiten.
  4. Mit der rollenbasierten Zugriffssteuerung in GKE Clusterberechtigungen für Mandanten definieren.

Hinweis

Der Plattformbetreiber, der für die Konfiguration der Mehrmandantenfähigkeit verantwortlich ist, muss sich über die folgenden Anforderungen im Klaren sein und diese erfüllen:

Lokale Umgebungsvariablen definieren

Definieren Sie die lokalen Umgebungsvariablen für das Cluster-Cloud-Projekt und das Mandanten-Cloud-Projekt, um die in diesem Prozess verwendeten Befehle zu vereinfachen:

  1. Ersetzen Sie YOUR_CLUSTER_PROJECT_ID durch die ID des Cluster-Cloud-Projekts und führen Sie dann den folgenden Befehl aus:

    export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
    
  2. Ersetzen Sie YOUR_TENANT_PROJECT_ID durch die ID des Mandanten-Cloud-Projekts und führen Sie dann den folgenden Befehl aus:

    export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
    
  3. Überprüfen Sie Ihre lokalen Umgebungsvariablen. Führen Sie dazu die folgenden Befehle aus:

    echo "cluster Cloud project is:" $CLUSTER_PROJECT_ID
    echo "tenant Cloud project is:" $TENANT_PROJECT_ID
    

Die ID des Cluster-Cloud-Projekts und die ID des Mandanten-Cloud-Projekts werden jetzt in allen folgenden Befehlen verwendet, in denen $CLUSTER_PROJECT_ID und $TENANT_PROJECT_ID angegeben sind.

IAM-Berechtigungen überprüfen

Führen Sie die folgenden testIamPermissions-Befehle aus. Damit können Sie prüfen, ob Sie die erforderlichen IAM-Berechtigungen für den Zugriff auf die Ressourcen im Cluster-Cloud-Projekt sowie im Mandanten-Cloud-Projekt haben.

Führen Sie den folgenden Befehl aus, um Ihre Berechtigungen im Cluster-Cloud-Projekt zu prüfen:

curl -X POST \
  -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
  --header "Content-Type: application/json" \
  --data '{"permissions":["logging.sinks.create", "logging.sinks.get", "resourcemanager.projects.setIamPolicy"]}' \
  https://cloudresourcemanager.googleapis.com/v1/projects/$CLUSTER_PROJECT_ID:testIamPermissions

Erwartete Ergebnisse für das Cluster-Cloud-Projekt:

{
  "permissions": [
    "logging.sinks.create",
    "logging.sinks.get",
    "resourcemanager.projects.setIamPolicy"
  ]
}

Führen Sie den folgenden Befehl aus, um Ihre Berechtigungen im Mandanten-Cloud-Projekt zu prüfen:

curl -X POST \
  -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
  --header "Content-Type: application/json" \
  --data '{"permissions":["logging.buckets.create", "logging.buckets.get", "resourcemanager.projects.setIamPolicy", "resourcesettings.settingvalues.create", "serviceusage.services.enable"]}' \
  https://cloudresourcemanager.googleapis.com/v1/projects/$TENANT_PROJECT_ID:testIamPermissions

Erwartete Ergebnisse für das Mandanten-Cloud-Projekt:

{
  "permissions": [
    "logging.buckets.create",
    "logging.buckets.get",
    "resourcemanager.projects.setIamPolicy",
    "resourcesettings.settingvalues.create",
    "serviceusage.services.enable",
  ]
}

Mandantenzugriff mithilfe einer Google-Gruppe und der Identitäts- und Zugriffsverwaltung konfigurieren

Verwenden Sie eine Google-Gruppe, damit Mandanten auf den GKE-Cluster zugreifen können. Durch die IAM-Berechtigungen haben Mandanten die Berechtigung, Anmeldedaten abzurufen. Sie können im Cluster jedoch erst dann wieder aktiv werden, wenn in einem späteren Schritt die rollenbasierte Zugriffssteuerung von Kubernetes konfiguriert wird.

Sie müssen eine Google-Gruppe erstellen, in der alle Nutzer Ihres Mandanten-Cloud-Projekts enthalten sind. Weitere Informationen zum Verwenden einer Sicherheitsgruppe finden Sie unter Google Groups für GKE verwenden.

Erstellen Sie die folgende lokale Umgebungsvariable für Ihre Google-Gruppe:

export SECURITY_GROUP=gke-security-groups@company.com

Kubernetes-Clusterbetrachter

Führen Sie die folgenden Befehle aus, damit die Mandanten Anmeldedaten für den Cluster abrufen können. Die Mandanten haben dadurch nicht die Möglichkeit, Ressourcen im GKE-Cluster zu lesen oder zu bearbeiten.

IAM-Referenz

gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
   --member=group:$SECURITY_GROUP \
   --role='roles/container.clusterViewer' \
   --condition=None

Sie können eine IAM-Bedingung verwenden, um den Zugriff auf einen bestimmten Cluster einzuschränken.

gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
   --member=group:$SECURITY_GROUP \
   --role='roles/container.clusterViewer' \
   --condition="expression=resource.name == 'cluster-name',title=Restrict cluster access"

Monitoring-Betrachter

Führen Sie den folgenden Befehl aus, damit Mandanten Monitoring-Messwerte lesen können.

Referenz zu Monitoring-Rollen

gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
   --member=group:$SECURITY_GROUP \
   --role='roles/monitoring.viewer' \
   --condition=None

Jedes Cloud-Projekt des Mandanten dem Cloud-Projekt des Clusters zuordnen

Mit den Werten für Ressourceneinstellungen können Sie Mandanten-Cloud-Projekte einem Cluster-Cloud-Projekt zuordnen.

Die Ressourceneinstellung kann für jedes einzelne Mandanten-Cloud-Projekt oder auf jeder Ebene der Ordnerhierarchie konfiguriert werden. Es ist einfacher, dies auf der Ebene eines einzelnen Mandantenordners festzulegen. Flexiblere Möglichkeiten bieten sich jedoch beim Festlegen auf Ebene des Mandantenprojekts. Wenn Mandanten die Cloud Run for Anthos-UI verwenden, sehen Sie jetzt auch ihre Dienste im Cluster-Cloud-Projekt. Dadurch ergeben sich keine Änderungen an den IAM-Berechtigungen für das Cluster-Cloud-Projekt oder die GKE-Cluster. Es erfolgt lediglich eine Zuordnung von einem Mandantenprojekt (oder Ordner) zu einem Cluster-Cloud-Projekt.

  1. Aktivieren Sie die resourcesettings API im Mandanten-Cloud-Projekt.

    gcloud services enable resourcesettings.googleapis.com \
      --project=$TENANT_PROJECT_ID
    
  2. Fügen Sie Ihrer Nutzer-ID die Berechtigungen des Organisationsadministrators (roles/resourcesettings.admin) hinzu. Führen Sie dazu folgenden Befehl aus:

    gcloud organizations add-iam-policy-binding YOUR_ORGANIZATION_ID \
      --member=YOUR_ADMIN_MEMBER_ID \
      --role='roles/resourcesettings.admin'
    

    Ersetzen Sie YOUR_ORGANIZATION_ID durch die ID Ihrer Organisation und YOUR_ADMIN_MEMBER_ID durch Ihre Nutzer-ID, z. B. user:my-email@my-domain.com.

  3. Wählen Sie eine der folgenden Methoden zum Definieren der Zuordnung aus.

    Sie können den Wert der Ressourceneinstellung in einem übergeordneten Google Cloud-Ordner festlegen, wenn alle untergeordneten Cloud-Projekte und Google Cloud-Ordner denselben Wert verwenden.

Mandantenprojekte

Legen Sie den Wert der Ressourceneinstellungen für jedes Mandanten-Cloud-Projekt fest:

  1. Rufen Sie den name des Mandanten-Cloud-Projekts ab und legen Sie dafür eine lokale Umgebungsvariable fest:
    export TENANT_PROJECT_NUMBER=$(gcloud alpha projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
  2. Erstellen Sie eine Datei mit dem Werten der Ressourceneinstellung, um die Zuordnung vom Mandanten-Cloud-Projekt zum Cluster-Cloud-Projekt zu definieren. In dieser Datei können mehrere IDs für das Cluster-Cloud-Projekt definiert und einem einzelnen Mandanten-Cloud-Projekt hinzugefügt werden.
    cat > value-file.json << EOF
    {
    "name": "projects/$TENANT_PROJECT_NUMBER/settings/cloudrun-multiTenancy/value",
    "value": {
      "stringSetValue": {
        "values": [ "projects/$CLUSTER_PROJECT_ID" ]
      }
    }
    }
    EOF
    
  3. Stellen Sie die Ressourceneinstellungen für das Mandanten-Cloud-Projekt bereit:
    gcloud alpha resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --project $TENANT_PROJECT_ID

Mandantenordner

Legen Sie den Wert der Ressourceneinstellung für einen übergeordneten Mandantenordner fest, um diesen Wert für alle untergeordneten Mandanten-Cloud-Projekte und -Ordner zu übernehmen:

  1. Rufen Sie den number des Mandantenordners ab und legen Sie ihn auf eine lokale Umgebungsvariable fest:
    export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
    
  2. Erstellen Sie eine Datei mit dem Werten der Ressourceneinstellung, um die Zuordnung vom Mandantenordner zum Cluster-Cloud-Projekt zu definieren. In dieser Datei können mehrere IDs für das Cluster-Cloud-Projekt definiert und einem einzelnen Mandantenordner hinzugefügt werden.
    cat > value-file.json << EOF
    {
    "name": "folders/$TENANT_FOLDER_NUMBER/settings/cloudrun-multiTenancy/value",
    "value": {
      "stringSetValue": {
        "values": [ "projects/$CLUSTER_PROJECT_ID" ]
      }
    }
    }
    EOF
    
  3. Stellen Sie die Ressourceneinstellungen im Mandantenordner bereit:
    gcloud alpha resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER

Log-Buckets und -senken zur Weiterleitung von Logdaten einrichten

Erstellen Sie für jeden Mandanten einen Log-Bucket und eine Logsenke und gewähren Sie die entsprechenden Berechtigungen, um die Logdaten des Cluster-Cloud-Projekts an das Mandanten-Cloud-Projekt weiterzuleiten. In den folgenden Schritten werden alle Logs aus dem Namespace im Cluster-Cloud-Projekt an den Bucket weitergeleitet. Im nachstehenden Abschnitt erfahren Sie Einzelheiten dazu, wie Sie die Freigabe der Logs einschränken können.

Erstellen Sie die folgenden lokalen Umgebungsvariablen:

  • Geben Sie den Namespace des GKE-Clusters an, auf den Ihre Mandanten zugreifen.
  • Der Name der Senke. Zur Vereinfachung dieses Schritts ist der Name eine Kombination aus den zuvor erstellten lokalen Umgebungsvariablen des Cluster-Cloud-Projekts und des Mandanten-Cloud-Projekts. Sie können diesen Wert ändern.
export NAMESPACE=$NAMESPACE
export SINK_NAME=$CLUSTER_PROJECT_ID-$TENANT_PROJECT_ID

Führen Sie den folgenden Befehl aus, um den Log-Bucket im Mandantenprojekt zu erstellen. Beachten Sie, dass der Name des Log-Buckets die ID des Cluster-Cloud-Projekts sein muss und nicht geändert oder bearbeitet werden kann.

gcloud alpha logging buckets \
   create $CLUSTER_PROJECT_ID \
   --location=global \
   --project=$TENANT_PROJECT_ID

Führen Sie den folgenden Befehl aus, um im Bucket des Mandanten-Cloud-Projekts die Senke aus dem angegebenen Namespace im Cluster-Cloud-Projekt zu erstellen. Beachten Sie, dass Sie den Umfang der Logs einschränken können. Wenn Sie beispielsweise nur einen einzelnen GKE-Cluster oder bestimmte Ressourcen von Cloud Run for Anthos freigeben möchten, definieren Sie zusätzliche log-filter-Werte.

gcloud alpha logging sinks \
   create $SINK_NAME \
   logging.googleapis.com/projects/$TENANT_PROJECT_ID/locations/global/buckets/$CLUSTER_PROJECT_ID \
   --log-filter=resource.labels.namespace_name=$NAMESPACE \
   --project $CLUSTER_PROJECT_ID

Führen Sie die folgenden Befehle aus, um dem erstellten Bucket die Berechtigung aus dem Dienstkonto der Logsenke hinzuzufügen.

export SINK_SERVICE_ACCOUNT=$(gcloud alpha logging sinks \
   describe $SINK_NAME \
   --project $CLUSTER_PROJECT_ID \
   --format="value(writerIdentity)")
gcloud projects add-iam-policy-binding $TENANT_PROJECT_ID \
   --member=$SINK_SERVICE_ACCOUNT \
   --role='roles/logging.bucketWriter' \
   --condition="expression=resource.name.endsWith\
   (\"locations/global/buckets/$CLUSTER_PROJECT_ID\"),\
   title=Log bucket writer from $CLUSTER_PROJECT_ID"

Mandantenberechtigungen mit rollenbasierter Zugriffssteuerung einrichten

Sie haben zuvor Google Groups und IAM verwendet, um Berechtigungen zu konfigurieren, damit Mandanten auf das Cloud-Projekt des GKE-Clusters zugreifen können. Damit Mandanten Zugriff auf die Ressourcen im GKE-Cluster haben, müssen Sie Berechtigungen mit Kubernetes RBAC definieren.

Clusterrollen erstellen

Sobald Sie die folgenden Clusterrollen definiert und erstellt haben, können Sie diese verwenden, um alle nachfolgenden Mandanten des Cluster-Cloud-Projekts hinzuzufügen.

UI-Rollen

Mit dieser Rolle können Mandanten alle Namespaces abfragen. Dies ist erforderlich, um herauszufinden, auf welche Namespaces Nutzer zum Erstellen von /sdk/gcloud/reference/alpha/logging/sinks/create-Diensten zugreifen können.

kubectl create clusterrole \
   namespace-lister \
   --verb=list \
   --resource=namespaces

Mit dieser Rolle können Mandanten Dienste von Cloud Run for Anthos sehen. Dies ist erforderlich, um die Dienste in der Cloud Run for Anthos-UI aufzulisten.

kubectl create clusterrole \
   ksvc-lister \
   --verb=list \
   --resource=services.serving.knative.dev

Clusterrollen erstellen

Nur eine dieser Berechtigungen ist erforderlich. Mit der ersten Berechtigung können Mandanten alle Ressourcen in ihrem Namespace bearbeiten. Die zweite Berechtigung ermöglicht es, eine eher begrenzte Auswahl der Dienste von Cloud Run for Anthos zu erstellen.

kubectl create clusterrole \
   kubernetes-developer \
   --verb="*" \
   --resource="*.*"

Wenn die Berechtigung kubernetes-developer zu umfangreich ist, können Mandanten mit der folgenden Berechtigung Knative-Dienste in ihren Namespaces erstellen und die anderen Knative-Ressourcen aufrufen.

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: knative-developer
rules:
- apiGroups: ["serving.knative.dev"]
  resources: ["services"]
  verbs: ["*"]
- apiGroups: ["serving.knative.dev"]
  resources: ["*"]
  verbs: ["get", "list", "watch"]
EOF

Mandanten-Namespace erstellen und Berechtigungen zuweisen

Dies setzt voraus, dass Sie Google Groups for GKE eingerichtet haben. Dies ist für jeden Mandanten erforderlich.

export TENANT_GROUP=tenant-a@company.com

TENANT_GROUP muss Teil von SECURITY_GROUP sein

Funktion zum Aufrufen aller Namespaces

Zum Abfragen des GKE-Clusters müssen alle Mandanten die Möglichkeit haben, Namespaces aufzulisten. Derzeit gibt es kein auth can-i, das Namespaces zurückgibt, für die eine Aktion möglich ist. Die einzige Möglichkeit, das Problem zu umgehen, besteht darin, Namespaces aufzulisten und dann jeden Namespace einzeln abzufragen.

kubectl create clusterrolebinding \
   all-namespace-listers \
   --clusterrole=namespace-lister \
   --group=$TENANT_GROUP

Funktion zum Auflisten von Cloud Run for Anthos-Diensten

kubectl create clusterrolebinding \
   all-ksvc-listers \
   --clusterrole=ksvc-lister \
   --group=$TENANT_GROUP

Funktion zum Bearbeiten von Ressourcen im Namespace

Erstellen Sie zuerst den Namespace:

kubectl create namespace $NAMESPACE

Wenn Sie die Rolle „kubernetes-developer“ verwenden:

kubectl create rolebinding \
   kubernetes-developer \
   --namespace=$NAMESPACE \
   --clusterrole=kubernetes-developer \
   --group=$TENANT_GROUP

Wenn Sie die Rolle „knative-developer“ verwenden:

kubectl create rolebinding \
   kubernetes-developer \
   --namespace=$NAMESPACE \
   --clusterrole=knative-developer \
   --group=$TENANT_GROUP

Zu Mandant die Funktion hinzufügen, auf externe IP-Adressen zuzugreifen

cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ingress-reader
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get"]
EOF
kubectl create rolebinding \
   ingress-reader-$TENANT_GROUP \
   --namespace=gke-system \
   --clusterrole=ingress-reader \
   --group=$TENANT_GROUP

Bestätigen

Sie können prüfen, ob Sie die Mehrmandantenfähigkeit im Unternehmen erfolgreich konfiguriert haben. Öffnen Sie dazu das Mandanten-Cloud-Projekt in Cloud Run for Anthos und stellen Sie einen Dienst für einen Cluster des Cluster-Cloud-Projekts bereit.

Zu Cloud Run for Anthos

Glückwunsch! Ihr Mandant kann jetzt mit den Diensten und Ressourcen innerhalb des GKE-Cluster-Namespace interagieren, auf den ihm Zugriff gewährt wurde.

Mehrmandantenfähigkeit