我有一个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重定向流量,并且流量是随机的。
答案 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,也可以随时进行探索。
希望有帮助!