Auto reload secret di Kubernetes adalah solusi penting untuk menjaga keamanan dan performa aplikasi tanpa memerlukan restart manual setiap kali secret diperbarui. Dengan memanfaatkan HashiCorp Vault sebagai penyedia secret dan Stakater Reloader sebagai alat untuk mendeteksi perubahan secara otomatis, kamu bisa memastikan bahwa aplikasi selalu mendapatkan versi terbaru dari secret yang digunakan. Dalam artikel ini, kita akan membahas cara mengimplementasikan auto reload secret di Kubernetes menggunakan Vault dan Stakater Reloader, mulai dari konfigurasi hingga cara kerja integrasi ini. Dengan teknik ini, kamu bisa meningkatkan efisiensi sistem dan menghindari downtime yang tidak perlu, sambil memastikan aplikasi tetap aman dan selalu menggunakan data terbaru.

Untuk memulai implementasi auto reload secret di Kubernetes menggunakan Vault dan Stakater Reloader, langkah pertama adalah menginstal kedua komponen ini pada cluster Kubernetes kamu. Berikut adalah panduan instalasi dan konfigurasi:

1. Instal HashiCorp Vault di Kubernetes

helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault -n vault --create-namespace

2. Exec kedalam pod vault

kubectl exec -it pod/vault-0 -n vault -- sh
vault operator init

pada saat kamu melakukan init akan muncul 5 Unseal Key dan 1 Initial Root Token. Simpan baik-baik key dan token ini karena akan digunakan kedepannya.

3. Unseal dan login ke vault

vault operator unseal
vault login
vault auth enable -path k8s kubernetes

Perintah ini digunakan untuk mengaktifkan metode autentikasi di HashiCorp Vault. Vault mendukung berbagai metode autentikasi (seperti LDAP, GitHub, AWS, dll.), dan di sini kamu akan mengaktifkan metode autentikasi berbasis Kubernetes.

4. mengatur Vault untuk bisa berinteraksi dengan API server Kubernetes untuk autentikasi

vault write auth/k8s/config \
   kubernetes_host="https://$KUBERNETES_PORT_443_TCP_ADDR:443"

5. Mengaktifkan Secret Engine

vault secrets enable -path=default kv-v2

default ini disesuikan dengan namespace ya, nantinya akan membaca seperti default/db-passowrd atau default/credential.

6. Menambakan policy pada vault

vault policy write dolanawan - <<EOF
path "default/*" {
   capabilities = ["create", "read", "update", "patch", "delete", "list"]
}
EOF

memberikan akses penuh untuk namespace/path default/* untuk mengakses secret.

7. Menambhkan role pada vault

vault write auth/k8s/role/dolanawan-role \
   bound_service_account_names=default \
   bound_service_account_namespaces="*" \
   policies=dolanawan \
   audience=vault \
   ttl=24h

role ini nanti juga bisa digunakan saat kita membuat user baru agar bisa mengakses secret engine

8. Install vault-secret-operator

vault-operator-values.yaml

defaultVaultConnection:
  # toggles the deployment of the VaultAuthMethod CR
  enabled: true

  # Address of the Vault Server
  # Example: http://vault.default.svc.cluster.local:8200
  address: "http://vault.vault.svc.cluster.local:8200"
  skipTLSVerify: false

copy code di atas lalu simpan dengan nama vault-operator-values.yaml lalu jalankan perintah dibawah ini

helm install vault-secrets-operator hashicorp/vault-secrets-operator -n vault-secrets-operator-system --create-namespace --values vault-operator-values.yaml

fungsi vault-operator-secret ini adalah sebagai injector secret ke kubernetes.

9. Static Auth

apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultAuth
metadata:
  name: static-auth
spec:
  method: kubernetes
  mount: k8s
  kubernetes:
    role: dolanawan-role
    serviceAccount: default
    audiences:
      - vault
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
  name: wg-easy
  namespace: default
spec:
  type: kv-v2
  # mount path
  mount: default
  # path of the secret
  path: wg-easy
  # dest k8s secret
  destination:
    name: wg-easy
    create: true
  # static secret refresh interval
  refreshAfter: 30s
  # Name of the CRD to authenticate to Vault
  vaultAuthRef: static-auth

Karena dalam demo ini kita akan menggunakan static auth dan static secret maka bisa guna 2 code diatas lalu apply menggunakan kubectl apply

10. Install Stakater

helm repo add stakater https://stakater.github.io/stakater-charts helm repo update

helm install secret-reloader stakater/reloader -n default --set reloader.watchGlobally=false 

11. Penambahan annotation pada deployment service

  annotations:
    reloader.stakater.com/auto: "true"

Penambahan annotations ini bertujuan jika vault melakukan perubahan pada secret maka Stakater akan melakukan restart deployment sehingga kita tidak perlu melakukan restart deployment secara manual.

Jika tutorial diatas masih kebinggungan mungkin kalian bisa mengunjungi beberapa refrensi dibawah ini.

Stakater Reloader Vault