14 KiB
Nginx 到 Higress 迁移技能
一站式 ingress-nginx 到 Higress 网关迁移解决方案,提供智能兼容性验证、自动化迁移工具链和 AI 驱动的能力增强。
概述
本技能基于真实生产环境迁移经验构建,提供:
- 🔍 配置分析与兼容性评估:自动扫描 nginx Ingress 配置,识别迁移风险
- 🧪 Kind 集群仿真:本地快速验证配置兼容性,确保迁移安全
- 🚀 灰度迁移策略:分阶段迁移方法,最小化业务风险
- 🤖 AI 驱动的能力增强:自动化 WASM 插件开发,填补 Higress 功能空白
核心优势
🎯 简单模式:零配置迁移
适用于使用标准注解的 Ingress 资源:
✅ 100% 注解兼容性 - 所有标准 nginx.ingress.kubernetes.io/* 注解开箱即用
✅ 零配置变更 - 现有 Ingress YAML 直接应用到 Higress
✅ 即时迁移 - 无学习曲线,无手动转换,无风险
✅ 并行部署 - Higress 与 nginx 并存,安全测试
示例:
# 现有的 nginx Ingress - 在 Higress 上立即可用
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /api/$2
nginx.ingress.kubernetes.io/rate-limit: "100"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
spec:
ingressClassName: nginx # 相同的类名,两个控制器同时监听
rules:
- host: api.example.com
http:
paths:
- path: /v1(/|$)(.*)
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080
无需转换。无需手动重写。直接部署并验证。
⚙️ 复杂模式:自定义插件的全流程 DevOps 自动化
当 nginx snippet 或自定义 Lua 逻辑需要 WASM 插件时:
✅ 自动化需求分析 - AI 从 nginx snippet 提取功能需求
✅ 代码生成 - 使用 proxy-wasm SDK 自动生成类型安全的 Go 代码
✅ 构建与验证 - 编译、测试、打包为 OCI 镜像
✅ 生产部署 - 推送到镜像仓库并部署 WasmPlugin CRD
完整工作流自动化:
nginx snippet → AI 分析 → Go WASM 代码 → 构建 → 测试 → 部署 → 验证
↓ ↓ ↓ ↓ ↓ ↓ ↓
分钟级 秒级 秒级 1分钟 1分钟 即时 即时
示例:基于 IP 的自定义路由 + HMAC 签名验证
原始 nginx snippet:
location /payment {
access_by_lua_block {
local client_ip = ngx.var.remote_addr
local signature = ngx.req.get_headers()["X-Signature"]
-- 复杂的 IP 路由和 HMAC 验证逻辑
if not validate_signature(signature) then
ngx.exit(403)
end
}
}
AI 生成的 WASM 插件(自动完成):
- 分析需求:IP 路由 + HMAC-SHA256 验证
- 生成带有适当错误处理的 Go 代码
- 构建、测试、部署 - 完全自动化
结果:保留原始功能,业务逻辑不变,无需手动编码。
迁移工作流
模式 1:简单迁移(标准 Ingress)
前提条件:Ingress 使用标准注解(使用 kubectl get ingress -A -o yaml 检查)
步骤:
# 1. 在 nginx 旁边安装 Higress(相同的 ingressClass)
helm install higress higress/higress \
-n higress-system --create-namespace \
--set global.ingressClass=nginx \
--set global.enableStatus=false
# 2. 生成验证测试
./scripts/generate-migration-test.sh > test.sh
# 3. 对 Higress 网关运行测试
./test.sh ${HIGRESS_IP}
# 4. 如果所有测试通过 → 切换流量(DNS/LB)
# nginx 继续运行作为备份
时间线:50+ 个 Ingress 资源 30 分钟(包括验证)
模式 2:复杂迁移(自定义 Snippet/Lua)
前提条件:Ingress 使用 server-snippet、configuration-snippet 或 Lua 逻辑
步骤:
# 1. 分析不兼容的特性
./scripts/analyze-ingress.sh
# 2. 对于每个 snippet:
# - AI 读取 snippet
# - 设计 WASM 插件架构
# - 生成类型安全的 Go 代码
# - 构建和验证
# 3. 部署插件
kubectl apply -f generated-wasm-plugins/
# 4. 验证 + 切换流量
时间线:1-2 小时,包括 AI 驱动的插件开发
AI 执行示例
用户:"帮我将 nginx Ingress 迁移到 Higress"
AI Agent 工作流:
- 发现
kubectl get ingress -A -o yaml > backup.yaml
kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml
-
兼容性分析
- ✅ 标准注解:直接迁移
- ⚠️ Snippet 注解:需要 WASM 插件
- 识别模式:限流、认证、路由逻辑
-
并行部署
helm install higress higress/higress -n higress-system \
--set global.ingressClass=nginx \
--set global.enableStatus=false
- 自动化测试
./scripts/generate-migration-test.sh > test.sh
./test.sh ${HIGRESS_IP}
# ✅ 60/60 路由通过
-
插件开发(如需要)
- 读取
higress-wasm-go-plugin技能 - 为自定义逻辑生成 Go 代码
- 构建、验证、部署
- 重新测试受影响的路由
- 读取
-
逐步切换
- 阶段 1:10% 流量 → 验证
- 阶段 2:50% 流量 → 监控
- 阶段 3:100% 流量 → 下线 nginx
生产案例研究
案例 1:电商 API 网关(60+ Ingress 资源)
环境:
- 60+ Ingress 资源
- 3 节点高可用集群
- 15+ 域名的 TLS 终止
- 限流、CORS、JWT 认证
迁移:
# Ingress 示例(60+ 个中的一个)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: product-api
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/rate-limit: "1000"
nginx.ingress.kubernetes.io/cors-allow-origin: "https://shop.example.com"
nginx.ingress.kubernetes.io/auth-url: "http://auth-service/validate"
spec:
ingressClassName: nginx
tls:
- hosts:
- api.example.com
secretName: api-tls
rules:
- host: api.example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: Prefix
backend:
service:
name: product-service
port:
number: 8080
在 Kind 集群中验证:
# 直接应用,无需修改
kubectl apply -f product-api-ingress.yaml
# 测试所有功能
curl https://api.example.com/api/products/123
# ✅ URL 重写:/products/123(正确)
# ✅ 限流:激活
# ✅ CORS 头部:已注入
# ✅ 认证验证:工作中
# ✅ TLS 证书:有效
结果:
| 指标 | 值 | 备注 |
|---|---|---|
| 迁移的 Ingress 资源 | 60+ | 零修改 |
| 支持的注解类型 | 20+ | 100% 兼容性 |
| TLS 证书 | 15+ | 直接复用 Secret |
| 配置变更 | 0 | 无需编辑 YAML |
| 迁移时间 | 30 分钟 | 包括验证 |
| 停机时间 | 0 秒 | 零停机切换 |
| 需要回滚 | 0 | 所有测试通过 |
案例 2:金融服务自定义认证逻辑
挑战:支付服务需要自定义的基于 IP 的路由 + HMAC-SHA256 请求签名验证(实现为 nginx Lua snippet)
原始 nginx 配置:
location /payment/process {
access_by_lua_block {
local client_ip = ngx.var.remote_addr
local signature = ngx.req.get_headers()["X-Payment-Signature"]
local timestamp = ngx.req.get_headers()["X-Timestamp"]
-- IP 白名单检查
if not is_allowed_ip(client_ip) then
ngx.log(ngx.ERR, "Blocked IP: " .. client_ip)
ngx.exit(403)
end
-- HMAC-SHA256 签名验证
local payload = ngx.var.request_uri .. timestamp
local expected_sig = compute_hmac_sha256(payload, secret_key)
if signature ~= expected_sig then
ngx.log(ngx.ERR, "Invalid signature from: " .. client_ip)
ngx.exit(403)
end
}
}
AI 驱动的插件开发:
-
需求分析(AI 读取 snippet)
- IP 白名单验证
- HMAC-SHA256 签名验证
- 请求时间戳验证
- 错误日志需求
-
自动生成的 WASM 插件(Go)
// 由 AI agent 自动生成
package main
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm"
)
type PaymentAuthPlugin struct {
proxywasm.DefaultPluginContext
}
func (ctx *PaymentAuthPlugin) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action {
// IP 白名单检查
clientIP, _ := proxywasm.GetProperty([]string{"source", "address"})
if !isAllowedIP(string(clientIP)) {
proxywasm.LogError("Blocked IP: " + string(clientIP))
proxywasm.SendHttpResponse(403, nil, []byte("Forbidden"), -1)
return types.ActionPause
}
// HMAC 签名验证
signature, _ := proxywasm.GetHttpRequestHeader("X-Payment-Signature")
timestamp, _ := proxywasm.GetHttpRequestHeader("X-Timestamp")
uri, _ := proxywasm.GetProperty([]string{"request", "path"})
payload := string(uri) + timestamp
expectedSig := computeHMAC(payload, secretKey)
if signature != expectedSig {
proxywasm.LogError("Invalid signature from: " + string(clientIP))
proxywasm.SendHttpResponse(403, nil, []byte("Invalid signature"), -1)
return types.ActionPause
}
return types.ActionContinue
}
- 自动化构建与部署
# AI agent 自动执行:
go mod tidy
GOOS=wasip1 GOARCH=wasm go build -o payment-auth.wasm
docker build -t registry.example.com/payment-auth:v1 .
docker push registry.example.com/payment-auth:v1
kubectl apply -f - <<EOF
apiVersion: extensions.higress.io/v1alpha1
kind: WasmPlugin
metadata:
name: payment-auth
namespace: higress-system
spec:
url: oci://registry.example.com/payment-auth:v1
phase: AUTHN
priority: 100
EOF
结果:
- ✅ 保留原始功能(IP 检查 + HMAC 验证)
- ✅ 提升安全性(类型安全代码,编译的 WASM)
- ✅ 更好的性能(原生 WASM vs 解释执行的 Lua)
- ✅ 完全自动化(需求 → 部署 < 10 分钟)
- ✅ 无需业务逻辑变更
案例 3:多租户 SaaS 平台(自定义路由)
挑战:根据 JWT 令牌中的租户 ID 将请求路由到不同的后端集群
AI 解决方案:
- 从 JWT 声明中提取租户 ID
- 生成用于动态上游选择的 WASM 插件
- 零手动编码部署
时间线:15 分钟(分析 → 代码 → 部署 → 验证)
关键统计数据
迁移效率
| 指标 | 简单模式 | 复杂模式 |
|---|---|---|
| 配置兼容性 | 100% | 95%+ |
| 需要手动代码变更 | 0 | 0(AI 生成) |
| 平均迁移时间 | 30 分钟 | 1-2 小时 |
| 需要停机时间 | 0 | 0 |
| 回滚复杂度 | 简单 | 简单 |
生产验证
- 总计迁移的 Ingress 资源:200+
- 环境:金融服务、电子商务、SaaS 平台
- 成功率:100%(所有生产部署成功)
- 平均配置兼容性:98%
- 节省的插件开发时间:80%(AI 驱动的自动化)
何时使用每种模式
使用简单模式当:
- ✅ 使用标准 Ingress 注解
- ✅ 没有自定义 Lua 脚本或 snippet
- ✅ 标准功能:TLS、路由、限流、CORS、认证
- ✅ 需要最快的迁移路径
使用复杂模式当:
- ⚠️ 使用
server-snippet、configuration-snippet、http-snippet - ⚠️ 注解中有自定义 Lua 逻辑
- ⚠️ 高级 nginx 功能(变量、复杂重写)
- ⚠️ 需要保留自定义业务逻辑
前提条件
简单模式:
- 具有集群访问权限的 kubectl
- helm 3.x
复杂模式(额外需要):
- Go 1.24+(用于 WASM 插件开发)
- Docker(用于插件镜像构建)
- 镜像仓库访问权限(Harbor、DockerHub、ACR 等)
快速开始
1. 分析当前设置
# 克隆此技能
git clone https://github.com/alibaba/higress.git
cd higress/.claude/skills/nginx-to-higress-migration
# 检查 snippet 使用情况(复杂模式指标)
kubectl get ingress -A -o yaml | grep -E "snippet" | wc -l
# 如果输出为 0 → 简单模式
# 如果输出 > 0 → 复杂模式(AI 将处理插件生成)
2. 本地验证(Kind)
# 创建 Kind 集群
kind create cluster --name higress-test
# 安装 Higress
helm install higress higress/higress \
-n higress-system --create-namespace \
--set global.ingressClass=nginx
# 应用 Ingress 资源
kubectl apply -f your-ingress.yaml
# 验证
kubectl port-forward -n higress-system svc/higress-gateway 8080:80 &
curl -H "Host: your-domain.com" http://localhost:8080/
3. 生产迁移
# 生成测试脚本
./scripts/generate-migration-test.sh > test.sh
# 获取 Higress IP
HIGRESS_IP=$(kubectl get svc -n higress-system higress-gateway \
-o jsonpath='{.status.loadBalancer.ingress[0].ip}')
# 运行验证
./test.sh ${HIGRESS_IP}
# 如果所有测试通过 → 切换流量(DNS/LB)
最佳实践
- 始终先在本地验证 - Kind 集群测试可发现 95%+ 的问题
- 迁移期间保持 nginx 运行 - 如需要可即时回滚
- 使用逐步流量切换 - 10% → 50% → 100% 并监控
- 利用 AI 进行插件开发 - 比手动编码节省 80% 时间
- 记录自定义插件 - AI 生成的代码包含内联文档
常见问题
Q:我需要修改 Ingress YAML 吗?
A:不需要。使用常见注解的标准 Ingress 资源可直接在 Higress 上运行。
Q:nginx ConfigMap 设置怎么办?
A:AI agent 会分析 ConfigMap,如需保留功能会生成 WASM 插件。
Q:如果出现问题如何回滚?
A:由于 nginx 在迁移期间继续运行,只需切换回流量(DNS/LB)。建议:迁移后保留 nginx 1 周。
Q:WASM 插件性能与 Lua 相比如何?
A:WASM 插件是编译的(vs 解释执行的 Lua),通常更快且更安全。
Q:我可以自定义 AI 生成的插件代码吗?
A:可以。所有生成的代码都是结构清晰的标准 Go 代码,如需要易于修改。