Anda dapat menggunakan ComputeClasses Google Kubernetes Engine (GKE) untuk membuat node yang memenuhi berbagai persyaratan workload. Pod dapat menggunakan ComputeClass untuk membuat hardware. Bergantung pada ComputeClass, hardware tersebut mungkin banyak diminati, ketersediaannya terbatas, atau relatif mahal untuk perusahaan Anda. Tutorial ini menunjukkan cara menggunakan RBAC Kubernetes dan ValidatingAdmissionPolicies untuk membatasi pembuatan, penghapusan, modifikasi, dan pemilihan ComputeClass.
Pembatasan ini dapat membantu Anda mencegah situasi seperti berikut:
- Pod yang tidak memerlukan hardware khusus seperti GPU atau TPU akan memilih ComputeClass yang meminta hardware tersebut.
- Entitas yang tidak sah membuat atau mengubah ComputeClass untuk mendapatkan akses ke hardware yang dicadangkan untuk beban kerja penting.
Dokumen ini menggunakan contoh ValidatingAdmissionPolicy yang memblokir jenis penyalahgunaan umum, seperti toleransi ComputeClass karakter pengganti atau pemilihan ComputeClass tertentu yang tidak diizinkan. Anda dapat mengubah ValidatingAdmissionPolicy untuk memenuhi persyaratan khusus organisasi Anda, seperti memblokir workload dari tim tertentu agar tidak menggunakan ComputeClass.
Tujuan
- Gunakan ValidatingAdmissionPolicy untuk membatasi ComputeClass yang dapat dipilih Pod di setiap namespace ke daftar yang disetujui.
- Gunakan kontrol akses berbasis peran (RBAC) untuk membatasi siapa yang dapat membuat, mengubah, atau menghapus ComputeClass di cluster Anda.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Jika Anda menggunakan project yang sudah ada untuk panduan ini, pastikan Anda memiliki izin yang diperlukan untuk menyelesaikan panduan ini. Jika berhasil membuat project baru, berarti Anda sudah memiliki izin yang diperlukan.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan Kubernetes Engine API:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (
roles/serviceusage.serviceUsageAdmin), yang berisi izinserviceusage.services.enable. Pelajari cara memberikan peran.gcloud services enable container.googleapis.com
-
Instal Google Cloud CLI.
-
Jika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Jika Anda menggunakan project yang sudah ada untuk panduan ini, pastikan Anda memiliki izin yang diperlukan untuk menyelesaikan panduan ini. Jika berhasil membuat project baru, berarti Anda sudah memiliki izin yang diperlukan.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan Kubernetes Engine API:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (
roles/serviceusage.serviceUsageAdmin), yang berisi izinserviceusage.services.enable. Pelajari cara memberikan peran.gcloud services enable container.googleapis.com
- Jika Anda menggunakan shell lokal, instal komponen
kubectl:gcloud components install kubectl
- Pastikan Anda memiliki cluster GKE yang menggunakan versi 1.30 atau yang lebih baru. Anda juga dapat membuat cluster Autopilot untuk tutorial ini.
- Konfigurasi cluster Anda untuk Google Grup untuk RBAC:
- Siapkan grup
gke-security-groupsdi domain Anda. - Aktifkan Google Grup untuk RBAC di cluster Anda.
Untuk mengetahui informasi selengkapnya, lihat Menyiapkan Google Grup.
- Siapkan grup
Peran yang diperlukan
Untuk mendapatkan izin yang diperlukan guna membuat kebijakan RBAC dan objek Kubernetes di cluster Anda, minta administrator untuk memberi Anda peran IAM Kubernetes Engine Admin (role/container.admin) di project Anda.
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Menyiapkan lingkungan
Untuk menyiapkan cluster Anda untuk tugas pembuatan dan verifikasi dalam tutorial ini, ikuti langkah-langkah berikut:
Buat koneksi ke cluster Anda:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATIONGanti kode berikut:
CLUSTER_NAME: nama cluster Anda.CONTROL_PLANE_LOCATION: region atau zona bidang kontrol cluster, sepertius-central1atauus-central1-a.
Buat namespace yang akan digunakan untuk tutorial ini. Anda juga dapat menggunakan namespace yang sudah ada di cluster.
kubectl create namespace computeclass-vap-tutorialBuat kebijakan RBAC yang memberikan akses untuk mengelola ValidatingAdmissionPolicies dan ValidatingAdmissionPolicyBindings:
Simpan manifes berikut sebagai
validatingadmissionpolicy-editor.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: validatingadmissionpolicy-editor rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingadmissionpolicies","validatingadmissionpolicybindings"] verbs: ["get", "list", "create", "update", "patch", "delete"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: edit-validatingadmissionpolicies subjects: - kind: User name: USER_ACCOUNT apiGroup: rbac.authorization.k8s.io roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: validatingadmissionpolicy-editorGanti
USER_ACCOUNTdengan alamat email akun pengguna Anda.Buat kebijakan RBAC:
kubectl apply -f validatingadmissionpolicy-editor.yaml
Buat ComputeClass di cluster Anda. Jika cluster sudah memiliki ComputeClass, lewati langkah ini.
Simpan manifes berikut sebagai
access-computeclass.yaml:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: access-restriction-class spec: priorities: - machineFamily: e2 nodePoolAutoCreation: enabled: true whenUnsatisfiable: ScaleUpAnywayBuat ComputeClass:
kubectl apply -f access-computeclass.yaml
Membuat ValidatingAdmissionPolicy
Untuk membatasi ComputeClass yang dapat dipilih Pod, Anda membuat ValidatingAdmissionPolicy dan menerapkannya di namespace tertentu. Anda menggunakan spesifikasi ValidatingAdmissionPolicy untuk mengontrol cara Pod dapat memilih ComputeClass. Langkah-langkah berikut menunjukkan cara membuat dan menerapkan kebijakan ini:
Simpan manifes ValidatingAdmissionPolicy berikut sebagai
restrict-computeclass-usage-vap.yaml:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicy metadata: name: restrict-computeclass-usage spec: failurePolicy: Fail # If an internal error occurs, deny the request. variables: # Check whether the admission request is for a Deployment. - name: isDeployment expression: "object.kind == 'Deployment'" # Get the Pod specification from the admission request by reading the # spec.template.spec field for Deployments or the spec field for static Pods. - name: podSpec expression: "variables.isDeployment ? object.spec.template.spec : object.spec" # Check whether a node selector or an affinity rule that explicitly requests a # disallowed ComputeClass. - name: hasForbiddenNodeSelectorOrAffinity expression: >- (has(variables.podSpec.nodeSelector) && variables.podSpec.nodeSelector['cloud.google.com/compute-class'] == 'COMPUTECLASS_NAME') || (has(variables.podSpec.affinity) && has(variables.podSpec.affinity.nodeAffinity) && has(variables.podSpec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution) && variables.podSpec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.exists(term, has(term.matchExpressions) && term.matchExpressions.exists( exp, exp.key == 'cloud.google.com/compute-class' && exp.operator == 'In' && exp.values.exists(v, v == 'COMPUTECLASS_NAME') ) )) # Check whether the Pod has a toleration for the taint that corresponds to a # disallowed ComputeClass. - name: hasForbiddenComputeClassToleration expression: >- has(variables.podSpec.tolerations) && variables.podSpec.tolerations.exists(t, t.key == 'cloud.google.com/compute-class' && (t.operator == 'Exists' || (t.operator == 'Equal' && t.value == 'COMPUTECLASS_NAME')) && has(t.effect) && t.effect == 'NoSchedule') # Check whether the Pod has a toleration that could match any taint. - name: hasWildcardToleration expression: >- has(variables.podSpec.tolerations) && variables.podSpec.tolerations.exists(t, (t.operator == 'Exists' && !(has(t.key) && t.key != '')) ) # Trigger the ValidatingAdmissionPolicy when Pods or Deployments are created or # updated. matchConstraints: resourceRules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["pods"] - apiGroups: ["apps"] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["deployments"] # Validate whether any of the expressions in the variables section evaluate to # true. validations: - expression: >- !(variables.hasForbiddenNodeSelectorOrAffinity || variables.hasForbiddenComputeClassToleration || variables.hasWildcardToleration) message: >- Pods and Deployments in this namespace cannot request ComputeClass COMPUTECLASS_NAME or use wildcard tolerations.Ganti
COMPUTECLASS_NAMEdengan nama ComputeClass yang ingin Anda cegah agar tidak dipilih oleh Pod.ValidatingAdmissionPolicy ini memiliki properti berikut:
- Pemicu untuk Pod statis atau Pod dalam Deployment.
Menemukan Pod yang melakukan salah satu hal berikut:
- Gunakan pemilih node atau aturan afinitas node untuk memilih ComputeClass tertentu yang tidak diizinkan secara eksplisit.
- Gunakan toleransi yang sesuai dengan taint node untuk ComputeClass tertentu yang tidak diizinkan.
- Gunakan toleransi yang cocok dengan semua taint node dalam cluster.
ValidatingAdmissionPolicy ini adalah contoh. Anda dapat menggunakan ekspresi untuk memicu kebijakan berdasarkan kondisi Anda sendiri, seperti mencegah Pod yang memiliki label tertentu memilih ComputeClass tertentu.
Buat ValidatingAdmissionPolicy:
kubectl apply -f restrict-computeclass-usage-vap.yamlSimpan ValidatingAdmissionPolicyBinding berikut sebagai
restrict-computeclass-usage-binding.yaml:apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingAdmissionPolicyBinding metadata: name: restrict-computeclass-usage-binding spec: policyName: restrict-computeclass-usage validationActions: ["Deny","Audit"] matchResources: namespaceSelector: matchLabels: kubernetes.io/metadata.name: computeclass-vap-tutorial # Replace with the name of any namespace in the cluster.ValidatingAdmissionPolicyBinding ini menerapkan ValidatingAdmissionPolicy dari langkah sebelumnya di namespace
computeclass-vap-tutorial. Nilai di kolomvalidationActionsmenolak Pod atau Deployment yang melanggar ValidatingAdmissionPolicy dan menambahkan entri ke log audit Kubernetes.Buat ValidatingAdmissionPolicyBinding:
kubectl apply -f restrict-computeclass-usage-binding.yaml
Mengonfigurasi kebijakan RBAC
Selain menggunakan ValidatingAdmissionPolicy untuk mencegah workload menggunakan ComputeClass tertentu, gunakan RBAC untuk mencegah principal yang tidak sah membuat dan mengubah ComputeClass di cluster Anda. Langkah-langkah berikut menunjukkan cara memberikan akses ke ComputeClass untuk grup pengguna tertentu dengan menggunakan Google Grup untuk RBAC:
Buat grup untuk editor ComputeClass:
Di konsol Admin Google, buka halaman Grup.
Klik Buat grup.
Di halaman Detail grup, lakukan hal berikut:
- Di kolom Nama grup, tentukan
computeclass-editors. - Di kolom Email grup, tentukan
computeclass-editors. - Centang kotak Keamanan.
- Klik Berikutnya.
- Di kolom Nama grup, tentukan
Di halaman Jenis akses, di kolom Anggota grup, pastikan kotak centang Siapa yang dapat melihat anggota dicentang.
Klik Buat grup.
Di menu navigasi, klik Direktori > Grup.
Arahkan kursor ke baris gke-security-groups, lalu klik Tambahkan anggota.
Di dialog Add members to gke-security-groups, tentukan
computeclass-editorsdan pilih grup tersebut dari hasil.Klik Tambahkan ke grup.
Tambahkan alamat email pengguna yang diberi otorisasi ke grup
computeclass-editors.Simpan ClusterRole berikut sebagai
computeclass-editor-clusterrole.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: computeclass-editor rules: - apiGroups: ["cloud.google.com"] resources: ["computeclasses"] verbs: ["create","update"]Buat ClusterRole:
kubectl apply -f computeclass-editor-clusterrole.yamlSimpan ClusterRoleBinding berikut sebagai
computeclass-editor-role-binding.yaml:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: computeclass-editor-role-binding subjects: - kind: Group name: computeclass-editors@GROUP_DOMAIN apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: computeclass-editor apiGroup: rbac.authorization.k8s.io # Required for role referencesGanti
GROUP_DOMAINdengan nama domain grupcomputeclass-editors.Buat ClusterRoleBinding:
kubectl apply -f computeclass-editor-role-binding.yaml
Memverifikasi batasan Anda
Bagian berikut menunjukkan cara memverifikasi bahwa batasan yang Anda konfigurasi di bagian sebelumnya berfungsi seperti yang diharapkan. Jika Anda mengonfigurasi pembatasan sendiri di ValidatingAdmissionPolicies atau kebijakan RBAC, uji pembatasan dengan membuat workload yang melanggar kebijakan tersebut.
Memverifikasi ValidatingAdmissionPolicy
Simpan salah satu manifes berikut, yang masing-masing melanggar kondisi ValidatingAdmissionPolicy yang berbeda:
Deployment yang menggunakan pemilih node untuk memilih ComputeClass yang tidak diizinkan:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest # The node selector triggers the policy. nodeSelector: cloud.google.com/compute-class: COMPUTECLASS_NAMEDeployment yang memiliki toleransi untuk ComputeClass yang tidak diizinkan:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest tolerations: - key: cloud.google.com/compute-class operator: Equal value: COMPUTECLASS_NAME effect: NoScheduleDeployment yang memiliki aturan afinitas node untuk ComputeClass yang tidak diizinkan:
apiVersion: apps/v1 kind: Deployment metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: replicas: 1 selector: matchLabels: app: forbidden-selector-app template: metadata: labels: app: forbidden-selector-app spec: containers: - name: my-app-container image: nginx:latest affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: cloud.google.com/compute-class operator: In values: - COMPUTECLASS_NAMEPod yang memiliki toleransi untuk taint node apa pun dalam cluster:
apiVersion: v1 kind: Pod metadata: name: disallowed-computeclass-deployment-toleration namespace: computeclass-vap-tutorial spec: containers: - name: my-app-container image: nginx:latest tolerations: - operator: Exists effect: NoSchedule
Buat workload pengujian:
kubectl apply -f PATH_TO_WORKLOAD_MANIFESTOutputnya mirip dengan hal berikut ini:
Error from server (BadRequest): admission webhook "validation-policy.kubernetes.io" denied the request: Pods and Deployments in this namespace cannot request ComputeClass COMPUTECLASS_NAME or use wildcard tolerations.
Memverifikasi konfigurasi RBAC
Untuk memverifikasi konfigurasi RBAC, ikuti langkah-langkah berikut:
Lakukan autentikasi ke cluster menggunakan kredensial pengguna yang merupakan anggota grup
computeclass-editors.Periksa apakah pengguna dapat membuat ComputeClass:
kubectl auth can-i create computeclasses.cloud.google.com \ --as=MEMBER_USERGanti
MEMBER_USERdengan alamat email pengguna yang merupakan anggota grup.Outputnya adalah
yes.Lakukan autentikasi ke cluster menggunakan kredensial pengguna yang bukan anggota grup
computeclass-editors.Periksa apakah pengguna dapat membuat ComputeClass:
kubectl auth can-i create computeclasses.cloud.google.com \ --as=NON_MEMBER_USERGanti
NON_MEMBER_USERdengan alamat email pengguna yang bukan anggota grup.Outputnya adalah
no.
Jika output perintah kubectl auth can-i adalah yes untuk pengguna yang bukan anggota grup, verifikasi hal berikut:
- Grup
computeclass-editorsadalah anggota grupgke-security-groups. - Alamat email grup di ClusterRoleBinding Anda adalah alamat email grup yang sama persis, seperti
computeclass-editors@example.com.
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.
Jika Anda men-deploy kebijakan ValidatingAdmissionPolicy dan RBAC dalam tutorial ini di cluster produksi, GKE akan memblokir Pod dan permintaan API yang masuk yang melanggar kebijakan tersebut. Agar kebijakan ini tetap aktif, lewati bagian ini. Bagian berikut menunjukkan cara menghapus project atau setiap resource jika Anda mengikuti tutorial ini di lingkungan pembelajaran atau pengujian.
Menghapus project
Menghapus Google Cloud project:
gcloud projects delete PROJECT_ID
Menghapus resource satu per satu
Hapus ComputeClass yang Anda buat:
kubectl delete computeclass access-restriction-classHapus ValidatingAdmissionPolicy dan ValidatingAdmissionPolicyBinding:
kubectl delete validatingadmissionpolicy restrict-computeclass-usage kubectl delete validatingadmissionpolicybinding restrict-computeclass-usage-bindingHapus ClusterRole dan ClusterRoleBinding:
kubectl delete clusterroles \ computeclass-editor validatingadmissionpolicy-editor kubectl delete clusterrolebindings \ computeclass-editor-role-binding edit-validatingadmissionpoliciesHapus namespace contoh:
kubectl delete namespace computeclass-vap-tutorial
Langkah berikutnya
- Meninjau praktik terbaik untuk keamanan cluster
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.