1: Kubernetes 入门

本章将帮你快速掌握 Kubernetes 的基础知识和背景,内容分布如下:

  • 重要 Kubernetes 背景
  • Kubernetes:云的操作系统

重要 Kubernetes 背景

Kubernetes 是一个容器化云原生微服务应用的编排器

这里有很多术语,我们来逐一解释。

编排

编排器是一种部署应用并动态响应变化的系统。例如,Kubernetes 可以:

  • 部署应用
  • 根据需求扩缩容
  • 在故障时自行修复
  • 执行滚动更新和回滚
  • 还有许多其他功能

最棒的是,它完成所有这些工作都无需你亲自介入。你只需提前配置好一些东西,然后就可以坐等 Kubernetes 施展魔法。

容器化

容器化是将应用及其依赖项打包成镜像,然后作为容器运行的过程。

可以将容器视为虚拟机(VM)的下一代产品。两者都是打包和运行应用的方式,但容器更小、更快、更便携。

尽管有这些优势,容器并未完全取代虚拟机,在大多数环境中你会看到它们并存。但对于大多数新应用,容器是首选方案。

云原生

云原生应用具备云特性,例如自动扩缩容、自愈、自动更新、回滚等。

仅仅在公有云中运行一个普通应用并不等于云原生。

微服务

微服务应用由许多小型、专业化、独立的部件组成,它们协同工作形成有用的应用。

考虑一个电商应用,包含以下六个功能:

  • Web 前端
  • 商品目录
  • 购物车
  • 身份认证
  • 日志
  • 商店

要将其制作为微服务应用,你需要将每个功能设计、开发、部署和管理为各自独立的小应用(即微服务)。因此,这个应用有六个微服务。

这种设计带来了巨大的灵活性:六个微服务各自拥有小型的开发团队和独立的发布周期,还可以独立地扩缩容和更新。

最常见的模式是将每个微服务部署为自己的容器。这意味着一个或多个 Web 前端容器、一个或多个商品目录容器、一个或多个购物车容器等等。扩缩应用的任何部分只需增加或移除容器即可。

现在我们已经解释了一些术语,让我们重新审视并改写本章开头那句充满术语的句子。

原句是:“Kubernetes is an orchestrator of containerized cloud-native microservices applications.” 我们现在知道它的意思是:Kubernetes 部署、扩缩容、自愈和更新应用,其中各个应用功能被打包并部署为容器。

希望这澄清了一些术语。但如果仍有模糊之处也别担心,整本书中我们会再次详细讲解所有内容。

Kubernetes 从何而来

Kubernetes 由一群 Google 工程师开发,部分原因是为了应对 Amazon Web Services (AWS) 和 Docker。

AWS 通过发明现代云计算改变了世界,行业其他部分需要迎头赶上。Google 就是追赶者之一。他们建立了自己的云,但需要一种抽象 AWS 价值的方式,让客户尽可能容易地从 AWS 迁移到他们的云上。同时,他们自己的生产应用(如 Search 和 Gmail)每周运行数十亿个容器。

与此同时,Docker 席卷全球,用户需要帮助来管理爆炸式增长的容器。

这促使一群 Google 工程师利用他们从内部容器管理工具中获得的经验,创建了一个名为 Kubernetes 的新工具。2014 年,他们将 Kubernetes 开源,并捐赠给了新成立的云原生计算基金会(CNCF)。

截至撰写本书时,Kubernetes 已经超过 10 年,经历了惊人的增长和采用。然而,其核心仍然满足 Google 和行业其他部分的两大需求:

  1. 抽象基础设施(例如 AWS)
  2. 简化应用可移植性

这两点正是 Kubernetes 对行业如此重要的主要原因。

Kubernetes 与 Docker

所有早期版本的 Kubernetes 都默认使用 Docker 作为其容器运行时。这意味着 Kubernetes 使用 Docker 处理创建、启动和停止容器等底层任务。

然而,发生了两件事:

  1. Docker 变得臃肿
  2. 人们创建了大量 Docker 的替代品

结果,Kubernetes 项目创建了容器运行时接口(CRI),使运行时层可插拔。现在你可以根据需求挑选最佳运行时。例如,有些运行时提供更好的隔离性,有些提供更好的性能,有些支持 Wasm 容器,等等。

Kubernetes 1.24 最终移除了对 Docker 作为运行时的支持,因为它对于 Kubernetes 所需来说过于臃肿且大材小用。此后,大多数新 Kubernetes 集群默认使用 containerd(发音为“container dee”)作为运行时。幸运的是,containerd 是 Docker 的精简版,为 Kubernetes 优化,并且完全支持由 Docker 容器化的应用。事实上,Docker、containerd 和 Kubernetes 都与实现了开放容器倡议(OCI)标准的镜像和容器兼容。

图 1.2 展示了一个四节点 Kubernetes 集群,运行多个容器运行时。

图 1.2 - 单集群多运行时
注意图中某些节点上有多个运行时。这种配置完全受支持且越来越常见。你将在第 9 章中处理类似配置,向 Kubernetes 部署一个 Wasm(WebAssembly)应用。

那么 Docker Swarm 呢?

在 2016 和 2017 年,Docker Swarm、Mesosphere DCOS 和 Kubernetes 竞争成为行业标准的容器编排器。Kubernetes 获胜了。

不过,Docker Swarm 仍在开发中,仍有一些小公司使用它作为 Kubernetes 的简单替代品。

Kubernetes 与 Borg:抵抗是徒劳的!

我们已经提到 Google 大规模运行容器已有很长时间。他们有两个内部工具叫 BorgOmega,负责编排这些数十亿个容器。因此,很容易将 Kubernetes 与它们联系起来——三者都在大规模编排容器,且都与 Google 相关。

然而,Kubernetes 并非 Borg 或 Omega 的开源版本。更准确地说,Kubernetes 与它们共享 DNA 和家族历史。

图 1.3 - 共享 DNA
(图中展示了 Kubernetes、Borg 和 Omega 之间的遗传关系。)

目前,Kubernetes 是 CNCF 拥有并管理的开源项目,采用 Apache 2.0 许可证。1.0 版本早在 2015 年 7 月发布,截至撰写本书时,我们已经达到 1.32 版本,平均每年发布三个新版本。

Kubernetes 名称的含义

大多数人将 Kubernetes 读作“koo-ber-net-eez”,但社区非常友好,即使发音不同也不会介意。

Kubernetes 一词源自希腊语“helmsman”(舵手),也就是掌舵船舶的人。你可以在其标志中看出这一点——一个船舵。

图 1.4 - Kubernetes 标志
标志为七辐船舵。

一些最初的工程师曾想将 Kubernetes 命名为 “Seven of Nine”(九之七)。这是因为 Kubernetes 受 Google 的 Borg 项目启发,而《星际迷航:航海家号》中一个著名的 Borg 无人机就叫 Seven of Nine。版权法不允许这样做,因此他们给标志设计了七根辐条,作为对 Seven of Nine 的微妙致敬。

最后关于名称的一点:你经常会看到它被简写为 K8s,读作“kates”。数字 8 替代了“K”和“s”之间的八个字符。


Kubernetes:云的操作系统

Kubernetes 是云原生应用的事实标准平台,我们有时称它为云的操作系统(OS)。这是因为它抽象了不同云平台之间的差异,就像 Linux 和 Windows 等操作系统抽象服务器之间的差异一样:

  • Linux 和 Windows 抽象服务器资源并调度应用进程。
  • Kubernetes 抽象云资源并调度应用微服务。

举个简单的例子,你可以在 Kubernetes 上调度应用,而无需关心它们是运行在 AWS、Azure、Civo Cloud、GCP 还是你的本地数据中心。这使得 Kubernetes 成为以下场景的关键推动者:

  • 混合云
  • 多云
  • 云迁移

总之,Kubernetes 让你今天更容易部署到一个云,明天再迁移到另一个云。

应用调度

操作系统的主要工作之一是简化工作任务的调度。

例如,计算机是 CPU、内存、存储和网络等硬件资源的复杂集合。幸运的是,现代操作系统隐藏了大部分细节,使应用开发的世界变得更加友好。例如,有多少开发者需要关心他们的代码使用哪个 CPU 核心、内存 DIMM 或闪存芯片?大多数时候,我们让操作系统来决定。

Kubernetes 对云和数据中心做了类似的事情。从高层看,云或数据中心是资源和服务的复杂集合。Kubernetes 抽象了大部分内容,使资源更容易消费。同样,你多久会关心你的应用使用哪个计算节点、哪个故障区域或哪个存储卷?大多数时候,你会乐意让 Kubernetes 来决定。


章节总结

  • Kubernetes 由 Google 工程师基于多年超大规模运行容器的经验创建。他们将其作为开源项目捐赠给社区,现已成为部署和管理云原生应用的行业标准平台。
  • 它可以在任何云或本地数据中心上运行,并抽象底层基础设施。这使你能够构建混合云,以及在不同的云之间迁移应用。
  • 它采用 Apache 2.0 许可证开源,由云原生计算基金会(CNCF)拥有和管理。