Questa guida illustra come configurare il servizio Knative per consentire a uno o più progetti Google Cloud di 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 serve a un team di sviluppatori di applicazioni che usano il proprio progetto Google Cloud per eseguire il deployment e gestire i servizi in esecuzione in cluster GKE disparati nei progetti Google Cloud di altri team. Questa funzionalità, chiamata multi-tenancy, consente agli operatori di piattaforma di personalizzare l'accesso dei team di sviluppo solo ai servizi in esecuzione nei vari ambienti della tua organizzazione (ad esempio produzione e gestione temporanea).
La gestione di Knative supporta in modo specifico la multi-tenancy aziendale. Questo tipo di multi-tenancy consente a un progetto Google Cloud di cluster di consentire l'accesso a risorse specifiche del proprio cluster GKE. Il progetto Google Cloud a cui è stato concesso l'accesso al progetto Google Cloud del cluster è il progetto Google Cloud tenant. I tenant del progetto Google Cloud del cluster possono utilizzare il servizio Knative per accedere, operare e possedere i servizi e le risorse per i quali viene concesso l'accesso.
Concettualmente, sono previsti quattro passaggi per configurare la multitenancy aziendale con la gestione Knative:
- Configurare l'accesso del tenant al progetto Google Cloud del cluster utilizzando un gruppo Google e Identity and Access Management.
- Mappa ogni progetto Google Cloud del tenant al progetto Google Cloud del cluster.
- Instrada i dati del log del progetto Google Cloud del cluster ai progetti Google Cloud tenant utilizzando bucket di log e sink.
- Definisci le autorizzazioni del cluster per i tenant utilizzando controllo dell'accesso basato sui ruoli.
Prima di iniziare
L'operatore di piattaforma responsabile della configurazione dell'architettura multi-tenancy deve comprendere e soddisfare i seguenti requisiti:
Come spiegato nella documentazione di GKE, devi comprendere i seguenti concetti dell'architettura multi-tenancy:
Questo documento presuppone che esistano già i progetti Google Cloud per i quali vuoi abilitare la multitenancy.
Devi avere accesso ai servizi e alle risorse dei progetti Google Cloud seguenti:
Autorizzazioni di Identity and Access Management nel progetto tenant di Google Cloud:
- roles/logging.configWriter
- Amministratore tenant del gruppo Google
Autorizzazioni di Identity and Access Management nel progetto Google Cloud del cluster:
Devi avere 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 ed esegui questo comando:export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
Sostituisci
YOUR_TENANT_PROJECT_ID
con l'ID del progetto Google Cloud tenant ed 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 tenant vengono ora utilizzati in tutti i seguenti comandi in cui sono specificati $CLUSTER_PROJECT_ID
e $TENANT_PROJECT_ID
.
Verifica delle autorizzazioni IAM
Esegui i comandi testIamPermissions riportati di seguito per verificare di disporre delle autorizzazioni IAM necessarie per accedere alle risorse del progetto Google Cloud del cluster e ai progetti Google Cloud del 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 in ciascun progetto Google Cloud del 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",
]
}
Usa un gruppo Google e Identity and Access Management per configurare l'accesso al tenant
Usa un gruppo Google per consentire ai tenant di accedere al cluster GKE. Le autorizzazioni IAM concedono ai tenant le autorizzazioni per ottenere le credenziali, ma non potranno fare nulla nel cluster finché non verrà configurato il controllo dell'accesso basato sui ruoli di Kubernetes in un passaggio successivo.
Devi creare un gruppo Google che contenga tutti gli utenti del progetto Google Cloud tenant. Per ulteriori informazioni sull'utilizzo di un gruppo di sicurezza, consulta 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 cluster Kubernetes
Esegui i comandi seguenti per consentire ai tenant di ottenere le credenziali per il cluster. Questo non consente ai tenant di leggere o manipolare le risorse sul 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 una condizione 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"
Visualizzatore Monitoring
Esegui questo comando per consentire ai tenant di leggere le metriche di monitoraggio.
Riferimento ai ruoli di Monitoring
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/monitoring.viewer' \
--condition=None
Mappatura di ogni progetto Google Cloud del tenant al progetto Google Cloud del cluster
Puoi utilizzare 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 del tenant o può essere impostata a qualsiasi livello della gerarchia delle cartelle. È più semplice da impostare a livello di cartella di singolo tenant, ma più flessibile da impostare a livello di progetto di ogni tenant. Al termine della configurazione, ogni volta che i tenant esplorano l'interfaccia utente di gestione di Knative vedranno anche i loro servizi nel progetto Google Cloud nel cluster. Questa operazione non modifica le autorizzazioni IAM sul progetto Google Cloud del cluster o sui cluster GKE; si tratta solo di una mappatura da un progetto (o cartella) tenant a un progetto Google Cloud nel cluster.
Abilita l'API
resourcesettings
nel progetto tenant Google Cloud.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 il comando seguente:gcloud organizations add-iam-policy-binding YOUR_ORGANIZATION_ID \ --member=YOUR_ADMIN_MEMBER_ID \ --role='roles/resourcesettings.admin'
Sostituisci
YOUR_ORGANIZATION_ID
con l'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 delle risorse su una cartella Google Cloud padre, se tutti i progetti Google Cloud secondari e tutte le cartelle Google Cloud utilizzano lo stesso valore.
Progetti tenant
Imposta il valore di impostazione delle risorse per ogni progetto Google Cloud del tenant:
- Ottieni il
name
del progetto tenant di Google Cloud e impostalo su una variabile di ambiente locale:export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
- Crea un file dei valori delle impostazioni delle risorse per definire la mappatura dal progetto Google Cloud del tenant al progetto Google Cloud del cluster. È possibile definire più ID progetto Google Cloud di cluster in questo file e aggiungerli a un singolo progetto Google Cloud 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 della risorsa nel progetto Google Cloud tenant:
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --project $TENANT_PROJECT_ID
Cartelle tenant
Imposta il valore di impostazione delle risorse per una cartella tenant principale per impostare questo valore su tutti i progetti e le cartelle di Google Cloud del tenant figlio:
- Ottieni il
number
della cartella tenant e impostalo su una variabile di ambiente locale:export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
- Crea un file dei valori delle impostazioni delle risorse per definire la mappatura dalla cartella tenant al progetto Google Cloud del cluster. È possibile definire più ID progetto Google Cloud di cluster in questo file e aggiungerli a una singola cartella 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, crei un bucket di log, un sink e le autorizzazioni per instradare i dati del log del progetto Google Cloud del cluster al progetto Google Cloud del tenant. Nei passaggi seguenti, tutti i log dello spazio dei nomi nel progetto Google Cloud del cluster vengono instradati al bucket. Per i dettagli su come limitare i log condivisi, consulta il set di seguito.
Crea le seguenti variabili di ambiente locale:
- Specifica lo spazio dei nomi del cluster GKE a cui accedono i tenant.
- Il nome del sink. Per semplificare questo passaggio, il nome è una combinazione delle variabili di ambiente del progetto Google Cloud del cluster e del progetto Google Cloud del tenant che hai creato in precedenza. 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. Tieni presente che il nome del bucket di log deve essere l'ID del progetto Google Cloud del cluster e non può essere modificato o modificato.
gcloud logging buckets \
create $CLUSTER_PROJECT_ID \
--location=global \
--project=$TENANT_PROJECT_ID
Esegui questo comando per creare il sink dallo spazio dei nomi specificato nel progetto Google Cloud del cluster al bucket del progetto Google Cloud tenant. Tieni presente che puoi restringere l'ambito dei log, ad esempio per condividere solo un singolo cluster GKE o risorse di gestione Knative specifiche definendo valori log-filter
aggiuntivi.
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 i comandi seguenti 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 tenant con controllo dell'accesso basato su ruoli (RBAC)
In precedenza hai utilizzato Google Gruppi e IAM per configurare le autorizzazioni e consentire ai tenant di accedere al progetto Google Cloud del cluster GKE. Per consentire ai tenant di accedere alle risorse all'interno del cluster GKE, devi definire le autorizzazioni con Kubernetes RBAC.
Creazione ruoli cluster
Dopo aver definito e creato i ruoli cluster seguenti, puoi continuare a utilizzarli in futuro per aggiungere tutti i tenant successivi del progetto Google Cloud del cluster.
Ruoli UI
Questo ruolo consente ai tenant di eseguire query su tutti gli spazi dei nomi. Questa operazione è necessaria 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 di gestione di Knative. Questa operazione è necessaria per elencare i servizi nell'interfaccia utente di gestione di Knative.
kubectl create clusterrole \
ksvc-lister \
--verb=list \
--resource=services.serving.knative.dev
Creazione ruoli cluster
È necessaria una sola di queste autorizzazioni. La prima autorizzazione consente ai tenant di manipolare qualsiasi risorsa nel proprio spazio dei nomi. La seconda autorizzazione consente di creare un insieme più limitato di servizi di pubblicazione Knative.
kubectl create clusterrole \
kubernetes-developer \
--verb="*" \
--resource="*.*"
Se l'autorizzazione kubernetes-developer
è troppo permissiva, quanto segue consente ai tenant di creare servizi Knative nei propri spazi dei nomi e di visualizzare le 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 tenant e assegna le autorizzazioni.
Tieni presente che questo aspetto 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, tutti i tenant nella maggior parte dei casi sono in grado di elencare gli spazi dei nomi. Al momento non esiste un comando auth can-i che restituisce gli spazi dei nomi per i quali è possibile un'azione. L'unica soluzione è elencare gli spazi dei nomi e quindi eseguire query per ogni spazio dei nomi singolarmente.
kubectl create clusterrolebinding \
all-namespace-listers \
--clusterrole=namespace-lister \
--group=$TENANT_GROUP
Può elencare i servizi di pubblicazione Knative
kubectl create clusterrolebinding \
all-ksvc-listers \
--clusterrole=ksvc-lister \
--group=$TENANT_GROUP
Può manipolare le risorse nello spazio dei nomi
Prima 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
Per verificare di aver configurato correttamente la multitenancy aziendale, apri il progetto Google Cloud del tenant in Knative pubblicando ed eseguendo il deployment di un servizio in un cluster GKE.
Vai alla pubblicazione con Knative
Complimenti, il tenant può ora interagire con i servizi e le risorse all'interno dello spazio dei nomi del cluster GKE a cui è stato concesso l'accesso.
Riferimento multi-tenancy
- Multi-tenancy di GKE
- Best practice per l'architettura multi-tenancy di GKE
- Quota dello spazio dei nomi