k8s statefulSet控制器

k8s statefulSet

简介

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

StatefulSet会关联卷(volume),删除时不会删除卷
StatefulSet需要headless service,需要你去创建该服务
StatefulSet不保证Pod数量不为0,顺序创建,倒序删除。
StatefulSet的命名需要遵守 DNS 子域名规范:

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

StatefulSet 是为了解决没有状态的服务的问题,Deployment和ReplicaSets是为无状态服务而设计,其应用场景包括:

  • 匹配 Pod name ( 网络标识 ) 的模式为:$(statefulset名称)-$(序号),比如上面的示例:web-0,web-1,web-2
  • StatefulSet 为每个 Pod 副本创建了一个 DNS 域名,这个域名的格式为: $(podname).(headless server name),也就意味着服务间是通过Pod域名来通信而非 Pod IP,因为当Pod所在Node发生故障时, Pod 会被飘移到其它 Node 上,Pod IP 会发生变化,但是 Pod 域名不会有变化
  • StatefulSet 使用 Headless 服务来控制 Pod 的域名,这个域名的 FQDN 为:$(service name).$(namespace).svc.cluster.local,其中,“cluster.local” 指的是集群的域名
  • 根据 volumeClaimTemplates,为每个 Pod 创建一个 pvc,pvc 的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的 volumeMounts.name=www, Pod name=web-[0-2],因此创建出来的 PVC 是 www-web-0、www-web-1、www-web-2
  • 删除 Pod 不会删除其 pvc,手动删除 pvc 将自动释放 pv

Statefulset的启停顺序:

  • 有序部署:部署StatefulSet时,如果有多个Pod副本,它们会被顺序地创建(从0到N-1)并且,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态。

  • 有序删除:当Pod被删除时,它们被终止的顺序是从N-1到0。

  • 有序扩展:当对Pod执行扩展操作时,与部署一样,它前面的Pod必须都处于Running和Ready状态。

StatefulSet使用场景:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于 PVC 来实现。
  • 稳定的网络标识符,即 Pod 重新调度后其 PodName 和 HostName 不变。
  • 有序部署,有序扩展,基于 init containers 来实现。
  • 有序收缩。

模版

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
结果

image

查看全部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

结果

image

更新

通过前面的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
结果

image

实时过程

image

可以看到也是倒序更新的

删除

删除Pod

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

结果
image

实时过程
image

可以看到,还是按照顺序创建的

删除sts

命令

 kubectl delete sts web -n killer

结果
image

参考文档

https://blog.csdn.net/lady_killer9/article/details/125355150

posted @ 2022-04-27 13:42  liwenchao1995  阅读(57)  评论(0编辑  收藏  举报