Menggunakan External Secrets Operator

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.com
    • iamcredentials.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.

  • 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 seperti kube-system atau gke-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:

  1. Siapkan hubungan tepercaya antara cluster Anda dan Google Cloud dengan mengikuti petunjuk di Autentikasi Cluster Workload Identity.
  2. 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=None
    

    Ganti nilai berikut:

    • SECRET_NAME: nama secret di Secret Manager
    • PROJECT_ID: Project ID Google Cloud Anda
    • PROJECT_NUMBER: nomor project Google Cloud numerik Anda
    • OPERATOR_NAMESPACE: namespace tempat Anda menginstal operator
    • KUBERNETES_SERVICEACCOUNT: nama ServiceAccount Kubernetes yang digunakan oleh operator
  3. 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.

  1. Buat file bernama secret-store.yaml dengan konten berikut:

    apiVersion: external-secrets.io/v1
    kind: SecretStore
    metadata:
      name: gcp-store
      namespace: NAMESPACE
    spec:
      provider:
        gcpsm:
          projectID: PROJECT_ID
    

    Ganti nilai berikut:

    • NAMESPACE: namespace tempat Anda ingin membuat SecretStore
    • PROJECT_ID: Project ID Google Cloud Anda tempat rahasia disimpan
  2. 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.

  1. Buat file bernama cluster-secret-store.yaml dengan konten berikut:

    apiVersion: external-secrets.io/v1
    kind: ClusterSecretStore
    metadata:
      name: gcp-cluster-store
    spec:
      provider:
        gcpsm:
          projectID: PROJECT_ID
    

    Ganti PROJECT_ID dengan project ID Google Cloud Anda tempat rahasia disimpan.

  2. 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.

  1. Buat file bernama external-secret.yaml dengan 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_NAME
    

    Ganti nilai berikut:

    • EXTERNAL_SECRET: nama resource ExternalSecret.
    • NAMESPACE: namespace tempat Anda membuat SecretStore.
    • 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, tetapkan kind: ClusterSecretStore, dan perbarui name di secretStoreRef.

  2. 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.

  1. Buat file bernama external-secret-json.yaml dengan 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_NAME
    
  2. Terapkan 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:

  1. Gunakan perintah kubectl get untuk memeriksa status resource ExternalSecret:

    kubectl get externalsecret EXTERNAL_SECRET -n NAMESPACE -o yaml
    

    Periksa bagian status untuk melihat apakah ada pesan error atau kondisi yang gagal.

  2. Gunakan perintah kubectl logs untuk memeriksa log Pod pengontrol External Secrets Operator:

    kubectl logs -l app.kubernetes.io/name=external-secrets -n OPERATOR_NAMESPACE
    
  3. Pastikan 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.

Langkah berikutnya