k8s学习-StatefulSet(模板、更新、扩缩容、删除等)


概念

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

StatefulSet会关联卷(volume),删除时不会删除卷,之后PV、PVC的文章中再详细介绍。

StatefulSet需要headless service,需要你去创建该服务,之后service文章中再详细介绍。

StatefulSet不保证Pod数量不为0,顺序创建,倒序删除。

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:
  selector:
    matchLabels:
      app: nginx # 必须匹配 .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # 默认值是 1
  template:
    metadata:
      labels:
        app: nginx # 必须匹配 .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: nginx:1.15.3
        ports:
        - containerPort: 80
          name: web

可以看到创建了nginx的headless service,volumeClaimTemplates通过PV提供存储。

实战

创建

命令

kubectl create -f sts-test.yaml -n killer
kubectl get svc -n killer
kubectl get sts -n killer
kubectl get po -n killer

结果
在这里插入图片描述
查看全部yaml

kubectl get sts web  -n killer -o yaml

结果

apiVersion: apps/v1
kind: StatefulSet
metadata:
  creationTimestamp: "2022-06-19T16:37:51Z"
  generation: 1
  name: web
  namespace: killer
  resourceVersion: "105754"
  selfLink: /apis/apps/v1/namespaces/killer/statefulsets/web
  uid: 4d7a0d8f-2f44-47ff-a4d7-5100b8be03cd
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.15.3
        imagePullPolicy: IfNotPresent
        name: nginx
        ports:
        - containerPort: 80
          name: web
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 10
  updateStrategy:
    rollingUpdate:
      partition: 0
    type: RollingUpdate
status:
  collisionCount: 0
  currentReplicas: 3
  currentRevision: web-56bf45cc57
  observedGeneration: 1
  readyReplicas: 3
  replicas: 3
  updateRevision: web-56bf45cc57
  updatedReplicas: 3

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

扩缩容

命令

kubectl scale sts web --replicas=4 -n killer

结果
在这里插入图片描述

更新

通过前面的yaml可以看到更新策略

updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate

除了RollingUpdate滚动更新外,还有onDelete在删除时更新。
命令

更新之前,再打开一个终端,运行一个实时查看命令

 kubectl get po -l app=nginx -n killer -w

更新命令如下,以修改镜像版本为例

kubectl set image sts web nginx=nginx:latest -n killer --record

结果
在这里插入图片描述
实时过程
在这里插入图片描述
可以看到也是倒序更新的

删除

删除Pod

命令

kubectl delete po web-1 web-2 -n killer

结果
在这里插入图片描述
实时过程
在这里插入图片描述
可以看到,还是按照顺序创建的

删除sts

命令

 kubectl delete sts web -n killer

结果
在这里插入图片描述

参考

k8s-sts

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kubernetes中,我们可以通过滚动更新来实现零停机不停服发布服务。滚动更新是一种逐步替换Pod的方法,它允许我们在不停机的情况下将新版本的应用程序逐步引入生产环境。 以下是实现零停机不停服发布服务的步骤: 1. 创建Deployment资源 首先,我们需要创建一个Deployment资源,用于管理我们的应用程序。Deployment资源可以自动创建和管理Pod,确保我们的应用程序在任何时候都有指定数量的Pod在运行。 2. 更新应用程序镜像 接下来,我们需要更新应用程序的镜像,以便将新版本的应用程序引入生产环境。我们可以通过修改Deployment资源的镜像字段来更新应用程序镜像。 3. 逐步替换Pod 当我们更新Deployment资源的镜像字段时,Kubernetes会自动创建新的Pod,并逐步替换旧的Pod。默认情况下,每次更新会替换25%的Pod,直到所有Pod都被替换为止。 4. 检查更新状态 在进行滚动更新时,我们可以使用kubectl rollout status命令来检查更新状态。该命令将显示Deployment的更新进度,以及新旧Pod的状态。 5. 回滚更新 如果在滚动更新过程中发生了问题,我们可以使用kubectl rollout undo命令来回滚更新。该命令将自动将Deployment回滚到上一个版本,并重新创建旧版本的Pod。 通过上述步骤,我们可以实现零停机不停服发布服务,确保我们的应用程序在更新过程中始终可用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值