虽然“容器编排平台”还没有被整个行业大范围采用,但在这一领域 Kubernetes 已经战胜其他选手,成为了事实标准。近两年的 Web 开发技术社区,随便打开一两个群,你都能看到人们在谈 Kubernetes。很多开发人员,包括曾经的我,在学习 Kubernetes 时遇到一个障碍:在网上看到的各类 Kubernetes 文章,或者在社区里听到的各类 Kubernetes 分享,通常都充斥着各类听不懂的名词,让人一时无法融入他们的氛围之中。而当自己狠下心去找一两篇安装教程想试一试的时候,却发现要么准备步骤繁多,要么文档中的步骤复杂、令人忘而却步。
我相信这些问题不止我一个人遇到,而且事实上,它们本不应该成为阻挡我们学习 Kubernetes 的障碍。
获得 Kubernetes 集群
在聊我们如何获得一个可用的 Kubernetes 集群之前,稍微啰嗦几句关于必要性的问题。很多技术参考书喜欢先上来写一章“概述”,就像大学教材第一章总是“绪论”一个套路,先回顾一下这个技术的来龙去脉,展望一下未来。然后第二章是安装教程,不少书写的特别详细,恨不得每一个界面都截图,每一段代码和配置都要贴到书上。这个做法先不说在书的写作上合不合理,它至少带来一个问题,那就是不知不觉就把读者刚翻开一本书时的新鲜感带到软件安装的细节中磨灭殆尽了。这是十分低效的,也是很打击读者信心的事情。
如果我们眼前的任务是学习 Kubernetes 的用法,而不是要学会如何部署并立志去当一个 Kubernetes 集群运维人员,那么完全没必要早早地着急研究如何部署一个 Kubernetes 集群,更不必去研究它的高可用集群的原理和细节。
对于急于学习 Kubernetes 用法的开发人员来说,可以有更多简单的方法获得一个可用的 Kubernetes 集群:
- 使用 Katacoda 提供的线上环境(免费)。Katacoda 是一个提供交互式在线学习环境的网站,它有很多课程是免费的,其中就包括不少 Kubernetes 课程。只要打开其中一个 Kubernetes 相关课程,根据提示就可以在几分钟时间里获得一个小型集群环境。
- 使用 Minikube 在个人电脑上安装(免费)。Minikube 是一个可以在个人电脑上快速启动的集群。不过,由于仍然有一些自己安装的步骤,所以由于每个人电脑的实际情况的不同,还是有一定机率会遇到一些问题。
- 使用公有云提供的 Kubernetes 服务(收费)。微软云、腾讯云、华为云等各类云环境都提供了 Kubernetes 集群服务,对于用户来说,只要一路下一步下去,根据向导和文档,通常只需要十来分钟就可以拥有一个自己的集群。
实际上直接使用公有云的 Kubernetes 是我最推荐的一种方法,因为它最省事,而且并不贵:省事是很容易理解的,各个云一定希望自己提供的服务是易于使用、健康稳定的,否则不会有人用他们的服务;而价格方面,我自己在好几个云环境都创建过 Kubernetes 集群,发现他们对于主节点(集群管理节点)都是不收费的,只对工作节点收费——也就是说,用于运行你的容器的虚拟机才需要收费。Azure 国际云上提供的 B2ms 型号虚拟机(2 核 8 GB内存)一个月才人民币 500 元左右(美元 $70.8)。如果你只是要用几天用于学习的话,平均到每天只要 17 元,相当于一顿外卖的钱,可以说相当便宜了。
总之,如果你现在是想快速上手学习,那就先不要在部署 Kubernetes 集群上花费太多精力。
正确的学习路径
我想,应该有不少人都买了 Kubernetes 的大部头著作。但这其实也是没必要的。
坦率地讲,很多大部头并不适合想快速上手 Kubernetes 的应用开发人员作为入门读物。这些大部头,会从 Kubernetes 的历史渊源讲起,然后分别介绍 Pod、Service、ReplicaSet、Deployment、PersistentVolume、PersistentVolumeClaim 等一系列概念,后面介绍各种原理,包括 Kubernetes 网络模型,最后还不忘介绍如何阅读 Kubernetes 源代码、为它贡献代码、开发扩展等。
估计这一系列下来,很多人的一开始的热情早就磨灭到所剩无几了。最重要的是,对于开发人员来说,还是没有学会该怎么写好一个 Pod 的描述文件,该怎么为自己的应用设计一个面向 Kubernetes 的持续交付流水线。这类书,就像一本字典——你在遇到不认识的字时总是可以随手翻一翻,但学习遣词造句却还是要从《语文》课本开始。同理,开发人员需要一个快速上手的路径,而不是先从大部头著作开始。
我主张,应用开发人员只需要先学很少的几个 Kubernetes 关键概念,比如 Pod、Service 和 Deployment;然后直接把精力放在如何把自己的应用部署上去,并着手研究部署到 Kubernetes 之后的各类场景化需求,再反过来去逐个学习 Kubernetes 的各项功能特性。
举例来说,把自己的应用部署上去,如果你的应用:
- 需要存储文件,你就着手研究如何使用 PersistentVolume、PersistentVolumeClaim 来实现存储;
- 依赖 Redis 或 Postgres 数据库,你就研究如何在部署应用的同时,等待 Redis/Postgres 变成就绪状态,再让用户访问自己的应用;
- 是一个微服务系统,你就研究如何发现并调用其他微服务;
- 总是崩溃,你就研究如何收集日志,并存储内存转储文件(core dump),以便分析;
- 需要很多配置,你就研究如何将应用的配置交给 Kubernetes 管理,并规划命名空间以满足多套逻辑环境的隔离性。
下图是 WordPress 应用在 Kubernetes 上部署时涉及到的各种资源:
一步一步下来,我相信,你对 Kubernetes 的各种特性会是一个逐渐熟悉的过程。最重要的是,这会是一个“发现之旅”,它让你总是带着明确的问题出发,在解决问题之后获得相应的成就感,激励你继续探索和学习下去。而这正是学习一个新的工具最好的方法。
总结
Kubernetes 已经占据着各类技术社区的头条很长一段时间了,但根据 InfoQ 2019 年发布的Cloud & DevOps 报告,大量的企业目前还没有采用它。对于开发人员来说,现在这个阶段开始学习并为企业接下来的战略做好准备,将是对自己接下来一段时间职业生涯最好的保障。
同时,人们在谈到学习 Kubernetes 时,经常谈到的是它复杂、难以入门,让很多人“从入门到放弃”。实际上,在学习 Kubernetes 时,选择一个合适的学习路径是可以让学习效果事半功倍的。
基于上面的讨论,我结合自己学习 Kubernetes 的经历,近期制作了一门在线直播课程,以一个开发人员的视角与大家一同学习 Kubernetes。目前这个课程第一期的直播已经在 3.19 日晚播出,收到大量关注和好评。如果你对这个课程感兴趣,请扫码查看其详细信息:
此外,还有一些其他的资源,也是供开发人员学习 Kubernetes 非常好的材料:
- 微软提供了一份学习路径材料,我个人认为是比较为开发人员考虑的。
- 红帽编写的给开发人员的 OpenShift 文档是一份不可多得的实操手册。