深入剖析Kubernetes
张磊
Kubernetes社区资深成员与项目维护者
立即订阅
21378 人已学习
课程目录
已完结 56 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (5讲)
开篇词 | 打通“容器技术”的任督二脉
免费
01 | 预习篇 · 小鲸鱼大事记(一):初出茅庐
02 | 预习篇 · 小鲸鱼大事记(二):崭露头角
03 | 预习篇 · 小鲸鱼大事记(三):群雄并起
04 | 预习篇 · 小鲸鱼大事记(四):尘埃落定
容器技术概念入门篇 (5讲)
05 | 白话容器基础(一):从进程说开去
06 | 白话容器基础(二):隔离与限制
07 | 白话容器基础(三):深入理解容器镜像
08 | 白话容器基础(四):重新认识Docker容器
09 | 从容器到容器云:谈谈Kubernetes的本质
Kubernetes集群搭建与实践 (3讲)
10 | Kubernetes一键部署利器:kubeadm
11 | 从0到1:搭建一个完整的Kubernetes集群
12 | 牛刀小试:我的第一个容器化应用
容器编排与Kubernetes作业管理 (15讲)
13 | 为什么我们需要Pod?
14 | 深入解析Pod对象(一):基本概念
15 | 深入解析Pod对象(二):使用进阶
16 | 编排其实很简单:谈谈“控制器”模型
17 | 经典PaaS的记忆:作业副本与水平扩展
18 | 深入理解StatefulSet(一):拓扑状态
19 | 深入理解StatefulSet(二):存储状态
20 | 深入理解StatefulSet(三):有状态应用实践
21 | 容器化守护进程的意义:DaemonSet
22 | 撬动离线业务:Job与CronJob
23 | 声明式API与Kubernetes编程范式
24 | 深入解析声明式API(一):API对象的奥秘
25 | 深入解析声明式API(二):编写自定义控制器
26 | 基于角色的权限控制:RBAC
27 | 聪明的微创新:Operator工作原理解读
Kubernetes容器持久化存储 (4讲)
28 | PV、PVC、StorageClass,这些到底在说啥?
29 | PV、PVC体系是不是多此一举?从本地持久化卷谈起
30 | 编写自己的存储插件:FlexVolume与CSI
31 | 容器存储实践:CSI插件编写指南
Kubernetes容器网络 (8讲)
32 | 浅谈容器网络
33 | 深入解析容器跨主机网络
34 | Kubernetes网络模型与CNI网络插件
35 | 解读Kubernetes三层网络方案
36 | 为什么说Kubernetes只有soft multi-tenancy?
37 | 找到容器不容易:Service、DNS与服务发现
38 | 从外界连通Service与Service调试“三板斧”
39 | 谈谈Service与Ingress
Kubernetes作业调度与资源管理 (5讲)
40 | Kubernetes的资源模型与资源管理
41 | 十字路口上的Kubernetes默认调度器
42 | Kubernetes默认调度器调度策略解析
43 | Kubernetes默认调度器的优先级与抢占机制
44 | Kubernetes GPU管理与Device Plugin机制
Kubernetes容器运行时 (3讲)
45 | 幕后英雄:SIG-Node与CRI
46 | 解读 CRI 与 容器运行时
47 | 绝不仅仅是安全:Kata Containers 与 gVisor
Kubernetes容器监控与日志 (3讲)
48 | Prometheus、Metrics Server与Kubernetes监控体系
49 | Custom Metrics: 让Auto Scaling不再“食之无味”
50 | 让日志无处可逃:容器日志收集与管理
再谈开源与社区 (1讲)
51 | 谈谈Kubernetes开源社区和未来走向
答疑文章 (1讲)
52 | 答疑:在问题中解决问题,在思考中产生思考
特别放送 (1讲)
特别放送 | 2019 年,容器技术生态会发生些什么?
结束语 (1讲)
结束语 | Kubernetes:赢开发者赢天下
特别放送 | 云原生应用管理系列 (1讲)
基于 Kubernetes 的云原生应用管理,到底应该怎么做?
深入剖析Kubernetes
登录|注册

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

张磊 2018-10-08

你好,我是张磊。今天我和你分享的主题是:深入理解 StatefulSet 之有状态应用实践。

在前面的两篇文章中,我详细讲解了 StatefulSet 的工作原理,以及处理拓扑状态和存储状态的方法。而在今天这篇文章中,我将通过一个实际的例子,再次为你深入解读一下部署一个 StatefulSet 的完整流程。

今天我选择的实例是部署一个 MySQL 集群,这也是 Kubernetes 官方文档里的一个经典案例。但是,很多工程师都曾向我吐槽说这个例子“完全看不懂”。

其实,这样的吐槽也可以理解:相比于 Etcd、Cassandra 等“原生”就考虑了分布式需求的项目,MySQL 以及很多其他的数据库项目,在分布式集群的搭建上并不友好,甚至有点“原始”。

所以,这次我就直接选择了这个具有挑战性的例子,和你分享如何使用 StatefulSet 将它的集群搭建过程“容器化”。

备注:在开始实践之前,请确保我们之前一起部署的那个 Kubernetes 集群还是可用的,并且网络插件和存储插件都能正常运行。具体的做法,请参考第 11 篇文章《从 0 到 1:搭建一个完整的 Kubernetes 集群》的内容。

首先,用自然语言来描述一下我们想要部署的“有状态应用”。

© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《深入剖析Kubernetes》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(52)

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

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

    2018-10-08
    25
  • 黄俊
    error: unable to recognize "rook-storage.yaml": no matches for kind "Pool" in version "ceph.rook.io/v1"

    应该是rook新版本的问题,rook-storage.yaml 文件中有两个位置需要修改。

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

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

    2018-10-10
    7
  • V V
    这种部署方式,主节点pod挂了的时候,能自动重新创建一个出来吗?
    2018-11-28
    4
  • 风轨
    集群中的master/slave节点关系不对等。Service是通过label来绑定pod的,一个statefulSet中所有pod的label都是一样的,无法区分,因此service也是无法区别绑定slave pod的。所以答案应该是老师在文中多次提及的Operator,一次编排多个角色不同甚至镜像不同的服务。

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

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

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

    2018-10-08
    3
  • 加菲老猫
    老师方便提供一个官方的mysql-statefulset.yaml样本嘛,我storageClassName: rook-ceph-block参数怎么加都跑不出来,多谢多谢!
    2018-11-28
    2
  • 彭锐
    这样的有状态应用有个约束,pod标识一旦确定,角色就确定了。但实际应用中,不能有这样的约束,主挂了,要有一个从升主。这就要求至少有选主机制,所有的配置文件也不能依赖id确定角色。
    这怎么玩呢?operater吗?operater可以看成一个特定应用的sre保姆吗?

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

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

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

    2018-10-11
    2
  • Caesar
    前面看大神说在搞kata-container,我有一个疑问,kata-container其实也是虚拟机加容器的方式,那它和docker加虚拟机的优势相比在哪呢

    作者回复: kata可不是虚拟机加容器,kata是用虚拟化实现的容器

    2018-10-08
    2
  • 彰玉
    集群建好了 数据也插入成功了 集群也正常后 主从节点的任何节点重启 是重新按yamL启动 还是直接挂数据盘启幼

    作者回复: 按yaml启动

    2019-06-03
    1
  • 强者之风
    看不出来用MySQL-read service

    作者回复: 而通过连接 mysql-read 这个 Service,我们就可以用 SQL 进行读操作,如下所示:

    2019-04-13
    1
    1
  • D
    这里创建MySQL的时候,由于设定了readnessProbe在启动后30秒执行,但是当你没办法在30秒之内启动成功过一会执行logs就会看到一个—init……的错误,这是因为容器检测到不可用就重新创建了一个新的,但是新的容器MySQL执行初始化的时候发现所在的数据目录(/var/lib/MySQL)不为空,这时候只要响应的调高readnessProbe和livenessProbe的initialDelaySeconds值就好了
    2018-12-28
    1
  • 侯操宇
    如果master和slave用两个StatefulSet的话,怎么来保证master和slave的启动顺序呢?

    作者回复: 两个statefulset 肯定需要你在外部控制了

    2018-10-11
    1
  • 千寻
    集群只有一个节点,ceph storageclass哪里replica设置为3,启动时一直处于pending,enent提示pod has unbound persistentvolumeclaims,将replica设置为1就没有问题,问一下这个大概是什么回事?
    谢谢老师

    作者回复: node数太少不够启动存储节点了

    2018-10-09
    1
  • mazhen
    总结里给的'mysql-statefulset.yaml'好像有点问题,在声明'volumeClaimTemplates'时,是不是应该通过'storageClassName'属性引用前面定义的'StorageClass':

    storageClassName: rook-ceph-block

    我开始一直遇到"pod has unbound immediate PersistentVolumeClaims" 错误,增加了这个属性就好了。

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

    2018-10-08
    1
    1
  • 李博越
    Mac上用minikube是不是玩不起来啊?感觉搭建环境好多的坑

    作者回复: 可以的,估计还是那啥的问题吧

    2018-10-08
    1
  • 小太阳
    initcontainer会在statefulset初始化每一个pod之前都运行一次么?initcontainer是在操作上一个生成的pod么?
    2019-10-15
  • 小太阳
    在initcontainer的command部分,试图读取应用程序pod的hostname。可是pod不是等initcontainer运行完了才初始化么?那样运行initcontainer的时候,应用程序pod的hostname不是还不存在么?
    2019-10-15
  • 杨天一
    您好,想咨询下有没有全部的Yaml文件以及它们的启动顺序。我使用apply -f configmap.yaml后提示got "string", expected "map"; if you choose to ignore these errors,turn validation off with……
    2019-09-10
收起评论
52
返回
顶部