在Kubernetes中,StatefulSet是一种控制器(Controller),用于管理有状态应用程序的部署。与ReplicaSet和Deployment不同,StatefulSet维护了每个Pod的稳定标识,并确保这些Pod的唯一性以及在重启、扩展或收缩时的稳定性。

以下是一个典型的StatefulSet的示例:
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 3
  serviceName: "nginx"
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

在这个示例中:

  •  replicas: 3 指定了希望运行的Pod副本数为3。

  •  serviceName: "nginx" 定义了用于Headless Service的名称,该服务负责为每个Pod创建DNS记录。

  •  selector 部分定义了用于选择Pod的标签。

  •  template 部分定义了要创建的Pod的模板,包括容器的镜像、标签等信息。

  •  volumeClaimTemplates 部分定义了每个Pod使用的动态存储卷声明(Persistent Volume Claim),以及相关的存储资源和访问模式。


StatefulSet相对于其他控制器的主要特点包括:

1. 稳定标识: StatefulSet创建的Pod具有稳定的网络标识和存储标识。每个Pod都有一个唯一的标识,通常使用序数(例如,pod-0、pod-1)。

2. 有序部署: StatefulSet按照Pod的序数顺序部署。当新的Pod需要创建时,它会等待前一个Pod成功运行并稳定后再启动。

3. 有状态存储: StatefulSet支持使用持久卷(Persistent Volume)和持久卷声明(Persistent Volume Claim)来实现有状态的存储。每个Pod都可以有自己独立的存储,且存储可以保留和迁移。

4. Headless Service: StatefulSet通常配合一个Headless Service使用,该服务用于为每个Pod创建DNS记录。这样,每个Pod都可以通过其DNS名称进行访问,例如web-0.nginx。

5. 删除保护: StatefulSet提供了删除保护,确保删除Pod时会依次删除,以避免并发删除可能导致的数据丢失。

StatefulSet适用于部署需要稳定标识、有状态存储和有序部署的应用程序,例如数据库、消息队列等。


转载请注明出处:http://www.zyzy.cn/article/detail/9723/Kubernetes