背景
在使用Nginx作為前端頁(yè)面的反向代理時(shí),有時(shí)我們需要在服務(wù)端為用戶的本次訪問(wèn)保存一些臨時(shí)狀態(tài),這種臨時(shí)狀態(tài)通常被稱為 session。當(dāng)訪問(wèn)壓力增大時(shí),常用的辦法是開(kāi)啟多個(gè)服務(wù)端實(shí)例,然后使用Nginx一類的反向代理服務(wù)器進(jìn)行負(fù)載均衡。然而對(duì)于依賴會(huì)話與用戶進(jìn)行交互的頁(yè)面來(lái)說(shuō),由于負(fù)載均衡可能會(huì)將同一用戶的兩次訪問(wèn)分發(fā)到不同的服務(wù)端上,這樣會(huì)話就無(wú)法正常運(yùn)作了。而解決這個(gè)問(wèn)題有最常用的兩種方法,
- 一種是在應(yīng)用層面上作修改,以支持會(huì)話共享。
- 一種方式則是使用會(huì)話粘粘:在客戶端第一次發(fā)起請(qǐng)求時(shí),反向代理為客戶端分配一個(gè)服務(wù)端,并且將該服務(wù)端的地址以SetCookie的形式發(fā)送給客戶端,這樣客戶端下一次訪問(wèn)該反向代理時(shí),便會(huì)帶著這個(gè)cookie,里面包含了上一次反向代理分配給該客戶端的服務(wù)端信息。
在Nginx中,這種機(jī)制是通過(guò)一個(gè)名為Sticky的插件實(shí)現(xiàn)的。而Traefik則集成了與Nginx的sticky sessions相同功能,并且可以在Kubernetes中方便的開(kāi)啟和配置該特性。
關(guān)于Traefik 服務(wù)發(fā)現(xiàn)部署部分可以參照之前的文章
Kubernetes 服務(wù)發(fā)布之traefik ingress
kubernetes 中service開(kāi)啟Sticky
Kubernetes中可以通過(guò)為指定的service對(duì)象或ingress對(duì)象聲明annotation來(lái)為ingress controller做額外的詳細(xì)配置。例如,如果要開(kāi)啟sticky,只需要在想要開(kāi)啟sticky的服務(wù)端對(duì)應(yīng)的service上添加以下的annotation即可。
示例配置
apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: kube-system
annotations:
traefik.ingress.kubernetes.io/affinity: "true"
traefik.ingress.kubernetes.io/session-cookie-name: "traefik-cookie"
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- name: web
port: 80
targetPort: 8080
