我们知道ip_hash通常用于负载均衡,可以让某一个客户端在一段时间内只固定访问负载均衡后端的真实服务器。这样就可以让客户端在一段时间内和负载后端某个真实服务器建立稳固的连接,继续保持会话。
如果是kubernetes集群中扩容了多个节点形成负载均衡。我们如何让service负载也实现ip_hash类似的功能呢?也很简单。
我用的是Helm。直接在Helm的templates/service.yaml文件添加下面这段代码:
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
service.spec.sessionAffinity这个字段默认为none,改成ClientIP表示会根据客户端IP地址来选择会话亲和性。service.spec.sessionAffinityConfig.clientIP.timeoutSeconds这个参数就是设置会话最长的粘性时间。如果不设置,则就是默认10800即3个小时。
我把配置文件拎出来,放到values中统一配置。
所以在values.yaml中修改service这一部分的代码:
service:
type: ClusterIP
port: 80
sessionAffinity: ClientIP
timeoutSeconds: 10800
然后再修改templates/service.yaml,完整的service.yaml如下:
apiVersion: v1
kind: Service
metadata:
name: {{ include "projectname.fullname" . }}
labels:
{{- include "projectname.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
sessionAffinity: {{ .Values.service.sessionAffinity }}
sessionAffinityConfig:
clientIP:
timeoutSeconds: {{ .Values.service.timeoutSeconds }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "projectname.selectorLabels" . | nindent 4 }}
最后测试一下:
helm install . --dry-run --debug .
官网参考地址:
https://kubernetes.io/docs/concepts/services-networking/service/