Google Cloud Kubernetes-与Cloudflare的负载均衡器会话相似性

时间:2019-06-05 08:18:43

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

背景

我有一个Web应用程序,该应用程序已部署到具有多个Pod的部署中。该部署通过具有外部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附加到标头中的请求。是否可以定义负载均衡以查看此标头并根据其值重定向流量?

1 个答案:

答案 0 :(得分: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,也可以随时进行探索。

希望有帮助!