k8s~service負載(zai)到pod的狀態(tai)保(bao)持
nginx或者其它負載均衡(heng)軟件都有一(yi)個能力,就是當客(ke)戶請求一(yi)個網頁時(shi),第一(yi)次訪問(wen)的是A服務器,第二次也(ye)就會讓你訪問(wen)A服務器,而在k8s里(li),也(ye)有這種機制和能力。
k8s的Session affinity
-
Service同樣也支持Session affinity(粘(zhan)性(xing)會(hui)話)機制,可以將來自同一個(ge)客戶(hu)端的請求(qiu)始終轉發至同一個(ge)后端的Pod對(dui)象,這(zhe)意味著它會(hui)影響調(diao)度(du)算法(fa)的流量分發功(gong)用(yong)(yong),進(jin)而降低其負載均衡的效果。因此(ci),當客戶(hu)端訪問Pod中的應用(yong)(yong)程序時(shi)(shi),如果有(you)基(ji)于(yu)客戶(hu)端身(shen)份保存某些私有(you)信(xin)息,并(bing)基(ji)于(yu)這(zhe)些私有(you)信(xin)息追(zhui)蹤(zong)用(yong)(yong)戶(hu)的活動等一類的需求(qiu)時(shi)(shi),那么應該啟用(yong)(yong)session affinity機制。
-
Service affinity的效果(guo)僅(jin)(jin)僅(jin)(jin)在一(yi)段(duan)時(shi)間內(nei)生效,默認值為10800秒(miao),超出時(shi)長,客(ke)(ke)(ke)(ke)戶端(duan)(duan)(duan)再次訪問會(hui)重新調度。該(gai)機制僅(jin)(jin)能基(ji)于(yu)客(ke)(ke)(ke)(ke)戶端(duan)(duan)(duan)IP地址(zhi)識別客(ke)(ke)(ke)(ke)戶端(duan)(duan)(duan)身份(fen),它會(hui)將經由同一(yi)個NAT服務器進行原地址(zhi)轉換(huan)的所有(you)客(ke)(ke)(ke)(ke)戶端(duan)(duan)(duan)識別為同一(yi)個客(ke)(ke)(ke)(ke)戶端(duan)(duan)(duan),由此可知,其調度的效果(guo)并不理想。Service 資源 通(tong)過. spec. sessionAffinity 和. spec. sessionAffinityConfig 兩個字段(duan)配置粘性會(hui)話。 spec. sessionAffinity 字段(duan)用于(yu)定義要使用的粘性會(hui)話的類型,它僅(jin)(jin)支持使用“ None” 和“ ClientIP” 兩種屬性值。如下:
查看相關配置
[root@k8s-master mainfests]# kubectl explain svc.spec.sessionAffinity
KIND: Service
VERSION: v1
FIELD: sessionAffinity <string>
DESCRIPTION:
Supports "ClientIP" and "None". Used to maintain session affinity. Enable
client IP based session affinity. Must be ClientIP or None. Defaults to
None. More info:
//kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies
通過sessionAffinity實現客戶端與Pod的會話保持
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
selector:
app: myapp
release: canary
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800 #默認的過期時間是10800秒,到期后POD從新路由
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080
測試,同一個客戶端IP走一個POD
[root@k8s-master mainfests]# while true;do curl //192.168.56.11:30080/hostname.html;sleep 1;done
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt
myapp-deploy-69b47bc96d-hwbzt