两者使用场景比较:
clusterIp 适用于需要均衡负载均衡的场景 比如前端访问后端服务 负载均衡自动处理流量转发
statefulSet headless适用于指定的访问主从模式 需要有角色对应访问 比如 mongodb数据库
配置对比:
service
type:service
......
spec
type:clusterIp
headless service
type:service
......
spe
clusterIp:none
连接对比:
因为 clusterIp 返回的是虚拟地址 直接通过 [serviceName].[namespace].svc.cluster.local
但是 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
如果查看策略路由错误导致连接不通 需要配置策略路由表 podIp via veth 我之前再 K8S部署踩坑总结-CSDN博客 也提到过
关于主从策略的分配 只要pod之间的访问打通 mongodb会自动进行主从分配