“那一刻,我第一次體會到什么叫‘Lua 插件的熱升級’——它熱得像巖漿,把整條流量通路都燒穿了。”

以上畫面,來自 2025 年 7 月 14 日,某跨境電商大促前最后一次封板演練。主角就是本文的主角——Kong Gateway 3.8

如果你正準備從 3.7.x 甚至 3.6.x 直接躍遷到 3.8,建議先泡一杯咖啡,再把我這篇踩坑日記當恐怖片看——因為今晚的鬼,可能明晚就爬到你家網關。


一、升級前:我們本來信心爆棚

看起來穩如老狗,對吧?


二、第一波 502:Lua 插件熱升級成了“熱炸彈”

2.1 現場回放

00:11 —— Ansible 把最后一個節點升級到 3.8,Kong 進程優雅重啟,status 接口 200。
00:12 —— Nginx error.log 突然像機槍掃射:

2025/06/14 00:12:41 [error] 42#0: *154437 lua entry thread aborted: runtime error: .../kong/plugins/custom-auth/handler.lua:89: attempt to index local 'conf' (a nil value)
while sending to client, client: 10.244.5.21, server: kong, request: "GET /api/order/123 HTTP/2.0", upstream: "http://10.244.9.77:8080", host: "mall.example.com"

緊接著,Prometheus 的 kong_http_status{code="502"} 從 0 飆到 8000+ qps。

2.2 根因定位

2.3 回滾?抱歉,Deck 把路堵死了

當時我們想:回滾!但悲劇的是——

于是群里出現一句絕望名言:

“升上去是英雄,想下來是狗熊。”


三、第二條命:藍綠 + deck dump 兩行命令

3.1 藍綠發布才是親爹

凌晨 1:00,我們決定徹底放棄“滾動升級”,啟用藍綠:

3.2 deck CLI 的爽點:兩行命令 120 秒回滾

deck 在 1.29 之后支持 --rbac-resources-only--select-tag,我們把“藍綠”玩出了花:

# 1. 從藍集群(3.7)dump 出干凈的配置
deck dump --kong-addr https://blue-admin:8444 \
          --headers "kong-admin-token:$TOKEN" \
          --output-file blue-3.7.yaml \
          --skip-consumers false

# 2. 把藍配置同步到綠集群(3.8)并強制覆蓋
deck diff --kong-addr https://green-admin:8444 \
          --state blue-3.7.yaml \
          --headers "kong-admin-token:$TOKEN"

deck sync  --kong-addr https://green-admin:8444 \
          --state blue-3.7.yaml \
          --headers "kong-admin-token:$TOKEN"

從 dump 到 ALB 切流,全程 120 秒,SLA 掉到 99.92% 后馬上回升到 99.99%。


四、填坑攻略:如何優雅地再上 3.8

4.1 插件改造 Checklist

  1. Redis 字段對齊:統一 redis.timeoutredis.connect_timeout,否則 3.8 啟動即崩潰。
  2. schema 兼容性:在 schema.lua 里加 legacy = true 標記,讓 3.7 和 3.8 都能識別。
  3. 熱升級測試

4.2 藍綠發布腳本模板

我們把當晚的腳本抽象成了 GitHub Actions workflow(已脫敏):

name: blue-green-upgrade
on:
  workflow_dispatch:
    inputs:
      version:
        description: 'target Kong version'
        required: true
        default: '3.8.1.1'
jobs:
  build-green:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: build green AMI
        run: |
          packer build -var kong_version=${{ github.event.inputs.version }} kong-green.pkr.hcl
      - name: terraform apply green
        run: |
          terraform apply -auto-approve -var="green_version=${{ github.event.inputs.version }}"
      - name: wait for healthy
        run: |
          until curl -f https://green-admin:8444/status/ready; do sleep 5; done
      - name: deck sync config
        run: |
          deck sync --kong-addr https://green-admin:8444 --state prod.yaml
      - name: switch ALB
        run: |
          aws elbv2 modify-target-groups \
            --target-group-arn $BLUE_TG_ARN \
            --health-check-path "/status/unready"
          aws elbv2 modify-listener --listener-arn $ALB_LISTENER \
            --default-actions Type=forward,TargetGroupArn=$GREEN_TG_ARN

4.3 監控與回滾閘門


五、彩蛋:那些官方沒寫但你必須知道的細節

  1. Wasm 插件緩存路徑變動
    3.8 在 /usr/local/kong/wasmtime-cache 新增文件鎖,如果你用 tmpfs,記得加 size=1G,mode=1777,否則緩存寫爆直接 500。

  2. AI Gateway 計數器 License 陷阱
    3.8 引入 /license/report 的新字段 ai_requests,每調一次 LLM 就寫一次表;壓測時把 PG 寫滿,IO util 飆 90%。解決:把 ai_requests_reporting = off 寫進 kong.conf。

  3. OpenSSL 3.2 Security Level 2
    升級后所有 1024-bit RSA 證書直接拒絕握手,測試環境踩坑無數。提前用 openssl s_client -connect 掃一遍上游證書。


六、寫在最后的 3 句忠告

  1. 不要迷信“滾動升級”,藍綠才是網關升級的終極浪漫。
  2. deck dump 不是備份,它是時光機——請每月跑一次 deck dump --all-workspaces 并加密存 S3。
  3. Lua 插件是靈魂,也是炸彈——每次升級前,先把單元測試跑成煙花。

當你把以上三件事做成肌肉記憶,下一次“3.9 → 3.10”的凌晨,你就能在 Slack 里淡定地打出一句:

“流量已切綠,Prometheus 全綠,我去睡了,各位晚安。”

上一篇:

2025 PHP 面試題全攻略|語法基礎·Redis 消息隊列·實戰算法一文搞定大廠校招

下一篇:

Traefik Docker 自動證書崩潰應急方案:ZeroSSL 快速接入指南
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費