一、有状态与无状态
无状态:
deployment控制器设计原则:管理的所有pod一模一样,提供同一个服务,也不考虑在那台Node运行,科随意扩容和缩容。这种应用称为:无状态,如web服务。
有状态:
在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有依赖关系,如主从关系、主备关系、这种应用称为有状态。如mysql主从,etcd集群。
有状态举例:
如在k8s中部署一个mysql主从,需要考虑哪些问题:
1、主从实例启动的顺序
2、主从实例是独立数据存储
3、主从连接使用ip地址还是主机名
二、StatefulSet控制器概述
StatefulSet控制器用于部署有状态应用,满足一些有状态应用的需求:
1、Pod有序的部署、扩容、删除和停止
2、Pod分配一个稳定的且唯一的网络标识
3、Pod分配一个独享的存储
三、StatefulSet控制器:网络标识
稳定的网络标识:使用Headless Service(相比普通Service只是将spec.clusterIP定义为None)来维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加serviceName: “nginx”字段指定StatefulSet控制器要使用这个Headless Service。
稳定主要体现在主机名和Pod A记录:
1、主机名: <statefulset名称>-<编号>
2、Pod DNS A记录:<statefulset名称-编号>.<service-name>.<namespace>.svc.cluster.local 用这个进行连接
主机名:
Pod DNS A记录:
示例二:
四、StatefulSet控制器:独享存储
SstatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板。当StatefulSet使用volumeClaimtemplate创建一个PersistentVolume时,同样也会为每个Pod分配并创建一个编号的PVC,每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。
每个pod都有独立存储
## kubectl get pods
五、StatefulSet小结
StatefulSet与Deployment区别:有身份的
身份三要素:
1、域名
2、主机名
3、存储(pvc)
在k8s里部署应用集群参考资料:
https://kubernetes.io/zh-cn/docs/tutorials/stateful-application/zookeeper/
https://kubernetes.io/zh-cn/docs/tutorials/stateful-application/cassandra/
https://github.com/lizhenliang/k8s-statefulset
分布式系统部署步骤: