Multi-tenancy lintas project untuk layanan Knative

Panduan ini memandu Anda mengonfigurasi layanan Knative untuk mengizinkan satu atau beberapa project menjalankan dan mengelola workload yang berjalan di cluster GKE dalam project yang berbeda. Google Cloud Google Cloud

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

Inferensi Knative secara khusus mendukung multi-tenancy tingkat perusahaan. Multi-tenancy jenis ini memungkinkan project Google Cloud cluster, untuk mengizinkan akses ke resource tertentu dari cluster GKE-nya. Google Cloud Project yang diberi akses ke cluster Google Cloud project adalah project tenant Google Cloud . Tenant project cluster dapat menggunakan layanan Knative untuk mengakses, mengoperasikan, dan memiliki layanan dan resource yang aksesnya diberikan kepada mereka. Google Cloud

Secara konseptual, ada empat langkah untuk mengonfigurasi multi-tenancy perusahaan dengan Knative serving:

  1. Konfigurasi akses tenant ke project cluster menggunakan Google Grup dan Identity and Access Management. Google Cloud
  2. Petakan setiap project Google Cloud tenant ke project Google Cloud cluster.
  3. Routing data log project cluster Google Cloud ke project tenant Google Cloud menggunakan bucket dan sink log.
  4. Tentukan izin cluster untuk tenant menggunakan role-based access control.

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 cluster Google Cloud , 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
    

Project ID cluster Google Cloud dan project ID tenant Google Cloud Anda kini digunakan di semua perintah berikutnya 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 cluster serta project tenant. Google Cloud Google Cloud

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 di 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 Grup Google dan Identity and Access Management untuk mengonfigurasi akses tenant

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

Anda harus membuat Grup Google yang berisi semua pengguna project tenant Anda. Google Cloud Untuk mengetahui informasi selengkapnya 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

Kubernetes Cluster Viewer

Jalankan perintah berikut untuk mengizinkan tenant mendapatkan kredensial ke cluster, hal ini tidak mengizinkan 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 kondisi 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"

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 tenant Google Cloud , atau dapat ditetapkan di tingkat hierarki folder mana pun. Lebih mudah untuk menetapkannya di tingkat folder tenant tunggal, tetapi lebih fleksibel untuk ditetapkan di tingkat setiap project tenant. Setelah penyiapan ini selesai, setiap kali tenant menjelajahi UI penayangan Knative, mereka juga akan melihat layanan mereka di project Google Cloud cluster. Hal ini tidak mengubah izin IAM di project Google Cloud cluster atau cluster GKE, tetapi hanya pemetaan dari project (atau folder) tenant ke project cluster 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 tenant Google Cloud dan tetapkan ke variabel lingkungan lokal:
    export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
  2. Buat file nilai setelan resource untuk menentukan pemetaan dari project Google Cloud tenant ke project Google Cloud cluster. Beberapa ID project cluster dapat ditentukan dalam file ini dan ditambahkan ke project tenant tunggal. Google Cloud Google Cloud
    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

Tetapkan nilai setelan resource untuk folder tenant induk guna menetapkan nilai tersebut ke semua project dan folder tenant Google Cloud turunan:

  1. Dapatkan number folder tenant dan tetapkan ke variabel lingkungan lokal:
    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 cluster Google Cloud dapat ditentukan dalam file ini dan ditambahkan ke satu folder tenant.
    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 data log project cluster Google Cloud ke project tenant Google Cloud . Pada langkah-langkah berikut, semua log dari namespace di project cluster Google Cloud akan dirutekan ke bucket. Lihat set di bawah untuk mengetahui detail tentang cara membatasi log yang dibagikan.

Buat variabel lingkungan lokal berikut:

  • Tentukan namespace cluster GKE yang diakses tenant Anda.
  • Nama sink. Untuk menyederhanakan langkah ini, nama tersebut adalah kombinasi dari variabel lingkungan lokal cluster Google Cloud project dan tenant Google Cloud project yang Anda buat sebelumnya. 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. Perhatikan bahwa nama bucket log harus berupa ID project cluster Google Cloud 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 project cluster Google Cloud , ke bucket project tenant Google Cloud . Perhatikan bahwa Anda dapat mempersempit cakupan log, misalnya untuk membagikan hanya cluster GKE individual atau resource layanan Knative tertentu dengan menentukan nilai log-filter tambahan.

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 kontrol akses berbasis peran (RBAC)

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

Membuat Peran Cluster

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

Peran UI

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

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

Dengan peran ini, tenant dapat melihat layanan penayangan Knative. Hal 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 izin ini yang diperlukan. Izin pertama memungkinkan tenant memanipulasi resource apa pun di namespace-nya. Izin kedua memungkinkan serangkaian yang lebih terbatas hanya untuk membuat layanan Knative.

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

Jika izin kubernetes-developer terlalu permisif, kode berikut memungkinkan tenant membuat layanan Knative di namespace mereka dan melihat resource 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

Buat namespace Tenant dan tetapkan izin.

Perhatikan bahwa hal ini mengasumsikan Anda telah melakukan penyiapan menggunakan Google Grup untuk GKE. Tindakan ini perlu dilakukan untuk setiap tenant.

export TENANT_GROUP=tenant-a@company.com

TENANT_GROUP harus menjadi bagian dari SECURITY_GROUP

Kemampuan untuk melihat semua namespace

Untuk membuat kueri cluster GKE, semua tenant harus memiliki kemampuan untuk mencantumkan namespace. Saat ini tidak ada auth can-i yang menampilkan namespace yang memungkinkan untuk melakukan tindakan. Satu-satunya solusi adalah mencantumkan namespace, lalu membuat kueri setiap namespace satu per satu.

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

Kemampuan untuk mencantumkan layanan inferensi Knative

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

Kemampuan untuk memanipulasi resource di namespace

Pertama, 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

Menambahkan 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 tenant di layanan Knative dan men-deploy layanan ke cluster GKE. Google Cloud

Buka inferensi Knative

Selamat, tenant Anda kini dapat berinteraksi dengan layanan dan resource dalam namespace cluster GKE yang telah diberi akses.

Referensi multi-tenancy