一 了解基本的
术语
备注: 关于'各个术语',后续会'补充自己写的相关博客',构成一个'系列'
二 Service的
会话粘滞
需求: 实现基于'客户端 IP' 的会话亲和性
效果: 来自'同一客户端(Client IP)'的请求与后端'某个pod'绑定('或者说映射'),如果没有特殊的配置,是'获取不了客户端的ip',获取的是'所访问的pod所在节点的ip'
更具体的效果: 如果'replicas=2'为两个副本,设置'sessionAffinity: ClientIP',那么请求只会到达'其中一个pod'上,另一个'pod'没有访问记录
辨析: 同一客户端'Client IP'的请求与pod进行'会话粘滞'和获取客户端的真实ip是'两码事情'
配置参数
'sessionAffinityConfig' --> 设置sessionAffinity的'有效期'
实验模板
创建
测试
测试思路:
1)同一客户端通过'curl'命令行多次进行访问 --> 为了防止'缓存'对实验结果造成影响,'不用浏览器'
2)观察两个pod的日志,看请求是否在'session的有效期内'定向调度到'某个具体'的pod上
3)开启'多个终端'观察
关于client ip,由于我们使用'flannel'的网络形式,并且是在master上'访问'
'命令行修改'
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClusterIP"}}'
kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}' #取消session
(1)
官网的说明
kubectl expose deployment source-ip-app --name=clusterip --port=80 --target-port=8080
说明: 通过'expose'命令的方式创建Service
备注: 如果'没有指定类型'默认就是'Cluster IP'
kubectl expose deployment source-ip-app --name=nodeport --port=80 --target-port=8080 --type=NodePort
说明: 由于不同的云厂商,'Load Blance'实现的差异性,后续讲解'几个大厂'的特性
(2)Node Port获取Client IP的方式
kubectl patch svc nodeport -p '{"spec":{"externalTrafficPolicy":"Local"}}'
说明: 下面的'备注'有问题,'Cluster'会造成'二跳'的
流量图
实验思路
通过'前后对比'修改该参数的数值,查看nginx日志中'客户端的ip'
测试如下
验证输出
继续验证
场景: 两个node,但是只有'一个副本',分别通过'node1:nodePort'和'node2:nodePort'访问'实验现象' --> '本次以浏览器的形式'
说明: 为了保持'实验环境的干净',把'工作负载删除',然后'重建'
说明: 很显然pod落在'node2上',我们尝试通过chrome浏览器访问--> 'node1:nodePort'
访问: 通过'node2:nodePort'的形式访问,并观察'nginx的日志'
后续探讨: 不设置保留源ip和设置保留源ip,'iptales规则是如何实现' --> '关于ipvs的实现先了解即可'
备注: 记得LVS的'Full Nat'方式,通过options的形式也可以获取'客户端的ip'
版权声明:本文为wzj_110原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。