Multitenancy tra progetti per Cloud Run for Anthos

Questa guida illustra la configurazione di Cloud Run for Anthos per consentire a uno o più progetti Google Cloud di eseguire e gestire i carichi di lavoro in esecuzione su un cluster Google Kubernetes Engine in un altro progetto Cloud.

Un modello operativo comune con Cloud Run for Anthos è per un team di sviluppatori di applicazioni che utilizzano il proprio progetto Cloud per eseguire il deployment e gestire servizi in esecuzione in vari tipi di cluster Google Kubernetes Engine nei progetti di altri team. Questa funzionalità, chiamata multi-tenant, ti consente, in qualità di operatore della piattaforma, di personalizzare i tuoi team di sviluppo per accedere solo ai servizi in esecuzione nelle tue organizzazioni in vari ambienti (ad esempio produzione e gestione temporanea).

Cloud Run for Anthos supporta specificamente la multitenancy aziendale. Questo tipo di multitenancy consente a un progetto Cloud del cluster, di consentire l'accesso a risorse specifiche del cluster Google Kubernetes Engine. Il progetto Cloud a cui è stato concesso l'accesso al progetto Cloud del cluster è il progetto Cloud tenant. I tenant del progetto cloud del cluster possono utilizzare Cloud Run for Anthos per accedere, operare e detenere la proprietà di quei servizi e risorse per cui sono autorizzati ad accedere.

Concettualmente, sono necessari quattro passaggi per configurare la multitenancy aziendale con Cloud Run for Anthos:

  1. Configurare l'accesso tenant al progetto cloud del cluster utilizzando un gruppo Google e Identity and Access Management.
  2. Mappa ciascun progetto Cloud tenant al progetto Cloud del cluster.
  3. Instrada i dati di log del progetto Cloud del cluster ai progetti Cloud del tenant utilizzando i bucket di log e i sink.
  4. Definisci le autorizzazioni del cluster per i tenant che utilizzano il controllo dell'accesso basato sui ruoli in GKE.

Prima di iniziare

L'operatore della piattaforma responsabile della configurazione della multitenancy deve comprendere e soddisfare i seguenti requisiti:

Definisci le variabili di ambiente locali

Per semplificare i comandi utilizzati in questo processo, definisci le variabili di ambiente locali per il progetto cloud del cluster e il progetto cloud tenant:

  1. Sostituisci YOUR_CLUSTER_PROJECT_ID con l'ID del progetto cloud del cluster, quindi esegui il comando seguente:

    export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
    
  2. Sostituisci YOUR_TENANT_PROJECT_ID con l'ID del progetto cloud tenant, quindi esegui il comando seguente:

    export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
    
  3. Verifica le variabili di ambiente locali eseguendo questi comandi:

    echo "cluster Cloud project is:" $CLUSTER_PROJECT_ID
    echo "tenant Cloud project is:" $TENANT_PROJECT_ID
    

L'ID progetto cloud del tuo cluster e l'ID progetto cloud del tenant vengono ora utilizzati in tutti i comandi seguenti in cui sono specificati $CLUSTER_PROJECT_ID e $TENANT_PROJECT_ID.

Verifica delle autorizzazioni IAM

Esegui i comandi testIamPermissions seguenti per verificare di avere le autorizzazioni IAM richieste per accedere alle risorse sul progetto Cloud del cluster e a quelli del tenant Cloud.

Esegui questo comando per convalidare le autorizzazioni nel progetto 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 Cloud del cluster:

{
  "permissions": [
    "logging.sinks.create",
    "logging.sinks.get",
    "resourcemanager.projects.setIamPolicy"
  ]
}

Esegui questo comando per convalidare le autorizzazioni per ciascun progetto 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 cloud tenant:

{
  "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 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 saranno in grado di eseguire alcuna operazione nel cluster finché il controllo dell'accesso basato sui ruoli di Kubernetes non verrà configurato in un passaggio successivo.

Devi creare un gruppo Google che contenga tutti gli utenti del tuo progetto tenant Cloud. Per ulteriori informazioni 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 comandi seguenti per consentire ai tenant di ottenere le credenziali nel cluster. Questo non consente ai tenant di leggere o gestire le risorse sul cluster GKE.

Riferimenti IAM

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 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 Cloud tenant sul progetto Cloud del cluster

Puoi utilizzare i valori dell'impostazione delle risorse per mappare i progetti Cloud tenant a un progetto Cloud del cluster.

L'impostazione della risorsa può essere configurata per ogni singolo progetto Cloud tenant oppure può essere impostata a qualsiasi livello della gerarchia di cartelle. È più facile impostarlo a livello di singola cartella tenant, ma è più flessibile da impostare a livello di progetto tenant. Dopo la configurazione, ogni volta che i tenant esplorano l'interfaccia utente di Cloud Run for Anthos, vedranno i propri servizi nel progetto Cloud del cluster. Non modifica le autorizzazioni IAM sul progetto Cloud del cluster o sui cluster GKE, si tratta solo di una mappatura da un progetto tenant (o una cartella) a un progetto cloud del cluster.

  1. Abilitare l'API resourcesettings nel progetto Cloud tenant.

    gcloud services enable resourcesettings.googleapis.com \
      --project=$TENANT_PROJECT_ID
    
  2. Aggiungi i privilegi amministrativi 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 e YOUR_ADMIN_MEMBER_ID con il tuo ID utente, ad esempio user:my-email@my-domain.com.

  3. Scegli uno dei seguenti metodi per definire la mappatura.

    Puoi impostare il valore dell'impostazione della risorsa su una cartella Google Cloud padre, se tutti i progetti Cloud secondari e le cartelle Google Cloud utilizzano lo stesso valore.

Progetti inquilini

Imposta il valore dell'impostazione delle risorse per ciascun progetto cloud tenant:

  1. Ottieni name del progetto cloud tenant e impostalo su una variabile di ambiente locale:
    export TENANT_PROJECT_NUMBER=$(gcloud alpha projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
  2. Crea un file del valore dell'impostazione della risorsa per definire la mappatura dal progetto cloud tenant al progetto Cloud del cluster. In questo file è possibile definire più ID progetto Cloud del cluster e aggiungere a un singolo progetto Cloud tenant.
    cat > value-file.json << EOF
    {
    "name": "projects/$TENANT_PROJECT_NUMBER/settings/cloudrun-multiTenancy/value",
    "value": {
      "stringSetValue": {
        "values": [ "projects/$CLUSTER_PROJECT_ID" ]
      }
    }
    }
    EOF
    
  3. Esegui il deployment delle impostazioni delle risorse nel progetto cloud tenant:
    gcloud alpha 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 principale per impostare tale valore su tutti i progetti e le cartelle Cloud tenant figlio:

  1. Ottieni il number della cartella tenant e impostalo su una variabile di ambiente locale:
    export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
    
  2. Crea un file del valore dell'impostazione della risorsa per definire la mappatura dalla cartella tenant al progetto cloud del cluster. In questo file è possibile definire più ID progetto Cloud del cluster e aggiungerli a una cartella tenant.
    cat > value-file.json << EOF
    {
    "name": "folders/$TENANT_FOLDER_NUMBER/settings/cloudrun-multiTenancy/value",
    "value": {
      "stringSetValue": {
        "values": [ "projects/$CLUSTER_PROJECT_ID" ]
      }
    }
    }
    EOF
    
  3. Esegui il deployment delle impostazioni della risorsa nella cartella tenant:
    gcloud alpha resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER

Configurazione dei bucket e dei sink dei log per il routing dei dati di log

Per ogni tenant, creerai un bucket di log, un sink e le autorizzazioni per instradare i dati di log del progetto cloud del cluster al progetto Cloud del tenant. Nei passaggi seguenti, tutti i log dello spazio dei nomi nel progetto Cloud del cluster vengono instradati al bucket. Vedi l'insieme che segue 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 accede il tuo tenant.
  • Il nome del sink. Per semplificare questo passaggio, il nome è una combinazione delle variabili di ambiente locale del progetto Cloud del cluster e del progetto tenant Cloud 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 cloud del cluster e non può essere modificato o modificato.

gcloud alpha 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 Cloud del cluster al bucket di progetto Cloud tenant. Tieni presente che puoi restringere l'ambito dei log, ad esempio per condividere solo il cluster GKE singolo o risorse Cloud Run for Anthos specifiche definendo ulteriori valori log-filter.

gcloud alpha 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 alpha 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 di tenant con il 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 Cloud del cluster GKE. Per consentire ai tenant l'accesso alle risorse all'interno del cluster GKE, devi definire le autorizzazioni con Kubernetes RBAC.

Creazione ruoli cluster

Dopo aver definito e creato i seguenti ruoli cluster, puoi continuare a utilizzarli in futuro per aggiungere tutti i tenant successivi del progetto Cloud del cluster.

Ruoli UI

Questo ruolo consente ai tenant di eseguire query su tutti gli spazi dei nomi. Questa informazione è necessaria per trovare gli spazi dei nomi a cui gli utenti hanno accesso per creare servizi /sdk/gcloud/reference/alpha/logging/sinks/create.

kubectl create clusterrole \
   namespace-lister \
   --verb=list \
   --resource=namespaces

Questo ruolo consente ai tenant di visualizzare i servizi Cloud Run for Anthos. Questo elenco è obbligatorio per elencare i servizi nell'interfaccia utente di Cloud Run for Anthos.

kubectl create clusterrole \
   ksvc-lister \
   --verb=list \
   --resource=services.serving.knative.dev

Creazione 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 creazione dei servizi Cloud Run for Anthos.

kubectl create clusterrole \
   kubernetes-developer \
   --verb="*" \
   --resource="*.*"

Se l'autorizzazione kubernetes-developer è troppo permissiva, quanto segue consente ai tenant di creare servizi Knative sui propri spazi dei nomi e 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

Creare lo spazio dei nomi Tenant e assegnare le autorizzazioni.

Supponiamo che tu abbia configurato Google Gruppi per GKE. Questa operazione è necessaria per ciascun tenant.

export TENANT_GROUP=tenant-a@company.com

TENANT_GROUP deve far parte di SAFE_GROUP

Possibilità di visualizzare tutti gli spazi dei nomi

Per eseguire query sul cluster GKE, tutti i tenant hanno la possibilità di elencare gli spazi dei nomi. Al momento non esiste un elemento 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 su ciascuno di essi singolarmente.

kubectl create clusterrolebinding \
   all-namespace-listers \
   --clusterrole=namespace-lister \
   --group=$TENANT_GROUP

Possibilità di elencare i servizi Cloud Run for Anthos

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 sviluppatore di Kubernetes:

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

Aggiunta 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=gke-system \
   --clusterrole=ingress-reader \
   --group=$TENANT_GROUP

Verifica

Puoi verificare la corretta configurazione della multitenancy aziendale aprendo il progetto tenant Cloud in Cloud Run for Anthos ed eseguendo il deployment di un servizio in un cluster del progetto Cloud del cluster.

Vai a Cloud Run for Anthos

Congratulazioni, il tuo 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 multitenancy