GKE负载均衡器-Ingress-服务-会话亲和性(粘性会话)咨询
嘿,结合你已经在开发环境用minibike实现粘性会话的经验,我来给你详细梳理下GKE环境下配置负载均衡、Ingress及服务会话亲和性的正确姿势,主要分GCE原生Ingress和NGINX Ingress两种常见场景来说明:
一、GCE原生Ingress配置粘性会话
你之前的配置里用了kubernetes.io/ingress.class: "gce",但加了NGINX的亲和性annotation,这其实不会生效——因为GCE Ingress只识别自己专属的annotations,NGINX的规则对它没用。下面是正确的配置方式:
1. 服务(Service)配置
对于HTTP/HTTPS服务,GCE的会话亲和性是在负载均衡器(Ingress)层面实现的,Service本身不需要额外配置(除非是TCP/UDP服务,后面会提到)。确保你的Service是ClusterIP或NodePort类型即可(GCE Ingress会自动为ClusterIP Service创建NodePort)。
2. Ingress配置
使用cloud.google.com/开头的annotations来启用Cookie-based粘性会话,同时注意使用最新的Ingress API版本:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gl-ingress annotations: kubernetes.io/ingress.class: "gce" # 简化静态IP配置,只需IP名称(GKE会自动识别当前项目) kubernetes.io/ingress.global-static-ip-name: "web-static-ip" cloud.google.com/affinity: "cookie" # 启用基于Cookie的会话亲和性 cloud.google.com/session-cookie-name: "GCE_SESSION" # 自定义Cookie名称(可选,默认是GCLBALANCE) cloud.google.com/affinity-duration: "3600s" # Cookie过期时间(可选,默认1小时) spec: defaultBackend: service: name: gl-ui-service port: number: 80 rules: - http: paths: - path: /api/* pathType: Prefix backend: service: name: gl-api-service port: number: 80
3. TCP/UDP服务的会话亲和性
如果是TCP或UDP协议的服务,需要在Service层面配置ClientIP亲和性:
apiVersion: v1 kind: Service metadata: name: gl-tcp-service spec: selector: app: gl-tcp-app ports: - port: 8080 targetPort: 8080 sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 3600 # 会话超时时间,默认3小时(10800秒)
二、NGINX Ingress配置粘性会话(适配你的开发环境)
如果你后续想切换到NGINX Ingress(和你开发环境用的minibike逻辑一致),配置方式和你之前的开发环境类似,但要确保Ingress Class匹配,并且使用正确的NGINX annotations:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gl-nginx-ingress annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/affinity: "cookie" # 启用Cookie亲和 nginx.ingress.kubernetes.io/session-cookie-name: "NGINX_SESSION" # 自定义Cookie名称 nginx.ingress.kubernetes.io/session-cookie-expires: "3600" # Cookie过期时间(秒) nginx.ingress.kubernetes.io/session-cookie-max-age: "3600" # Cookie最大存活时间 spec: defaultBackend: service: name: gl-ui-service port: number: 80 rules: - http: paths: - path: /api/* pathType: Prefix backend: service: name: gl-api-service port: number: 80
NGINX Ingress的粘性会话是在NGINX代理层面实现的,会给客户端返回指定的Cookie,后续请求携带该Cookie就会被路由到同一个Pod。
三、关键注意事项
- Ingress Class必须匹配:GCE和NGINX Ingress的annotations不通用,一定要确保Ingress Class和对应的annotations配对,否则配置完全不生效。
- API版本兼容性:
extensions/v1beta1已经被废弃,建议使用networking.k8s.io/v1版本的Ingress资源,避免后续集群升级出现兼容性问题。 - 静态IP简化配置:GKE中配置全局静态IP时,不需要写完整的项目路径,只需IP名称即可(前提是该IP在当前GCP项目下)。
- 会话稳定性提醒:粘性会话依赖Pod存活,如果Pod重启或被扩缩容替换,会话会丢失。如果是有状态服务,建议搭配分布式会话存储(比如Redis)来提升可靠性。
- 验证配置:配置完成后,用
kubectl describe ingress <ingress-name>查看Ingress事件,确认负载均衡器创建成功;也可以用curl -v https://your-domain.com测试,查看响应头中是否返回了配置的Cookie。
内容的提问来源于stack exchange,提问作者zmad5306




