如何使用Nginx Plus Ingress实现金丝雀部署中的粘性会话?
用Nginx Plus Ingress实现金丝雀部署与粘性会话
要在Nginx Plus Ingress中实现你需要的「金丝雀权重分配+已有会话粘性保留」效果,核心是通过Nginx Plus专属的Ingress注解组合配置,具体步骤如下:
1. 配置主服务Ingress(echo-v1)
先为主服务echo-v1创建Ingress,同时开启会话粘性,确保已有会话固定路由到v1,不受金丝雀规则影响:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo-main annotations: # 开启基于Cookie的会话粘性 nginx.org/affinity: "cookie" # 自定义粘性Cookie名称,可按需修改 nginx.org/affinity-cookie-name: "ECHO_SESSION" # 设置Cookie过期时间,示例为1小时 nginx.org/affinity-cookie-expires: "1h" # Cookie生效路径 nginx.org/affinity-cookie-path: "/" spec: ingressClassName: nginx-plus # 指定使用Nginx Plus IngressClass rules: - host: echo.example.com # 替换为你的实际域名 http: paths: - path: / pathType: Prefix backend: service: name: echo-v1 port: number: 80
2. 配置金丝雀服务Ingress(echo-v2)
为echo-v2创建金丝雀Ingress,通过权重控制新会话的流量分配,同时确保已有粘性会话的请求不会被路由到金丝雀服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo-canary annotations: # 标记当前Ingress为金丝雀实例 nginx.org/canary: "true" # 设置金丝雀服务接收的新会话权重(0-100),示例为20%新流量走v2 nginx.org/canary-weight: "20" # 基于Cookie过滤金丝雀流量:仅匹配无ECHO_SESSION Cookie的请求 nginx.org/canary-by-cookie: "ECHO_SESSION" nginx.org/canary-by-cookie-value: "~^$" # 正则匹配空值或不存在的Cookie spec: ingressClassName: nginx-plus rules: - host: echo.example.com http: paths: - path: / pathType: Prefix backend: service: name: echo-v2 port: number: 80
3. 权重调整与验证逻辑
- 权重调整:直接修改金丝雀Ingress的
nginx.org/canary-weight值即可:- 设为
0:所有新会话都路由到echo-v1 - 设为
100:所有新会话都路由到echo-v2 - 中间值(如50):按比例分配新会话流量
- 设为
- 验证效果:
- 已有会话:携带
ECHO_SESSIONCookie的请求,无论权重如何调整,始终返回echo-v1的版本号 - 新会话:清除Cookie后发起请求,会按权重比例随机路由到echo-v1或echo-v2
- 已有会话:携带
核心注解说明
| 注解 | 作用 |
|---|---|
nginx.org/affinity: cookie | 开启基于Cookie的会话粘性 |
nginx.org/affinity-cookie-name | 自定义用于粘性会话的Cookie名称 |
nginx.org/canary: "true" | 将Ingress标记为金丝雀实例,仅处理符合规则的流量 |
nginx.org/canary-weight | 控制金丝雀服务接收的新流量权重(范围0-100) |
nginx.org/canary-by-cookie | 指定用于过滤金丝雀流量的Cookie名称 |
nginx.org/canary-by-cookie-value | Cookie的匹配规则,这里用~^$匹配无Cookie或空Cookie的请求 |
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

