1.1.2 Kubernetes:云原生基础设施
2014 年,Google 公司开源了 Kubernetes 项目。此时,在容器编排领域主要有两个竞争对手,即 Docker 公司的 Docker Swarm 和 Apache 基金会的 Mesos。虽然 Kubernetes诞生得较晚,但实际上其设计思想来源于 Google 公司内部的 Borg 和 Omega 系统特性,这些特性放到 Kubernetes 项目上,就是 Pod、Sidecar 等功能和设计模式。这些特性并不是几个工程师突发奇想的结果,而是 Google 公司在容器化基础设施领域多年来实践经验的沉淀与升华。为了推广 Kubernetes 项目,同时与 Docker 公司竞争,Google 和 Red Hat 联合发起 CNCF 基金会。有了这两家公司的背书,CNCF 和 Kubernetes 迅速发展,该基金会下的项目和围绕Kubernetes 的二次创新项目大量涌现,包括容器监控的实施标准 Prometheus、微服务治理项目 Istio、有状态应用部署框架 Operator 等。2017 年,Docker 公司宣布将在自己的主打产品 Docker 企业版中内置 Kubernetes,这标志着容器编排之争落下了帷幕,Kubernetes 成为容器编排的事实标准。
从技术角度来讨论 Kubernetes 为何能获胜也是个有意思的话题。Kubernetes 从应用的角度定义了多种资源,用来描述不同的应用类型以及相关能力(见代码清单 1-1)。
(1) Pod:最小的调度单元,一个 Pod 包含一组容器,容器之间通常存在密切关系,例如,使用 localhos(本地主机)进行本地通信会直接发生文件交换、需要共享 Linux Namespace。
(2) Deployment:通常用来部署多副本的 Pod,可以看到 Pod 的状态,在 Pod 异常时能够及时处理故障,使其恢复正常。
(3) Statefulset:描述有状态应用,可以控制 Pod 的启动顺序,为 Pod 绑定不同的存储等。
(4) Job、CronJob:这两种类型资源分别对应一次性任务和周期性任务。
(5) Daemonset:通常用来部署后台常驻任务,如在每个节点上的日志程序。除了以上描述应用的资源,还有其他资源。