此篇文章是再前一篇实战部署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如果服务都挂了就报错 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐