StatefulSet的每个Pod单独创建Service实践

 更新时间:2026年01月16日 09:02:10   作者:CN-FuWei  
本文介绍了如何为StatefulSet的每个Pod创建独立的Service,并提供了一个示例脚本,以批量生成Service定义,通过这种方式,可以实现从集群外部访问每个Pod的功能,并且可以根据需要配置不同的Service类型(如NodePort、LoadBalancer、ClusterIP+Ingress等)

一、实现目标

假设我们有一个 StatefulSet,名称为 my-db,其 Pod 名为:

my-db-0.my-db.default.svc.cluster.local
my-db-1.my-db.default.svc.cluster.local
...

我们想为每个 Pod 创建一个对应的 Service,让它们可以被集群外访问,如:

  • my-db-0 → 可通过 db0.example.com或 <NodeIP>:<port>访问
  • my-db-1 → 可通过 db1.example.com或 <NodeIP>:<port>访问

二、操作步骤

2.1 创建 StatefulSet(示例)

先假设你已经有如下 StatefulSet(这里以简单的 nginx 为例):

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-db
spec:
  serviceName: "my-db"
  replicas: 3
  selector:
    matchLabels:
      app: my-db
  template:
    metadata:
      labels:
        app: my-db
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

配套的 Headless Service(必须):

apiVersion: v1
kind: Service
metadata:
  name: my-db
spec:
  clusterIP: None
  selector:
    app: my-db
  ports:
  - port: 80
    targetPort: 80

2.2 为每个 Pod 创建独立 Service

我们可以写一个循环或使用 Helm 模板等方式批量生成 YAML,这里我手动展示前两个 Pod 的 Service 定义(my-db-0-svc和 my-db-1-svc)。

示例:为每个 Pod 创建 NodePort 类型的 Service

# Service for my-db-0
apiVersion: v1
kind: Service
metadata:
  name: my-db-0-svc
spec:
  selector:
    statefulset.kubernetes.io/pod-name: my-db-0
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30001   # 可选指定,范围 30000–32767
  type: NodePort
---
# Service for my-db-1
apiVersion: v1
kind: Service
metadata:
  name: my-db-1-svc
spec:
  selector:
    statefulset.kubernetes.io/pod-name: my-db-1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30002
  type: NodePort
---
# Service for my-db-2
apiVersion: v1
kind: Service
metadata:
  name: my-db-2-svc
spec:
  selector:
    statefulset.kubernetes.io/pod-name: my-db-2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30003
  type: NodePort

说明:

  • statefulset.kubernetes.io/pod-name: 这是一个 Kubernetes 内置的标签,表示 Pod 是由哪个 StatefulSet 创建的以及它的序号。
  • 我们通过这个 label selector 精确地选中某一个 Pod。
  • 每个 Service 都通过 NodePort 暴露出去,也可以替换为 LoadBalancer 或 ClusterIP+Ingress。

2.3 从集群外部访问

例如:

  • 访问 my-db-0:http://<NodeIP>:30001
  • 访问 my-db-1:http://<NodeIP>:30002

你也可以配置域名解析,将 db0.example.com 指向 <NodeIP>:30001,依此类推。

自动生成多个 Service(Shell 脚本方式)

当 Pod 数量较多时,可以使用脚本来生成 YAML 文件。例如:

for i in 0 1 2; do
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: my-db-${i}-svc
spec:
  selector:
    statefulset.kubernetes.io/pod-name: my-db-${i}
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 3000$((i+1))
  type: NodePort
EOF
done

补充:使用 Headless + External DNS + Ingress 等组合

对于更复杂的场景,还可以:

  • 使用 Ingress + 自定义 Host 匹配不同后端 Service
  • 使用 external-dns 自动注册 DNS 记录
  • 使用 Istio 等服务网格进行流量管理

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s部署ingress-nginx的详细步骤大全

    k8s部署ingress-nginx的详细步骤大全

    nginx一般是作为服务的入口,其在kubernetes的部署方式也大致相似,这篇文章主要给大家介绍了关于k8s部署ingress-nginx的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • kubernetes k8s CRD自定义资源学习笔记

    kubernetes k8s CRD自定义资源学习笔记

    这篇文章主要介绍了kubernetes k8s CRD自定义资源学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • keepalived nopreempt的应用场景及说明

    keepalived nopreempt的应用场景及说明

    文章详细介绍了keepalived高可用模式下`nopreempt`非抢占模式的应用场景,并探讨了不同配置下的VIP故障转移行为,同时,文章还解释了`notify`脚本的作用,包括触发时机和典型用途
    2026-01-01
  • 删除k8s环境过期镜像&docker磁盘清理方式

    删除k8s环境过期镜像&docker磁盘清理方式

    文章介绍了如何清理Kubernetes环境中的过期镜像和Docker磁盘空间,包括使用`docker system prune`命令和编写脚本进行镜像删除
    2025-12-12
  • Kubernetes集群环境初始化

    Kubernetes集群环境初始化

    这篇文章介绍了Kubernetes集群环境初始化的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • helmfile声明式部署Helm Chart使用详解

    helmfile声明式部署Helm Chart使用详解

    这篇文章主要为大家介绍了helmfile声明式部署Helm Chart使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • K8S中某个容器突然出现内存和CPU占用过高的问题及解决方案

    K8S中某个容器突然出现内存和CPU占用过高的问题及解决方案

    当K8S容器出现资源过载时,可通过kubectl监控定位问题,调整资源限制,优化应用代码,拆分多应用容器,利用监控工具排查,实施水平扩展或迁移负载,确保集群稳定运行
    2025-07-07
  • K8S加入新的node节点实现方式

    K8S加入新的node节点实现方式

    文章主要介绍了基于kubeadm安装的k8s集群加入新的节点的过程,包括初始化节点、安装Docker和相关组件、配置镜像下载加速器、添加软件源、安装组件、上传和解压镜像、加入新的节点并查看节点状态等步骤
    2026-04-04
  • StatefulSet的每个Pod单独创建Service实践

    StatefulSet的每个Pod单独创建Service实践

    本文介绍了如何为StatefulSet的每个Pod创建独立的Service,并提供了一个示例脚本,以批量生成Service定义,通过这种方式,可以实现从集群外部访问每个Pod的功能,并且可以根据需要配置不同的Service类型(如NodePort、LoadBalancer、ClusterIP+Ingress等)
    2026-01-01
  • k8s容器的内存设置的踩坑记录

    k8s容器的内存设置的踩坑记录

    这篇文章主要介绍了k8s容器的内存设置的踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07

最新评论