今天是一個純技術的額外分享~利用 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 或手動安裝)。
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=-
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"
# 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"
# 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 # 驗證同步成功
# 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