clusterIp 与 statefulSet+headless 配置和使用场景对比
此篇文章是再前一篇实战部署k8s的基础上,请见前文,做mongodb部署优化的时候,主要针对于 pod连接 clusterIp 和statefulSet 服务 ,详细分析学习下两者的使用场景 和具体部署配置和连接配置
两者使用场景比较:
clusterIp 适用于需要均衡负载均衡的场景 随机流量分发到副本 比如前端访问后端服务 负载均衡自动处理流量转发
statefulSet+headless适用于指定的访问主从模式 需要有每个副本对应不同角色对应访问 比如 mongodb数据库 (因为读写操作不同)
配置对比:
service
type:service
......
spec
type:clusterIp
headless service
type:service
......
spe
clusterIp:none
连接对比:
因为 clusterIp 返回的是虚拟地址 直接通过 [serviceName].[namespace].svc.cluster.local 注意 这个自动转为虚拟ip 只会再k8s内部环境 当外部访问 比如外部服务访问内部集群服务时 只能通过获取的具体的clusterIp kubctl get svc -n [namespace]
但是 headless + statefulSet 返回的是podip 客户端和pod 连接都需要通过podIp连接 假设 pod名称为 mongodb 如果单个为mongodb-0 后期扩展多个副本时 为mongodb-0 ,mongodb-1... 连接配置为 mongodb-0?. [serviceName].[namespace].svc.cluster.local
如果多个为
mongodb://mongodb-0. [serviceName].[namespace].svc.cluster.local:27017,mongo-1. [serviceName].[namespace].svc.cluster.local:27017,mongo-2.mongo-headless.backend-space.svc.cluster.local:27017/myapp?replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=true
replicaSet=rs 声明这是副本集 retryWrites=true readPreference = 主从读写访问分配方式
要注意一点: 能直接通过 clusterIp svc.cluster.local 访问的情况 只有 无状态服务 即 deployment的时候 因为deployment 所有副本的作用是一样的 只要随机负载均衡到一个副本上即可 所以直接访问svc.cluster.local 自动转化虚拟ip
但对于有状态服务 statefulSet不论是 headless clusterIp:none 还是有clusterIp 都需要通过pod 拼接 并增加 replicaSet =rs参数 访问
写法含义具体说明
1.列出所有pod 只有这样pod内部的主从分配才会自动操作 当一个节点挂会自动分配另一个pod
2. replicaSet 声明副本集 是为了 自动发现主从 不会将本该到主节点的请求转到从节点 从而报错
3.不能使用clusterIp访问方式 不然会会处理成随机负载均衡 会把原本该发送给主节点的请求 发到从节点 引起报错
如果查看策略路由错误导致连接不通 需要配置策略路由表 podIp via veth 我之前再 K8S部署踩坑总结-CSDN博客 也提到过
关于主从策略的分配 只要pod之间的访问打通 mongodb会自动进行主从分配
下面整理下不同场景下 statefulSet服务访问参数:
1.高并发请求 (读多写少)
readPreference:secondaryPrefferd
效果:写 主节点 mongodb-0 读 自动分散到 mongodb -1 ...2 从节点 压力分散
2. 需要实时最新的数据
readPreference:primary
效果:读写都从主节点 mongodb- 0 因为能保证最新的数据
3. 可以允许数据有少量延迟
readPreference:secondary
效果:读请求都从从节点 mongodb -1 ..2如果服务都挂了就报错
更多推荐


所有评论(0)