概念:

StatefulSet是用来管理有状态应用的工作负载API对象,kubectl 中可以简写sts ,sts每一个pod生成一个唯一的标识符,sts_name-number,number从0开始。

StatefulSet会关联卷(volume),删除是不会删除卷,之后的PV,PVC的随笔中会陆续介绍。

StatefulSet需要headless service,需要你去常见该服务,之后service随笔也会陆续介绍。

StatefulSet不保证pod的数量,顺序创建,倒叙删除。

StatefulSet的命名需要遵守DNS子域名规范:

  • 不能超过253个字符
  • 只能包含小写字母,数字,以及'-'和'.'
  • 必须咦字母数开头
  • 必须以字母数字结尾

模板:

apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx ---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" #必须匹配 .spec.template.metadata.labels
replicas: 3 # 默认是1
selector:
matchLabels:
app: nginx #必须匹配 .spec.template.metadata.labels
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14
#image: nginx
ports:
- containerPort: 80
name: web

创建:

kubectl create -f sts-test.yaml

查看:

[root@k8s-master01 ns-slx-study]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 17m
web-1 1/1 Running 0 17m
web-2 1/1 Running 0 17m
[root@k8s-master01 ns-slx-study]# kubectl get sts
NAME READY AGE
web 3/3 45m

查看所有yaml:

[root@k8s-master01 ns-slx-study]# kubectl get sts web -o yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"StatefulSet","metadata":{"annotations":{},"name":"web","namespace":"default"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"serviceName":"nginx","template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.14","name":"web","ports":[{"containerPort":80}]}]}}}}
creationTimestamp: "2023-02-23T23:28:57Z"
generation: 7
name: web
namespace: default
resourceVersion: "291331"
uid: 4aa0221f-c60d-4f71-a2d2-07f8184f9191
spec:
podManagementPolicy: OrderedReady
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
serviceName: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.14
imagePullPolicy: IfNotPresent
name: web
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
status:
availableReplicas: 3
collisionCount: 0
currentReplicas: 3
currentRevision: web-54b86cbdbb
observedGeneration: 7
readyReplicas: 3
replicas: 3
updateRevision: web-54b86cbdbb
updatedReplicas: 3

不同于Deployment的strategy,sts的回滚策略字段为updateStrategy。

扩缩容:

扩容:

#将sts的副本增加到5
kubectl scale sts web --relicas=5
#可以使用命令查看扩容的过程
[root@k8s-master01 ns-slx-study]# kubectl get pod -w -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 28m
web-1 1/1 Running 0 28m
web-2 1/1 Running 0 28m
web-3 0/1 Pending 0 0s
web-3 0/1 Pending 0 0s
web-3 0/1 ContainerCreating 0 0s
web-3 0/1 ContainerCreating 0 1s
web-3 1/1 Running 0 51s
web-4 0/1 Pending 0 0s
web-4 0/1 Pending 0 0s
web-4 0/1 ContainerCreating 0 0s
web-4 0/1 ContainerCreating 0 1s
web-4 1/1 Running 0 62s

缩容:

#将sts web副本缩容到2个
[root@k8s-master01 ns-slx-study]# kubectl scale sts web --replicas=2
#查看缩容的过程
[root@k8s-master01 ns-slx-study]# kubectl get pod -w -l app=nginx
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 32m
web-1 1/1 Running 0 32m
web-2 1/1 Running 0 32m
web-3 1/1 Running 0 4m26s
web-4 1/1 Running 0 3m35s
web-4 1/1 Terminating 0 3m38s
web-4 1/1 Terminating 0 3m38s
web-4 0/1 Terminating 0 3m39s
web-4 0/1 Terminating 0 3m39s
web-4 0/1 Terminating 0 3m39s
web-3 1/1 Terminating 0 4m30s
web-3 1/1 Terminating 0 4m30s
web-3 0/1 Terminating 0 4m31s
web-3 0/1 Terminating 0 4m31s
web-3 0/1 Terminating 0 4m31s
web-2 1/1 Terminating 0 32m
web-2 1/1 Terminating 0 32m
web-2 0/1 Terminating 0 32m
web-2 0/1 Terminating 0 32m
web-2 0/1 Terminating 0 32m

更新:

更新策略:

On DElete策略:(不常用)

  OnDelete 更新策略实现了传统(1.7 版本之前)的行为,它也是默认的更新策略。当我们选择这个更新策略并修改 StatefulSet 的.spec.template 字段时,StatefulSet 控制器不会自动更新 Pod,必须手动删除 Pod 才能使控制器创建新的 Pod

Rolling Upddate 策略:

  RollingUpdate(滚动更新)更新策略会自动更新一个 StatefulSet 中所有的 Pod,采用与序号索引相反的顺序进行滚动更新

命令:

#我这里主要使用的rollingUpdate方式更新:
#命令行的方式:
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
#更改后的SetatefulSet:
kubectl get sts web -o yaml | grep -A 1 "updateStrategy" #以上都是1.7版本之前的操作,在1.7版本之后是默认rollingUpdate方式更新
#建议使用edit或者yaml文件的方式更新
#更新后会倒叙的方式依次删除重建
[root@k8s-master01 ns-slx-study]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 81s
web-1 1/1 Running 0 84s
web-2 1/1 Running 0 32s
web-3 0/1 ContainerCreating 0 1s
web-4 1/1 Running 0 4s

分段更新:

#比如我们定义一个分区"partition":3,可以使用 patch 或 edit 直接对 StatefulSet 进行设置:
使用命令更改:kubectl edit sts web
updateStrategy:
rollingUpdate:
partition: 3
type: RollingUpdate
这里面的parition的字段为3 ,保存退出,再更改镜像
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: web
ports:
- containerPort: 80
protocol: TCP
再更改镜像,是从最后的开始往3号位置更新到最后,是从最后开始更新,到3号结束
更改完之后是这样的:
- image: nginx:1.14
imagePullPolicy: IfNotPresent
image: nginx:1.14
imageID: docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
- image: nginx:1.14
imagePullPolicy: IfNotPresent
image: nginx:1.14
imageID: docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
- image: nginx:1.14
imagePullPolicy: IfNotPresent
image: nginx:1.14
imageID: docker-pullable://nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d
- image: nginx
imagePullPolicy: IfNotPresent
image: nginx:latest
imageID: docker-pullable://nginx@sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
- image: nginx
imagePullPolicy: IfNotPresent
image: nginx:latest
imageID: docker-pullable://nginx@sha256:6650513efd1d27c1f8a5351cbd33edf85cc7e0d9d0fcb4ffb23d8fa89b601ba8
#下面的两个镜像和上面的是不一样的

删除:

删除StatefulSet有两种方式:级联删除,非级联删除

使用非级联删除时,StatefulSet的pod不会被删除(很少使用)

使用级联删除时,StatefulSet和它的pod都会被删除

1,非级联删除

  使用kubectl delete sts xxx 删除StatefulSet的时候,只需要后面加上--cascade=false参数,就会采用非级联删除,此时删除StatefulSet不会删除它的pod

[root@k8s-master01 ns-slx-study]# kubectl get pod  #查看pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 11m
web-1 1/1 Running 0 11m
web-2 1/1 Running 0 11m
web-3 1/1 Running 0 9m41s
web-4 1/1 Running 0 9m44s
[root@k8s-master01 ns-slx-study]# kubectl delete sts web --cascade=false #使用非级联删除
warning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.
statefulset.apps "web" deleted
[root@k8s-master01 ns-slx-study]# kubectl get sts #查看以及没有sts,以及被删除
No resources found in default namespace.
[root@k8s-master01 ns-slx-study]# kubectl get pod #管理的pod并没有被删除
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 12m
web-1 1/1 Running 0 12m
web-2 1/1 Running 0 12m
web-3 1/1 Running 0 10m
web-4 1/1 Running 0 10m #由于此时删除了StatefulSet,它管理的pod变成了孤儿因此单独删除pod时,不会被重建
[root@k8s-master01 ns-slx-study]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 12m
web-1 1/1 Running 0 12m
web-2 1/1 Running 0 12m
web-3 1/1 Running 0 10m
web-4 1/1 Running 0 10m
[root@k8s-master01 ns-slx-study]# kubectl delete po/web-1
pod "web-1" deleted
[root@k8s-master01 ns-slx-study]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 15m
web-2 1/1 Running 0 15m
web-3 1/1 Running 0 13m
web-4 1/1 Running 0 13m

2,级联删除

  省略--cascade=false参数就是级联删除

[root@k8s-master01 ns-slx-study]# kubectl get pod
NAME READY STATUS RESTARTS AGE
web-0 1/1 Running 0 11s
web-1 1/1 Running 0 10s
web-2 1/1 Running 0 8s
[root@k8s-master01 ns-slx-study]# kubectl delete sts web
statefulset.apps "web" deleted
[root@k8s-master01 ns-slx-study]# kubectl get pod
No resources found in default namespace.
[root@k8s-master01 ns-slx-study]#

参考:StatefulSet | Kubernetes

StatefulSet 模板,更新,扩缩容,删除的更多相关文章

  1. Kubernetes 监控:Prometheus Adpater =》自定义指标扩缩容

    使用 Kubernetes 进行容器编排的主要优点之一是,它可以非常轻松地对我们的应用程序进行水平扩展.Pod 水平自动缩放(HPA)可以根据 CPU 和内存使用量来扩展应用,前面讲解的 HPA 章节 ...

  2. Docker Swarm(七)Scale 扩(缩)容服务

    扩(缩)容服务 扩容服务 Service还提供了复制(类似kubernetes里的副本)功能.可以通过 docker service scale 命令来设置服务中容器的副本数: docker serv ...

  3. 构建Docker平台【第四篇】创建服务及扩缩容等操作

    第一步:创建服务 1. 配置 nginx 的 yaml 文件 apiVersion: extensions/v1beta1 kind: Deployment metadata: name: my-ng ...

  4. Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler

    Knative Serving 默认情况下,提供了开箱即用的快速.基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA).下面带你体验如何在 Knative 中玩转 Au ...

  5. 如何根据不同业务场景调节 HPA 扩缩容灵敏度

    背景 在 K8s 1.18 之前,HPA 扩容是无法调整灵敏度的: 对于缩容,由 kube-controller-manager 的 --horizontal-pod-autoscaler-downs ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

  7. 从零入门 Serverless | Serverless Kubernetes 应用部署及扩缩容

    作者 | 邓青琳(轻零) 阿里云技术专家 导读:本文分为三个部分,首先给大家演示 Serverless Kubernetes 集群的创建和业务应用的部署,其次介绍 Serverless Kuberne ...

  8. Netty 如何高效接收网络数据?一文聊透 ByteBuffer 动态自适应扩缩容机制

    本系列Netty源码解析文章基于 4.1.56.Final版本,公众号:bin的技术小屋 前文回顾 在前边的系列文章中,我们从内核如何收发网络数据开始以一个C10K的问题作为主线详细从内核角度阐述了网 ...

  9. Airbnb的动态kubernetes集群扩缩容

    Airbnb的动态kubernetes集群扩缩容 本文介绍了Airbnb的集群扩缩容的演化历史,以及当前是如何通过Cluster Autoscaler 实现自定义扩展器的.最重要的经验就是Airbnb ...

  10. 三十三、HPA实现自动扩缩容

    通过HPA实现业务应用的动态扩缩容 HPA控制器介绍 当系统资源过高的时候,我们可以使用如下命令来实现 Pod 的扩缩容功能 $ kubectl -n luffy scale deployment m ...

随机推荐

  1. 我和Java这些年的故事(三)

    J2EE让Java在服务端找到了用武之地,之前一直处于鄙视链末端的Java,也终于有了向VB/VC叫板的资本.EJB更是J2EE的代名词,是解决企业级组件复用的法宝. 有了JSP/Servlet,Ja ...

  2. vite2.9 + vue3.2 打包部署到nginx上刷新页面404问题

    vite2.9 + vue3.2 打包部署到nginx上刷新页面404问题 在本地运行没问题,部署到服务器上,能正常访问,但是刷新之后页面404 原有的Nginx配置为: server { liste ...

  3. C# 实现窗体底部滚动字幕

    使用的控件 panel和label及其定时器. 实现原理 通过定时器定时将label的位置在panel上进行移动,实现滚动的视觉效果,此处将label放在panel上的好处是可以单独设置滚动字母的背景 ...

  4. Word05 邀请函office真题

    1.课程的讲解之前,先来对题目进行分析,首先需要制作一份请柬,请柬中需要包含标题.收件人名称.联谊会时间.联谊会地点和邀请人. 2.打开一个"新的Wrod"文档,在页面中输入请柬的 ...

  5. C++实现有序表--链表的合并操作代码

    #include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...

  6. FIFO 串口接收处理机制

    与安富莱电子的串口处理机制做对比交互 参考链接: https://www.eet-china.com/mp/a161019.html

  7. MVC对session或cookie保存的值在js中做处理

    在cshtml中保存数据 eg: @Html.Hidden("sessionUserName", Session["userName"]) @Html.Hidd ...

  8. MySQL 利用时间(秒分时日月年)分组统计

    1.统计 七天 前 人数 select count(*) from your_table where last_login_time> date_sub(date(now()), interva ...

  9. Linux 系统挂载 ntfs 移动硬盘无法写入的问题

    linux 下挂载 ntfs 移动硬盘无法写入问题 在机房使用移动硬盘时发现无法写入硬盘,具体是 Ubuntu 21.04 ,移动硬盘是 SSD ,分区类型是 NTFS . 首先百度得知最优办法是安装 ...

  10. A - Add Odd or Subtract Even

    A - Add Odd or Subtract Even 思路:其实认真观察就能发现,这个与输入的书有关系,且答案为0,1,2.先看相同,不用加减,为0,再看前小后大,因为加奇数减偶数,如果,相差奇数 ...