kubernetes - Google Cloud Kubernetes - 与 Cloudflare 的负载均衡器 session 关联

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

背景

我有一个 Web 应用程序,它部署到具有多个 pod 的部署中。部署通过带有外部 IP 的 kubernetes 服务暴露在互联网上。

通过Cloudflare对外暴露的IP:

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

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

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

我在开发环境中进行了检查,发现 session 亲和性运行不正常。

调查

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

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

可能的解决方案

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

最佳答案

最简单的使用方法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 中使用粘性 session 的更多信息。

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

希望对您有所帮助!

关于kubernetes - Google Cloud Kubernetes - 与 Cloudflare 的负载均衡器 session 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56456642/

相关文章:

google-app-engine - App Engine 之外的 db.model from_protobuf() 等效项?

networking - GCP - 无 Cloud NAT,但给定的公共(public) IP 离开 VPC

sql-server - 为 SQL Server 群集准备数据库

hadoop - 在 Kubernetes 上为 Apache Spark 部署 Elasticsearch

kubernetes - kubernetes 对象的完整列表在哪里?

java - 无法在 Android 应用程序中使用 Google 登录

load-balancing - 同一子网上的 F5 LTM

ssl - TLS 握手如何在负载平衡系统中工作?

Kubernetes -> 每个命名空间的内存消耗

angular - Angular 2+-动态更改应用程序的基本路径