iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
AI & Data

進擊的 n8n系列 第 22

Day 22:Redis 佈署與 Queue Mode 設定

  • 分享至 

  • xImage
  •  

還記得我們在前幾天介紹過 n8n 的 Queue Mode 嗎?Queue Mode 就是有人幫你分擔主人的工作,可以讓 n8n 在執行上更有效率。

所以我們今天的重點就是在 GKE 的環境也來把 n8n 的 Queue Mode 裝起來吧!
本日目標:在 GKE Private Cluster 中,安裝 Redis(有密碼、持久化),並將 n8n 切換為 Queue Mode。Main 專責 API/UI;Worker 專責執行工作。

  1. 使用 Helm 安裝 Redis(Bitnami)
    會建立 StatefulSet(持久化)+ 密碼(K8s Secret)
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
  1. 更新 n8n Main(Queue Mode 但不執行工作)
    將 Day 21 的 n8n-main Deployment 加入 Queue 設定;同時避免 Main 搶工作
# 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
  1. 新增 n8n Worker Deployment(可以被水平擴展)
# 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

上一篇
Day 21:n8n on GKE(Private Cluster + Internal Load Balancer)部署細節
下一篇
Day 23:n8n 加密金鑰與憑證管理(Secret Manager or 自行管理)
系列文
進擊的 n8n25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言