背景信息
会话保持,有时也称为“粘性会话”(Sticky Sessions)。启用会话保持后,负载均衡会将来自同一客户端的访问请求持续分发到同一台后端云服务器上进行处理。简单来说,如果用户需要登录,就可以理解为会话;如果不需要登录,就可以理解为连接。
实际上,会话保持机制与负载均衡的基本功能是完全矛盾的。负载均衡的目标是将来自客户端的连接和请求均衡地转发至后端的多台服务器,以避免单台服务器负载过高;而会话保持机制则要求将某些请求转发至同一台服务器进行处理。因此,在实际的部署环境中,需要根据应用环境的特点选择适当的会话保持机制。
前提条件
- 确保您已经创建SCE集群,具体操作请参阅创建SCE集群。
- 确保kubectl工具已经连接目标集群。
- 确保您的SCE集群已安装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.ctyun.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实例,进行会话保持。