问我什么是 Kubernetes ?不妨从 Kubernetes 这个名字谈起。
Kubernetes 这个单词来源于希腊语,意味着“舵手”、“飞行员”。从 Kubernetes 蓝色的船舵 logo 来看,它所取的正是“舵手”一意。
Kubernetes 的蓝色 logo
之所以取“舵手”一意,是因为它借用了容器的一个形象比喻——“集装箱”。我们形象地把容器比作航运中的集装箱。容器使得各个应用无差异地在不同的环境安装部署,好比集装箱使得不同的货物能在不同的港口统一运输。Kubernetes 借用了“集装箱”这一比喻,寓意希望能成为轮船上的舵手,把集装箱安全顺利送达各个码头,运输管理众多的集装箱,也就是管理众多的容器。
掌舵管理容器的 Kubernetes
以上是对 Kubernetes 的一个形象理解,接下来让我们看看 Kubernetes 的正式定义。
Kubernetes 官网给出了定义:
Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
Kubernetes 是一个开源的容器编排工具,最初由谷歌开发。它的基本功能是管理容器,容器可以是 Docker 容器,也可以是来自于其他技术的容器。这进一步意味着 Kubernetes 可以帮助管理由数百或者成千上万容器所组成的应用程序。Kubernetes 可以在不同的环境里管理这些容器,比如物理机环境,虚拟机环境,或者云环境,甚至混合环境。
简单来说,Kubernetes 就是用来进行容器编排的工具,那么容器编排又是什么概念呢?不妨让我们先了解容器编排产生的背景,这也正是像 Kubernetes 这样的容器编排工具产生的原因。
由于应用程序日益激增的复杂度,以及其他种种原因,微服务架构逐渐兴起。而微服务的兴起也使得容器的使用量大幅度提升,这是因为微服务框架把一个大型的单体应用程序拆分解耦成立众多小型独立的微服务应用,而容器恰恰是装载部署这些小型微服务的最佳实现方式。
微服务的兴起推动了容器的发展
微服务和容器的兴起又进一步使得一些应用程序由数百甚至数千个容器组成,这个时候对众多容器的管理就成为了巨大的挑战。使用脚本和自制的工具跨多个环境来管理这些容器是非常复杂的,有时候对于某些场景来说甚至是不可能的,这最终产生了对容器编排技术的需求。
大规模容器的管理挑战
那么容器编排又是如何管理这些众多的容器的呢?这也同样是问 Kubernetes 有着什么样的功能呢?下面用几个简单的具体例子来说明。
智能部署
我们在部署应用时,可以告诉 Kubernetes 我们的部署需求,指定我们想要的部署区域。比如在下面这个例子中,我们想要把应用部署到区域 A ,Kubernetes 会观察所要部署的容器的大小规格,比如容器所需要的 CPU 、内存大小等,然后依据我们的需求在区域 A 寻找满足我们需求的主机,并创建容器的实例。此外 Kubernetes 十分智能,它会在区域 A 中选择比较空闲、资源使用率相对较低的主机。在我们这个例子中,主机 B 相比主机 A 更为空闲,因此Kubernetes 将优先在主机 B 上创建我们的容器应用实例。
部署在区域 A 中相对空闲的主机 B
我们还可以向 Kubernetes 指定应用程序所需的具体资源,比如说部署一个机器学习的应用程序,应用需要运行在有 GPU 的机器上进行模型的训练。我们可以向 Kubernetes 指定这一部署需求,接着 Kubernetes 会根据我们的需求寻找带有GPU的主机,进行应用的部署。
部署在有GPU的区域B
Kubernetes 可以帮助我们方便地部署多个应用实例的副本。比如告诉 Kubernetes 我们需要两个应用副本,Kubernetes 便会默认在两个不同的主机上分别部署一个应用实例,以防止单点失效,提高应用的可用性。应用运行后,再告诉 Kubernetes 我们需要三个应用副本,Kubernetes 就会寻找合适的主机,再创建一个副本。
创建多个副本
负载均衡
Kubernetes 会自动检测容器的负载,如果发现容器负载过高,比如 CPU 利用率过高、或者响应时间过长,Kubernetes 就会自动创建容器副本,进行部署扩容。以下面的例子为例,主机 D 上容器负载过高,Kubernetes 自动为该容器创建副本,将负载均分到多个容器上来实现负载均衡,提高应用的响应时间。
自动创建副本实现负载均衡
自动恢复
Kubernetes 有健康检查的功能,如果某个容器应用不幸因为故障而意外退出了,Kubernetes 会检测到这个状态,接着会把运行故障的容器进行自动迁移,即在新的地方重新启动一个新的容器实例,相应的存储资源、负载均衡分发规则将会关联到新的容器实例上,来完成容器的一个自动恢复。
故障节点自动恢复
以上便是容器编排的几项基本内容,也是 Kubernetes 的几个基本功能。当然 Kubernetes 还有更多强大的功能,比如错误恢复、日志聚合、监控警告、数据持久化、服务发现、资源管理、配置管理、秘钥管理、流量转发等等。
Kubernetes 官网所给出的部分特性功能
除了容器编排的角度,我们还可以从不同角度继续深入了解 Kubernetes。
各个视角下的 kubernetes
运维角度:Kubernetes 是一个资源对接平台。我们可以把数据中心的主机,存储和网络资源交给 Kubernetes,让 Kubernetes 自动的将这些资源分配给有需要的应用程序,减少人工操作,提升运维效率。
开发角度:Kubernetes 是一个分布式系统管理平台。Kubernetes 可以帮助我们将应用部署到成百上千台主机上,为应用的部署、运行和管理提供支持,让分布式系统的运行和部署变得更加的简单。
项目角度:Kubernetes 是个开源项目,它不归属于任何一家商业公司,它是云原生计算基金会CNCF旗下的核心开源项目。
发展角度:Kubernetes 像是一个云时代的操作系统。Linux、Windows 操作系统帮我们管理了单一一台主机的计算、存储和网络资源,而 Kubernetes 为我们管理了成百上千台主机的计算、存储和网络资源,并通过对容器的编排管理,实现资源的有效利用。Kubernetes 就好比一个分布式的操作系统,而运行在其上的容器实例相当于这个分布式操作系统中的进程。
Kubernetes 不是唯一的容器编排管理工具,在 2014 年 Docker 公司就率先发布了容器编排工具 Docker Swarm,随后引发一场容器编排之战。
容器编排之战
为了对抗以 Docker 公司为核心的容器商业生态,在 Kubernetes 发布之后,Google、Red Hat 等开源基础设施公司共同发起了 CNCF 基金会,希望以 Kubernetes 为基础,建立一个由开源基础设施领域厂商主导、按照独立基金会方式运营的平台社区。
最终 Kubernetes 凭借以下几个方面的优势最终取得了胜利:
Kubernetes 源自 Google 内部久负盛名的大规模集群管理系统 Borg。Kubernetes 站在巨人的肩膀上,借助 Borg 系统十余年的实践经验和技术沉淀,成功将 Google 所有的应用运行在超过 100 万台服务器、超过 80 个数据中心,每周的 20 亿个容器上。
相比功能简单、生态自闭的 Swarm 项目,Kubernetes 凭借强大的功能将其远远甩在了身后。通过 Kubernetes,用户可以根据自己的使用场景、通过灵活插拔的方式,采用自定义的网络、存储、调度、监控、日志等模块。
Kubernetes 第一时间以开源的姿态走进大众视野,用户、社区和各大企业厂商纷纷拥抱 Kubernetes,在自身的产品上开始支持 Kubernetes。在用户、社区和大厂的支持中, Kubernetes 逐步成为企业基础架构的部署标准和新一代的应用服务层。
Docker 公司在 Kubernetes 社区崛起和壮大后,最终败下阵来,Kubernetes 随之成为主流的容器编排工具,随后陆陆续续出现了很多基于 Kubernetes 的商业版服务和产品。
Kubernetes 是开源项目,是云原生计算基金会下的核心开源项目,因此它不属于任何一个软件厂商,任何人和组织都可以免费获取 Kubernetes 的源代码和二进制文件,然而开源社区并不为商业用户提供产品支持,为了满足企业用户的需求,不少厂商基于开源的 Kubernetes 的开源项目,提供了商业版的 Kubernetes 服务和产品,比如在私有云里比较有影响力有 Red Hat OpenShift,各大云厂商也提供了 Kubernetes 的服务,如 Azure 上的 AKS 、GCP 上的 GKE 等
开源项目到商业软件
Kubernetes 是云时代的“操作系统”,为实现混合云和多有云架构提供了重要的基础,正为云原生的发展持续发挥着重要作用。