本地K8s如何通过同端口独立域名直连StatefulSet有状态Pod
你需要的效果不需要部署额外的网络插件或入口控制器,仅用原生Service资源配合本地网络配置即可实现,全量适配Docker Desktop、minikube等本地K8s发行版,同时适用于Cassandra、etcd、Redis等所有StatefulSet部署的有状态服务。
核心实现逻辑
StatefulSet的每个Pod自带固定标签statefulset.kubernetes.io/pod-name=<statefulset名称>-<序号>,你只需要为每个Pod单独创建匹配对应标签的Service,所有Service统一使用9042端口,再解决本地域名解析和同端口流量转发的问题即可,完全不需要给不同Pod映射不同端口。
具体操作步骤
1. 为每个StatefulSet副本创建独立Service
直接部署以下YAML,注意把selector里的服务名、命名空间改成你自己环境的实际值:
apiVersion: v1 kind: Service metadata: name: cassandra-0 # 可选:指定和StatefulSet相同的命名空间 # namespace: default spec: type: ClusterIP ports: - port: 9042 targetPort: 9042 # 填Pod实际监听的服务端口 selector: statefulset.kubernetes.io/pod-name: cassandra-0 --- apiVersion: v1 kind: Service metadata: name: cassandra-1 spec: type: ClusterIP ports: - port: 9042 targetPort: 9042 selector: statefulset.kubernetes.io/pod-name: cassandra-1 --- apiVersion: v1 kind: Service metadata: name: cassandra-2 spec: type: ClusterIP ports: - port: 9042 targetPort: 9042 selector: statefulset.kubernetes.io/pod-name: cassandra-2
部署完成后,集群内部已经可以通过这三个Service的域名同端口访问对应Pod。
2. 配置本地路由实现同端口访问
利用本地回环段支持绑定多个IP的特性,给每个Service分配独立的本地回环IP,同端口转发不会产生冲突,是通用度最高的方案:
- 第一步:给本地回环接口添加3个额外IP
- Linux/macOS 执行以下命令:
sudo ifconfig lo0 alias 127.0.0.2 up sudo ifconfig lo0 alias 127.0.0.3 up sudo ifconfig lo0 alias 127.0.0.4 up - Windows 以管理员权限打开PowerShell执行:
netsh interface ip add address "Loopback Pseudo-Interface 1" 127.0.0.2 255.0.0.0 netsh interface ip add address "Loopback Pseudo-Interface 1" 127.0.0.3 255.0.0.0 netsh interface ip add address "Loopback Pseudo-Interface 1" 127.0.0.4 255.0.0.0
- Linux/macOS 执行以下命令:
- 第二步:启动端口转发,每个Service绑定到独立回环IP的9042端口
所有环境kubectl命令一致,加&可以让转发进程后台运行:kubectl port-forward --address 127.0.0.2 svc/cassandra-0 9042:9042 & kubectl port-forward --address 127.0.0.3 svc/cassandra-1 9042:9042 & kubectl port-forward --address 127.0.0.4 svc/cassandra-2 9042:9042 & - 第三步:修改本地hosts文件添加解析记录
不同系统hosts文件路径:- Linux/macOS:
/etc/hosts - Windows:
C:\Windows\System32\drivers\etc\hosts
在文件末尾添加以下三行:
127.0.0.2 cassandra-0 127.0.0.3 cassandra-1 127.0.0.4 cassandra-2 - Linux/macOS:
验证方式
配置完成后,本地直接用对应服务客户端连接cassandra-0:9042、cassandra-1:9042、cassandra-2:9042即可直连对应Pod,所有连接用的端口完全一致,满足客户端驱动的要求。
如果你用minikube,也可以把上述三个Service的type改成
LoadBalancer,执行minikube tunnel后会给每个Service分配独立的隧道IP,直接把这三个IP和对应域名写到hosts里即可,不需要做端口转发,效果完全一致。
内容的提问来源于stack exchange,提问作者Chameleon

