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。
-
创建 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
-
创建 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
-
验证 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)
-
客户端直连任意节点
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,也没有负载均衡。
时来天地皆同力,运去英雄不自由
浙公网安备 33010602011771号