Halaman ini menjelaskan cara menggunakan External Secrets Operator (ESO) untuk menyelaraskan secret dari Secret Manager ke cluster yang terhubung ke Google Distributed Cloud.
External Secrets Operator adalah operator Kubernetes open source yang mengintegrasikan sistem pengelolaan secret eksternal. Operator membaca informasi dari API eksternal dan otomatis menyuntikkan nilai ke dalam secret Kubernetes.
Prasyarat
Sebelum dapat menggunakan External Secrets Operator, Anda perlu melakukan hal berikut:
- Buat cluster yang terhubung ke Distributed Cloud yang berfungsi.
- Pastikan API berikut diaktifkan di project Google Cloud Anda.
Untuk mengetahui informasi tentang cara mengaktifkan API, lihat
Mengaktifkan layanan:
secretmanager.googleapis.comiamcredentials.googleapis.com
Pastikan Anda telah menginstal alat command line berikut:
- Versi terbaru Google Cloud CLI, yang mencakup
gcloud, alat command line untuk berinteraksi dengan Google Cloud. kubectl
Jika Anda menggunakan Cloud Shell sebagai lingkungan shell untuk berinteraksi dengan Google Cloud, alat ini akan diinstal untuk Anda.
- Versi terbaru Google Cloud CLI, yang mencakup
Pastikan Anda telah menginisialisasi gcloud CLI untuk digunakan dengan project Anda.
Aktifkan Workload Identity Federation di cluster. Workload Identity Pool otomatis tersedia dan mengikuti format
PROJECT_ID.svc.id.goog.Instal External Secrets Operator di cluster Anda. Untuk petunjuk penginstalan, lihat dokumentasi External Secrets Operator. Sebaiknya instal operator di namespace khusus, seperti
external-secrets. Jangan menginstalnya di namespace yang dikelola sistem sepertikube-systemataugke-system.
Cluster yang terhubung Distributed Cloud otomatis didaftarkan ke Fleet dalam project tempat cluster tersebut dibuat.
Autentikasi
External Secrets Operator memerlukan autentikasi untuk mengakses Secret Manager. Distributed Cloud Connected menggunakan Fleet Workload Identity Federation untuk mengizinkan workload melakukan autentikasi keGoogle Cloud API.
Untuk mengonfigurasi autentikasi untuk External Secrets Operator:
- Siapkan hubungan tepercaya antara cluster Anda dan Google Cloud dengan mengikuti petunjuk di Autentikasi Cluster Workload Identity.
Berikan peran Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor) pada secret ke ServiceAccount Kubernetes yang digunakan External Secrets Operator:gcloud secrets add-iam-policy-binding SECRET_NAME \ --project=PROJECT_ID \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/OPERATOR_NAMESPACE/sa/KUBERNETES_SERVICEACCOUNT" \ --role="roles/secretmanager.secretAccessor" \ --condition=NoneGanti nilai berikut:
SECRET_NAME: nama secret di Secret ManagerPROJECT_ID: Project ID Google Cloud AndaPROJECT_NUMBER: nomor project Google Cloud numerik AndaOPERATOR_NAMESPACE: namespace tempat Anda menginstal operatorKUBERNETES_SERVICEACCOUNT: nama ServiceAccount Kubernetes yang digunakan oleh operator
Konfigurasi Pod External Secrets Operator untuk menggunakan Workload Identity Federation dan berikan file konfigurasi kredensial ke Pod operator dengan mengikuti petunjuk Mengonfigurasi workload.
Membuat resource ESO untuk menyinkronkan secret
Setelah mengonfigurasi autentikasi, Anda dapat membuat resource External Secrets Operator untuk menyinkronkan secret.
Membuat SecretStore
SecretStore menentukan cara mengakses sistem pengelolaan secret eksternal.
Anda dapat membuat resource SecretStore di namespace yang sama dengan External
Secrets Operator atau di namespace aplikasi. Untuk mengetahui informasi selengkapnya, lihat
SecretStore di
dokumentasi Kubernetes.
Buat file bernama
secret-store.yamldengan konten berikut:apiVersion: external-secrets.io/v1 kind: SecretStore metadata: name: gcp-store namespace: NAMESPACE spec: provider: gcpsm: projectID: PROJECT_IDGanti nilai berikut:
NAMESPACE: namespace tempat Anda ingin membuatSecretStorePROJECT_ID: Project ID Google Cloud Anda tempat rahasia disimpan
Gunakan perintah kubectl apply untuk menerapkan manifes:
kubectl apply -f secret-store.yaml
Membuat ClusterSecretStore
ClusterSecretStore adalah resource cakupan cluster yang dapat digunakan oleh resource ExternalSecret di namespace mana pun. Untuk mengetahui informasi selengkapnya, lihat
ClusterSecretStore
dalam dokumentasi Kubernetes.
Buat file bernama
cluster-secret-store.yamldengan konten berikut:apiVersion: external-secrets.io/v1 kind: ClusterSecretStore metadata: name: gcp-cluster-store spec: provider: gcpsm: projectID: PROJECT_IDGanti
PROJECT_IDdengan project ID Google Cloud Anda tempat rahasia disimpan.Terapkan manifes:
kubectl apply -f cluster-secret-store.yaml
Membuat ExternalSecret
ExternalSecret mendeklarasikan data yang akan diambil dan tempat menyimpannya di
cluster. Buat resource ExternalSecret di namespace tempat Pod aplikasi menggunakan Secret Kubernetes yang dihasilkan. Untuk mengetahui informasi selengkapnya, lihat ExternalSecret dalam dokumentasi Kubernetes.
Buat file bernama
external-secret.yamldengan konten berikut:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner data: - secretKey: K8S_SECRET_KEY remoteRef: key: SECRET_NAMEGanti nilai berikut:
EXTERNAL_SECRET: nama resourceExternalSecret.NAMESPACE: namespace tempat Anda membuatSecretStore.K8S_SECRET_NAME: nama Secret Kubernetes yang akan dibuat oleh ESO.K8S_SECRET_KEY: kunci dalam data Secret Kubernetes.SECRET_NAME: nama secret di Google Cloud Secret Manager.
Jika Anda menggunakan
ClusterSecretStore, tetapkankind: ClusterSecretStore, dan perbaruinamedisecretStoreRef.Terapkan manifes:
kubectl apply -f external-secret.yaml
Menyinkronkan beberapa kunci dari secret JSON
Jika secret Anda di Secret Manager berisi string JSON, Anda dapat mengekstrak semua kunci sebagai entri individual di secret Kubernetes.
Buat file bernama
external-secret-json.yamldengan konten berikut:apiVersion: external-secrets.io/v1 kind: ExternalSecret metadata: name: EXTERNAL_SECRET namespace: NAMESPACE spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: gcp-store target: name: K8S_SECRET_NAME creationPolicy: Owner dataFrom: - extract: key: SECRET_NAMETerapkan manifes:
kubectl apply -f external-secret-json.yaml
Setiap key-value pair dalam secret JSON dipetakan ke key-value pair dalam secret Kubernetes yang dihasilkan.
Pemecahan masalah
Jika rahasia Anda tidak disinkronkan, gunakan langkah-langkah berikut untuk memecahkan masalah:
Gunakan perintah kubectl get untuk memeriksa status resource
ExternalSecret:kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yamlPeriksa bagian
statusuntuk melihat apakah ada pesan error atau kondisi yang gagal.Gunakan perintah kubectl logs untuk memeriksa log Pod pengontrol External Secrets Operator:
kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACEPastikan bahwa ServiceAccount Kubernetes yang digunakan oleh operator memiliki peran Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor) dan Workload Identity Federation dikonfigurasi dengan benar di Pod operator. Untuk mengetahui informasi selengkapnya, lihat Workload Identity Federation di cluster.