我在开发环境中使用了具有以下配置的minibike的粘性会话:
入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: gl-ingress
annotations:
nginx.ingress.kubernetes.io/affinity: cookie
kubernetes.io/ingress.class: "gce"
kubernetes.io/ingress.global-static-ip-name: "projects/oceanic-isotope-199421/global/addresses/web-static-ip"
spec:
backend:
serviceName: gl-ui-service
servicePort: 80
rules:
- http:
paths:
- path: /api/*
backend:
serviceName: gl-api-service
servicePort: 8080
服务:
apiVersion: v1
kind: Service
metadata:
name: gl-api-service
labels:
app: gl-api
annotations:
ingress.kubernetes.io/affinity: 'cookie'
spec:
type: NodePort
ports:
- port: 8080
protocol: TCP
selector:
app: gl-api
现在我已将我的项目部署到GKE粘性会话不再起作用 . 我相信原因是在GKE中配置的全局负载均衡器与NGINX Ingress控制器没有会话关联 . 任何人都有运气接线吗?任何帮助,将不胜感激 . 我想 Build 会话亲和性:客户端浏览器>负载均衡器>入口>服务 . 实际会话位于服务后面的pod中 . 它是一个API网关(用Zuul构建) .
4 回答
GCE / GKE Ingress控制器中尚未提供会话亲和性 .
在此期间和解决方法中,您可以直接使用GCE API来创建HTTP负载均衡器 . 请注意,您不能在同一群集中同时使用Ingress .
使用NodePort用于Kubernetes服务 . 在
spec.ports[*].nodePort
中设置端口的值,否则将分配随机的值Disable kube-proxy SNAT load balancing
从GCE API创建负载均衡器,并启用cookie session affinity . 作为后端使用1的端口 .
基于此:https://github.com/kubernetes/ingress-gce/blob/master/docs/annotations.md没有可用的注释,这可能会影响Google Cloud LoadBalancer(GCLB)的会话亲缘关系设置,该设置是由于创建入口而创建的 . 因此:
必须手动打开:如上所述,通过自己创建LB,或让入口控制器执行此操作,然后更改每个后端的后端配置(通过GUI或gcloud cli) . 恕我直言,后来似乎更快,更不容易出错 . (经过测试,配置更改自动传播后,LB返回了cookie "GCLB",后续请求包括cookie被路由到同一个节点)
正如Matt-y-er所正确指出的那样:service.spec "externalTrafficPolicy"必须设置为local "Local"才能禁止从GCLB选择的节点转发到另一个节点 . 然而:
仍然需要确保:
GCLB不应向节点发送流量,节点不运行pod或
确保所有节点上都有一个pod(并且只有一个pod,因为externalTrafficPolicy设置不会阻止多个本地pod上的负载均衡)
关于#3,简单的解决方案:
更复杂的解决方案(但允许比节点更少的pod):
似乎需要调整GCLB 's health check doesn',因为Ingress规则定义会自动为后端设置 Health 检查(而不是默认的healthz服务)
提供反关联性规则以确保每个节点上最多只有一个pod实例(https://kubernetes.io/docs/concepts/configuration/assign-pod-node/)
注意:上述反亲和版本于2018年7月24日在运行COS的2节点集群上测试了1.10.4-gke.2 kubernetes版本(默认GKE VM映像)
Good news! 最后,他们支持这些调整作为测试版功能!
从GKE版本1.11.3-gke.18开始,您可以使用Ingress配置后端服务的这些属性:
超时
连接耗尽超时
会话亲和力
后端服务的配置信息保存在名为BackendConfig的自定义资源中,您可以将其“附加”到Kubernetes服务 .
与其他甜蜜的beta功能(如CDN,Armor等...)一起,您可以在这里找到操作指南:https://cloud.google.com/kubernetes-engine/docs/how-to/configure-backend-service
我在版本上尝试了gke教程:1.11.6-gke.6(最新版本) . 粘性不存在......只有在服务上找到externalTrafficPolicy“:”Local“之后,工作的唯一选择才...
我打开缺陷谷歌一样,他们接受了它,没有承诺eta . https://issuetracker.google.com/issues/124064870