news 2026/9/22 1:30:21

K8S-Statefulset控制器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
K8S-Statefulset控制器

一、Statefulset控制器:概念、原理解读

StatefulSet是为了管理有状态服务的问题而设计的。

有状态服务

StatefulSet是有状态的集合,管理有状态的服务,它所管理的Pod的名称不能随意变化。数据持久化的目录也是不一样,每一个Pod都有自己独有的数据持久化存储目录。比如MySQL主从、redis集群等。

无状态服务

RC、Deployment、DaemonSet都是管理无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的。个体对整体无影响,所有pod都是共用一个数据卷的,部署的tomcat就是无状态的服务,tomcat被删除,在启动一个新的tomcat,加入到集群即可,跟tomcat的名字无关。

StatefulSet部分组成

  1. Headless Service:用来定义pod网路标识,生成可解析的DNS记录

  2. volumeClaimTemplates:存储卷申请模板,创建pvc,指定pvc名称大小,自动创建pvc,且pvc由存储类供应。

  3. StatefulSet:管理pod的

Headless service

Headless service不分配clusterIP,headless service可以通过解析service的DNS,返回所有Pod的dns和ip地址 (只有statefulSet部署的Pod才有DNS地址),普通的service,只能通过解析service的DNS返回service的ClusterIP。

为什么要用headless service(没有service ip的service)?

在使用Deployment时,创建的Pod名称是没有顺序的,是随机字符串,在用statefulset管理pod时要求pod名称必须是有序的每一个pod不能被随意取代,pod重建后pod名称还是一样的。因为pod IP是变化的,所以要用Pod名称来识别。pod名称是pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称。

1、headless service会为service分配一个域名

<service name>.$<namespace name>.svc.cluster.local

K8s中资源的全局FQDN格式:

Service_NAME.NameSpace_NAME.Domain.LTD.Domain.LTD.=svc.cluster.local.
[root@k8s-master deployment]# dig nginx-deploy-svc.default.svc.cluster.local @10.96.0.10 ; <<>> DiG 9.11.36-RedHat-9.11.36-14.el8_10 <<>> nginx-deploy-svc.default.svc.cluster.local @10.96.0.10 ;; global options: +cmd ;; Got answer: ;; WARNING: .local is reserved for Multicast DNS ;; You are currently testing what happens when an mDNS query is leaked to DNS ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19414 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: 16379d4770867ed4 (echoed) ;; QUESTION SECTION: ;nginx-deploy-svc.default.svc.cluster.local. IN A ;; ANSWER SECTION: nginx-deploy-svc.default.svc.cluster.local. 30 IN A 10.97.172.98 ;; Query time: 7 msec ;; SERVER: 10.96.0.10#53(10.96.0.10) ;; WHEN: 一 1月 13 01:25:21 EST 2025 ;; MSG SIZE rcvd: 141 [root@k8s-master deployment]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d4h nginx-deploy-svc NodePort 10.97.172.98 <none> 80:30676/TCP 2m20s

2、StatefulSet会为关联的Pod保持一个不变的Pod Name

statefulset中Pod的名字格式为 【 $(StatefulSet name)-$(pod序号) 】

3、StatefulSet会为关联的Pod分配一个dnsName

$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

二、Statefulset资源清单文件编写技巧

#查看定义Statefulset资源需要的字段 [root@k8s-master01~]# kubectl explain statefulset FIELDS: apiVersion <string> #定义statefulset资源需要使用的api版本 kind <string> #定义的资源类型 metadata <Object> #元数据 spec <Object> #定义容器相关的信息 #查看statefulset.spec字段如何定义 [root@k8s-master01~]# kubectl explain statefulset.spec FIELDS: podManagementPolicy <string> #pod管理策略 replicas <integer> #副本数 revisionHistoryLimit <integer> #保留的历史版本 selector <Object> -required- #标签选择器,选择它所关联的pod serviceName <string> -required- #headless service的名字 template <Object> -required- #生成pod的模板 updateStrategy <Object> #更新策略 volumeClaimTemplates <[]Object> #存储卷申请模板 #查看statefulset的spec.template字段如何定义? #对于template而言,其内部定义的就是pod,pod模板是一个独立的对象 [root@k8s-master01~]# kubectl explain statefulset.spec.template FIELDS: metadata <Object> spec <Object> #定义容器属性的

通过上面可以看到,statefulset资源中有两个spec字段。第一个spec声明的是statefulset定义多少个Pod副本(默认将仅部署1个Pod)、匹配Pod标签的选择器、创建pod的模板、存储卷申请模板,第二个spec是spec.template.spec:主要用于Pod里的容器属性等配置。

.spec.template里的内容是声明Pod对象时要定义的各种属性,所以这部分也叫做PodTemplate(Pod模板)。还有一个值得注意的地方是:在.spec.selector中定义的标签选择器必须能够匹配到spec.template.metadata.labels里定义的Pod标签,否则Kubernetes将不允许创建statefulset。

三、Statefulset使用案例:部署web站点

#编写一个Statefulset资源清单文件 [root@k8s-master01~]# cat statefulset.yaml apiVersion: v1 kind: Service metadata: name: nginx-svc labels: app: nginx spec: ports: - port: 80 name: web clusterIP: "None" selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx-svc" replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: web #更新资源清单文件 [root@k8s-master01~]# kubectl apply -f statefulset.yaml service/nginx created statefulset.apps/web created #查看statefulset是否创建成功 [root@k8s-master01~]# kubectl get statefulset NAME READY AGE web 2/2 42s #查看pod [root@k8s-master01~]# kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 2m17s web-1 1/1 Running 0 115s #通过上面可以看到创建的pod是有序的 #查看headless service [root@k8s-master01~]# kubectl get svc -l app=nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx ClusterIP None <none> 80/TCP 3m19s #查看pvc [root@k8s-master01~]# kubectl get pvc #查看pod主机名 [root@k8s-master01~]# for i in 0 1; do kubectl exec web-$i -- sh -c 'hostname';done web-0 web-1 #使用k运行一个提供nslookup命令的容器(bubybox:1.28),这个命令来自于dnsutils包,通过对pod主机名执行nslookup,可以检查它们在集群内部的DNS地址: [root@hd1 ~]# cat pod-second.yaml apiVersion: v1 kind: Pod metadata: name: pod-second labels: app: backend tier: db spec: containers: - name: busybox image: busybox:1.28 imagePullPolicy: IfNotPresent command: ["sh","-c","sleep 3600"] [root@hd1 ~]# kubectl apply -f pod-second.yaml [root@hd1 ~]# kubectl exec -it pod-second -- /bin/sh / # nslookup web-0.nginx.default.svc.cluster.local Server: 10.10.0.10 Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local Name: web-0.nginx.default.svc.cluster.local Address 1: 10.10.156.137 web-0.nginx.default.svc.cluster.local / # #statefulset创建的pod也是有dns记录的 Address: 10.10.209.154 #解析的是pod的ip地址,还可以解析 nginx.default.svc.cluster.local / # nslookup nginx.default.svc.cluster.local Server: 10.10.0.10 Address 1: 10.10.0.10 kube-dns.kube-system.svc.cluster.local Name: nginx.default.svc.cluster.local Address 1: 10.10.25.245 web-1.nginx.default.svc.cluster.local Address 2: 10.10.156.137 web-0.nginx.default.svc.cluster.local / #

四、Statefulset管理pod:扩容、缩容、更新

Statefulset实现pod的动态扩容

如果我们觉得两个副本太少了,想要增加,只需要修改配置文件statefulset.yaml里的replicas的值即可,原来replicas: 2,现在变成replicaset: 3,修改之后,执行如下命令更新:

[root@k8s-master01~]# kubectl apply -f statefulset.yaml service/nginx unchanged statefulset.apps/web configured [root@k8s-master01~]# kubectl get sts NAME READY AGE web 3/3 60m [root@k8s-master01~]# kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 61m web-1 1/1 Running 0 60m web-2 1/1 Running 0 79s #也可以直接编辑控制器实现扩容 [root@k8s-master01~]# kubectl edit sts web #这个是我们把请求提交给了apiserver,实时修改,把上面的spec下的replicas 后面的值改成4,保存退出 [root@k8s-master01~]# kubectl get pods -l app=nginx NAME READY STATUS RESTARTS AGE web-0 1/1 Running 0 62m web-1 1/1 Running 0 62m web-2 1/1 Running 0 3m13s web-3 1/1 Running 0 26s

Statefulset实现pod的动态缩容

如果我们觉得4个Pod副本太多了,想要减少,只需要修改配置文件statefulset.yaml里的replicas的值即可,把replicaset:4变成replicas: 2,修改之后,执行如下命令更新:

[root@k8s-master01~]# kubectl apply -f statefulset.yaml​service/nginx unchanged​statefulset.apps/web configured​[root@k8s-master01~]# kubectl get pods -l app=nginx​NAME READY STATUS RESTARTS AGE​web-0 1/1 Running 0 64m​web-1 1/1 Running 0 64m

Statefulset实现pod的更新

[root@k8s-worker01 ~]# docker load -i myapp.tar.gz [root@k8s-master01~]# kubectl edit sts web #修改镜像nginx变成- image: ikubernetes/myapp:v2,修改之后保存退出 [root@k8s-master01~]# kubectl get pods -o wide -l app=nginx NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 1/1 Running 0 18s 10.10.209.156 k8s-worker01 web-1 1/1 Running 0 36s 10.10.187.115 k8s-worker02 #查看pod详细信息 [root@k8s-master01~]# kubectl describe pods web-0 #可以看到pod已经使用刚才更新的镜像ikubernetes/myapp:v2
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 17:57:52

K8S-Service资源对象

一、概述 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资源&…

作者头像 李华
网站建设 2026/9/21 15:24:10

郭嘉队动手了?刺激消费扩大内需!

一&#xff0c;沪指新低砸出双底&#xff01;3800 点大胆布局&#xff0c;越跌越买正当时上证指数创了新低&#xff0c;从时间和空间两个维度看&#xff0c;这就是双底形态的第二只脚在落地&#xff0c;市场正在慢慢构筑底部。尐程序&#xff1a;期权汇之前大盘回升的时候&…

作者头像 李华
网站建设 2026/9/22 4:47:34

记力扣2105.给植物浇水 练习有感

Alice 和 Bob 打算给花园里的 n 株植物浇水。植物排成一行&#xff0c;从左到右进行标记&#xff0c;编号从 0 到 n - 1 。其中&#xff0c;第 i 株植物的位置是 x i 。每一株植物都需要浇特定量的水。Alice 和 Bob 每人有一个水罐&#xff0c;最初是满的 。他们按下面描述的方…

作者头像 李华
网站建设 2026/9/21 12:53:56

突破性智能容器管理:自托管服务器的革命性演进

突破性智能容器管理&#xff1a;自托管服务器的革命性演进 【免费下载链接】Cosmos-Server ☁️ The Most Secure and Easy Selfhosted Home Server. Take control of your data and privacy without sacrificing security and stability (Authentication, anti-DDOS, anti-bot…

作者头像 李华
网站建设 2026/9/22 2:11:17

超越Borel:论非Borel集的存在性、构造及其在实分析中的核心作用

摘要&#xff1a;在标准拓扑空间&#xff08;如ℝⁿ&#xff09;中&#xff0c;Borel集构成了由开集生成的σ-代数&#xff0c;是实分析、测度论与拓扑学中研究的基本对象。然而&#xff0c;Borel集并未穷尽所有可能的子集&#xff1b;存在大量复杂程度更高、结构更丰富的非Bor…

作者头像 李华
网站建设 2026/9/21 7:57:11

百度网盘提取码智能查询工具:告别繁琐搜索的终极方案

百度网盘提取码智能查询工具&#xff1a;告别繁琐搜索的终极方案 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗&#xff1f;当你满怀期待地打开一个资源分享链接&#xff0c;却发现需…

作者头像 李华