iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
AI & Data

進擊的 n8n系列 第 23

Day 23:n8n 加密金鑰與憑證管理(Secret Manager or 自行管理)

  • 分享至 

  • xImage
  •  

今天是一個純技術的額外分享~利用 GCP 上的金鑰憑證管理來管理 n8n 部署過程會使用到的各種 Secret。

目標:將 N8N_ENCRYPTION_KEY、第三方 API Token 等存於 Google Secret Manager;透過 Secrets Store CSI Driver(GCP Provider) 自動同步為 Kubernetes Secret,供 n8n Main/Worker 使用。
先決條件:Day 21 的 Workload Identity 已啟用;GKE 建議安裝 Secrets Store CSI Driver(GKE Add-on 或手動安裝)。


  1. 建立 Secret Manager
gcloud secrets create n8n-encryption-key --replication-policy="automatic"
echo -n "pleaseChangeMe_32Bytes_Minimum" | gcloud secrets versions add n8n-encryption-key --data-file=-
gcloud secrets create n8n-git-token --replication-policy="automatic"
echo -n "glpat_xxxxxxxxxxxxxx" | gcloud secrets versions add n8n-git-token --data-file=-
  1. 讓 Workload Identity 對 Secret Manager 有讀取權
    綁定 GSA: sa-n8n-wi@YOUR_PROJECT_ID.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding <YOUR_PROJECT_ID> \
  --member="serviceAccount:sa-n8n-wi@<YOUR_PROJECT_ID>.iam.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"
  1. SecretProviderClass:把 GSM 同步到 K8s Secret
    使用 secretObjects 將檔案同步為 K8s Secret:n8n-secrets(key 名對應 env)
# spc-n8n-gsm.yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: spc-n8n-gsm
  namespace: n8n
spec:
  provider: gcp
  parameters:
    secrets: |
      - resourceName: "projects/<YOUR_PROJECT_ID>/secrets/n8n-encryption-key/versions/latest"
        fileName: "encryption-key"
      - resourceName: "projects/<YOUR_PROJECT_ID>/secrets/n8n-git-token/versions/latest"
        fileName: "git-token"
  secretObjects:
  - secretName: n8n-secrets
    type: Opaque
    data:
    - objectName: "encryption-key"
      key: "encryption-key"
    - objectName: "git-token"
      key: "git-token"
  1. 將 SPC 掛載到 Pod,並同步 Secret
    任何使用 spc-n8n-gsm 的 Pod 啟動時,會自動產生/更新 K8s Secret:n8n-secrets。
# mount-spc-to-main.patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n-main
  namespace: n8n
spec:
  template:
    spec:
      volumes:
      - name: gsm-secrets
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "spc-n8n-gsm"
      containers:
      - name: n8n
        volumeMounts:
        - name: gsm-secrets
          mountPath: "/var/run/secrets/gsm"   # 可不使用檔案,僅用於觸發 sync
        env:
        - name: N8N_ENCRYPTION_KEY
          valueFrom:
            secretKeyRef:
              name: n8n-secrets
              key: encryption-key

kubectl apply -f spc-n8n-gsm.yaml
kubectl -n n8n patch deploy n8n-main --type merge --patch-file mount-spc-to-main.patch.yaml
kubectl -n n8n get secret n8n-secrets -o yaml   # 驗證同步成功
  1. n8n Worker 同理:
    你可將同一個 spc-n8n-gsm 掛在 n8n-worker,或直接在 worker YAML 中 envFrom n8n-secret。
# mount-spc-to-worker.patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: n8n-worker
  namespace: n8n
spec:
  template:
    spec:
      volumes:
      - name: gsm-secrets
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "spc-n8n-gsm"
      containers:
      - name: n8n-worker
        volumeMounts:
        - name: gsm-secrets
          mountPath: "/var/run/secrets/gsm"
        env:
        - name: N8N_ENCRYPTION_KEY
          valueFrom:
            secretKeyRef:
              name: n8n-secrets
              key: encryption-key

kubectl -n n8n patch deploy n8n-worker --type merge --patch-file mount-spc-to-worker.patch.yaml
  • 為何用 CSI 同步成 K8s Secret?
    好處是 n8n 仍可用熟悉的 envFrom/secretKeyRef 方式;Secret 會跟著 Pod 生命週期維護與更新,既能用到 GSM,又不需要修改應用程式程式碼。

上一篇
Day 22:Redis 佈署與 Queue Mode 設定
下一篇
Day 24:監控與 Log(可以使用 Google Cloud 的 Cloud Logging & Monitoring)
系列文
進擊的 n8n25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言