statefulSet

statefulset概述

  • StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载 API 对象,它为 Pod 提供持久化标识和有序部署、扩展、删除等特性

StatefulSet特性

  • 为pod提供唯一标识,保障部署和扩容缩容的顺序
  • 为了解决有状态服务的问题(对应deployments和replicaSets是为无状态服务而设计),其应用场景包括
    • 稳定的持久化存储,即pod死亡后重新调度一个新的pod,还是能访问到之前pod的持久化数据,基于PVC实现
    • 稳定的网络标志,即pod重新调度后,其PodName和主机名不变,基于Headless Service(即没有Cluster IP 的service)来实现
    • 有序部署,有序扩展,即Pod的启动是有顺序,在部署或者扩展的时候要依据定义的顺序依次进行(即从0到n-1,在下一个pod运行之前所有之前的pod必须都是running和ready状态),基于init containers来实现
    • 有序收缩,有序删除(即从n-1到0)。缩容时从索引号最大的Pod开始删除,而且一次只能删除一个,因此缩容速度不会太快。有实例不健康时,不允许缩容

什么是无状态服务

  • 没有对应的存储需要时时保留,多实例对同一个请求的访问一致
  • 多个实例可以共享相同的持久化数据

statefulset更新策略

  • RollingUpdate (默认):
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 1  # 只有序号 >= partition 的 Pod 会被更新
  • OnDelete:
spec:
  updateStrategy:
    type: OnDelete  # 需要手动删除 Pod 才会更新

statefulset 对pod的管理策略

  • 有序部署 (默认)
spec:
  podManagementPolicy: OrderedReady
  • 并行部署
spec:
  podManagementPolicy: Parallel  # 同时创建/删除所有 Pod

statefulset命名机制概述

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  clusterIP: None  # Headless 模式
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: "mysql"  # 必须匹配 Headless Service 名称
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:  # 自动为每个 Pod 创建 PVC
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "ssd"
      resources:
        requests:
          storage: 10Gi
  • statefulset会创建有序pod,命名规则为(statefulset-name)-(ordinal-index)。上面这段statefulset会创建三个pod,名称分别是 mysql-0、mysql-1、mysql-2
  • StarefulSet通过Headless service提供稳定的Pod域名,域名格式为:\((pod name).\)(headless service name).$(namespace).svc.cluster.local,其中,“cluster.local”指的是集群的域名
  • stateful通过volumeClaimTemplates的配置,为每个Pod创建一个pvc,pcv的命名规则为\((volumeClaimTempaltes.name)-\)(pod_name)
posted @ 2024-05-10 10:25  立勋  阅读(37)  评论(0)    收藏  举报