Questa guida illustra come configurare Knative serving per consentire uno o più progetti Google Cloud per eseguire e gestire i carichi di lavoro in esecuzione su un cluster GKE in un altro progetto Google Cloud.
Un modello operativo comune con Knative serving è adatto a un team di applicazioni agli sviluppatori di utilizzare il proprio progetto Google Cloud per eseguire il deployment dei servizi in esecuzione in cluster GKE disparati tra gli altri team progetti Google Cloud. Questa funzionalità, chiamata multi-tenancy, ti consente, in qualità di operatore della piattaforma, di personalizzare l'accesso dei team di sviluppo solo ai loro servizi in esecuzione nei vari ambienti della tua organizzazione (ad esempio, produzione e staging).
Knative serving supporta in modo specifico il multitenancy per le aziende. Questo tipo di architettura multi-tenancy consente a un progetto Google Cloud in cluster di consentire l'accesso a specifiche delle risorse del proprio cluster GKE. Il progetto Google Cloud a cui viene concesso l'accesso al progetto Google Cloud del cluster è il progetto Google Cloud del tenant. Inquilini di possono utilizzare Knative serving per accedere, operare su i servizi e le risorse per i quali viene concesso loro l'accesso.
A livello concettuale, la configurazione del multitenancy aziendale con il servizio Knative prevede quattro passaggi:
- Configura l'accesso del tenant al progetto Google Cloud del cluster utilizzando un gruppo Google e Identity and Access Management.
- Mappa ogni progetto Google Cloud tenant al progetto Google Cloud del cluster.
- Instrada i dati di log del progetto Google Cloud del cluster ai progetti Google Cloud tenant utilizzando i bucket di log e lavandini.
- Definisci le autorizzazioni del cluster per i tenant utilizzando il controllo dell'accesso basato sui ruoli.
Prima di iniziare
L'operatore della piattaforma responsabile della configurazione del multitenancy deve comprendere e soddisfare i seguenti requisiti:
Come spiegato nella documentazione di GKE, devi comprendere i seguenti concetti di multitenancy:
Questo documento presuppone che i progetti Google Cloud che vuoi abilitare la multitenancy esiste già.
Devi avere accesso ai servizi e ai servizi per progetti Google Cloud seguenti di risorse:
Autorizzazioni per Identity and Access Management nel progetto Google Cloud tenant:
- roles/logging.configWriter
- Amministratore del tenant del gruppo Google
Autorizzazioni per Identity and Access Management nel progetto Google Cloud del cluster:
Devi disporre o installare la versione più recente di [Google Cloud CLI]](/sdk/docs/install).
Definisci le variabili di ambiente locali
Per semplificare i comandi utilizzati in questo processo, definisci le variabili di ambiente locali sia per il progetto Google Cloud del cluster sia per il progetto Google Cloud del tenant:
Sostituisci
YOUR_CLUSTER_PROJECT_ID
con l'ID del progetto Google Cloud del cluster e poi esegui questo comando:export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
Sostituisci
YOUR_TENANT_PROJECT_ID
con l'ID del progetto Google Cloud tenant e poi esegui questo comando:export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
Verifica le variabili di ambiente locali eseguendo questi comandi:
echo "cluster Google Cloud project is:" $CLUSTER_PROJECT_ID echo "tenant Google Cloud project is:" $TENANT_PROJECT_ID
L'ID progetto Google Cloud del cluster e l'ID progetto Google Cloud del tenant vengono ora utilizzati in tutti i comandi riportati di seguito in cui sono specificati $CLUSTER_PROJECT_ID
e $TENANT_PROJECT_ID
.
Verifica delle autorizzazioni IAM in corso...
Esegui questi comandi testIamPermissions per verificare di disporre delle autorizzazioni IAM necessarie per accedere alle risorse nel progetto Google Cloud del cluster e ai progetti Google Cloud tenant.
Esegui questo comando per convalidare le tue autorizzazioni nel progetto Google Cloud del cluster:
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
Risultati previsti per il progetto Google Cloud del cluster:
{
"permissions": [
"logging.sinks.create",
"logging.sinks.get",
"resourcemanager.projects.setIamPolicy"
]
}
Esegui questo comando per convalidare le autorizzazioni su ciascun progetto Google Cloud tenant:
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
Risultati previsti per ogni progetto Google Cloud tenant:
{
"permissions": [
"logging.buckets.create",
"logging.buckets.get",
"resourcemanager.projects.setIamPolicy",
"resourcesettings.settingvalues.create",
"serviceusage.services.enable",
]
}
Utilizzare un gruppo Google e Identity and Access Management per configurare l'accesso del tenant
Usa un gruppo Google per consentire ai tenant di accedere al cluster GKE. Le autorizzazioni IAM concedono ai tenant le autorizzazioni per recuperare ma non potranno fare nulla nel cluster fino a quando Il controllo dell'accesso basato su ruoli di Kubernetes verrà configurato in un passaggio successivo.
Devi creare un gruppo Google che contenga tutti gli utenti del progetto Google Cloud del tuo tenant. Per ulteriori informazioni sull'utilizzo di un gruppo di sicurezza, vedi Utilizzo di Google Gruppi per GKE.
Crea la seguente variabile di ambiente locale per il tuo gruppo Google:
export SECURITY_GROUP=gke-security-groups@company.com
Visualizzatore dei cluster Kubernetes
Esegui questi comandi per consentire ai tenant di ottenere le credenziali per il cluster: Ciò non consente ai tenant di leggere o manipolare qualsiasi risorsa cluster GKE.
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/container.clusterViewer' \
--condition=None
Per limitare l'accesso a un cluster specifico, puoi utilizzare un account IAM .
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 Viewer
Esegui il comando seguente per consentire ai tenant di leggere le metriche di monitoraggio.
Guida di riferimento per i ruoli di monitoraggio
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/monitoring.viewer' \
--condition=None
Mappando ogni progetto Google Cloud tenant al progetto Google Cloud del cluster
Utilizzi i valori di impostazione delle risorse per mappare i progetti Google Cloud del tenant a un progetto Google Cloud del cluster.
L'impostazione delle risorse può essere configurata per ogni singolo progetto Google Cloud tenant oppure possono essere impostate a qualsiasi livello della gerarchia delle cartelle. È più facile impostarlo a livello di singola cartella del tenant, ma è più flessibile a livello di progetto di ogni tenant. Una volta completata la configurazione, ogni volta che gli utenti esplorano l'interfaccia utente di Knative Serving, vedranno anche i propri servizi nel progetto Google Cloud del cluster. Ciò non modifica le autorizzazioni IAM nel progetto Google Cloud del cluster o nei cluster GKE, ma si tratta solo di una mappatura da un progetto (o una cartella) del tenant a un progetto Google Cloud del cluster.
Abilita l'API
resourcesettings
nel progetto Google Cloud del tenant.gcloud services enable resourcesettings.googleapis.com \ --project=$TENANT_PROJECT_ID
Aggiungi i privilegi di amministratore dell'organizzazione (
roles/resourcesettings.admin
) al tuo ID utente eseguendo questo comando:gcloud organizations add-iam-policy-binding YOUR_ORGANIZATION_ID \ --member=YOUR_ADMIN_MEMBER_ID \ --role='roles/resourcesettings.admin'
Sostituisci
YOUR_ORGANIZATION_ID
con ID della tua organizzazione eYOUR_ADMIN_MEMBER_ID
con il tuo ID utente, ad esempiouser:my-email@my-domain.com
.Scegli uno dei seguenti metodi per definire la mappatura.
Puoi impostare il valore dell'impostazione della risorsa in una cartella Google Cloud principale se tutti i progetti e le cartelle Google Cloud secondari utilizzano lo stesso valore.
Progetti tenant
Imposta il valore dell'impostazione della risorsa per ogni progetto Google Cloud del tenant:
- Ottieni
name
del progetto Google Cloud tenant e impostalo su un ambiente locale variabile:export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
- Crea un file del valore dell'impostazione della risorsa per definire la mappatura dal progetto Google Cloud del tenant al progetto Google Cloud del cluster. In questo file è possibile definire più ID progetto Google Cloud del cluster e aggiungerli a un singolo progetto Google Cloud del tenant.
cat > value-file.json << EOF { "name": "projects/$TENANT_PROJECT_NUMBER/settings/cloudrun-multiTenancy/value", "value": { "stringSetValue": { "values": [ "projects/$CLUSTER_PROJECT_ID" ] } } } EOF
- Esegui il deployment delle impostazioni delle risorse nel progetto Google Cloud tenant:
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --project $TENANT_PROJECT_ID
Cartelle del tenant
Configura il valore dell'impostazione delle risorse per una cartella tenant padre a tutti i progetti e le cartelle Google Cloud tenant del bucket:
- Ottieni il
number
della cartella del tenant e impostalo su una variabile di ambiente locale:export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
- Crea un file con i valori delle impostazioni delle risorse per definire il mapping dal
della cartella tenant al progetto Google Cloud del cluster. In questo file è possibile definire più ID progetto Google Cloud per i cluster e aggiungerli a una singola cartella del tenant.
cat > value-file.json << EOF { "name": "folders/$TENANT_FOLDER_NUMBER/settings/cloudrun-multiTenancy/value", "value": { "stringSetValue": { "values": [ "projects/$CLUSTER_PROJECT_ID" ] } } } EOF
- Esegui il deployment delle impostazioni delle risorse nella cartella tenant:
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER
Configurazione dei bucket e dei sink di log per il routing dei dati di log
Per ogni tenant, crea un bucket di log, un sink e le autorizzazioni per instradare i dati dei log del progetto Google Cloud del cluster al progetto Google Cloud del tenant. Nei passaggi seguenti, tutti i log lo spazio dei nomi nel progetto Google Cloud del cluster viene instradato al bucket. Consulta l'insieme per i dettagli su come limitare i log condivisi.
Crea le seguenti variabili di ambiente locale:
- Specifica lo spazio dei nomi del cluster GKE che i tenant l'accesso.
- Il nome del sink. Per semplificare questo passaggio, il nome è una combinazione di il progetto Google Cloud nel cluster e le variabili di ambiente locale del progetto Google Cloud tenant che hai utilizzato è stato creato. Puoi modificare questo valore.
export NAMESPACE=$NAMESPACE
export SINK_NAME=$CLUSTER_PROJECT_ID-$TENANT_PROJECT_ID
Esegui questo comando per creare il bucket di log nel progetto tenant. Nota che il nome del bucket di log deve essere l'ID del progetto Google Cloud del cluster e non può essere modificato o modificati.
gcloud logging buckets \
create $CLUSTER_PROJECT_ID \
--location=global \
--project=$TENANT_PROJECT_ID
Esegui il comando seguente per creare lo scarico dallo spazio dei nomi specificato nel progetto Google Cloud del cluster al bucket del progetto Google Cloud del tenant. Tieni presente che puoi restringere l'ambito
nei log, ad esempio per condividere solo un singolo cluster GKE
specifiche risorse Knative serving definendo
Valori di log-filter
.
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
Esegui questi comandi per aggiungere l'autorizzazione dall'account di servizio del sink di log al bucket che hai creato.
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"
Configurazione delle autorizzazioni del tenant con il controllo dell'accesso basato sui ruoli (RBAC)
In precedenza hai utilizzato Google Gruppi e IAM per configurare per consentire ai tenant di accedere al progetto Google Cloud cluster GKE. consentire ai tenant di accedere alle risorse all'interno nel cluster GKE, devi definire le autorizzazioni con Kubernetes RBAC.
Creazione di ruoli nei cluster
Dopo aver definito e creato i seguenti ruoli del cluster, puoi continuare a utilizzarli in futuro per aggiungere tutti gli altri tenant del progetto Google Cloud del cluster.
Ruoli UI
Questo ruolo consente ai tenant di eseguire query su tutti gli spazi dei nomi. Questo è necessario per trovare gli spazi dei nomi a cui gli utenti hanno accesso per creare servizi /sdk/gcloud/reference/logging/sinks/create
.
kubectl create clusterrole \
namespace-lister \
--verb=list \
--resource=namespaces
Questo ruolo consente ai tenant di visualizzare i servizi Knative serving. Questo passaggio è necessario per elencare i servizi nell'interfaccia utente di Knative serving.
kubectl create clusterrole \
ksvc-lister \
--verb=list \
--resource=services.serving.knative.dev
Crea ruoli cluster
È obbligatoria solo una di queste autorizzazioni. La prima autorizzazione consente ai tenant di manipolare qualsiasi risorsa nel loro spazio dei nomi. La seconda autorizzazione consente di creare solo Knative serving più limitato i servizi di machine learning.
kubectl create clusterrole \
kubernetes-developer \
--verb="*" \
--resource="*.*"
Se l'autorizzazione kubernetes-developer
è troppo permissiva, quanto segue:
consente ai tenant di creare servizi Knative nei loro spazi dei nomi e di visualizzare
altre risorse Knative.
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
Crea lo spazio dei nomi del tenant e assegna le autorizzazioni.
Tieni presente che questo presuppone che tu abbia eseguito la configurazione utilizzando Google Gruppi per GKE. Questa operazione è necessaria per ogni tenant.
export TENANT_GROUP=tenant-a@company.com
TENANT_GROUP deve far parte di SECURITY_GROUP
Può visualizzare tutti gli spazi dei nomi
Per eseguire query sul cluster GKE, la maggior parte dei tenant ha di elencare gli spazi dei nomi. Al momento non esiste auth can-i che restituisce spazi dei nomi per i quali è possibile eseguire un'azione. L'unica soluzione è per elencare gli spazi dei nomi ed eseguire query su ogni spazio dei nomi singolarmente.
kubectl create clusterrolebinding \
all-namespace-listers \
--clusterrole=namespace-lister \
--group=$TENANT_GROUP
Possibilità di elencare i servizi Knative serving
kubectl create clusterrolebinding \
all-ksvc-listers \
--clusterrole=ksvc-lister \
--group=$TENANT_GROUP
Possibilità di manipolare le risorse nello spazio dei nomi
Per prima cosa, crea lo spazio dei nomi:
kubectl create namespace $NAMESPACE
Se utilizzi il ruolo kubernetes-developer:
kubectl create rolebinding \
kubernetes-developer \
--namespace=$NAMESPACE \
--clusterrole=kubernetes-developer \
--group=$TENANT_GROUP
Se utilizzi il ruolo knative-developer:
kubectl create rolebinding \
kubernetes-developer \
--namespace=$NAMESPACE \
--clusterrole=knative-developer \
--group=$TENANT_GROUP
Aggiungi la possibilità per il tenant di accedere all'indirizzo IP esterno
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
Verifica
Puoi verificare di aver configurato correttamente la multitenancy aziendale tramite l'apertura del progetto Google Cloud tenant in Knative serving e il deployment di un servizio in un cluster GKE.
Complimenti, il tenant può ora interagire con i servizi e le risorse nello spazio dei nomi del cluster GKE a cui è stato concesso l'accesso.