Questa guida ti illustra la configurazione di Knative Serving per 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 Google Cloud diverso.
Un modello operativo comune con Knative Serving prevede che un team di sviluppatori di applicazioni utilizzi il proprio progetto Google Cloud per eseguire il deployment e gestire i servizi in esecuzione in cluster GKE diversi nei progettiGoogle Cloud di altri team. Questa funzionalità, chiamata multi-tenancy, consente a te, in qualità di operatore della piattaforma, di personalizzare l'accesso dei tuoi team di sviluppo solo ai servizi in esecuzione nei vari ambienti della tua organizzazione (ad esempio, produzione e staging).
Knative serving supporta in modo specifico il multi-tenancy aziendale. Questo tipo di multi-tenancy consente a un progetto Google Cloud cluster di accedere a risorse specifiche del cluster GKE. Il progetto Google Cloud a cui è stato 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 per i quali è stato concesso l'accesso.
A livello concettuale, la configurazione del multi-tenancy aziendale con Knative Serving 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 cluster.
- Instrada i dati di log del progetto cluster ai progetti tenant utilizzando i bucket di log e i sink. Google Cloud Google Cloud
- Definisci le autorizzazioni del cluster per i tenant utilizzando controllo dell'accesso basato sui ruoli.
Prima di iniziare
L'operatore della piattaforma responsabile della configurazione del 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 progetti per cui vuoi abilitare il multitenancy esistano già. Google Cloud
Devi disporre dell'accesso ai seguenti servizi e risorse dei progetti Google Cloud :
Autorizzazioni Identity and Access Management nel progetto Google Cloud tenant:
- roles/logging.configWriter
- Amministratore tenant del gruppo Google
Autorizzazioni Identity and Access Management nel progetto Google Cloud del cluster:
Devi avere o installare l'ultima versione 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 cluster, quindi esegui il comando seguente:export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
Sostituisci
YOUR_TENANT_PROJECT_ID
con l'ID del progetto Google Cloud tenant, quindi esegui il seguente comando:export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
Verifica 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
Ora l'ID progetto del cluster Google Cloud e l'ID progetto del tenant Google Cloud vengono utilizzati in tutti i seguenti
comandi in cui sono specificati $CLUSTER_PROJECT_ID
e $TENANT_PROJECT_ID
.
Verifica delle autorizzazioni IAM
Esegui i seguenti comandi testIamPermissions per verificare di disporre delle autorizzazioni IAM richieste per accedere alle risorse nel progetto Google Cloud del cluster e nei progetti Google Cloud tenant.
Esegui questo comando per convalidare le tue autorizzazioni sul 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 del cluster Google Cloud :
{
"permissions": [
"logging.sinks.create",
"logging.sinks.get",
"resourcemanager.projects.setIamPolicy"
]
}
Esegui questo comando per convalidare le tue autorizzazioni su ogni 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 al tenant
Utilizza 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é 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 Google Cloud del tuo tenant. Per saperne di più sull'utilizzo di un gruppo di sicurezza, vedi Utilizzare 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 seguenti comandi per consentire ai tenant di ottenere le credenziali per il cluster. In questo modo, i tenant non possono leggere o manipolare alcuna risorsa 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"
Monitoring Viewer
Esegui questo comando 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 Google Cloud tenant al progetto Google Cloud cluster
Utilizzi i valori di impostazione delle risorse per mappare i progetti Google Cloud tenant a un progetto Google Cloud cluster.
L'impostazione della risorsa può essere configurata per ogni progetto Google Cloud tenant individuale oppure può essere impostata a qualsiasi livello della gerarchia delle cartelle. È più facile impostarlo a livello di cartella single-tenant, ma è più flessibile impostarlo a livello di progetto di ogni tenant. Una volta configurata, ogni volta che i tenant sfogliano l'interfaccia utente di Knative Serving, vedranno anche i propri servizi nel progetto cluster Google Cloud . Ciò non modifica le autorizzazioni IAM nel progetto Google Cloud del cluster o nei cluster GKE, ma è solo una mappatura da un progetto (o cartella) tenant a un progetto Google Cloud del cluster.
Abilita l'API
resourcesettings
nel progetto Google Cloud 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 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 della risorsa in una cartella Google Cloud principale, se tutti i progetti Google Cloud e le cartelle Google Cloud figlio utilizzano lo stesso valore.
Progetti tenant
Imposta il valore dell'impostazione della risorsa per ogni progetto Google Cloud tenant:
- Ottieni il
name
del progetto Google Cloud tenant e impostalo su una variabile dell'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
progetto Google Cloud tenant al progetto Google Cloud cluster. In questo file possono essere definiti più ID progetto Google Cloud cluster e aggiunti 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 delle risorse nel progetto Google Cloud del tenant:
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 figlio: Google Cloud
- 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 di valori di impostazione delle risorse per definire la mappatura dalla cartella del tenant al progetto del cluster Google Cloud . In questo file possono essere definiti più ID progetto Google Cloud cluster e aggiunti 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 del 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 di log del progetto Google Cloud del cluster al progetto Google Cloud del tenant. Nei passaggi successivi, tutti i log dello spazio dei nomi nel progetto del cluster Google Cloud vengono indirizzati al bucket. Consulta il set riportato di seguito per informazioni dettagliate 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 tuoi tenant.
- Il nome del sink. Per semplificare questo passaggio, il nome è una combinazione delle variabili di ambiente locali del progetto cluster Google Cloud e del progetto tenant Google Cloud 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 dei log nel progetto tenant. Tieni presente che il nome del bucket dei log deve essere l'ID del progetto Google Cloud del cluster e non può essere modificato.
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 cluster Google Cloud al bucket del progetto tenant Google Cloud . Tieni presente che puoi restringere l'ambito
dei log, ad esempio per condividere solo singoli cluster GKE o
risorse di Knative Serving specifiche definendo ulteriori
valori 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 tenant con controllo dell'accesso basato sui ruoli (RBAC)
In precedenza hai utilizzato Google Gruppi e IAM per configurare le autorizzazioni per consentire ai tenant di accedere al progetto del cluster GKE. Google Cloud Per consentire agli inquilini di accedere alle risorse all'interno del cluster GKE, devi definire le autorizzazioni con Kubernetes RBAC.
Crea ruoli cluster
Dopo aver definito e creato i seguenti ruoli del cluster, puoi continuare a utilizzarli 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. 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 nella UI di Knative serving.
kubectl create clusterrole \
ksvc-lister \
--verb=list \
--resource=services.serving.knative.dev
Crea ruoli cluster
È necessaria 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 servizi Knative serving.
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 del tenant e assegna le autorizzazioni.
Tieni presente che questo presuppone che tu abbia eseguito la configurazione utilizzando Google Groups 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 auth can-i� che restituisce gli spazi dei nomi per i quali è possibile un'azione. L'unica soluzione alternativa è elencare gli spazi dei nomi e poi eseguire query su ciascuno 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 multi-tenancy aziendale aprendo il progetto Google Cloud tenant in Knative Serving e eseguendo il deployment di un servizio in un cluster GKE.
Congratulazioni, ora il tuo tenant può interagire con i servizi e le risorse all'interno dello spazio dei nomi del cluster GKE a cui è stato concesso l'accesso.