還記得我們在前幾天介紹過 n8n 的 Queue Mode 嗎?Queue Mode 就是有人幫你分擔主人的工作,可以讓 n8n 在執行上更有效率。
所以我們今天的重點就是在 GKE 的環境也來把 n8n 的 Queue Mode 裝起來吧!
本日目標:在 GKE Private Cluster 中,安裝 Redis(有密碼、持久化),並將 n8n 切換為 Queue Mode。Main 專責 API/UI;Worker 專責執行工作。
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 建議在 n8n namespace 內安裝,或獨立 redis namespace 也可以
kubectl create namespace n8n --dry-run=client -o yaml | kubectl apply -f -
helm upgrade --install redis-n8n bitnami/redis \
--namespace n8n \
--set architecture=standalone \
--set auth.enabled=true \
--set auth.existingSecret="" \
--set auth.password="changeThisStrongPwd!" \
--set master.persistence.enabled=true \
--set master.persistence.size=10Gi \
--set master.persistence.storageClass="" \
--set commonLabels.app=redis-n8n
取得密碼(供 n8n 用)
export REDIS_PASS="changeThisStrongPwd!" # 若用上方 --set,密碼已知
# 若改為自動生成密碼,可用:
# export REDIS_PASS=$(kubectl get secret --namespace n8n redis-n8n -o jsonpath="{.data.redis-password}" | base64 -d)
2)(Optional)限制網路流量的 NetworkPolicy
僅允許 n8n namespace、label 為 app in (n8n, n8n-worker) 的 Pod 訪問 Redis
# redis-networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-n8n-to-redis
namespace: n8n
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: redis
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: n8n
podSelector:
matchExpressions:
- key: app
operator: In
values: ["n8n", "n8n-worker"]
ports:
- protocol: TCP
port: 6379
kubectl apply -f redis-networkpolicy.yaml
# n8n-main-queue.patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n-main
namespace: n8n
spec:
template:
spec:
containers:
- name: n8n
env:
- name: N8N_EXECUTIONS_MODE
value: "queue"
- name: EXECUTIONS_PROCESS
value: "main" # main=只接收/派工,不跑工作
- name: QUEUE_BULL_REDIS_HOST
value: "redis-n8n-master"
- name: QUEUE_BULL_REDIS_PORT
value: "6379"
- name: QUEUE_BULL_REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-n8n
key: redis-password
- name: QUEUE_BULL_REDIS_DB
value: "0"
建立與 Bitnami Redis Secret 對應的本地 Secret(若前面 helm 未自動創建或你手動設定密碼)
kubectl -n n8n create secret generic redis-n8n \
--from-literal=redis-password="$REDIS_PASS" --dry-run=client -o yaml | kubectl apply -f -
kubectl -n n8n patch deploy n8n-main --type merge --patch-file n8n-main-queue.patch.yaml
# n8n-worker.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: n8n-worker
namespace: n8n
spec:
replicas: 2
selector:
matchLabels:
app: n8n-worker
template:
metadata:
labels:
app: n8n-worker
spec:
serviceAccountName: n8n-wi
containers:
- name: n8n-worker
image: n8nio/n8n:latest
imagePullPolicy: IfNotPresent
env:
- name: N8N_PORT
value: "5678"
- name: N8N_PROTOCOL
value: "http"
- name: N8N_EXECUTIONS_MODE
value: "queue"
- name: QUEUE_BULL_REDIS_HOST
value: "redis-n8n-master"
- name: QUEUE_BULL_REDIS_PORT
value: "6379"
- name: QUEUE_BULL_REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: redis-n8n
key: redis-password
- name: QUEUE_BULL_REDIS_DB
value: "0"
# DB Config 與 Main 一致(指向同一個 Cloud SQL)
- name: DB_TYPE
value: "postgresdb"
- name: DB_POSTGRESDB_HOST
value: "<CLOUD_SQL_PRIVATE_IP_OR_DNS>"
- name: DB_POSTGRESDB_PORT
value: "5432"
- name: DB_POSTGRESDB_DATABASE
value: "n8n"
- name: DB_POSTGRESDB_USER
value: "n8n"
- name: DB_POSTGRESDB_PASSWORD
valueFrom:
secretKeyRef:
name: n8n-db-secret
key: db-password
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2000m"
memory: "2Gi"
kubectl apply -f n8n-worker.yaml
驗證
# 確認 Redis、Main、Worker 都健康
kubectl -n n8n get pods -w
# 看 Worker 是否在接收工作(Queue 模式)
kubectl -n n8n logs deploy/n8n-worker -f