背景信息
會話保持,有時也稱為“粘性會話”(Sticky Sessions)。啟用會話保持后,負載均衡會將來自同一客戶端的訪問請求持續分發到同一臺后端云服務器上進行處理。簡單來說,如果用戶需要登錄,就可以理解為會話;如果不需要登錄,就可以理解為連接。
實際上,會話保持機制與負載均衡的基本功能是完全矛盾的。負載均衡的目標是將來自客戶端的連接和請求均衡地轉發至后端的多臺服務器,以避免單臺服務器負載過高;而會話保持機制則要求將某些請求轉發至同一臺服務器進行處理。因此,在實際的部署環境中,需要根據應用環境的特點選擇適當的會話保持機制。
前提條件
- 確保您已經創建Serverless集群,具體操作請參閱創建Serverless集群。
- 確保kubectl工具已經連接目標集群。
- 確保您的Serverless集群群已安裝CoreDNS插件。
操作步驟
不啟用會話保持
步驟一:創建工作負載
創建一個nginx工作負載,并確保工作負載的實例個數大于1,部署2個副本,工作負載不需要其他的額外特殊配置。
- 登錄容器服務控制臺,在左側菜單欄選擇“集群”。
- 在集群列表頁面,選擇目標集群名稱,然后在左側菜單欄選擇“工作負載”下的“無狀態”,點擊“創建deployment”。
也可以使用yaml創建工作負載,創建nginx工作負載參考如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: registry-huadong1.crs-internal.daliqc.cn/open-source/nginx:1.25-alpine
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
protocol: TCP
步驟二:創建service服務
為nginx工作負載創建service,注意Session Affinity不需要設置,保持默認值即可。參考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
ports:
- port: 30003
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
步驟三:使用service域名訪問前端應用實現負載均衡
進入任意pod容器內部,發起服務調用,使用service域名訪問后端應用,在pod容器內部執行這個命令100次。
$for i in $(seq 1 100); do curl nginx-service.default:30003; done;
觀察工作負載日志,查看Pod實例的日志輸出。
可以看到服務請求會隨機的轉發到任一個Pod實例,實現了負載均衡。
啟用會話保持
步驟一:創建工作負載
創建一個nginx工作負載,部署2個副本。同“不啟用會話保持”。
步驟二:創建service服務
創建一個ClusterIP類型的服務(Service)并關聯到上述nginx工作負載,注意需要展開高級設置,并設置Session Affinity為客戶端IP。參考如下:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: default
spec:
ports:
- port: 30003
protocol: TCP
targetPort: 80
selector:
app: nginx
type: ClusterIP
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
當設置了會話保持之后,k8s會根據訪問的ip來把請求轉發給以前訪問過的pod,其中timeoutSeconds指的是會話保持的時間,這個時間默認是10800秒。
步驟三:使用service域名訪問前端應用實現會話保持
進入任意pod容器內部,發起服務調用,使用service域名訪問后端應用,在pod容器內部執行這個命令100次。
$for i in {1..100};do curl nginx-service:30003;done;
觀察工作負載日志,查看Pod實例的日志輸出。
可以看到服務請求會全部轉發到某一個Pod實例,進行會話保持。