In diesem Leitfaden erfahren Sie, wie Sie Knative serving konfigurieren, um Ein oder mehrere Google Cloud-Projekte zum Ausführen und Verwalten der ausgeführten Arbeitslasten in einem GKE-Cluster in einem anderen Google Cloud-Projekt.
Ein gängiges Betriebsmodell mit Knative serving ist ein Anwendungsteam. Entwickelnden nutzen, um mit ihrem Google Cloud-Projekt Dienste bereitzustellen und zu verwalten die in unterschiedlichen GKE-Clustern anderer Teams ausgeführt werden, Google Cloud-Projekte 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).
Knative serving unterstützt speziell Unternehmen Mehrmandantenfähigkeit. Diese Art der Mehrmandantenfähigkeit aktiviert ein Cluster-Google Cloud-Projekt, um Zugriff auf bestimmte Ressourcen ihres GKE-Cluster. Das Google Cloud-Projekt, dem Zugriff auf das Google Cloud-Projekt des Clusters gewährt wurde, ist das Google Cloud-Projekt des Mandanten. Mieter von Cluster-Google Cloud-Projekt können Knative serving nutzen, um auf sind Inhaber dieser Dienste und Ressourcen, für die ihnen Zugriff gewährt wurde.
Konzeptionell lässt sich die Mehrmandantenfähigkeit in Unternehmen in vier Schritten mit Knative serving:
- Konfigurieren Sie den Mandantenzugriff auf das Google Cloud-Clusterprojekt mithilfe einer Google-Gruppe und Identity and Access Management
- Ordnen Sie jedes Google Cloud-Projekt des Mandanten dem Google Cloud-Projekt des Clusters zu.
- Die Logdaten des Google Cloud-Clusters mithilfe von Log-Buckets an die Google Cloud-Projekte des Mandanten weiterleiten und Waschbecken.
- Mit der rollenbasierten Zugriffssteuerung 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:
Wie in der GKE-Dokumentation erläutert, müssen Sie die folgenden Konzepte der Mehrmandantenfähigkeit verstehen:
In diesem Dokument wird davon ausgegangen, dass die Google Cloud-Projekte, für die Sie die Mehrmandantenfähigkeit aktivieren möchten, bereits vorhanden sind.
Sie benötigen Zugriff auf die folgenden Dienste und Ressourcen des Google Cloud-Projekts:
Berechtigungen für Identity and Access Management im Google Cloud-Projekt des Mandanten:
- roles/logging.configWriter
- Mandantenadministrator der Google-Gruppe
Berechtigungen zu Identity and Access Management im Google Cloud-Projekt des Clusters:
Sie benötigen die neueste Version der [Google Cloud CLI]](/sdk/docs/install).
Lokale Umgebungsvariablen definieren
Definieren Sie lokale Umgebungsvariablen, um die in diesem Prozess verwendeten Befehle zu vereinfachen für das Google Cloud-Projekt des Clusters und das Google Cloud-Projekt des Mandanten:
Ersetzen Sie
YOUR_CLUSTER_PROJECT_ID
durch die ID des Google Cloud-Projekts des Clusters und dann führen Sie den folgenden Befehl aus:export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
Ersetzen Sie
YOUR_TENANT_PROJECT_ID
durch die ID des Google Cloud-Projekts des Mandanten und dann führen Sie den folgenden Befehl aus:export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
Überprüfen Sie Ihre lokalen Umgebungsvariablen. Führen Sie dazu die folgenden Befehle aus:
echo "cluster Google Cloud project is:" $CLUSTER_PROJECT_ID echo "tenant Google Cloud project is:" $TENANT_PROJECT_ID
Die Google Cloud-Projekt-ID des Clusters und die Google Cloud-Projekt-ID des Mandanten werden jetzt in folgenden Anwendungen verwendet
Befehle, bei denen $CLUSTER_PROJECT_ID
und $TENANT_PROJECT_ID
angegeben sind.
IAM-Berechtigungen überprüfen
Führen Sie die folgenden testIamPermissions-Befehle aus. um zu prüfen, ob Sie die erforderlichen IAM-Berechtigungen für Sie können auf die Ressourcen im Google Cloud-Projekt des Clusters und in den Google Cloud-Projekten des Mandanten zugreifen.
Führen Sie den folgenden Befehl aus, um Ihre Berechtigungen für das Google Cloud-Projekt des Clusters zu validieren:
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 Google Cloud-Projekt des Clusters:
{
"permissions": [
"logging.sinks.create",
"logging.sinks.get",
"resourcemanager.projects.setIamPolicy"
]
}
Führen Sie den folgenden Befehl aus, um Ihre Berechtigungen für jedes Google Cloud-Projekt des Mandanten 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 jedes Google Cloud-Projekt für Mandanten:
{
"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, die alle Nutzer Ihres Mandanten-Google Cloud-Projekts enthält. 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.
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.
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/monitoring.viewer' \
--condition=None
Jedes Google Cloud-Projekt des Mandanten dem Google Cloud-Projekt des Clusters zuordnen
Sie verwenden Werte für Ressourceneinstellungen, um Mandanten-Google Cloud-Projekte einem Cluster-Google Cloud-Projekt zuzuordnen.
Die Ressourceneinstellung kann für jedes einzelne Google Cloud-Projekt eines Mandanten konfiguriert werden. kann auf jeder Ebene der Ordnerhierarchie festgelegt 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 nach der Einrichtung die Knative serving-UI sehen sie ihre Dienste auch auf der Google Cloud-Projekt des Clusters Dies ändert nichts an den IAM-Berechtigungen für das Google Cloud-Projekt des Clusters oder den für GKE-Cluster verwendet wird, handelt es sich lediglich um eine Zuordnung von einem Mandantenprojekt (oder Ordner) zu einem Google Cloud-Projekt des Clusters
Aktivieren Sie die
resourcesettings
API im Google Cloud-Projekt des Mandanten.gcloud services enable resourcesettings.googleapis.com \ --project=$TENANT_PROJECT_ID
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 undYOUR_ADMIN_MEMBER_ID
durch Ihre Nutzer-ID, z. B.user:my-email@my-domain.com
.Wählen Sie eine der folgenden Methoden zum Definieren der Zuordnung aus.
Sie können den Wert der Ressourceneinstellung für einen übergeordneten Google Cloud-Ordner festlegen, wenn alle untergeordneten Google Cloud-Projekte und Google Cloud-Ordner die auf denselben Wert.
Mandantenprojekte
Legen Sie den Wert der Ressourceneinstellung für jedes Google Cloud-Projekt des Mandanten fest:
name
des Google Cloud-Projekts für Mandanten abrufen und auf eine lokale Umgebung festlegen Variable:export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
- Erstellen Sie eine Datei mit dem Wert der Ressourceneinstellung, um die Zuordnung der
Google Cloud-Projekt des Mandanten mit dem Google Cloud-Projekt des Clusters. Es können mehrere Google Cloud-Projekt-IDs für Cluster angegeben werden
in dieser Datei definiert und einem Google Cloud-Projekt für einen einzelnen Mandanten hinzugefügt.
cat > value-file.json << EOF { "name": "projects/$TENANT_PROJECT_NUMBER/settings/cloudrun-multiTenancy/value", "value": { "stringSetValue": { "values": [ "projects/$CLUSTER_PROJECT_ID" ] } } } EOF
- Stellen Sie die Ressourceneinstellungen für das Google Cloud-Projekt des Mandanten bereit:
gcloud 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 Folgendes festzulegen: Wert für alle Google Cloud-Projekte und -Ordner des untergeordneten Mandanten:
- Rufen Sie den
number
des Mandantenordners ab und legen Sie ihn auf einen lokalen Speicherort fest. Umgebungsvariable:export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
- Erstellen Sie eine Datei mit dem Wert der Ressourceneinstellung, um die Zuordnung der
Mandantenordner zum Google Cloud-Clusterprojekt. Es können mehrere Google Cloud-Projekt-IDs für Cluster angegeben werden
in dieser Datei definiert und einem Ordner für einen einzelnen Mandanten hinzugefügt.
cat > value-file.json << EOF { "name": "folders/$TENANT_FOLDER_NUMBER/settings/cloudrun-multiTenancy/value", "value": { "stringSetValue": { "values": [ "projects/$CLUSTER_PROJECT_ID" ] } } } EOF
- Stellen Sie die Ressourceneinstellungen im Mandantenordner bereit:
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER
Log-Buckets und -senken zur Weiterleitung von Logdaten einrichten
Für jeden Mandanten erstellen Sie einen Log-Bucket, eine Senke und die Berechtigungen zum Weiterleiten des Logdaten des Google Cloud-Projekts zu Clustern im Google Cloud-Projekt des Mandanten In den folgenden Schritten wurden alle Logs Namespace im Google Cloud-Clusterprojekt 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. Um diesen Schritt zu vereinfachen, ist der Name eine Kombination aus lokale Umgebungsvariablen des Google Cloud-Cluster-Projekts und des Mandanten-Google Cloud-Projekts, erstellt. 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. Hinweis Der Name des Log-Buckets muss die ID des Google Cloud-Clusterprojekts sein und kann nicht geändert werden oder modifiziert wurden.
gcloud logging buckets \
create $CLUSTER_PROJECT_ID \
--location=global \
--project=$TENANT_PROJECT_ID
Führen Sie den folgenden Befehl aus, um die Senke aus dem angegebenen Namespace in der
Google Cloud-Projekt des Clusters in den Bucket des Google Cloud-Projekts des Mandanten. Sie können den Umfang der
um beispielsweise nur einzelne GKE-Cluster oder
spezifischen Knative serving-Ressourcen, indem wir zusätzliche
log-filter
-Werte.
gcloud 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 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 zum Konfigurieren verwendet Berechtigungen, mit denen Mandanten auf das Google Cloud-Projekt der GKE-Cluster. Damit Mandanten Zugriff auf die Ressourcen im GKE-Cluster haben, müssen Sie Berechtigungen mit Kubernetes RBAC definieren.
Clusterrollen erstellen
Nachdem Sie die folgenden Clusterrollen definiert und erstellt haben, können Sie um alle nachfolgenden Mandanten des Google Cloud-Projekts des Clusters 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/logging/sinks/create
-Diensten zugreifen können.
kubectl create clusterrole \
namespace-lister \
--verb=list \
--resource=namespaces
Mit dieser Rolle können Mandanten Knative serving-Dienste aufrufen. Dies ist erforderlich, um die Dienste in der Knative serving-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 Ihnen, einfach nur Knative serving 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
Kann Knative serving-Dienste auflisten
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=istio-system \
--clusterrole=ingress-reader \
--group=$TENANT_GROUP
Bestätigen
Sie können prüfen, ob Sie die Mehrmandantenfähigkeit im Unternehmen erfolgreich konfiguriert haben, indem Sie das Google Cloud-Projekt des Mandanten in Knative serving öffnen und einen Dienst bereitstellen, GKE-Cluster.
Glückwunsch! Ihr Mandant kann jetzt mit den Diensten und Ressourcen innerhalb des GKE-Cluster-Namespace interagieren, auf den ihm Zugriff gewährt wurde.