k8s-StatefulSet控制器

一、StatefulSet概述

RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet管理所有有状态的服务,比如MySQL、MongoDB集群等。
StatefulSet所管理的Pod拥有固定的Pod名称,启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。
在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。

  StatefulSet其应用场景包括:

  • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现;
  • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现;
  • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到N-1,在下一个Pod运行之前所有之前的Pod必须都是Running和Ready状态),基于init containers来实现;
  • 有序收缩,有序删除(即从N-1到0);

从上面的应用场景可以发现,StatefulSet由以下几个部分组成:

  • 用于定义网络标志(DNS domain)的Headless Service
  • 用于创建PersistentVolumes的volumeClaimTemplates
  • 定义具体应用的StatefulSet

二、组件

  三个组件:headless service、StatefulSet、volumeClaimTemplate

  (1)headless service

在deployment中,每一个pod是没有名称,是无序的;而statefulset中要求是必须有序的,每一个pod的名称必须是固定的。当节点挂了、删了,重建之后的标识符是不变的,每一个节点的节点名称是不能改变的。pod名称是作为识别pod的唯一标识符,必须保证其标识符的稳定持久有效;

为了实现标识符的稳定唯一,就需要一个headless service 解析直达后端pod的ip地址,它还会还给每个pod配置一个唯一的名称。

  (2)volumeClaimTemplate

大部分有状态副本集都会用到持久存储,但是因为数据是不一样的,每个节点都需要自己专用的存储。在deployment中pod模板中创建的存储卷是一个共享的存储卷,多个pod使用同一个存储卷,而statefulset作为面向有状态的服务,定义中的每一个pod都不能使用同一个存储卷,由此基于pod模板创建pod是不适用的,这就需要引入volumeClainTemplate,当在使用statefulset创建pod时,会自动生成一个PVC,从而请求绑定一个PV,从而有自己专用的存储卷。

未完。。。

猜你喜欢

转载自www.cnblogs.com/weiyiming007/p/10338895.html