Tutorial ini menunjukkan cara administrator platform menggunakan kebijakan Pengontrol Kebijakan untuk mengatur cara membuat resource Google Cloud menggunakan Config Connector.
Halaman ini ditujukan untuk administrator IT dan Operator yang ingin memastikan bahwa semua resource yang berjalan dalam platform cloud memenuhi persyaratan kepatuhan organisasi dengan menyediakan dan mempertahankan otomatisasi untuk mengaudit atau menerapkan, dan yang mengelola siklus proses infrastruktur teknologi yang mendasarinya. Untuk mempelajari lebih lanjut peran umum dan contoh tugas yang kami referensikan dalam konten Google Cloud, lihat Peran dan tugas pengguna GKE Enterprise umum.
Petunjuk dalam tutorial ini mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang Kubernetes atau Google Kubernetes Engine (GKE). Dalam tutorial ini, Anda akan menentukan kebijakan yang membatasi lokasi yang diizinkan untuk bucket Cloud Storage.
Pengontrol Kebijakan memeriksa, mengaudit, dan menerapkan kepatuhan resource cluster Kubernetes Anda terhadap kebijakan yang terkait dengan keamanan, peraturan, atau aturan bisnis. Pengontrol Kebijakan dibuat dari project open source Pemilah Komunikasi OPA.
Config Connector membuat dan mengelola siklus proses resource Google Cloud, dengan mendeskripsikannya sebagai resource kustom Kubernetes. Untuk membuat resource Google Cloud, Anda membuat resource Kubernetes di namespace yang dikelola Config Connector. Contoh berikut menunjukkan cara mendeskripsikan bucket Cloud Storage menggunakan Config Connector:
apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: name: my-bucket spec: location: us-east1
Dengan mengelola resource Google Cloud menggunakan Config Connector, Anda dapat menerapkan kebijakan Policy Controller ke resource tersebut saat membuatnya di cluster edisi Enterprise Google Kubernetes Engine (GKE). Kebijakan ini memungkinkan Anda mencegah atau melaporkan tindakan yang membuat atau mengubah resource dengan cara yang melanggar kebijakan Anda. Misalnya, Anda dapat menerapkan kebijakan yang membatasi lokasi bucket Cloud Storage.
Pendekatan ini, berdasarkan model resource Kubernetes (KRM), memungkinkan Anda menggunakan kumpulan alat dan alur kerja yang konsisten untuk mengelola resource Kubernetes dan Google Cloud. Tutorial ini menunjukkan cara menyelesaikan tugas berikut:
- Menentukan kebijakan yang mengatur resource Google Cloud Anda.
- Terapkan kontrol yang mencegah developer dan administrator membuat resource Google Cloud yang melanggar kebijakan Anda.
- Terapkan kontrol yang mengaudit resource Google Cloud yang ada terhadap kebijakan Anda, meskipun Anda membuat resource tersebut di luar Config Connector.
- Memberikan masukan cepat kepada developer dan administrator saat mereka membuat dan mengupdate definisi resource.
- Validasi definisi resource Google Cloud terhadap kebijakan Anda sebelum mencoba menerapkan definisi ke cluster Kubernetes.
Tujuan
- Buat cluster edisi Enterprise Google Kubernetes Engine (GKE) yang menyertakan add-on Config Connector.
- Instal Pengontrol Kebijakan.
- Buat kebijakan untuk membatasi lokasi bucket Cloud Storage yang diizinkan.
- Pastikan kebijakan mencegah pembuatan bucket Cloud Storage di lokasi yang tidak diizinkan.
- Evaluasi kepatuhan kebijakan definisi bucket Cloud Storage selama pengembangan.
- Audit bucket Cloud Storage yang ada untuk kepatuhan kebijakan.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Make sure that billing is enabled for your Google Cloud project.
-
Di konsol Google Cloud, aktifkan Cloud Shell.
Di Cloud Shell, tetapkan project Google Cloud yang ingin Anda gunakan untuk tutorial ini:
gcloud config set project PROJECT_ID
Ganti
PROJECT_ID
dengan project ID Google Cloud project Anda. Saat Anda menjalankan perintah ini, Cloud Shell akan membuat variabel lingkungan yang diekspor bernamaGOOGLE_CLOUD_PROJECT
yang berisi project ID Anda. Jika tidak menggunakan Cloud Shell, Anda dapat membuat variabel lingkungan dengan perintah ini:export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
Aktifkan GKE API:
gcloud services enable container.googleapis.com
Aktifkan Policy Controller API:
gcloud services enable anthospolicycontroller.googleapis.com
Buat direktori untuk menyimpan file yang dibuat untuk tutorial ini:
mkdir -p ~/cnrm-gatekeeper-tutorial
Buka direktori yang Anda buat:
cd ~/cnrm-gatekeeper-tutorial
Membuat cluster GKE
Di Cloud Shell, buat cluster GKE dengan add-on Config Connector dan Workload Identity Federation for GKE:
gcloud container clusters create CLUSTER_NAME \ --addons ConfigConnector \ --enable-ip-alias \ --num-nodes 4 \ --release-channel regular \ --scopes cloud-platform \ --workload-pool $GOOGLE_CLOUD_PROJECT.svc.id.goog \ --zone ZONE
Ganti kode berikut:
CLUSTER_NAME
: Nama cluster yang ingin Anda gunakan untuk project ini, misalnya,cnrm-gatekeeper-tutorial
.ZONE
: Zona Compute Engine yang dekat dengan lokasi Anda, misalnya,asia-southeast1-b
.
Add-on Config Connector menginstal definisi resource kustom (CRD) untuk resource Google Cloud di cluster GKE Anda.
Opsional: Jika Anda menggunakan cluster pribadi di lingkungan Anda sendiri, tambahkan aturan firewall yang memungkinkan bidang kontrol cluster GKE terhubung ke webhook Pengontrol Kebijakan:
gcloud compute firewall-rules create allow-cluster-control-plane-tcp-8443 \ --allow tcp:8443 \ --network default \ --source-ranges CONTROL_PLANE_CIDR \ --target-tags NODE_TAG
Ganti kode berikut:
CONTROL_PLANE_CIDR
: Rentang IP untuk bidang kontrol cluster GKE Anda, misalnya,172.16.0.16/28
.NODE_TAG
: Tag yang diterapkan ke semua node di cluster GKE Anda.
Aturan firewall opsional ini diperlukan agar webhook Pengontrol Kebijakan dapat berfungsi saat cluster Anda menggunakan node pribadi.
Menyiapkan Config Connector
Project Google Cloud tempat Anda menginstal Config Connector dikenal sebagai project host. Project tempat Anda menggunakan Config Connector untuk mengelola resource dikenal sebagai project terkelola. Dalam tutorial ini, Anda akan menggunakan Config Connector untuk membuat resource Google Cloud dalam project yang sama dengan cluster GKE, sehingga project host dan project terkelola adalah project yang sama.
Di Cloud Shell, buat akun layanan Google untuk Config Connector:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name "Config Connector Gatekeeper tutorial"
Ganti
SERVICE_ACCOUNT_NAME
dengan nama yang ingin Anda gunakan untuk akun layanan ini, misalnya,cnrm-gatekeeper-tutorial
. Config Connector menggunakan akun layanan Google ini untuk membuat resource di project terkelola Anda.Berikan peran Storage Admin ke akun layanan Google:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \ --role roles/storage.admin
Dalam tutorial ini, Anda menggunakan peran Storage Admin karena Anda menggunakan Config Connector untuk membuat bucket Cloud Storage. Di lingkungan Anda sendiri, berikan peran yang diperlukan untuk mengelola resource Google Cloud yang ingin Anda buat untuk Config Connector. Untuk mengetahui informasi selengkapnya tentang peran bawaan, lihat memahami peran dalam dokumentasi IAM.
Buat namespace Kubernetes untuk resource Config Connector yang Anda buat dalam tutorial ini:
kubectl create namespace NAMESPACE
Ganti NAMESPACE dengan namespace Kubernetes yang ingin Anda gunakan dalam tutorial, misalnya,
tutorial
.Anotasikan namespace untuk menentukan project yang harus digunakan Config Connector untuk membuat resource Google Cloud (project terkelola):
kubectl annotate namespace NAMESPACE \ cnrm.cloud.google.com/project-id=$GOOGLE_CLOUD_PROJECT
Buat resource
ConfigConnectorContext
yang mengaktifkan Config Connector untuk namespace Kubernetes dan mengaitkannya dengan akun layanan Google yang Anda buat:cat << EOF | kubectl apply -f - apiVersion: core.cnrm.cloud.google.com/v1beta1 kind: ConfigConnectorContext metadata: name: configconnectorcontext.core.cnrm.cloud.google.com namespace: NAMESPACE spec: googleServiceAccount: SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com EOF
Saat Anda membuat resource
ConfigConnectorContext
, Config Connector akan membuat akun layanan Kubernetes dan StatefulSet di namespacecnrm-system
untuk mengelola resource Config Connector di namespace Anda.Tunggu Pod pengontrol Config Connector untuk namespace Anda:
kubectl wait --namespace cnrm-system --for=condition=Ready pod \ -l cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
Setelah Pod siap, perintah Cloud Shell akan muncul. Jika Anda mendapatkan pesan
error: no matching resources found
, tunggu beberapa menit, lalu coba lagi.Ikat akun layanan Kubernetes Config Connector ke akun layanan Google Anda dengan membuat binding kebijakan IAM:
gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \ --role roles/iam.workloadIdentityUser
Dengan binding ini, akun layanan Kubernetes
cnrm-controller-manager-NAMESPACE
di namespacecnrm-system
dapat berfungsi sebagai akun layanan Google yang Anda buat.
Menginstal Pengontrol Kebijakan
Instal Pengontrol Kebijakan dengan mengikuti petunjuk penginstalan.
Gunakan interval audit 60
detik.
Membuat resource Google Cloud menggunakan Config Connector
Di Cloud Shell, buat manifes Config Connector yang mewakili bucket Cloud Storage di region
us-central1
:cat << EOF > tutorial-storagebucket-us-central1.yaml apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: name: tutorial-us-central1-$GOOGLE_CLOUD_PROJECT namespace: NAMESPACE spec: location: us-central1 uniformBucketLevelAccess: true EOF
Untuk membuat bucket Cloud Storage, terapkan manifes:
kubectl apply -f tutorial-storagebucket-us-central1.yaml
Pastikan Config Connector membuat bucket Cloud Storage:
gcloud storage ls | grep tutorial
Outputnya mirip dengan hal berikut ini:
gs://tutorial-us-central1-PROJECT_ID/
Output ini menyertakan
PROJECT_ID
, yang merupakan project ID Google Cloud Anda.Jika Anda tidak melihat output ini, tunggu sebentar dan lakukan langkah lagi.
Buat kebijakan
Kebijakan di Pengontrol Kebijakan terdiri dari template batasan dan batasan. Template batasan berisi logika kebijakan. Batasan menentukan tempat kebijakan diterapkan dan parameter input ke logika kebijakan.
Di Cloud Shell, buat template batasan yang membatasi lokasi bucket Cloud Storage:
cat << EOF > tutorial-storagebucket-location-template.yaml apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: gcpstoragelocationconstraintv1 spec: crd: spec: names: kind: GCPStorageLocationConstraintV1 validation: openAPIV3Schema: properties: locations: type: array items: type: string exemptions: type: array items: type: string targets: - target: admission.k8s.gatekeeper.sh rego: | package gcpstoragelocationconstraintv1 allowedLocation(reviewLocation) { locations := input.parameters.locations satisfied := [ good | location = locations[_] good = lower(location) == lower(reviewLocation)] any(satisfied) } exempt(reviewName) { input.parameters.exemptions[_] == reviewName } violation[{"msg": msg}] { bucketName := input.review.object.metadata.name bucketLocation := input.review.object.spec.location not allowedLocation(bucketLocation) not exempt(bucketName) msg := sprintf("Cloud Storage bucket <%v> uses a disallowed location <%v>, allowed locations are %v", [bucketName, bucketLocation, input.parameters.locations]) } violation[{"msg": msg}] { not input.parameters.locations bucketName := input.review.object.metadata.name msg := sprintf("No permitted locations provided in constraint for Cloud Storage bucket <%v>", [bucketName]) } EOF
Terapkan template untuk membuat bucket Cloud Storage:
kubectl apply -f tutorial-storagebucket-location-template.yaml
Buat batasan yang hanya mengizinkan bucket di region Singapura dan Jakarta (
asia-southeast1
danasia-southeast2
). Batasan ini berlaku untuk namespace yang Anda buat sebelumnya. Tindakan ini mengecualikan bucket Cloud Storage default untuk Cloud Build.cat << EOF > tutorial-storagebucket-location-constraint.yaml apiVersion: constraints.gatekeeper.sh/v1beta1 kind: GCPStorageLocationConstraintV1 metadata: name: singapore-and-jakarta-only spec: enforcementAction: deny match: kinds: - apiGroups: - storage.cnrm.cloud.google.com kinds: - StorageBucket namespaces: - NAMESPACE parameters: locations: - asia-southeast1 - asia-southeast2 exemptions: - ${GOOGLE_CLOUD_PROJECT}_cloudbuild EOF
Untuk membatasi zona tempat bucket dapat berada, terapkan batasan:
kubectl apply -f tutorial-storagebucket-location-constraint.yaml
Memverifikasi kebijakan
Buat manifes yang mewakili bucket Cloud Storage di lokasi yang tidak diizinkan (
us-west1
):cat << EOF > tutorial-storagebucket-us-west1.yaml apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: name: tutorial-us-west1-$GOOGLE_CLOUD_PROJECT namespace: NAMESPACE spec: location: us-west1 uniformBucketLevelAccess: true EOF
Untuk membuat bucket Cloud Storage, terapkan manifes:
kubectl apply -f tutorial-storagebucket-us-west1.yaml
Outputnya mirip dengan hal berikut ini:
Error from server ([singapore-and-jakarta-only] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"]): error when creating "tutorial-storagebucket-us-west1.yaml": admission webhook "validation.gatekeeper.sh" denied the request: [singapore-and-jakarta-only] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"]
Opsional: Anda dapat melihat catatan keputusan untuk menolak permintaan di Cloud Audit Logs. Buat kueri log Aktivitas Admin untuk project Anda:
gcloud logging read --limit=1 \ "logName=\"projects/$GOOGLE_CLOUD_PROJECT/logs/cloudaudit.googleapis.com%2Factivity\""' resource.type="k8s_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="ZONE" protoPayload.authenticationInfo.principalEmail!~"system:serviceaccount:cnrm-system:.*" protoPayload.methodName:"com.google.cloud.cnrm." protoPayload.status.code=7'
Outputnya mirip dengan hal berikut ini:
insertId: 3c6940bb-de14-4d18-ac4d-9a6becc70828 labels: authorization.k8s.io/decision: allow authorization.k8s.io/reason: '' mutation.webhook.admission.k8s.io/round_0_index_0: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"container-annotation-handler.cnrm.cloud.google.com","mutated":true}' mutation.webhook.admission.k8s.io/round_0_index_1: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"management-conflict-annotation-defaulter.cnrm.cloud.google.com","mutated":true}' logName: projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity operation: first: true id: 3c6940bb-de14-4d18-ac4d-9a6becc70828 last: true producer: k8s.io protoPayload: '@type': type.googleapis.com/google.cloud.audit.AuditLog authenticationInfo: principalEmail: user@example.com authorizationInfo: - permission: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create resource: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID methodName: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create requestMetadata: callerIp: 203.0.113.1 callerSuppliedUserAgent: kubectl/v1.21.1 (linux/amd64) kubernetes/5e58841 resourceName: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID serviceName: k8s.io status: code: 7 message: Forbidden receiveTimestamp: '2021-05-21T06:56:24.940264678Z' resource: labels: cluster_name: CLUSTER_NAME location: CLUSTER_ZONE project_id: PROJECT_ID type: k8s_cluster timestamp: '2021-05-21T06:56:09.060635Z'
Kolom
methodName
menampilkan operasi yang dicoba,resourceName
menampilkan nama lengkap resource Config Connector, dan bagianstatus
menunjukkan bahwa permintaan tidak berhasil, dengan kode error7
dan pesanForbidden
.Buat manifes yang mewakili bucket Cloud Storage di lokasi yang diizinkan (
asia-southeast1
):cat << EOF > tutorial-storagebucket-asia-southeast1.yaml apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: name: tutorial-asia-southeast1-$GOOGLE_CLOUD_PROJECT namespace: NAMESPACE spec: location: asia-southeast1 uniformBucketLevelAccess: true EOF
Untuk membuat bucket Cloud Storage, terapkan manifes:
kubectl apply -f tutorial-storagebucket-asia-southeast1.yaml
Outputnya mirip dengan hal berikut ini:
storagebucket.storage.cnrm.cloud.google.com/tutorial-asia-southeast1-PROJECT_ID created
Output ini menyertakan
PROJECT_ID
, yang merupakan project ID Google Cloud Anda.Pastikan Config Connector membuat bucket Cloud Storage:
gcloud storage ls | grep tutorial
Outputnya mirip dengan hal berikut ini:
gs://tutorial-asia-southeast1-PROJECT_ID/ gs://tutorial-us-central1-PROJECT_ID/
Jika Anda tidak melihat output ini, tunggu sebentar dan lakukan langkah ini lagi.
Batasan audit
Pengontrol audit di Pengontrol Kebijakan secara berkala mengevaluasi resource berdasarkan batasannya. Pengontrol mendeteksi pelanggaran kebijakan untuk resource yang dibuat sebelum batasan, dan untuk resource yang dibuat di luar Config Connector.
Di Cloud Shell, lihat pelanggaran untuk semua batasan yang menggunakan template batasan
GCPStorageLocationConstraintV1
:kubectl get gcpstoragelocationconstraintv1 -o json \ | jq '.items[].status.violations'
Outputnya mirip dengan hal berikut ini:
[ { "enforcementAction": "deny", "kind": "StorageBucket", "message": "Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are \"asia-southeast1\", \"asia-southeast2\"", "name": "tutorial-us-central1-PROJECT_ID", "namespace": "NAMESPACE" } ]
Anda akan melihat bucket Cloud Storage yang Anda buat di
us-central1
sebelum membuat batasan.
Memvalidasi resource selama pengembangan
Selama pengembangan dan build integrasi berkelanjutan, sebaiknya validasikan resource terhadap batasan sebelum Anda menerapkan resource tersebut ke cluster GKE. Memvalidasi memberikan masukan yang cepat dan memungkinkan Anda menemukan masalah terkait resource dan batasan lebih awal. Langkah-langkah ini menunjukkan cara memvalidasi resource dengan kpt. Alat command line kpt memungkinkan Anda mengelola dan menerapkan manifes resource Kubernetes.
Di Cloud Shell, jalankan fungsi KRM
gatekeeper
menggunakan kpt:kpt fn eval . --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
Fungsi KRM adalah program yang dapat memutasi atau memvalidasi resource Kubernetes yang disimpan di sistem file lokal sebagai file YAML. Fungsi KRM
gatekeeper
memvalidasi resource bucket Cloud Storage Config Connector berdasarkan kebijakan Gatekeeper. Fungsi KRMgatekeeper
dikemas sebagai image container yang tersedia di Artifact Registry.Fungsi melaporkan bahwa file manifes untuk bucket Cloud Storage di region
us-central1
danus-west1
melanggar batasan.Outputnya mirip dengan hal berikut ini:
[RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2" [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2" Results: [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-central1.yaml" [ERROR] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-west1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-west1.yaml" Stderr: "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]" "violatedConstraint: singapore-and-jakarta-only" "" "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-west1-PROJECT_IDT : Cloud Storage bucket <tutorial-us-west1-PROJECT_IDgt; uses a disallowed location <us-west1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]" "violatedConstraint: singapore-and-jakarta-only" "" Exit code: 1
Memvalidasi resource yang dibuat di luar Config Connector
Anda dapat memvalidasi resource Google Cloud yang dibuat di luar Config Connector dengan mengekspor resource tersebut. Setelah mengekspor resource, gunakan salah satu opsi berikut untuk mengevaluasi kebijakan Pengontrol Kebijakan Anda terhadap resource yang diekspor:
Validasi resource menggunakan fungsi KRM
gatekeeper
.Impor resource ke Config Connector.
Untuk mengekspor resource, Anda menggunakan Inventaris Aset Cloud.
Di Cloud Shell, aktifkan Cloud Asset API:
gcloud services enable cloudasset.googleapis.com
Hapus file manifes resource Kubernetes untuk bucket Cloud Storage di
us-central1
danus-west1
:rm tutorial-storagebucket-us-*.yaml
Ekspor semua resource Cloud Storage dalam project Anda saat ini, dan simpan output dalam file bernama
export.yaml
:gcloud beta resource-config bulk-export \ --project $GOOGLE_CLOUD_PROJECT \ --resource-format krm \ --resource-types StorageBucket > export.yaml
Outputnya mirip dengan hal berikut ini:
Exporting resource configurations to stdout... Export complete.
Buat pipeline kpt dengan mengaitkan fungsi KRM. Pipeline ini memvalidasi resource di direktori saat ini berdasarkan kebijakan lokasi bucket Cloud Storage:
kpt fn source . \ | kpt fn eval - --image=gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=NAMESPACE \ | kpt fn eval - --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
Resource yang diekspor tidak memiliki nilai untuk atribut metadata
namespace
. Pipeline ini menggunakan fungsi KRM yang disebutset-namespace
untuk menetapkan nilainamespace
dari semua resource.Outputnya mirip dengan berikut ini dan menampilkan pelanggaran untuk resource yang Anda ekspor:
[RUNNING] "gcr.io/kpt-fn/set-namespace:v0.1" [PASS] "gcr.io/kpt-fn/set-namespace:v0.1" [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2" [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2" Results: [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "export.yaml" Stderr: "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]" "violatedConstraint: singapore-and-jakarta-only" "" Exit code: 1
Jika project Google Cloud Anda berisi bucket Cloud Storage yang Anda buat sebelum mengerjakan tutorial ini, dan lokasinya melanggar batasan, bucket yang dibuat sebelumnya akan muncul dalam output.
Selamat, Anda telah berhasil menyiapkan kebijakan yang mengatur lokasi bucket Cloud Storage yang diizinkan. Tutorial selesai. Sekarang Anda dapat terus menambahkan kebijakan Anda sendiri untuk resource Google Cloud lainnya.
Pemecahan masalah
Jika Config Connector tidak membuat resource Google Cloud yang diharapkan, gunakan perintah berikut di Cloud Shell untuk melihat log pengelola pengontrol Config Connector:
kubectl logs --namespace cnrm-system --container manager \
--selector cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
Jika Pengontrol Kebijakan tidak menerapkan kebijakan dengan benar, gunakan perintah berikut untuk melihat log pengelola pengontrol:
kubectl logs deployment/gatekeeper-controller-manager \
--namespace gatekeeper-system
Jika Pengontrol Kebijakan tidak melaporkan pelanggaran di kolom status
pada objek batasan, lihat log pengontrol audit
menggunakan perintah ini:
kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system
Jika Anda mengalami masalah lain dengan tutorial ini, sebaiknya tinjau dokumen berikut:
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.
Menghapus project
- Di konsol Google Cloud, buka halaman Manage resource.
- Jika project yang ingin Anda hapus tertaut ke organisasi, buka daftar Organization di kolom Name.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Menghapus resource
Jika ingin menyimpan project Google Cloud yang digunakan dalam tutorial ini, hapus setiap resource.
Di Cloud Shell, hapus batasan lokasi bucket Cloud Storage:
kubectl delete -f tutorial-storagebucket-location-constraint.yaml
Tambahkan anotasi
cnrm.cloud.google.com/force-destroy
dengan nilai stringtrue
ke semua resourcestoragebucket
dalam namespace yang dikelola oleh Config Connector:kubectl annotate storagebucket --all --namespace NAMESPACE \ cnrm.cloud.google.com/force-destroy=true
Anotasi ini adalah directive yang memungkinkan Config Connector menghapus bucket Cloud Storage saat Anda menghapus resource
storagebucket
yang sesuai di cluster GKE, meskipun bucket berisi objek.Hapus resource Config Connector yang mewakili bucket Cloud Storage:
kubectl delete --namespace NAMESPACE storagebucket --all
Hapus cluster GKE:
gcloud container clusters delete CLUSTER_NAME \ --zone ZONE --async --quiet
Hapus binding kebijakan Workload Identity di IAM:
gcloud iam service-accounts remove-iam-policy-binding \ SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \ --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \ --role roles/iam.workloadIdentityUser
Hapus binding peran Cloud Storage Admin untuk akun layanan Google:
gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \ --role roles/storage.admin
Hapus akun layanan Google yang Anda buat untuk Config Connector:
gcloud iam service-accounts delete --quiet \ SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com