有状态服务vs无状态服务-k8s部署对象
切入正题之前,先引入一个小知识点。什么是副本控制器?
对于副本控制器的基本理解就是:
控制pod集群副本的数量,永远与预期设定的数量保持一致
截止到当前版本,k8s副本控制器有两种类型:
- replicationcontroller
- replicaset
区别在于:
1、标签选择器功能不一样:
replicaset: 可以使用标签选择器进行复合选择
*单选
*复合选择
replicationcontroller: 仅支持单选
*单选
建议: 新版k8s中建议使用replicaset作为副本控制器
现在切入正题:
什么是有状态服务?有状态与无状态服务的区别是什么,主要判断是:是否
有实时的数据需要存储
无状态服务对象-Deployment
服务部署结构模型
Deployment->ReplicaSet->Pod
Deployment工作在ReplicaSet之上,用于管理无状态应用,通过“控制器模式”,来操作 ReplicaSet 的个数和属性,进而实现“水平扩展 / 收缩”和“滚动更新”这两个编排动作,也就是说,Deployment 控制器实际操纵的是ReplicaSet 对象,而不是 Pod 对象
关于滚动更新
相信大部分同学选择k8s的致命诱惑力来源于此,实现服务不停机更新。
该功能内部实现逻辑是:
Deployment内部重新建立新的replicaset–>重新建立新的pod,实际上就是控制旧的replicaset中的pod逐渐减少到0,新的replicaset中的pod逐渐增加到目标数量
操作指令:
kubectl rolling-update redis-master --image=redis-master:2.0
有状态服务-statefuleset
为了解决有状态服务使用容器化部署的一个问题,保证pod的hostname重启/重建后不变,通过hostname维护关联数据。
服务部署结构模型
Statefulset->ReplicaSet->Pod
Statefulset也是工作在Replicaset之上,用于管理有状态服务。
总结
对k8s来说,不能使用deployment部署模型部署有状态服务。通常情况下,deployment用来部署无状态服务。有状态服务的部署,使用statefulset进行。
推荐阅读