Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node运行,可随意扩容和缩容。这种应用称为“无状态”,例如Web服务
但是,在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有依赖关系,例如主从关系、主备关系,这种应用称为“有状态”,例如MySQL主从、Etcd集群、redis-cluster 等等
StatefulSet控制器用于部署有状态应用,满足一些有状态应用的需求:
? Pod有序的部署、扩容、删除和停止
? Pod分配一个稳定的且唯一的网络标识
? Pod分配一个独享的存储
稳定的网络标识:
使用无头服务 Headless Service(相比普通Service只是将spec.clusterIP定义为None,也就是没有clusterIP,使用endport 来通信)来维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加serviceName: “nginx”字段指定StatefulSet控制器要使用这个Headless Service。
稳定主要体现在主机名和Pod A记录:
? 主机名:<statefulset名称>-<编号>
? Pod DNS A记录:<statefulset名称-编号>.<service-name> .<namespace>.svc.cluster.local (POD 之间通过DNS A 记录通信)
例如: web- 0. web . default . svc . cluster . local
案例:
通过创建一个 nginx 应用的statefluset 控制器
创建 Headless Service ,定义 clusterIP: None (表示K8S 不会在给这个service 去颁发一个clusterIP 了;相比 deployment 控制器 的每个POD 都是相同的,而 statefuset 控制器的每个POD 都是有状态的
需要单独去访问 )
#创建statefulset,指定serviceName
这个就验证了 statefulset 的 Pod是 有序的部署、扩容、删除和停止 且 给每一个POD 分配一个稳定的且唯一的网络标识
独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当StatefulSet使用VolumeClaimTemplate创建一个PersistentVolume时,
同样也会为每个Pod分配并创建一个编号的PVC,每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。
在创建StatefulSet 控制器 独享存储前,需要先定义好存储卷,使用pv 作为持久化存储卷,后端存储为NFS
这里采用 动态PV 的方式 (NFS server 搭建的过程省略)
一、部署NFS服务器
二、配置PV 动态供给(NFS StorageClass),创建pvc
#部署NFS实现自动创建PV插件: 一共设计到4个yaml 文件 ,官方的文档有详细的说明
https://github.com/kubernetes-incubator/external-storage
#官方默认的镜像地址,国内可能无法下载,可以使用 image: fxkjnj/nfs-client-provisioner:latest
#定义NFS 服务器的地址,共享目录名称
# archiveOnDelete: "true" 表示当PVC 删除后,后端数据不直接删除,而是归档
基于上面的内容创建 statefulset.yaml 文件
删除statefulset
删除statefulset 有两张方法,级联删除 和 非级联删除
评论留言