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 harus 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 terdaftar 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. Pastikan akun layanan Google yang digunakan External Secrets Operator memiliki peran Secret Manager Secret Accessor (roles/secretmanager.secretAccessor) pada secret yang ingin Anda akses.
  3. Konfigurasi Pod External Secrets Operator untuk menggunakan Workload Identity Federation dengan mengikuti petunjuk Mengonfigurasi workload.

    Sebagian besar pelanggan menggunakan Workload Identity Federation untuk autentikasi. Untuk mengonfigurasi Workload Identity Federation, Anda harus memberikan anotasi pada ServiceAccount Kubernetes yang digunakan oleh operator dengan akun layanan Google. Untuk menambahkan anotasi ini, jalankan perintah kubectl annotate:

    kubectl annotate serviceaccount KSA_NAME \
        --namespace OPERATOR_NAMESPACE \
        iam.gke.io/gcp-service-account=GSA_EMAIL
    

    Atau, Anda dapat menambahkan anotasi ke YAML ServiceAccount:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        iam.gke.io/gcp-service-account: GSA_EMAIL
      name: KSA_NAME
      namespace: OPERATOR_NAMESPACE
    

    Ganti nilai berikut:

    • KSA_NAME: nama ServiceAccount Kubernetes yang digunakan oleh operator
    • OPERATOR_NAMESPACE: namespace tempat Anda menginstal operator
    • GSA_EMAIL: alamat email akun layanan Google
  4. Berikan file konfigurasi kredensial ke Pod operator. Untuk informasi selengkapnya, lihat Mengonfigurasi beban kerja.

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 dianotasi dengan benar menggunakan email akun layanan Google. Untuk mengetahui informasi selengkapnya, lihat Workload Identity Federation di cluster.

  4. Pastikan akun layanan Google memiliki izin yang diperlukan dan Workload Identity Federation dikonfigurasi dengan benar. Untuk mengetahui informasi selengkapnya, lihat Workload Identity Federation di cluster.

Langkah berikutnya