Files

14 KiB
Raw Permalink Blame History

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 插件(自动完成):

  1. 分析需求IP 路由 + HMAC-SHA256 验证
  2. 生成带有适当错误处理的 Go 代码
  3. 构建、测试、部署 - 完全自动化

结果:保留原始功能,业务逻辑不变,无需手动编码。

迁移工作流

模式 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-snippetconfiguration-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 工作流

  1. 发现
kubectl get ingress -A -o yaml > backup.yaml
kubectl get configmap -n ingress-nginx ingress-nginx-controller -o yaml
  1. 兼容性分析

    • 标准注解:直接迁移
    • ⚠️ Snippet 注解:需要 WASM 插件
    • 识别模式:限流、认证、路由逻辑
  2. 并行部署

helm install higress higress/higress -n higress-system \
  --set global.ingressClass=nginx \
  --set global.enableStatus=false
  1. 自动化测试
./scripts/generate-migration-test.sh > test.sh
./test.sh ${HIGRESS_IP}
# ✅ 60/60 路由通过
  1. 插件开发(如需要)

    • 读取 higress-wasm-go-plugin 技能
    • 为自定义逻辑生成 Go 代码
    • 构建、验证、部署
    • 重新测试受影响的路由
  2. 逐步切换

    • 阶段 110% 流量 → 验证
    • 阶段 250% 流量 → 监控
    • 阶段 3100% 流量 → 下线 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 驱动的插件开发

  1. 需求分析AI 读取 snippet

    • IP 白名单验证
    • HMAC-SHA256 签名验证
    • 请求时间戳验证
    • 错误日志需求
  2. 自动生成的 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
}
  1. 自动化构建与部署
# 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 0AI 生成)
平均迁移时间 30 分钟 1-2 小时
需要停机时间 0 0
回滚复杂度 简单 简单

生产验证

  • 总计迁移的 Ingress 资源200+
  • 环境金融服务、电子商务、SaaS 平台
  • 成功率100%(所有生产部署成功)
  • 平均配置兼容性98%
  • 节省的插件开发时间80%AI 驱动的自动化)

何时使用每种模式

使用简单模式当:

  • 使用标准 Ingress 注解
  • 没有自定义 Lua 脚本或 snippet
  • 标准功能TLS、路由、限流、CORS、认证
  • 需要最快的迁移路径

使用复杂模式当:

  • ⚠️ 使用 server-snippetconfiguration-snippethttp-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

最佳实践

  1. 始终先在本地验证 - Kind 集群测试可发现 95%+ 的问题
  2. 迁移期间保持 nginx 运行 - 如需要可即时回滚
  3. 使用逐步流量切换 - 10% → 50% → 100% 并监控
  4. 利用 AI 进行插件开发 - 比手动编码节省 80% 时间
  5. 记录自定义插件 - AI 生成的代码包含内联文档

常见问题

Q我需要修改 Ingress YAML 吗?

A:不需要。使用常见注解的标准 Ingress 资源可直接在 Higress 上运行。

Qnginx ConfigMap 设置怎么办?

AAI agent 会分析 ConfigMap如需保留功能会生成 WASM 插件。

Q如果出现问题如何回滚

A:由于 nginx 在迁移期间继续运行只需切换回流量DNS/LB。建议迁移后保留 nginx 1 周。

QWASM 插件性能与 Lua 相比如何?

AWASM 插件是编译的vs 解释执行的 Lua通常更快且更安全。

Q我可以自定义 AI 生成的插件代码吗?

A:可以。所有生成的代码都是结构清晰的标准 Go 代码,如需要易于修改。

相关资源


语言English | 中文