【问题标题】:Google Cloud Kubernetes - Load Balancer session affinity with CloudflareGoogle Cloud Kubernetes - 与 Cloudflare 的负载均衡器会话亲和性
【发布时间】:2019-10-20 17:41:22
【问题描述】:

背景

我有一个部署到多个 pod 部署的 Web 应用程序。部署通过具有外部 IP 的 kubernetes 服务暴露于 Internet。

通过 Cloudflare 向世界公开的外部 IP:

Client ---> Cloudflare ---> k8 service ---> pod

需要使用粘性会话定义此 Web 应用程序。所以我用sessionAffinity: ClientIP 修补了我的服务,如下所示:

kubectl patch service MYSERVICE  -p '{"spec":{"sessionAffinity":"ClientIP"}}'

我在开发环境上检查过,发现会话亲和性不好。

调查

我寻找粘性会话的问题。然后我发现 Cloudflare 调用方 IP 可以不时更改 - 随机更改。这会将所有用户重定向到另一个 pod - 这正是 Sticky Session 应该解决的问题。

所以,问题在于我的 Loadbalancer 服务根据 Cloudflare IP 重定向流量并且是随机的。

可能的解决方案

  1. 我发现可以根据 曲奇饼。创立了这个source。但它使用高级 Kubernetes 组件,例如 BackendService 和 Ingress,需要 定义明确。你有更简单的解决方案吗?
  2. Cloudflare 将真实客户端 IP 附加到标头中的请求。这是否可以定义负载平衡以查看此标头并根据其值重定向流量?

【问题讨论】:

    标签: kubernetes google-cloud-platform load-balancing google-kubernetes-engine


    【解决方案1】:

    使用Nginx Ingress Controller 最简单的方法是使用下面的官方入口资源示例。

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-test
      annotations:
        nginx.ingress.kubernetes.io/affinity: "cookie"
        nginx.ingress.kubernetes.io/session-cookie-name: "route"
        nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
        nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"    
    spec:
      rules:
      - host: stickyingress.example.com
        http:
          paths:
          - backend:
              serviceName: http-svc # k8 service name
              servicePort: 80 # k8 service port
            path: /
    

    为了使用它,你必须在你的 Kubernetes 集群上安装 Nginx Ingress Controller。您可以按照回答此post 的说明进行安装说明。然后应用上面的入口对象。

    您还可以阅读此blog 以获取有关如何在 Kubernetes 中使用粘性会话的更多信息。

    如果您可以使用它们,也可以随意探索其他 nginx ingress annotations

    希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 2019-06-12
      • 2020-10-06
      • 2013-02-09
      相关资源
      最近更新 更多