k8sKubernetes存储之 StatefulSet 控制器通过 Headless Service 管理Pod

Posted dezasseis

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8sKubernetes存储之 StatefulSet 控制器通过 Headless Service 管理Pod相关的知识,希望对你有一定的参考价值。

一、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 地址发生了改变。

以上是关于k8sKubernetes存储之 StatefulSet 控制器通过 Headless Service 管理Pod的主要内容,如果未能解决你的问题,请参考以下文章

k8sKubernetes存储之使用 StatefulSet 部署 MySQL 主从集群

k8sKubernetes存储之使用 StatefulSet 部署 MySQL 主从集群

k8sKubernetes存储之 StatefulSet 控制器通过 Headless Service 管理Pod

k8sKubernetes存储之 StatefulSet 控制器通过 Headless Service 管理Pod

K8SKubernetes的基本数据存储详解-EmptyDir / HostPath / NFS

Flink之Stateful Operators