彻底解决K8s会话丢失问题:ingress-nginx Sticky Session配置指南
你是否遇到过用户登录状态频繁丢失、购物车数据异常、表单提交重复的问题?在Kubernetes集群中,这些现象往往与**会话保持(Sticky Session)**配置不当有关。本文将通过3个实战步骤+2个避坑指南,帮助你在15分钟内掌握ingress-nginx控制器的会话保持方案,确保用户请求稳定路由到同一后端Pod。
什么是Sticky Session(会话保持)
Sticky Session(会话保持) 是一种负载均衡机制,通过在客户端生成标识Cookie,确保同一用户的请求持续路由到集群中的特定后端Pod。这对于需要维持用户状态的应用(如电商系统、在线编辑器)至关重要。
ingress-nginx控制器通过Cookie亲和性实现会话保持,核心原理如下:
配置步骤:3步实现会话保持
步骤1:添加核心注解
在Ingress资源中添加以下注解启用Cookie亲和性:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: sticky-session-demo
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie" # 启用Cookie亲和性
nginx.ingress.kubernetes.io/session-cookie-name: "INGRESSCOOKIE" # 自定义Cookie名称
nginx.ingress.kubernetes.io/session-cookie-expires: "172800" # Cookie有效期(秒)
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" # 最大存活时间(秒)
spec:
ingressClassName: nginx
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-service
port:
number: 80
注解详细说明参见官方文档:docs/user-guide/nginx-configuration/annotations.md
步骤2:配置高级参数
根据业务需求添加可选注解,增强安全性和灵活性:
| 注解键 | 取值示例 | 说明 |
|---|---|---|
| nginx.ingress.kubernetes.io/session-cookie-secure | "true" | 仅通过HTTPS传输Cookie |
| nginx.ingress.kubernetes.io/session-cookie-samesite | "Lax" | 限制跨域Cookie发送 |
| nginx.ingress.kubernetes.io/affinity-mode | "persistent" | 禁用会话重平衡(默认balanced) |
| nginx.ingress.kubernetes.io/session-cookie-path | "/api" | 仅对指定路径启用会话保持 |
步骤3:应用配置并验证
- 应用Ingress配置:
kubectl apply -f sticky-session-ingress.yaml
- 检查控制器日志确认配置生效:
kubectl logs -n ingress-nginx ingress-nginx-controller-xxxx -f | grep "affinity"
- 验证Cookie生成:
curl -I demo.example.com
# 应返回Set-Cookie: INGRESSCOOKIE=xxxx; Path=/; Expires=...
避坑指南:2个常见问题解决方案
问题1:会话保持不生效
症状:客户端Cookie未生成,请求随机分发到不同Pod
排查方向:
- 确认IngressClassName是否正确设置为
nginx - 检查是否存在多个Ingress资源冲突(参考文档)
- 验证后端服务是否使用
ClusterIP类型(NodePort可能导致亲和性失效)
问题2:Pod扩缩容导致会话丢失
解决方案:
- 启用会话重平衡(默认开启):
nginx.ingress.kubernetes.io/affinity-mode: "balanced"
- 配置会话Cookie自动更新:
nginx.ingress.kubernetes.io/session-cookie-change-on-failure: "true"
监控与运维建议
推荐监控指标
通过Prometheus监控会话保持状态,关键指标:
nginx_ingress_controller_session_affinity_cookie_annotations:启用亲和性的Ingress数量nginx_ingress_controller_requests:按Cookie路由的请求占比
相关监控配置可参考:deploy/prometheus/prometheus.yaml
可视化监控面板
总结与最佳实践
- 生产环境配置:
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "APPSESSION"
nginx.ingress.kubernetes.io/session-cookie-secure: "true"
nginx.ingress.kubernetes.io/session-cookie-samesite: "Lax"
nginx.ingress.kubernetes.io/affinity-mode: "balanced"
- 版本兼容性:
- 1.9.0+版本支持
affinity-mode参数 - 1.12.0+版本修复Canary发布场景下的会话保持问题(Changelog)
- 替代方案:
- 无状态服务推荐使用JWT令牌替代会话保持
- 高并发场景可考虑
upstream-hash-by: "$request_uri"(文档)
收藏本文,下次遇到会话问题时直接对照配置!如有疑问,欢迎在评论区留言讨论会话保持在微服务架构中的最佳实践。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




