You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

GKE负载均衡器-Ingress-服务-会话亲和性(粘性会话)咨询

GKE环境下配置会话亲和性(粘性会话)指南

嘿,结合你已经在开发环境用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

火山引擎 最新活动