1.应用场景
- 稳定的不共享持久化存储:即每个pod的存储资源是不共享的,且pod重新调度后还是能访问到相同的持久化数据,基于pvc实现。
- 稳定的网络标志:即pod重新调度后其PodName和HostName不变,且PodName和HostName是相同的,基于Headless Service来实现的。
- 有序部署,有序扩展:即pod是有顺序的,在部署或者扩展的时候是根据定义的顺序依次依序部署的(即从0到N-1,在下一个Pod运行之前所有之前的pod必都是Running状态或者Ready状态),是基于init containers来实现的。
- 有序收缩:在pod删除时是从最后一个依次往前删除,即从N-1到0.
基于上面的特性,可以发现statefulset由以下几个部分组成:
- 用于定义网络标志(DNS domain)的headless service
- 用于**创建pvc的volumeClaimTemplates**
- 具体的statefulSet应用
2.示例
2.1创建yaml文件
[root@vm21 opt]# vi statefulset-demo.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # 要点1,可以不用指定clusterIP
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" # 要点2,指定serviceName名称
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
name: web
2.2应用yaml文件
[root@vm21 opt]# kubectl apply -f statefulset-demo.yaml
service/nginx created
statefulset.apps/web created
2.3查看资源清单
[root@vm21 opt]# kubectl get pods,svc,sts
NAME READY STATUS RESTARTS AGE
pod/web-0 1/1 Running 0 10m
pod/web-1 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 109m
service/nginx ClusterIP None <none> 80/TCP 10m
NAME READY AGE
statefulset.apps/web 2/2 10m
2.4扩缩容
# 增加一个pod
[root@vm21 opt]# kubectl scale --replicas=3 sts web
statefulset.apps/web scaled
2.5查看资源清单
[root@vm21 opt]# kubectl get pods,svc,sts
NAME READY STATUS RESTARTS AGE
pod/web-0 1/1 Running 0 10m
pod/web-1 1/1 Running 0 10m
pod/web-2 1/1 Running 0 5m51s # 扩容后增加的pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 109m
service/nginx ClusterIP None <none> 80/TCP 10m
NAME READY AGE
statefulset.apps/web 3/3 10m
2.6创建外部测试pod
vi busubox-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
2.7stateful资源对照清单
[root@vm21 opt]# kubectl get pod -o wide |grep web
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-0 1/1 Running 0 35m 10.244.125.197 vm23 <none> <none>
web-1 1/1 Running 0 34m 10.244.14.5 vm22 <none> <none>
web-2 1/1 Running 0 30m 10.244.124.71 vm21 <none> <none>
2.8测试stateful解析
[root@vm21 opt]# kubectl exec -it busybox -- sh
/bin # nslookup web-0.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: web-0.nginx
Address 1: 10.244.125.197 web-0.nginx.default.svc.cluster.local #对照上面清单中web-0的IP为10.244.125.197
/bin # nslookup web-1.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: web-1.nginx
Address 1: 10.244.14.5 web-1.nginx.default.svc.cluster.local #对照上面清单中web-0的IP为10.244.14.5
/bin # nslookup web-2.nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: web-2.nginx
Address 1: 10.244.124.71 web-2.nginx.default.svc.cluster.local #对照上面清单中web-0的IP为10.244.124.71
/ # ping web-0.nginx
PING web-0.nginx (10.244.125.197): 56 data bytes #对照上面清单中web-0的IP为10.244.125.197
64 bytes from 10.244.125.197: seq=0 ttl=63 time=0.173 ms
64 bytes from 10.244.125.197: seq=1 ttl=63 time=0.081 ms
64 bytes from 10.244.125.197: seq=2 ttl=63 time=0.139 ms
^C
--- web-0.nginx ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.081/0.131/0.173 ms
/ # wget web-0.nginx
Connecting to web-0.nginx (10.244.125.197:80)
index.html 100% |*****************************************************| 615 0:00:00 ETA
/ # cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
2.9小结
1)有序索引
对于具有 N 个副本的 StatefulSet,StatefulSet 中的每个 Pod 将被分配一个整数序号, 从 0 到 N-1,该序号在 StatefulSet 上是唯一的。比如``sts name=nginx ,replicas=3则对应的pod名称依次为nginx-0、nginx-1、nginx-2`,
2)稳定的网络ID
StatefulSet 可以使用 "无头服务" 控制它的 Pod 的网络域。管理域的这个服务的格式为:
$(服务名称).$(命名空间).svc.cluster.local
其中 cluster.local 是集群域。
一旦每个 Pod 创建成功,就会得到一个匹配的 DNS 子域,格式为:
$(pod 名称).$(所属服务的 DNS 域名)
其中所属服务由 StatefulSet 的 serviceName 域来设定。
分类:
容器docker/k8s
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2017-06-29 在Windows下搭建基于nginx的视频直播和点播系统
2017-06-29 Linux下视频流媒体直播服务器搭建详解
2017-06-29 四款好用的免费直播编码推流软件
2017-06-29 如何生成HLS协议的M3U8文件
2017-06-29 Web视频播放 之 【HTML5 Video标签】
2017-06-29 谷歌浏览器Chrome播放rtsp视频流解决方案
2016-06-29 linux 调试利器gdb, strace, pstack, pstree, lsof