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

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

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

全部留言(108)

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

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

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

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

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

    作者回复: 说的对!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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