Questa guida ti illustra la procedura per configurare Knative serving in modo da consentire a uno o più Google Cloud progetti di eseguire e gestire i carichi di lavoro in esecuzione su un cluster GKE in un progetto diverso Google Cloud .
Un modello operativo comune con Knative serving prevede che un team di sviluppatori di applicazioni utilizzi il proprio Google Cloud progetto per eseguire il deployment e gestire i servizi in esecuzione in cluster GKE distinti nei progetti Google Cloud di altri team. Questa funzionalità, chiamata multi-tenancy, consente a te, in qualità di operatore della piattaforma, di personalizzare l'accesso dei team di sviluppo solo ai servizi in esecuzione nei vari ambienti della tua organizzazione (ad es. produzione e staging).
Knative serving supporta in modo specifico la multi-tenancy aziendale. Questo tipo di multi-tenancy consente a un cluster Google Cloud project di consentire l'accesso a risorse specifiche del proprio cluster GKE. Il Google Cloud progetto a cui viene concesso l'accesso al progetto Google Cloud cluster è il progetto tenant Google Cloud . I tenant del progetto cluster Google Cloud possono utilizzare Knative serving per accedere, operare e possedere i servizi e le risorse a cui è stato concesso l'accesso.
A livello concettuale, la configurazione della multi-tenancy aziendale con Knative serving prevede quattro passaggi:
- Configura l'accesso dei tenant al progetto cluster Google Cloud utilizzando un gruppo Google e Identity and Access Management.
- Mappa ogni progetto tenant Google Cloud al progetto cluster Google Cloud .
- Esegui il routing dei dati di log del progetto cluster ai progetti tenant utilizzando bucket e sink di log. Google Cloud Google Cloud
- 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 della multi-tenancy deve comprendere e soddisfare i seguenti requisiti:
Come spiegato nella documentazione di GKE, devi comprendere i seguenti concetti di multi-tenancy:
Questo documento presuppone che i Google Cloud progetti per cui vuoi abilitare la multi-tenancy esistano già.
Devi avere accesso ai seguenti Google Cloud servizi e risorse dei progetti:
Autorizzazioni Identity and Access Management nel progetto tenant Google Cloud :
- roles/logging.configWriter
- Amministratore tenant del gruppo Google
Autorizzazioni Identity and Access Management nel cluster Google Cloud progetto:
Devi avere o installare l'ultima versione della [Google Cloud CLI]](/sdk/docs/install).
Definisci le variabili di ambiente locali
Per semplificare i comandi utilizzati in questa procedura, definisci le variabili di ambiente locali sia per il progetto Google Cloud cluster sia per il progetto Google Cloud tenant:
Sostituisci
YOUR_CLUSTER_PROJECT_IDcon l'ID del progetto cluster ed esegui il comando seguente: Google Cloudexport CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_IDSostituisci
YOUR_TENANT_PROJECT_IDcon l'ID del progetto tenant ed esegui il comando seguente: Google Cloudexport TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_IDVerifica le variabili di ambiente locali eseguendo i seguenti comandi:
echo "cluster Google Cloud project is:" $CLUSTER_PROJECT_ID echo "tenant Google Cloud project is:" $TENANT_PROJECT_ID
L'ID progetto cluster e l'ID progetto tenant vengono ora utilizzati in tutti i comandi seguenti in cui $CLUSTER_PROJECT_ID e $TENANT_PROJECT_ID sono specificati. Google Cloud Google Cloud
Verifica delle autorizzazioni IAM
Esegui i seguenti comandi testIamPermissions per verificare di disporre delle autorizzazioni IAM richieste per accedere alle risorse del progetto Google Cloud cluster e dei progetti Google Cloud tenant.
Esegui il comando seguente per verificare le autorizzazioni sul progetto cluster Google Cloud :
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 cluster Google Cloud :
{
"permissions": [
"logging.sinks.create",
"logging.sinks.get",
"resourcemanager.projects.setIamPolicy"
]
}
Esegui il comando seguente per verificare le autorizzazioni su ogni progetto tenant Google Cloud :
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 tenant Google Cloud :
{
"permissions": [
"logging.buckets.create",
"logging.buckets.get",
"resourcemanager.projects.setIamPolicy",
"resourcesettings.settingvalues.create",
"serviceusage.services.enable",
]
}
Utilizza un gruppo Google e Identity and Access Management per configurare l'accesso dei tenant
Utilizza un gruppo Google per consentire ai tenant di accedere al cluster GKE. Le autorizzazioni IAM consentono ai tenant di ottenere le credenziali, ma non potranno fare nulla nel cluster finché il controllo dell'accesso basato sui ruoli di Kubernetes non sarà configurato in un passaggio successivo.
Devi creare un gruppo Google che contenga tutti gli utenti del progetto tenant Google Cloud . Per ulteriori informazioni sull'utilizzo di un gruppo di sicurezza, consulta Utilizzo di Gruppi Google 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 i comandi seguenti per consentire ai tenant di ottenere le credenziali per il cluster. In questo modo, i tenant non potranno leggere o manipolare le risorse del 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"
Monitoring Viewer
Esegui il comando seguente per consentire ai tenant di leggere le metriche di monitoraggio.
Riferimento ai ruoli di monitoraggio
gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
--member=group:$SECURITY_GROUP \
--role='roles/monitoring.viewer' \
--condition=None
Mappatura di ogni progetto tenant Google Cloud al progetto cluster Google Cloud
Utilizza i valori delle impostazioni delle risorse per mappare i progetti tenant Google Cloud a un progetto cluster Google Cloud .
L'impostazione della risorsa può essere configurata per ogni singolo progetto tenant Google Cloud o può essere impostata a qualsiasi livello della gerarchia di cartelle. È più facile impostarla a livello di cartella del singolo tenant, ma è più flessibile impostarla a livello di progetto tenant. Una volta configurata, ogni volta che i tenant sfogliano l' interfaccia utente di Knative serving, vedranno anche i loro servizi nel progetto Google Cloud cluster. Questa operazione non modifica le autorizzazioni IAM sul progetto Google Cloud cluster o sui cluster GKE, ma è solo una mappatura da un progetto tenant (o cartella) a un progetto Google Cloud cluster.
Abilita l'API
resourcesettingsnel progetto tenant Google Cloud .gcloud services enable resourcesettings.googleapis.com \ --project=$TENANT_PROJECT_IDAggiungi 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_IDcon l' ID della tua organizzazione eYOUR_ADMIN_MEMBER_IDcon 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 padre Google Cloud , se tutti i progetti secondari Google Cloud e le cartelle Google Cloud utilizzano lo stesso valore.
Progetti tenant
Imposta il valore dell'impostazione della risorsa per ogni progetto tenant Google Cloud :
- Ottieni il
namedel progetto tenant 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 di valori di impostazione delle risorse per definire la mappatura dal
tenant Google Cloud progetto al cluster Google Cloud progetto. In questo file è possibile definire più ID progetto cluster Google Cloud e aggiungerli a un singolo progetto tenant Google Cloud
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 tenant Google Cloud :
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --project $TENANT_PROJECT_ID
Cartelle tenant
Imposta il valore dell'impostazione della risorsa per una cartella tenant padre in modo da impostare questo valore per tutti i progetti e le cartelle tenant secondari Google Cloud :
- Ottieni il
numberdella cartella tenant e impostalo su una variabile di ambiente locale:export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
- Crea un file di valori di impostazione delle risorse per definire la mappatura dalla
cartella tenant al progetto cluster Google Cloud . In questo file è possibile definire più ID progetto Google Cloud cluster 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, crea un bucket di log, un sink e le autorizzazioni per eseguire il routing dei dati di log del progetto cluster Google Cloud al progetto tenant Google Cloud . Nei passaggi seguenti, tutti i log dallo spazio dei nomi nel progetto cluster Google Cloud vengono indirizzati al bucket. Consulta il set riportato di seguito per i dettagli su come limitare i log condivisi.
Crea le seguenti variabili di ambiente locali:
- 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 locali del progetto Google Cloud cluster e del progetto Google Cloud tenant che hai creato in precedenza. Puoi modificare questo valore.
export NAMESPACE=$NAMESPACE
export SINK_NAME=$CLUSTER_PROJECT_ID-$TENANT_PROJECT_ID
Esegui il comando seguente per creare il bucket di log nel progetto tenant. Tieni presente che il nome del bucket di log deve essere l'ID del progetto cluster e non può essere modificato. Google Cloud
gcloud logging buckets \
create $CLUSTER_PROJECT_ID \
--location=global \
--project=$TENANT_PROJECT_ID
Esegui il comando seguente per creare il sink dallo spazio dei nomi specificato nel
progetto Google Cloud cluster al bucket del progetto Google Cloud tenant. Tieni presente che puoi restringere l'ambito di
i log, ad esempio per condividere solo il singolo cluster GKE o
risorse Knative serving 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 dei tenant con il controllo dell'accesso basato sui ruoli (RBAC)
In precedenza hai utilizzato Gruppi Google e IAM per configurare le autorizzazioni per consentire ai tenant di accedere al Google Cloud progetto del cluster GKE. Per consentire ai tenant di accedere alle risorse all'interno del cluster GKE, devi definire le autorizzazioni con RBAC di Kubernetes.
Crea ruoli cluster
Dopo aver definito e creato i seguenti ruoli cluster, puoi continuare a utilizzare questi in futuro per aggiungere tutti i tenant successivi del progetto cluster Google Cloud .
Ruoli UI
Questo ruolo consente ai tenant di eseguire query su tutti gli spazi dei nomi. È 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. È 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
È richiesta solo una di queste autorizzazioni. La prima autorizzazione consente ai tenant di manipolare qualsiasi risorsa nel proprio spazio dei nomi. La seconda autorizzazione consente un insieme più limitato di creazione di servizi Knative serving.
kubectl create clusterrole \
kubernetes-developer \
--verb="*" \
--resource="*.*"
Se l'autorizzazione kubernetes-developer è troppo permissiva, la seguente 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 del tenant e assegna le autorizzazioni.
Tieni presente che questa procedura presuppone che tu abbia configurato l'utilizzo di Gruppi Google per GKE. Questa operazione è necessaria per ogni tenant.
export TENANT_GROUP=tenant-a@company.com
TENANT_GROUP deve far parte di SECURITY_GROUP
Possibilità di visualizzare tutti gli spazi dei nomi
Per eseguire query sul cluster GKE, tutti i tenant devono avere la possibilità di elencare gli spazi dei nomi. Al momento non esiste un' autorizzazione can-i che restituisca gli spazi dei nomi per cui è possibile un'azione. L'unica soluzione alternativa è elencare gli spazi dei nomi ed eseguire query su ciascuno di essi 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
Innanzitutto, 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 multi-tenancy aziendale aprendo il progetto tenant in Knative serving ed eseguendo il deployment di un servizio in un cluster GKE. Google Cloud
Congratulazioni, ora il tenant può interagire con i servizi e le risorse all'interno dello spazio dei nomi del cluster GKE a cui è stato concesso l'accesso.