云容器引擎

会话保持最佳实践

2025-01-09 08:23:53

l  不使用会话保持

1、前提条件

创建一个nginx工作负载,并确保工作负载的实例个数大于1,工作负载不需要其他的额外特殊配置

创建一个ClusterIP类型的服务(Service)并关联到上述nginx工作负载,注意Session Affinity不需要设置,保持默认值即可

2、测试验证

发起服务调用,在集群节点上执行这个命令发起对服务的100次调用 > for i in {1..100};do curl 10.96.116.221:80;done;

上述curl命令中的IP和端口来自如下地方:

观察工作负载日志,第一个Pod实例的日志输出:

第二个Pod实例的日志输出:

结论:服务请求会随机的转发到任一个Pod实例

 

l  集群内请求会话保持

1、前提条件

创建一个nginx工作负载,同上。

创建一个ClusterIP类型的服务(Service)并关联到上述nginx工作负载,注意需要展开高级设置,并设置Session Affinity为客户端IP

2、测试验证

发起服务调用,同上。观察工作负载日志,

第一个Pod实例的日志输出:

第二个Pod实例的日志输出:

结论:服务请求会全部转发到某一个Pod实例,进行会话保持。

 

l  集群外NodePort访问请求会话保持

1、前提条件

创建一个nginx工作负载,同上。创建一个NodePort类型的服务(Service)并关联到上述nginx工作负载,指定一个合法的主机端口,注意需要展开高级设置,并设置Session Affinity为客户端IP

2、测试验证

发起服务调用;在集群外执行这个命令发起对服务的100次调用 > for i in {1..100};do curl 10.142.232.160:30080;done;

上述curl命令中的IP可以是集群的vip或者集群任意节点IP,端口是服务(Service)中指定的主机端口。

观察工作负载日志,第一个Pod实例的日志输出:

第二个Pod实例的日志输出:

结论:集群外的请求会全部转发到某一个Pod实例,进行会话保持。

 

l  集群外Ingress访问请求会话保持

1、前提条件

创建一个nginx工作负载,同上

创建一个ClusterIP类型的服务(Service)并关联到上述nginx工作负载,注意Session Affinity不需要设置,保持默认值即可

确保当前命名空间已经绑定到一个负载均衡器:

创建一个生产路由(Ingress)并关联到上述服务(Service)

手动编辑Ingress资源文件,添加如下注解:# kubectl edit ingresses nginx-http -napp-istio annotations: nginx.ingress.kubernetes.io/affinity: cookie

添加本地hosts映射:# ip为Nginx-Ingress-Controller的访问地址 # 域名为创建Ingress时填入的域名 10.142.232.160 nginx.ccse.io

2、发起服务调用

在浏览器中多次发起对服务的请求 > http://nginx.ccse.io:10080/

 

这里没法通过curl来测试验证,因为curl请求时没法保持Cookie

 

3、观察工作负载日志

第一个Pod实例的日志输出:

第二个Pod实例的日志输出:

结论:浏览器中的请求会全部转发到某一个Pod实例,进行会话保持

l  集群外TCP/UDP访问

结论:集群外通过TCP/UDP没法进行会话保持

 

2. 参考

https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/affinity/cookie


KWIfTogeVOuQ