背景
我有一个 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 随机重定向流量。
可能的解决方案
- 我发现可以根据以下条件对流量进行负载平衡 曲奇饼。创立本source .但它使用高级 Kubernetes 组件,如 BackendService 和 Ingress,需要 定义明确。您有更简单的解决方案吗?
- 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/