# Nginx 到 Higress 迁移技能 一站式 ingress-nginx 到 Higress 网关迁移解决方案,提供智能兼容性验证、自动化迁移工具链和 AI 驱动的能力增强。 ## 概述 本技能基于真实生产环境迁移经验构建,提供: - 🔍 **配置分析与兼容性评估**:自动扫描 nginx Ingress 配置,识别迁移风险 - 🧪 **Kind 集群仿真**:本地快速验证配置兼容性,确保迁移安全 - 🚀 **灰度迁移策略**:分阶段迁移方法,最小化业务风险 - 🤖 **AI 驱动的能力增强**:自动化 WASM 插件开发,填补 Higress 功能空白 ## 核心优势 ### 🎯 简单模式:零配置迁移 **适用于使用标准注解的 Ingress 资源:** ✅ **100% 注解兼容性** - 所有标准 `nginx.ingress.kubernetes.io/*` 注解开箱即用 ✅ **零配置变更** - 现有 Ingress YAML 直接应用到 Higress ✅ **即时迁移** - 无学习曲线,无手动转换,无风险 ✅ **并行部署** - Higress 与 nginx 并存,安全测试 **示例:** ```yaml # 现有的 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:** ```nginx 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 插件**(自动完成): 1. 分析需求:IP 路由 + HMAC-SHA256 验证 2. 生成带有适当错误处理的 Go 代码 3. 构建、测试、部署 - **完全自动化** **结果**:保留原始功能,业务逻辑不变,无需手动编码。 ## 迁移工作流 ### 模式 1:简单迁移(标准 Ingress) **前提条件**:Ingress 使用标准注解(使用 `kubectl get ingress -A -o yaml` 检查) **步骤:** ```bash # 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 逻辑 **步骤:** ```bash # 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 工作流**: 1. **发现** ```bash kubectl get ingress -A -o yaml > backup.yaml kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml ``` 2. **兼容性分析** - ✅ 标准注解:直接迁移 - ⚠️ Snippet 注解:需要 WASM 插件 - 识别模式:限流、认证、路由逻辑 3. **并行部署** ```bash helm install higress higress/higress -n higress-system \ --set global.ingressClass=nginx \ --set global.enableStatus=false ``` 4. **自动化测试** ```bash ./scripts/generate-migration-test.sh > test.sh ./test.sh ${HIGRESS_IP} # ✅ 60/60 路由通过 ``` 5. **插件开发**(如需要) - 读取 `higress-wasm-go-plugin` 技能 - 为自定义逻辑生成 Go 代码 - 构建、验证、部署 - 重新测试受影响的路由 6. **逐步切换** - 阶段 1:10% 流量 → 验证 - 阶段 2:50% 流量 → 监控 - 阶段 3:100% 流量 → 下线 nginx ## 生产案例研究 ### 案例 1:电商 API 网关(60+ Ingress 资源) **环境**: - 60+ Ingress 资源 - 3 节点高可用集群 - 15+ 域名的 TLS 终止 - 限流、CORS、JWT 认证 **迁移:** ```yaml # 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 集群中验证**: ```bash # 直接应用,无需修改 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 配置**: ```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 驱动的插件开发**: 1. **需求分析**(AI 读取 snippet) - IP 白名单验证 - HMAC-SHA256 签名验证 - 请求时间戳验证 - 错误日志需求 2. **自动生成的 WASM 插件**(Go) ```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 } ``` 3. **自动化构建与部署** ```bash # 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 - < 0 → 复杂模式(AI 将处理插件生成) ``` ### 2. 本地验证(Kind) ```bash # 创建 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. 生产迁移 ```bash # 生成测试脚本 ./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) ``` ## 最佳实践 1. **始终先在本地验证** - Kind 集群测试可发现 95%+ 的问题 2. **迁移期间保持 nginx 运行** - 如需要可即时回滚 3. **使用逐步流量切换** - 10% → 50% → 100% 并监控 4. **利用 AI 进行插件开发** - 比手动编码节省 80% 时间 5. **记录自定义插件** - 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 代码,如需要易于修改。 ## 相关资源 - [Higress 官方文档](https://higress.io/) - [Nginx Ingress Controller](https://kubernetes.github.io/ingress-nginx/) - [WASM 插件开发指南](./SKILL.md) - [注解兼容性矩阵](./references/annotation-mapping.md) - [内置插件目录](./references/builtin-plugins.md) --- **语言**:[English](./README.md) | [中文](./README_CN.md)