Panduan ini akan menuntun Anda dalam mengonfigurasi penayangan Knative agar satu atau beberapa project Google Cloud dapat menjalankan dan mengelola beban kerja yang berjalan di cluster GKE dalam project Google Cloud yang berbeda.
Model operasi yang umum dengan inferensi Knative adalah agar tim developer aplikasi menggunakan project Google Cloud mereka untuk men-deploy dan mengelola layanan yang berjalan di cluster GKE yang berbeda di seluruh project Google Cloud milik tim lain. Kemampuan ini, yang disebut multi-tenancy, memungkinkan Anda, sebagai operator platform, untuk menyesuaikan akses tim pengembangan hanya ke layanan mereka yang berjalan di berbagai lingkungan organisasi Anda (misalnya, produksi vs. staging).
Penyajian Knative secara khusus mendukung multi-tenancy perusahaan. Jenis multi-tenancy ini memungkinkan project Google Cloud cluster, untuk mengizinkan akses ke resource tertentu di cluster GKE mereka. Project Google Cloud yang diberi akses ke project Google Cloud cluster adalah project Google Cloud tenant. Tenant project Google Cloud cluster dapat menggunakan inferensi Knative untuk mengakses, mengoperasikan, dan memiliki layanan dan resource yang aksesnya diberikan kepada mereka.
Secara konseptual, ada empat langkah untuk mengonfigurasi multi-tenancy perusahaan dengan inferensi Knative:
- Konfigurasikan akses tenant ke project Google Cloud cluster menggunakan Google Grup serta Identity and Access Management.
- Petakan setiap project Google Cloud tenant ke project Google Cloud cluster.
- Rutekan data log project Google Cloud cluster ke project Google Cloud tenant menggunakan bucket dan sink log.
- Menentukan 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:
Seperti yang dijelaskan dalam dokumentasi GKE, Anda harus memahami konsep multi-tenancy berikut:
Dokumen ini mengasumsikan bahwa project Google Cloud yang ingin Anda aktifkan multi-tenancy sudah ada.
Anda harus memiliki akses ke layanan dan resource project Google Cloud berikut:
Izin Identity and Access Management dalam project Google Cloud tenant:
- roles/logging.configWriter
- Admin penyewa grup Google
Izin Identity and Access Management dalam project Google Cloud cluster:
Anda harus memiliki atau menginstal [Google Cloud CLI]](/sdk/docs/install) versi terbaru).
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:
Ganti
YOUR_CLUSTER_PROJECT_ID
dengan ID cluster project Google Cloud, lalu jalankan perintah berikut:export CLUSTER_PROJECT_ID=YOUR_CLUSTER_PROJECT_ID
Ganti
YOUR_TENANT_PROJECT_ID
dengan ID project Google Cloud tenant, lalu jalankan perintah berikut:export TENANT_PROJECT_ID=$YOUR_TENANT_PROJECT_ID
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 Google Cloud cluster dan ID project Google Cloud tenant Anda sekarang digunakan di semua perintah berikut tempat $CLUSTER_PROJECT_ID
dan $TENANT_PROJECT_ID
ditentukan.
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 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",
]
}
Gunakan Google Grup serta Identity and Access Management untuk mengonfigurasi akses tenant
Gunakan Google Grup untuk mengizinkan tenant mengakses cluster GKE. Izin IAM memberikan izin kepada tenant 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 Google Grup yang berisi semua pengguna project Google Cloud tenant Anda. Untuk mengetahui informasi selengkapnya tentang cara menggunakan grup keamanan, lihat Menggunakan Google Grup untuk GKE.
Buat variabel lingkungan lokal berikut untuk Google Grup Anda:
export SECURITY_GROUP=gke-security-groups@company.com
Penampil Cluster Kubernetes
Jalankan perintah berikut untuk mengizinkan tenant mendapatkan kredensial ke cluster. Perintah ini tidak memungkinkan tenant untuk membaca atau memanipulasi resource apa pun di cluster GKE.
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"
Monitoring Viewer
Jalankan perintah berikut untuk mengizinkan tenant membaca metrik 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 dapat 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 individual, atau dapat ditetapkan pada level hierarki folder apa pun. Akan lebih mudah untuk menetapkannya pada tingkat folder tenant tunggal, tetapi lebih fleksibel untuk ditetapkan pada setiap level project tenant. Setelah ini disiapkan, setiap kali tenant menjelajahi UI penayangan Knative, mereka juga akan melihat layanannya di project Google Cloud cluster. Hal ini tidak mengubah izin IAM pada project Google Cloud cluster atau cluster GKE. Hal ini hanya merupakan pemetaan dari project tenant (atau folder) ke project Google Cloud cluster.
Aktifkan
resourcesettings
API di project Google Cloud tenant.gcloud services enable resourcesettings.googleapis.com \ --project=$TENANT_PROJECT_ID
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 danYOUR_ADMIN_MEMBER_ID
dengan ID pengguna Anda, misalnyauser:my-email@my-domain.com
.Pilih salah satu metode berikut untuk menetapkan 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 penyewa
Tetapkan nilai setelan resource untuk setiap project Google Cloud tenant:
- Dapatkan
name
project Google Cloud tenant dan tetapkan ke variabel lingkungan lokal:export TENANT_PROJECT_NUMBER=$(gcloud projects describe $TENANT_PROJECT_ID --format="value(projectNumber)")
- Buat file nilai setelan resource untuk menentukan pemetaan dari
project Google Cloud tenant ke project Google Cloud cluster. Beberapa ID project Google Cloud cluster dapat ditentukan dalam file ini dan ditambahkan ke satu project 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
- 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 penyewa
Tetapkan nilai setelan resource untuk folder tenant induk guna menetapkan nilai tersebut ke semua project dan folder Google Cloud tenant turunan:
- Dapatkan
number
dari folder tenant dan tetapkan ke variabel lingkungan lokal:export TENANT_FOLDER_NUMBER=$TENANT_FOLDER_NUMBER
- Buat file nilai setelan resource untuk menentukan pemetaan dari folder tenant ke project Google Cloud cluster. Beberapa ID project Google Cloud cluster 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
- Deploy setelan resource ke folder tenant:
gcloud resource-settings set-value cloudrun-multiTenancy --value-file value-file.json --folder $TENANT_FOLDER_NUMBER
Menyiapkan bucket log dan sink untuk merutekan data log
Untuk setiap tenant, Anda membuat bucket log, sink, dan izin untuk merutekan data log project Google Cloud cluster ke project Google Cloud tenant. Pada langkah-langkah berikut, semua log dari namespace di project Google Cloud cluster akan dirutekan ke bucket. Lihat set di bawah ini 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 project Google Cloud cluster dan variabel lingkungan lokal project Google Cloud tenant 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 merupakan ID project Google Cloud cluster dan tidak dapat diubah atau diubah.
gcloud logging buckets \
create $CLUSTER_PROJECT_ID \
--location=global \
--project=$TENANT_PROJECT_ID
Jalankan perintah berikut untuk membuat sink dari namespace yang ditentukan dalam project Google Cloud cluster, ke bucket project Google Cloud tenant. Perlu diperhatikan bahwa Anda dapat mempersempit cakupan log, misalnya untuk hanya membagikan cluster GKE individual atau resource penayangan 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 role-based access control (RBAC)
Sebelumnya Anda menggunakan Google Grup dan IAM untuk mengonfigurasi izin agar tenant dapat mengakses project Google Cloud di cluster GKE. Untuk mengizinkan tenant mengakses resource dalam cluster GKE, Anda harus menentukan izin dengan Kubernetes RBAC.
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 untuk mengkueri semua namespace. Hal ini diperlukan untuk
menemukan namespace mana yang dapat diakses pengguna untuk membuat
layanan /sdk/gcloud/reference/logging/sinks/create
.
kubectl create clusterrole \
namespace-lister \
--verb=list \
--resource=namespaces
Peran ini memungkinkan tenant untuk 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 dari izin ini yang diperlukan. Izin pertama memungkinkan tenant untuk memanipulasi resource apa pun dalam namespace mereka. Izin kedua memungkinkan serangkaian pembuatan layanan penyajian Knative yang lebih terbatas.
kubectl create clusterrole \
kubernetes-developer \
--verb="*" \
--resource="*.*"
Jika izin kubernetes-developer
terlalu permisif, hal berikut akan memungkinkan tenant untuk membuat layanan Knative pada namespace-nya 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
Membuat namespace Tenant dan menetapkan izin.
Perhatikan bahwa hal ini mengasumsikan bahwa Anda telah melakukan penyiapan menggunakan Google Grup untuk GKE. Hal ini perlu dilakukan untuk setiap tenant.
export TENANT_GROUP=tenant-a@company.com
TENANT_GROUP harus merupakan bagian dari security_GROUP
Kemampuan untuk melihat semua namespace
Untuk membuat kueri cluster GKE, semua tenant sebagian besar memiliki kemampuan untuk mencantumkan namespace. Saat ini, tidak ada auth can-i yang menampilkan namespace yang memungkinkan 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 penayangan Knative
kubectl create clusterrolebinding \
all-ksvc-listers \
--clusterrole=ksvc-lister \
--group=$TENANT_GROUP
Kemampuan untuk memanipulasi resource pada 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
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 multi-tenancy perusahaan telah berhasil dikonfigurasi dengan membuka project Google Cloud tenant di Knative yang menayangkan dan men-deploy layanan ke cluster GKE.
Selamat, tenant Anda kini dapat berinteraksi dengan layanan dan resource dalam namespace cluster GKE yang aksesnya telah diberikan.