Multi-tenancy lintas project untuk penayangan Knative

Panduan ini memandu Anda dalam mengonfigurasi penyajian Knative untuk memungkinkan satu atau beberapa project Google Cloud untuk menjalankan dan mengelola beban kerja yang sedang berjalan di cluster GKE dalam project Google Cloud yang berbeda.

Model operasi yang umum dengan inferensi Knative adalah untuk developer untuk menggunakan project Google Cloud mereka untuk men-deploy dan mengelola layanan yang berjalan di cluster GKE yang berlainan di antara tim lain project Google Cloud. Kemampuan ini, yang disebut multi-tenancy, memungkinkan Anda, sebagai operator platform, menyesuaikan akses tim pengembangan Anda hanya ke layanan mereka yang berjalan di organisasi Anda berbagai lingkungan (misalnya, production vs. staging).

Penyajian Knative secara khusus mendukung perusahaan multi-tenancy. Jenis multi-tenancy ini memungkinkan project Google Cloud cluster untuk mengizinkan akses ke resource dari cluster GKE mereka. Project Google Cloud yang yang diberi akses ke cluster project Google Cloud adalah project Google Cloud tenant. Tenant dari project Google Cloud cluster dapat menggunakan inferensi Knative untuk mengakses, mengoperasikan, dan memiliki layanan dan sumber daya yang dapat mereka akses.

Secara konseptual, ada empat langkah untuk mengkonfigurasi multi-tenancy perusahaan dengan Penyajian Knative:

  1. Mengonfigurasi akses tenant ke project Google Cloud cluster menggunakan Google Grup dan Identity and Access Management.
  2. Petakan setiap project Google Cloud tenant ke project Google Cloud cluster.
  3. Rutekan data log project Google Cloud cluster ke project Google Cloud tenant menggunakan bucket log dan default.
  4. Tentukan izin cluster untuk tenant menggunakan kontrol akses berbasis peran.

Sebelum memulai

Operator platform yang bertanggung jawab untuk mengonfigurasi multi-tenancy harus memahami dan memenuhi persyaratan berikut:

Menentukan variabel lingkungan lokal

Untuk menyederhanakan perintah yang digunakan dalam proses ini, tentukan variabel lingkungan lokal untuk project Google Cloud cluster dan project Google Cloud tenant:

  1. Ganti YOUR_CLUSTER_PROJECT_ID dengan ID project Google Cloud cluster, lalu jalankan perintah berikut:

    export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
    
  2. Ganti YOUR_TENANT_PROJECT_ID dengan ID project Google Cloud tenant, lalu jalankan perintah berikut:

    export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
    
  3. Verifikasi variabel lingkungan lokal Anda dengan menjalankan perintah berikut:

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

ID project Google Cloud cluster Anda dan ID project Google Cloud tenant Anda kini digunakan di semua perintah yang menentukan $CLUSTER_PROJECT_ID dan $TENANT_PROJECT_ID.

Memverifikasi izin IAM Anda

Jalankan perintah testIamPermissions berikut untuk memvalidasi bahwa Anda memiliki izin IAM yang diperlukan untuk mengakses resource di project Google Cloud cluster serta project Google Cloud tenant.

Jalankan perintah berikut untuk memvalidasi izin Anda di project Google Cloud 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

Hasil yang diharapkan untuk project Google Cloud cluster:

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

Jalankan perintah berikut untuk memvalidasi izin Anda pada setiap project 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

Hasil yang diharapkan untuk setiap project Google Cloud tenant:

{
  "permissions": [
    "logging.buckets.create",
    "logging.buckets.get",
    "resourcemanager.projects.setIamPolicy",
    "resourcesettings.settingvalues.create",
    "serviceusage.services.enable",
  ]
}

Menggunakan Google Grup serta Identity and Access Management untuk mengonfigurasi akses tenant

Gunakan Google Grup untuk mengizinkan tenant mengakses cluster GKE. Izin IAM memberi tenant izin untuk mendapatkan kredensial, tetapi mereka tidak akan dapat melakukan apa pun di cluster hingga Kontrol akses berbasis peran Kubernetes dikonfigurasi di langkah berikutnya.

Anda harus membuat grup Google yang berisi semua pengguna project Google Cloud tenant Anda. Untuk informasi lebih lanjut tentang cara menggunakan grup keamanan, lihat Menggunakan Google Grup untuk GKE.

Buat variabel lingkungan lokal berikut untuk grup Google Anda:

export SECURITY_GROUP=gke-security-groups@company.com

Penampil Cluster Kubernetes

Jalankan perintah berikut untuk mengizinkan tenant mendapatkan kredensial ke cluster, tidak memungkinkan tenant membaca atau memanipulasi resource apa pun di cluster GKE.

Referensi IAM

gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
   --member=group:$SECURITY_GROUP \
   --role='roles/container.clusterViewer' \
   --condition=None

Untuk membatasi akses ke cluster tertentu, Anda dapat menggunakan IAM kondisi.

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"

Penampil Pemantauan

Jalankan perintah berikut untuk mengizinkan tenant membaca metrik pemantauan.

Referensi Peran Pemantauan

gcloud projects add-iam-policy-binding $CLUSTER_PROJECT_ID \
   --member=group:$SECURITY_GROUP \
   --role='roles/monitoring.viewer' \
   --condition=None

Memetakan setiap project Google Cloud tenant ke project Google Cloud cluster

Anda menggunakan nilai setelan resource untuk memetakan project Google Cloud tenant ke project Google Cloud cluster.

Setelan resource dapat dikonfigurasi untuk setiap project Google Cloud tenant individu, atau dapat diatur di tingkat hierarki folder mana pun. Lebih mudah mengaturnya di level folder tenant tunggal, tetapi lebih fleksibel untuk ditetapkan di setiap project tenant level organisasi. Setelah pengaturan ini, setiap kali penyewa menjelajahi UI inferensi Knative, mereka juga akan melihat project Google Cloud. Izin ini tidak mengubah izin IAM pada project Google Cloud cluster atau GKE, hanya pemetaan dari project (atau folder) tenant ke project Google Cloud.

  1. Aktifkan resourcesettings API di project Google Cloud tenant.

    gcloud services enable resourcesettings.googleapis.com \
      --project=$TENANT_PROJECT_ID
    
  2. Tambahkan hak istimewa Admin Organisasi (roles/resourcesettings.admin) ke ID pengguna Anda dengan menjalankan perintah berikut:

    gcloud organizations add-iam-policy-binding YOUR_ORGANIZATION_ID \
      --member=YOUR_ADMIN_MEMBER_ID \
      --role='roles/resourcesettings.admin'
    

    Ganti YOUR_ORGANIZATION_ID dengan ID organisasi Anda dan YOUR_ADMIN_MEMBER_ID dengan ID pengguna Anda, misalnya user:my-email@my-domain.com.

  3. Pilih salah satu metode berikut untuk menentukan pemetaan.

    Anda dapat menetapkan nilai setelan resource di folder Google Cloud induk, jika semua project Google Cloud turunan dan folder Google Cloud menggunakan nilai yang sama.

Project tenant

Tetapkan nilai setelan resource untuk setiap project Google Cloud tenant:

  1. Dapatkan name project Google Cloud tenant dan tetapkan ke lingkungan lokal variabel:
    export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
  2. Buat file nilai setelan resource untuk menentukan pemetaan dari tenant project Google Cloud ke project Google Cloud cluster. Beberapa ID project Google Cloud cluster dapat yang ditentukan dalam file ini dan ditambahkan ke project Google Cloud tenant tunggal.
    cat > value-file.json << EOF
    {
    "name": "projects/$TENANT_PROJECT_NUMBER/settings/cloudrun-multiTenancy/value",
    "value": {
      "stringSetValue": {
        "values": [ "projects/$CLUSTER_PROJECT_ID" ]
      }
    }
    }
    EOF
  3. Deploy setelan resource ke project Google Cloud tenant:
    gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --project $TENANT_PROJECT_ID

Folder tenant

Setel nilai setelan resource untuk folder tenant induk untuk menyetelnya ke semua project dan folder Google Cloud tenant turunan:

  1. Dapatkan number dari folder tenant dan tetapkan ke folder lokal variabel lingkungan (lingkungan):
    export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
  2. Buat file nilai setelan resource untuk menentukan pemetaan dari folder tenant ke project Google Cloud cluster. Beberapa ID project Google Cloud cluster dapat yang ditentukan dalam file ini dan ditambahkan ke folder tenant tunggal.
    cat > value-file.json << EOF
    {
    "name": "folders/$TENANT_FOLDER_NUMBER/settings/cloudrun-multiTenancy/value",
    "value": {
      "stringSetValue": {
        "values": [ "projects/$CLUSTER_PROJECT_ID" ]
      }
    }
    }
    EOF
  3. Deploy setelan resource ke folder tenant:
    gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER

Menyiapkan bucket dan sink log untuk merutekan data log

Untuk setiap tenant, Anda membuat bucket log, sink, dan izin untuk merutekan mengelompokkan data log project Google Cloud ke project Google Cloud tenant. Pada langkah-langkah berikut, semua log dari namespace dalam cluster project Google Cloud akan dirutekan ke bucket. Lihat kumpulan di bawah ini untuk detail tentang cara membatasi log mana yang dibagikan.

Buat variabel lingkungan lokal berikut:

  • Tentukan namespace cluster GKE yang tenant Anda akses.
  • Nama sink. Untuk menyederhanakan langkah ini, nama adalah kombinasi dari project Google Cloud cluster dan variabel lingkungan lokal project Google Cloud tenant yang sebelumnya Anda dibuat. Anda dapat mengubah nilai ini.
export NAMESPACE=$NAMESPACE
export SINK_NAME=$CLUSTER_PROJECT_ID-$TENANT_PROJECT_ID

Jalankan perintah berikut untuk membuat bucket log di project tenant. Catatan bahwa nama bucket log harus merupakan ID project Google Cloud cluster dan tidak dapat diubah atau dimodifikasi.

gcloud logging buckets \
   create $CLUSTER_PROJECT_ID \
   --location=global \
   --project=$TENANT_PROJECT_ID

Jalankan perintah berikut untuk membuat sink dari namespace yang ditentukan di mengelompokkan project Google Cloud, ke bucket project Google Cloud tenant. Perhatikan bahwa Anda dapat mempersempit cakupan log, misalnya untuk membagikan hanya cluster GKE individu atau resource penyaluran Knative tertentu dengan menentukan Nilai 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

Jalankan perintah berikut untuk menambahkan izin dari akun layanan sink log ke bucket yang Anda buat.

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"

Menyiapkan izin tenant dengan role-based access control (RBAC)

Anda sebelumnya menggunakan Google Grup dan IAM untuk mengonfigurasi izin untuk mengizinkan tenant mengakses project Google Cloud milik cluster GKE. Untuk mengizinkan penyewa mengakses resource dalam GKE, Anda harus menentukan izin dengan Kubernetes RBAC.

Membuat Peran Cluster

Setelah menentukan dan membuat peran cluster berikut, Anda dapat terus menggunakan ini pada masa mendatang untuk menambahkan semua tenant berikutnya dari project Google Cloud cluster.

Peran UI

Peran ini memungkinkan tenant membuat kueri untuk semua namespace. Hal ini diperlukan untuk menemukan namespace mana yang dapat diakses pengguna untuk membuat /sdk/gcloud/reference/logging/sinks/create layanan.

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

Peran ini memungkinkan tenant untuk melihat layanan penayangan Knative. Ini diperlukan untuk mencantumkan layanan di UI penayangan Knative.

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

Membuat Peran Cluster

Hanya salah satu dari izin ini yang diperlukan. Izin pertama memungkinkan tenant untuk memanipulasi resource apa pun di namespace mereka. Izin kedua memungkinkan pembuatan penayangan Knative yang lebih terbatas layanan IT perusahaan mereka.

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

Jika izin kubernetes-developer terlalu permisif, hal berikut memungkinkan tenant membuat layanan Knative pada namespace mereka dan melihat sumber daya Knative lainnya.

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

Membuat namespace Tenant dan menetapkan izin.

Perhatikan bahwa dengan asumsi Anda telah menyiapkan menggunakan Google Grup untuk GKE. Tindakan ini perlu dilakukan untuk setiap penyewa.

export TENANT_GROUP=tenant-a@company.com

TENANT_GROUP harus menjadi bagian dari AMA_GROUP

Kemampuan untuk melihat semua namespace

Untuk membuat kueri cluster GKE, semua tenant memiliki kemampuan untuk membuat daftar namespace. Saat ini tidak ada auth can-i yang menampilkan namespace tempat tindakan dimungkinkan. Satu-satunya solusi adalah untuk membuat daftar namespace kemudian membuat kueri setiap namespace satu per satu.

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

Kemampuan untuk membuat daftar layanan penayangan Knative

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

Kemampuan untuk memanipulasi resource di namespace

Pertama-tama, buat namespace:

kubectl create namespace $NAMESPACE

Jika menggunakan peran kubernetes-developer:

kubectl create rolebinding \
   kubernetes-developer \
   --namespace=$NAMESPACE \
   --clusterrole=kubernetes-developer \
   --group=$TENANT_GROUP

Jika menggunakan peran knative-developer:

kubectl create rolebinding \
   kubernetes-developer \
   --namespace=$NAMESPACE \
   --clusterrole=knative-developer \
   --group=$TENANT_GROUP

Tambahkan kemampuan bagi tenant untuk mengakses alamat IP eksternal

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

Verifikasi

Anda dapat memverifikasi bahwa Anda telah berhasil mengonfigurasi multi-tenancy perusahaan dengan membuka project Google Cloud tenant di Knative dan men-deploy layanan ke cluster GKE.

Buka penayangan Knative

Selamat, penyewa Anda sekarang dapat berinteraksi dengan layanan dan resource dalam namespace cluster GKE yang telah diberikan akses.

Referensi multi-tenancy