首页 文章

GKE负载均衡器 - 入口 - 服务 - 会话亲和力(粘性会话)

提问于
浏览
5

我在开发环境中使用了具有以下配置的minibike的粘性会话:

入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gl-ingress
  annotations:
    nginx.ingress.kubernetes.io/affinity: cookie
    kubernetes.io/ingress.class: "gce"
    kubernetes.io/ingress.global-static-ip-name: "projects/oceanic-isotope-199421/global/addresses/web-static-ip"
spec:
  backend:
    serviceName: gl-ui-service
    servicePort: 80
  rules:
  - http:
      paths:
      - path: /api/*
        backend:
          serviceName: gl-api-service
          servicePort: 8080

服务:

apiVersion: v1
kind: Service
metadata:
  name: gl-api-service
  labels:
    app: gl-api
  annotations:
    ingress.kubernetes.io/affinity: 'cookie'
spec:
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
  selector:
    app: gl-api

现在我已将我的项目部署到GKE粘性会话不再起作用 . 我相信原因是在GKE中配置的全局负载均衡器与NGINX Ingress控制器没有会话关联 . 任何人都有运气接线吗?任何帮助,将不胜感激 . 我想 Build 会话亲和性:客户端浏览器>负载均衡器>入口>服务 . 实际会话位于服务后面的pod中 . 它是一个API网关(用Zuul构建) .

4 回答

  • 0

    GCE / GKE Ingress控制器中尚未提供会话亲和性 .

    在此期间和解决方法中,您可以直接使用GCE API来创建HTTP负载均衡器 . 请注意,您不能在同一群集中同时使用Ingress .

  • 0

    基于此:https://github.com/kubernetes/ingress-gce/blob/master/docs/annotations.md没有可用的注释,这可能会影响Google Cloud LoadBalancer(GCLB)的会话亲缘关系设置,该设置是由于创建入口而创建的 . 因此:

    • 必须手动打开:如上所述,通过自己创建LB,或让入口控制器执行此操作,然后更改每个后端的后端配置(通过GUI或gcloud cli) . 恕我直言,后来似乎更快,更不容易出错 . (经过测试,配置更改自动传播后,LB返回了cookie "GCLB",后续请求包括cookie被路由到同一个节点)

    • 正如Matt-y-er所正确指出的那样:service.spec "externalTrafficPolicy"必须设置为local "Local"才能禁止从GCLB选择的节点转发到另一个节点 . 然而:

    • 仍然需要确保:

    • GCLB不应向节点发送流量,节点不运行pod或

    • 确保所有节点上都有一个pod(并且只有一个pod,因为externalTrafficPolicy设置不会阻止多个本地pod上的负载均衡)

    关于#3,简单的解决方案:

    更复杂的解决方案(但允许比节点更少的pod):

    注意:上述反亲和版本于2018年7月24日在运行COS的2节点集群上测试了1.10.4-gke.2 kubernetes版本(默认GKE VM映像)

  • 4

    Good news! 最后,他们支持这些调整作为测试版功能!

    从GKE版本1.11.3-gke.18开始,您可以使用Ingress配置后端服务的这些属性:

    • 超时

    • 连接耗尽超时

    • 会话亲和力

    后端服务的配置信息保存在名为BackendConfig的自定义资源中,您可以将其“附加”到Kubernetes服务 .

    与其他甜蜜的beta功能(如CDN,Armor等...)一起,您可以在这里找到操作指南:https://cloud.google.com/kubernetes-engine/docs/how-to/configure-backend-service

  • 2

    我在版本上尝试了gke教程:1.11.6-gke.6(最新版本) . 粘性不存在......只有在服务上找到externalTrafficPolicy“:”Local“之后,工作的唯一选择才...

    spec:
      type: NodePort
      externalTrafficPolicy: Local
    

    我打开缺陷谷歌一样,他们接受了它,没有承诺eta . https://issuetracker.google.com/issues/124064870

相关问题