Headless Service + StatefulSet

# 进调试 Pod
kubectl run tmp --image=tutum/dnsutils -it --rm -- /bin/bash

# 1) 查 Service 返回的全部 IP
dig +short redis-headless.demo.svc.cluster.local
10.244.1.9
10.244.2.7
10.244.3.11

# 2) 单独 ping 某一个 Pod
ping redis-1.redis-headless.demo.svc.cluster.local
# 固定解析到 10.244.2.7(redis-1 的 IP)

 

用 Headless Service + StatefulSet 部署一个 3 节点 Redis 集群,每个 Redis 实例能被 独立寻址,并且 直接通过 DNS 拿到各自 Pod IP。

  1. 创建 Headless Service(redis-headless)

yaml
复制
# redis-headless.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis-headless
  namespace: demo
spec:
  clusterIP: None          # 关键点:Headless
  selector:
    app: redis              # 必须跟 StatefulSet 模板标签一致
  ports:
  - name: redis
    port: 6379
    targetPort: 6379
 

  1. 创建 StatefulSet(3 副本)

yaml
复制
# redis-sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: demo
spec:
  serviceName: redis-headless   # 必须指向上面的 Headless Service
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:7-alpine
        ports:
        - containerPort: 6379
          name: redis
 
一键创建
bash
复制
kubectl create ns demo
kubectl apply -f redis-headless.yaml -f redis-sts.yaml
 

  1. 验证 DNS 返回 3 个 Pod IP

bash
复制
# 进调试 Pod
kubectl run tmp --image=tutum/dnsutils -it --rm -- /bin/bash

# 1) 查 Service 返回的全部 IP
dig +short redis-headless.demo.svc.cluster.local
10.244.1.9
10.244.2.7
10.244.3.11

# 2) 单独 ping 某一个 Pod
ping redis-1.redis-headless.demo.svc.cluster.local
# 固定解析到 10.244.2.7(redis-1 的 IP)
 

  1. 客户端直连任意节点

bash
复制
redis-cli -h redis-0.redis-headless.demo.svc.cluster.local -p 6379
redis-cli -h redis-1.redis-headless.demo.svc.cluster.local -p 6379
redis-cli -h redis-2.redis-headless.demo.svc.cluster.local -p 6379
 
每条命令都直达对应 Pod,不需要经过虚拟 IP,也没有负载均衡。
posted @ 2025-11-27 16:16  滴滴滴  阅读(3)  评论(0)    收藏  举报