对控制器statefulset的深入理解

特性:

(1)稳定而且唯一的网络标识:pod的hostname模式为(statefulset名称)-(序号)

(2)稳定而且持久的存储:通过volumeclaimtemplate为每个pod创建一个PV。删除、减少副本,不会删除相关的卷

(3)有序、平滑地部署和扩展:比如redis主从集群应该先启动主节点,在启动从节点

(4)有序、平滑地删除和终止:比如我们要缩减redis规模,我们要先关闭从节点

(5)有序地滚动更新。一般要先更新从节点。

组成:

三个组件:headless service、volumeclaimtemplate、statefulset、

(1)headless service:

1)在deployment中,与之对应的服务是service,而在statefulset中与之对应的headless service。

headless service,即无头服务,与service的不同就是它没有cluster ip,解析他的名称时将返回改headless service对应的全部pod的endpoint列表

2)statefulset在headless service的基础上又为statefuleset控制的每个pod副本创建了一个DNS域名,这个域名的格式为:

$(podname).(headless server name)

FQDN:$(podname).(headless server name).namespace.svc.cluster.local

3)为什么需要headless service无头服务?

在用deployment时,每一个pod名称是没有顺序地,是随机字符串,因此pod名称是无序的,但是在statefulset中要求必须是有序,没一个pod不能被随意取代,pod重建后pod名称还是一样的。而pod ip是变化的,所以是以pod名称来识别。pod名称是pod唯一性的标识符,必须持久稳定有效。这时候要用到无头服务,它可以给每个Pod一个唯一的名称

(2)volumeclaimtemplates:存储卷申请模板,创建PVC,指定pvc名称大小,将自动创建pvc,且pvc必须由存储类供应。

1)为什么需要volumeclaimtemplate?

对于有状态的副本集都会用到持久卷,对于分布式系统来说,他的最大特点是数据是不一样的,所以各个节点不能使用同一存储卷,每个节点有自己的专用存储,但是如果在deployment中的Pod template里定义的存储卷,是所有副本集共用一个存储卷,数据是相同的,因为基于模板来的,而statefulset中每个pod都要自己的专用存储卷,所以statefulset的存储卷就不能再用pod模板来创建了,于是statefulset使用volumeclaimtemplate,称为卷申请模板,它会为每个pod生成不同的pvc,并绑定PV,从而实现各pod有专用存储。这就是为什么要用volumeclaimtemplate的原因。

(3)statefulset:定义具体应用,名为nginx,有三个pod副本,并为每个pod定义了一个域名部署statefulset。

配置文件的选项:

Kubectl explain sts.spec:查看主要字段解释

  1. replicas:定义副本数
  2. selector:标签选择器
  3. servicename:必须关联到一个无头服务商
  4. template:定义pod模板(其中定义关联哪个存储卷)
  5. volumeClaimTemplates:生成PVC

你可能感兴趣的:(k8s)