Kubernetes(二十三)Service(二)会话保持和获取客户端的ip

  • Post author:
  • Post category:其他



接上

一   了解基本的

术语

备注: 关于'各个术语',后续会'补充自己写的相关博客',构成一个'系列'

二   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 



四层Service获取源IP

(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后续专题讲解

说明: 由于不同的云厂商,'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'



关于上述问题在华为CCE官网



版权声明:本文为wzj_110原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。