概念:

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. 实践:Oracle 数据库基于 RMAN 备份至 腾讯云COS

    简介 对象存储(COS)海量容量无上限,自动沉降归档存储类型和深度归档存储类型,媲美磁带的成本,特别适合备份归档场景. 当前,越来越多客户选择备份上云:而 Oracle 备份模块实现了和 腾讯云COS ...

  2. js中的对象方法中this指向问题

    对象方法调用this所在函数fn的是b,所以this指向b,b.a1='hello a3' ,b没有a2属性,b.a2=undefinedvar a1='hello a1'var a2='hello ...

  3. (读书笔记)基于CMMI的软件工程及实训指导------第一章软件工程基础

    第一章------软件工程基础 1.软件工程基本原理 (1)按照软件生命周期的阶段划分制订计划,严格依据计划进行管理 (2)坚持进行阶段评审 (3)实行严格的产品控制 (4)采用现代程序设计技术 (5 ...

  4. SQL SERVER 多表联合修改

    sql server中有时候会用到多表联合修改,下面是简单的多表修改的例子 UPDATE a SET a.a1 = b.b1 , a.a2 = b.b2 FROM A a, B b WHERE a.a ...

  5. 2022-4-7内部群每日三题-清辉PMP

    1.公司聘用一名项目经理来协调一个期限紧迫的敏捷项目,项目经理和敏捷团队都由一位项目组合经理管理,该项目组合经理倾向于根据需要将开发人员重新分配给其他紧急事项,当项目经理与其接洽时,项目组合经理坚持认 ...

  6. 12种SQL注入报错方式

    1.通过floor报错,注入语句如下: and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from info ...

  7. tomcat的安装以及环境配置

    1.Tomcat的下载地址:http://tomcat.apache.org/ Tomcat是开放源代码的WEB服务器,安装时,只需解压压缩包即可 2.环境变量的配置 1>新建系统变量CATAL ...

  8. 根本不常用知识之Generator

    首先babel链接很重要 https://www.babeljs.cn/repl#?browsers=&build=&builtIns=false&corejs=3.6& ...

  9. 在 MAC 上 进行 iOS 的 Airtest 自动化测试(未完成)

    1. 用USB连接 iPhone 和 mac . 从 连接 https://github.com/AirtestProject/IOS-Tagent 下载iOS-Targent工程文件, 在左上角选择 ...

  10. 【BOOK】解析库—XPath

    XPath-XML Path Language 1.安装 lxml库 2.XPath常用规则 3.XPath解析页面 from lxml import etree text = ''' <div ...