1. 钱少事多受人欺
运维部门是成本部门。有个词叫,成本优化。CXO 看到机器的负载这么低,就会想着裁撤机器,能少花就少花点,运维也就来活儿了。优化成本是运维的职责之一。
运维是研发的服务团队。不能够创造营收,就意味着没有话语权,运维在公司的地位可想而知。更多的是研发提需求,运维去完成,没有太多商量的余地。
一个显著的特征是,外包运维的公司比外包研发的公司多很多。这也很容易理解,运维通常是首次搭建好之后,后续没有太多需求,属于长尾项目。而只要业务系统有人在用,研发就需要不断地迭代系统,支撑公司营收业务。
另外,研发分得很细,Web 研发、App 研发、Golang 研发,不是随便招聘一个研发就可以快速上手干活。运维却不同,一个 Shell 基本可以解决问题,会写 Python 就非常不错了。
2. 虚拟容器拔地起
基于物理机的 IT 基础架构资源利用率低、运维成本高、容灾备份困难,这加速了虚拟化技术、容器技术的发展。
虚拟化技术出现得很早,上世纪 80 年代就用于解决大型机分时复用的问题。chroot 、cgroup、lxc 等技术逐渐浮现。其实虚拟化技术,也分为全虚拟化和半虚拟化。半虚拟化效率高,但是需要对运行的 OS 内核进行修改。现在很多 IaaS 云厂商使用的是全虚拟化 QEMU-KVM 技术栈。
基于虚拟机构建的 IT 基础设置,让运维人员摆脱了物理机房的束缚,不用花太多时间关注硬件。范围缩小了,运维质量也就上去了。
事情还没完,还需要解决 CentOS、Ubuntu、Red Hat 等各种系统差异,而且基于虚拟机还是跑不了几个应用。相较于虚拟机具有独立完整内核,容器只是运行在宿主机上的一组进程,使用 lxc 等技术实现与系统之间的隔离。看着是个不错的技术,就是用的人不多,因为这玩意不好理解。
随着 2013 年 Docker 的出现,这种状况发生了改变。Docker 最大的贡献在于,制定了容器镜像规范,普及了容器技术。现在提到容器,大家很容易想到的就是 Docker ,其实还有 containerd、cri-o、isula ,他们都遵循 OCI 规范。Docker 的口号是 “Build once, Run anywhere, Configure once, Run anything” 。没错,Docker 屏蔽了底层的差异,有点像 JVM ,提供了一个中间层。
Docker 的普及,意味着运维的春天不远了。虚拟化技术让运维不用关注硬件,Docker 让运维不用关注应用。运维只需要基于 Docker 展开运维工作即可,采集监控指标、日志,配置告警等。
3. 敏捷开发少不了
敏捷开发发展于极限编程,是很重要的方法论。DevOps 被泛化,一千个人可能有一千个不同的解读,可以将其理解为一场 IT 文化运动。关于敏捷开发的内容,可以参考另外一篇文档 敏捷开发之研发流程 。
DevOps 正式出现,是在 2009 年。之后逐渐发展,历经十多年依然很受关注。
技术的出现可能很偶然,但技术的发展是需要市场培育的。最初的软件应用开发,需要很深入的理解计算机,相关的工具欠缺,复杂度降不下来,开发周期得按照月、年来算。现在不同了,互联网公司每周都有几次发布,而且一次发布的应用数量不少。
在这种需求端发生变化的情况下,促使了技术、文化的演变和发展,而这都基于容器技术。容器技术提供了隔离、弹性、随时创建、随时销毁的特征。较于难以理解的 Linux 系统行为,Docker 相关的概念简单太多,好用又好学,船还大,这简直就是技术人员的福音。
为了方便管理和监控,我们通常采用一个应用一个容器的模型。但微服务架构下,上百个应用,就得有上百个容器。管理这些容器,控制他们的启动顺序、运行位置、副本数量等都会面临巨大挑战。为此,容器编排成为了一个非常强烈的需求。
在容器编排大战之后,Kubernetes 成为了事实上的云原生基础设施,面向应用的分布式操作系统。随后,相关的技术像雨后春笋般涌现,微服务治理的 Istio ,编排任务的 Tekton ,提供无服务的 Knative 等等。
一花开后,百花开。有了 Docker 在前开路,我们进入了一个 IT 基础设施全面大发展的时代。
4. 站在枝头唧喳喳
前面说了这么多,好像没怎么提云原生。处于快速发展阶段的技术,概念上都有点捋不清。根据 CNCF 的定义,云原生应用就是使用容器、服务网格、微服务、不可变基础设施和声明式 API 等技术构建的应用。简单点就是,用 CNCF 内的项目。
从没见过哪个行业像 IT 行业这么热爱分享,更何况是一群以前没什么地位、大家都不愿意干的运维主导的。CNCF 每年都会举办云原生技术峰会 KubeCon 。
很多主题内容都是围绕 Kubernetes 进行的。Kubernetes 作为基础设置,替代了 OS\VM ,也就意味着之前所有的基础应用都需要往 Kubernetes 上迁移。除此,在使用 Kubernetes 的过程中,也会催生新的场景。
在未凝固的水泥路面上行走,才会永久留下脚印。Kubernetes 相关的生态就是一条这样的路面。而你需要做的,可能只是写一个 operator ,对接你擅长的领域。