深入剖析 Kubernetes
张磊
Kubernetes 社区资深成员与项目维护者
116705 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
再谈开源与社区 (1讲)
结束语 (1讲)
深入剖析 Kubernetes
15
15
1.0x
00:00/00:00
登录|注册

20 | 深入理解StatefulSet(三):有状态应用实践

Slave节点初始化SQL操作
备份信息文件传输
主从节点配置文件
从节点
主节点
保持状态不变
适用于有状态应用的部署
PV与Pod绑定
Pod的访问方式固定
Pod的拓扑关系固定
每个Pod实例有唯一且固定的编号
写请求由Master节点处理
读请求由Slave节点处理
"容器之间平等无序"
"阅后即焚"
"人格分裂"
验证MySQL集群
创建StatefulSet
创建PV
部署难点
主从复制
用途
特点
思考题
关键点
部署流程
MySQL集群部署
StatefulSet
总结

该思维导图由 AI 生成,仅供参考

你好,我是张磊。今天我和你分享的主题是:深入理解 StatefulSet 之有状态应用实践。
在前面的两篇文章中,我详细讲解了 StatefulSet 的工作原理,以及处理拓扑状态和存储状态的方法。而在今天这篇文章中,我将通过一个实际的例子,再次为你深入解读一下部署一个 StatefulSet 的完整流程。
今天我选择的实例是部署一个 MySQL 集群,这也是 Kubernetes 官方文档里的一个经典案例。但是,很多工程师都曾向我吐槽说这个例子“完全看不懂”。
其实,这样的吐槽也可以理解:相比于 Etcd、Cassandra 等“原生”就考虑了分布式需求的项目,MySQL 以及很多其他的数据库项目,在分布式集群的搭建上并不友好,甚至有点“原始”。
所以,这次我就直接选择了这个具有挑战性的例子,和你分享如何使用 StatefulSet 将它的集群搭建过程“容器化”。
备注:在开始实践之前,请确保我们之前一起部署的那个 Kubernetes 集群还是可用的,并且网络插件和存储插件都能正常运行。具体的做法,请参考第 11 篇文章《从 0 到 1:搭建一个完整的 Kubernetes 集群》的内容。
首先,用自然语言来描述一下我们想要部署的“有状态应用”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用StatefulSet将MySQL集群的搭建“容器化”。作者通过一个实际的例子,讲解了部署一个StatefulSet的完整流程。文章首先描述了要部署的“有状态应用”需求,即一个主从复制的MySQL集群,包括主节点和多个从节点,以及读写操作的限制。然后,作者详细介绍了在常规环境中部署这样一个主从模式的MySQL集群的难点,并提出了在Kubernetes项目上“容器化”解决这些难点的思路。作者重点介绍了如何使用StatefulSet来解决主从节点的不同配置文件、备份信息文件传输以及初始化SQL操作等问题。此外,作者还介绍了如何通过ConfigMap和Service来实现主从节点的配置文件管理和用户请求的转发。最后,作者提出了StatefulSet的框架设计和Pod模板的重点设计,以及如何使用PVC模板为每个Pod定义PVC来管理存储状态。整体来说,本文通过实例详细介绍了如何使用StatefulSet将MySQL集群的搭建“容器化”,为读者提供了深入理解StatefulSet之有状态应用实践的指导。文章还提出了在实现读写请求分离的情况下需要做的改动,为读者提供了进一步思考和实践的方向。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入剖析 Kubernetes》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(110)

  • 最新
  • 精选
  • Vincen
    因为是通过一个statefulset来实现的 感觉太复杂了,master和slave做成两个statefulset就非常简单了

    作者回复: 没错,这是一个很好的解决思路

    2018-10-08
    12
    122
  • DJH
    有一点我还是没想通,为啥数据复制操作要用sidecar容器来处理,而不用mysql主容器来一并解决。如果把数据复制操作和启动mysql服务一并写到同一个sh -c后面,这样算不算一个单一进程呢?

    作者回复: sidecar是常驻进程,要监听3370端口呢。一个容器里显然没办法管理两个常驻进程,这就是容器是单进程的意思啊。

    2018-10-10
    5
    44
  • sam700000
    通过这节我才更清晰理解了,kubernetes最小的管理单位是pod的概念,把思维从容器这层抽出来。然后也更清楚的理解了statefulset实现有状态,就是把特定的状态配置绑定在某个对象名称上面,然后通过之前说的控制循环不断的维护这个对象的特性,只要这写特定对象和它们各自绑定的状态配置不变就实现了有状态的应用部署和维护。果然实践出真知👍

    作者回复: 说的对!

    2019-08-14
    36
  • 彭锐
    这样的有状态应用有个约束,pod标识一旦确定,角色就确定了。但实际应用中,不能有这样的约束,主挂了,要有一个从升主。这就要求至少有选主机制,所有的配置文件也不能依赖id确定角色。 这怎么玩呢?operater吗?operater可以看成一个特定应用的sre保姆吗?

    作者回复: 没错。你说的这种情况得用operator,后面会讲。

    2018-10-18
    3
    34
  • 侯操宇
    老师,我发现在initContainers 的ini-mysql容器中,执行的只是简单的文件拷贝工作,但镜像却用的是mysql的镜像,可以用其他镜像取代吗?镜像的选择有什么讲究吗?

    作者回复: 没啥讲究,能完成任务即可

    2018-10-11
    3
    15
  • 风轨
    集群中的master/slave节点关系不对等。Service是通过label来绑定pod的,一个statefulSet中所有pod的label都是一样的,无法区分,因此service也是无法区别绑定slave pod的。所以答案应该是老师在文中多次提及的Operator,一次编排多个角色不同甚至镜像不同的服务。

    作者回复: 其实也可以写成两个statefulset

    2018-10-08
    15
  • wtcctw
    张大大你好, 我之前自己玩过docker,在看这个专栏之前,特意简单过了一下《Docker容器与容器云 第二版》,之前一些章节看得非常过瘾,讲解得非常透彻。 但是看到StateFulSet的时候感觉有点晕。。。特别是里面的Pod YAML定义,感觉要记的东西非常多,学习曲线也比较陡峭,一段时间不用肯定就忘了。 所以想问一下,作为非专业的运维人员,对于k8s的掌握大致要到何种程度,多谢多谢。

    作者回复: 遇到问题能迅速定位到源码即可

    2018-10-08
    8
    13
  • swordholder
    总结里给的'mysql-statefulset.yaml'好像有点问题,在声明'volumeClaimTemplates'时,是不是应该通过'storageClassName'属性引用前面定义的'StorageClass': storageClassName: rook-ceph-block 我开始一直遇到"pod has unbound immediate PersistentVolumeClaims" 错误,增加了这个属性就好了。

    作者回复: 对,用rook的环境应该加上这个,我加一句注释上去。

    2018-10-08
    4
    8
  • xfan
    感觉实现起来很复杂,不优美

    作者回复: 所以才要讲operator的

    2018-12-26
    7
  • eden
    老师,请问mysql persistent volume需要扩容怎么做?通过kubectl scale不能修改volume大小。

    作者回复: 需要存储插件支持

    2018-12-11
    5
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部