clusterIp 与 statefulSet+headless

两者使用场景比较:

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会自动进行主从分配