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

时间:2018-03-30 20:43:45

标签: kubernetes google-kubernetes-engine

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

入口:

 df.withColumn("is_red", when(col("type").equalTo("Red"), "Red")
   .otherwise("not Red")
   .withColumn("portion", col("value")/sum("value)
   .over(Window.partitionBy(col"is_Red")))
   .drop(is_Red)

服务:

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

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

5 个答案:

答案 0 :(得分:4)

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

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

  1. 使用NodePort作为Kubernetes服务。在spec.ports[*].nodePort中设置端口的值,否则将分配随机的
  2. Disable kube-proxy SNAT load balancing
  3. 从GCE API创建负载均衡器,并启用cookie session affinity。作为后端使用1的端口。

答案 1 :(得分:2)

基于此:https://github.com/kubernetes/ingress-gce/blob/master/docs/annotations.md 没有可用的注释,该注释可能会影响通过Ingress创建而创建的Google Cloud LoadBalancer(GCLB)的会话相似性设置。因此:

  1. 必须手动打开它:如上面建议的那样,您自己创建LB,或者让入口控制器这样做,然后更改每个后端的后端配置(通过GUI或gcloud cli)。恕我直言,后者似乎更快,更不容易出错。 (经过测试,并且在配置更改自动传播后,LB返回了cookie“ GCLB”,并且随后的请求(包括cookie)被路由到了同一节点)
  2. 正如Matt-y-er正确指出的那样:service.spec“ externalTrafficPolicy”必须设置为本地“ Local”,以禁止从节点向选定的GCLB转发。但是:
  3. 仍然需要确保:
    • GCLB不应将流量发送到未运行Pod的节点或
    • 确保所有节点上都运行着一个Pod(并且只有一个Pod,因为externalTrafficPolicy设置不会阻止对多个本地Pod的负载平衡)

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

更复杂的解决方案(但其豆荚少于节点):

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

答案 2 :(得分:0)

好消息!最后,他们支持将这些调整作为beta功能!

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

  • 超时
  • 连接耗尽超时
  • 会话亲和力

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

连同其他可爱的beta功能(例如CDN,Armor等...),您可以在此处找到操作指南: https://cloud.google.com/kubernetes-engine/docs/how-to/configure-backend-service

答案 3 :(得分:0)

我正在尝试在版本1.11.6-gke.6(最新版本)上使用的gke教程。 粘性不存在...唯一有效的选择是在服务上使用了externalTrafficPolicy“:” Local“之后。

spec:
  type: NodePort
  externalTrafficPolicy: Local

我向google公开了同样的缺陷,他们接受了它,但没有承诺eta。 https://issuetracker.google.com/issues/124064870

答案 4 :(得分:0)

对于入口负载均衡器的BackendConfig,可以在这里找到文档: https://cloud.google.com/kubernetes-engine/docs/how-to/ingress-features

类型生成的cookie的示例片段是:

spec:
  timeoutSec: 1800
  connectionDraining:
    drainingTimeoutSec: 1800
  sessionAffinity:
    affinityType: "GENERATED_COOKIE"
    affinityCookieTtlSec: 1800