一、StatefulSet 控制器简介

官方网址

  • StatefulSet 是用来管理有状态应用的工作负载 API 对象。

  • StatefulSet 用来管理 Deployment 和扩展一组 Pod,并且能为这些 Pod 提供序号和唯一性保证。

  • StatefulSets 对于需要满足以下一个或多个需求的应用程序很有价值:

    稳定的、唯一的网络标识符。
    稳定的、持久的存储。
    有序的部署和缩放。
    有序的、自动的滚动更新。

  • 和 Deployment 相同的是,StatefulSet 管理了基于相同容器定义的一组 Pod。但和 Deployment不同的是,StatefulSet 为它们的每个 Pod 维护了一个固定的 ID。这些 Pod是基于相同的声明来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。

  • StatefulSet给所有的Pod进行了编号,编号规则是: ( s t a t e f u l s e t 名 称 ) − (statefulset名称)- (statefulset)(序号),从0开始。

  • 删除或者收缩 StatefulSet 并不会删除它关联的存储卷。这样做是为了保证数据安全,它通常比自动清除 StatefulSet
    所有相关的资源更有价值。

  • 当删除 StatefulSets 时,StatefulSet 不提供任何终止 Pod 的保证。为了实现 StatefulSet 中的Pod 可以有序的终止,可以在删除之前将 StatefulSet 缩放为 0。

  • 删除或者收缩 StatefulSet 并不会删除它关联的存储卷,这样做是为了保证数据安全。

  • Pod被删除后重建,重建Pod的网络标识也不会改变,Pod的拓扑状态按照Pod的“名字+编号”的方式固定下来,并且为每个Pod提供了一个固定且唯一的访问入口,即Pod对应的DNS记录,同时重建时保证每个pod挂载到原来的卷上。

  • StatefulSet将应用状态抽象成了两种情况:
    拓扑状态:应用实例必须按照某种顺序启动。新创建的Pod必须和原来Pod的网络标识一样
    存储状态:应用的多个实例分别绑定了不同存储数据。

二、创建无存储 StatefulSet

01_创建 Headless service

vim service.yml

apiVersion: v1
kind: Service
metadata:
 name: nginx-svc
 labels:
  app: nginx
spec:
 ports:
 - port: 80
   name: web
 clusterIP: None
 selector:
  app: nginx

在这里插入图片描述

02_创建StatefulSet

  • 指定服务为创建的无头服务:nginx-svc

特点:

  • 指定StatefulSet名称为 web,pod命名自动为 web-数字编号
  • 发现名称根据副本个数依次排序,从 0 开始:web-0,web-1,web-2,web-3…
  • 上一个pod处于 Running和Ready 后再去创建下一个pod
  • 名称是它们的唯一标识
    vim pod.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
 name: web
spec:
 serviceName: "nginx-svc"
 replicas: 2
 selector:
  matchLabels:
   app: nginx
 template:
  metadata:
   labels:
    app: nginx
  spec:
   containers:
   - name: nginx
     image: myapp:v1
     ports:
     - containerPort: 80
       name: web

在这里插入图片描述

03_测试

检查pod在集群内部的地址: headless service 的 CNAME 指向 SRV 记录(记录每个 Running 和 Ready 状态的 Pod)。SRV 记录指向一个包含 Pod IP 地址的记录表项。
在这里插入图片描述
删除StatefulSet并重建,检查集群内部IP: 发现Pod 的序号、主机名、SRV 条目和记录名称没有改变,但和 Pod 相关联的 IP 地址发生了改变。
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐