Kubernetes 也称为“k8s”或“kube”,是一种容器编排平台,用于调度以及自动部署、管理和扩展容器化应用。
Kubernetes 最初由 Google 工程师开发,后来于 2014 年开源。 它是 Borg 的后代,Borg 是在 Google 内部使用的容器编排平台。 Kubernetes 是希腊语舵手或领航员的意思,因此,Kubernetes 的徽标(链接位于 ibm.com 外部)中有个船舵。
如今,Kubernetes 和更广泛的容器生态系统日益成熟,成为通用的计算平台和生态系统,可与作为现代云基础架构和应用基本构建块的虚拟机 (VM) 一争高下,甚至大有后来居上之势。 这个生态系统使组织能够交付高效的平台即服务 (PaaS),用于应对与基础架构和运营相关的多个云原生开发任务和问题,从而使开发团队能够专心致志地从事编码和创新工作。
以下视频介绍了 Kubernetes 的基础知识:
容器是轻量级的可执行应用组件,用于将应用源代码与在任何环境中运行这些代码所需的所有操作系统 (OS) 库和依赖项结合起来。
容器利用了操作系统 (OS) 虚拟化的一种形式,通过隔离进程并控制这些进程可以访问的 CPU 以及内存和磁盘的数量,使多个应用可以共享操作系统的单个实例。 由于容器比虚拟机 (VM) 更小、更节省资源、更便于移植,因此,容器已成为现代云原生应用的事实计算单元。
在最近的 IBM 调研 (PDF, 1.4 MB) 中,受访用户指出了采用容器和相关技术所带来的几个具体的技术和业务优势。
将容器视为有关 IT 基础架构自动化和抽象的持续工作中的最新成就,或许有助于理解这个概念。
在传统基础架构中,应用在物理服务器上运行,并掌握它们可以获取的所有资源。 因此,您可以选择在单台服务器上运行多个应用,但要祈祷一个应用不会占用其他应用的资源;也可以选择为每个应用专配一台服务器,但这样不仅浪费资源,而且还无法扩展。
虚拟机 (VM) 是从实际计算机硬件中抽象出来的服务器,使您能够在一台物理服务器上运行多个虚拟机,或者在多台物理服务器上运行单个虚拟机。 每个虚拟机都运行自己的操作系统实例,并且您可以在自己的虚拟机中隔离每个应用,从而降低在同一底层物理硬件上运行的应用相互影响的几率。 虚拟机可以更好地利用资源,与传统基础架构相比,更加便捷,也更加经济高效。 此外,它们也可以随意处置 - 当您不再需要运行应用时,关闭虚拟机即可。
有关虚拟机的更多信息,请查看“什么是虚拟机?”
容器将这种抽象提升到更高水平 - 具体而言,除了共享底层的虚拟化硬件外,还共享底层的虚拟化操作系统内核。 容器提供与虚拟机相同的隔离、可扩展性和可处置性,但由于它们不携带各自操作系统实例的有效内容,因此比虚拟机更加轻巧(即,占用的空间更少)。 它们的资源效率更高,这让您能够在更少的机器(虚拟和物理)上运行更多的应用,使用的操作系统实例也更少。 容器可以在桌面、数据中心和云环境之间更轻松地移植。 它们非常适合敏捷以及 DevOps 开发实践。
“什么是容器?”提供了容器和容器化的完整介绍。 博客帖子“容器与虚拟机:有何差异?”全面描述了二者之间的差异。
Docker 是用于创建和运行 Linux® 容器的最热门的工具。 尽管数十年前就已推出了早期形式的容器(使用 FreeBSD Jails 和 AIX Workload Partitions 等技术),但直到 2013 年,当 Docker 面向大众推出对开发人员和云友好的新实现时,容器才算实现了“平民化”。
Docker 最初是一个开源项目,如今也指代创造出 Docker 的 Docker Inc. 公司。它是一个商用容器工具包,基于开源项目而构建(同时也将这些改进回馈给开源社区)。
Docker 基于传统的 Linux 容器 (LXC) 技术,但支持更细粒度的 Linux 内核进程虚拟化,同时也添加了一些功能,更便于开发人员构建、部署、管理和保护容器。
尽管现在还存在其他容器平台,例如 Open Container Initiative (OCI)、CoreOS 和 Canonical (Ubuntu) LXD,但 Docker 仍广受青睐,甚至几乎成了容器的代名词,有时还被误认为是 Kubernetes 之类免费技术的竞争对手(请观看下面的视频“Kubernetes 与 Docker:这不是一个非此即彼的问题”)。
如今,一个组织可能拥有数百乃至数千个容器,随着容器数量的激增,运营团队需要调度并自动部署容器、进行联网,实现可扩展性和可用性。 容器编排市场应运而生。
虽然其他的容器编排选项(最著名的就是 Docker Swarm 和 Apache Mesos)在早期具有一定的吸引力,但 Kubernetes 很快就实现了超越,成为采用最为广泛的技术(事实上,它一度是开源软件历史上发展速度最快的项目)。
开发人员之所以选择并继续使用 Kubernetes,是因为它具有广泛的功能、庞大且不断扩大的开源支持工具生态系统、强大的支持能力以及在各个云服务提供商之间的可移植性。 所有主要的公有云提供商,包括 Amazon Web Services (AWS)、Google Cloud、IBM Cloud 和 Microsoft Azure,都提供完全管理的 Kubernetes 服务。
Kubernetes 负责在整个应用生命周期中调度并自动执行与容器相关的任务,包括:
读到这里,您应该已经知道 Kubernetes 是 Docker Swarm 的替代方案,而不是像大家所普遍误解的那样,是 Docker 的替代方案或竞争对手。
事实上,如果您已经积极踊跃地采用 Docker,并且正在创建基于 Docker 的大规模容器部署,那么 Kubernetes 编排就是为了管理这些工作负载而在逻辑上采取的后续操作。
要了解更多信息,请观看“Kubernetes 与 Docker:这不是一个非此即彼的问题”:
Kubernetes 架构的主要组成部分包括:
集群是 Kubernetes 架构的构建块。 集群由节点组成,每个节点表示一个计算主机(虚拟机或物理机器)。
每个集群都包含一个用作集群控制平面的主节点,以及多个负责部署、运行和管理容器化应用的工作节点。 主节点运行调度服务,根据开发人员设置的部署需求和可用计算能力,适时适地自动部署容器。 每个工作节点都包含用于管理容器的工具,例如 Docker,另外还包含名为 Kubelet 的软件代理程序,用于接收和执行来自主节点的命令。
开发人员使用 kubectl 管理集群的运行,kubectl 是与 Kubernetes API 直接通信的命令行界面 (cli)。
要更深入地了解 Kubernetes 集群,请阅读“Kubernetes 集群:快速可控的云应用交付架构”。
Pod 是共享相同计算资源和网络的多组容器。 它们也是 Kubernetes 中的可扩展性单元:如果 Pod 中某个容器的流量超过了它所能处理的范围,Kubernetes 就会将该 Pod 复制到集群中的其他节点。 因此,最好使 Pod 保持紧凑,使其仅包含必须共享资源的容器。
部署负责控制容器化应用的创建和状态,确保其持续运行。 它指定了应该在集群上运行的 Pod 副本数量。 如果某个 Pod 发生故障,那么部署将会创建新的 Pod。
有关 Kubernetes 部署的更多信息,请观看“Kubernetes 部署:快速入门”:
Kubernetes 可以部署和扩展 Pod,但无法管理或自动执行它们之间的路由,也不提供任何工具来监视、保护或调试这些连接。 随着集群中容器数量的增长,它们之间可能的连接路径数量也会呈指数级增加(例如,两个容器之间可能具有两个连接路径,而 10 个 Pod 之间则可能具有 90 个连接路径),从而带来配置和管理“噩梦”。
Istio 应运而生,这是用于 Kubernetes 集群的开源服务网格层。 对于每个 Kubernetes 集群,Istio 都会添加一个 Sidecar 容器,该容器对于程序员和管理员基本上不可见,用于配置、监视和管理其他容器之间的互动。
借助 Istio,您可以设置单一策略,用于配置容器之间的连接,这样就不必单独配置每个连接。 这样更便于调试容器之间的连接。
Istio 还提供了一个仪表板,供 DevOps 团队和管理员用来监视延迟时间、服务时间错误以及容器之间连接的其他特征。 而且,它内置了安全功能,尤其是身份管理,旨在防止未经授权的用户对容器之间的服务调用进行欺骗;此外,它还包含认证、授权和审计 (AAA) 功能,供安全专业人员用来监视集群。
Knative(发音为“kay-native”)是基于 Kubernetes 的开源平台,为云原生开发提供了两大类优势:
无服务器计算是一种相对较新的代码部署方式,旨在更高效、更经济实惠地运行云原生应用。 无服务器计算不会部署持续运行的代码实例,空闲着等待请求;而是按需启动代码 - 随着需求的波动而缩放,然后在不使用时关闭代码。 无服务器计算有助于防止浪费计算容量和能力,并降低成本,因为只需为代码的实际运行付费。
Knative 使开发人员只需构建容器一次,然后将其作为软件服务或无服务器函数来运行。 这对开发人员来说是透明的:Knative 在后台处理细节,而开发人员只需专注于代码。
对开发人员而言,代码容器化需要执行大量的重复步骤,而容器编排也需要大量的配置和脚本编制工作,例如,生成配置文件、安装依赖项、管理日志记录和跟踪,以及编写持续集成/持续部署 (CI/CD) 脚本。
Knative 通过以下三个组件,更轻松地自动完成这些任务:
构建:Knative 的“构建”组件可自动将源代码转换为云原生容器或函数。 具体而言,它从存储库中提取代码,安装所需的依赖项,构建容器映像,然后将其放入容器注册表中,供其他开发人员使用。 开发人员需要指定这些组件的位置,以便 Knative 可以找到它们,一旦完成这些任务,Knative 便会自动执行该构建。
服务: “服务”组件将容器作为可伸缩服务运行;它可以向上扩展到数千个容器实例,也可以向下收缩到零个容器(称为收缩到零)。 此外,“服务”组件还有两个非常有用的功能:配置 - 每当您将容器推送到生产环境时,它都会保存容器的多个版本(称为快照),并允许同时运行这些版本;服务路由 - 用于将不同数量的流量传递给这些版本。 您可以将这些功能结合起来使用,分阶段逐步推出容器;或者在将容器化应用投入全球生产环境之前,先进行初步测试。
事件: “事件”组件可以让指定的事件触发基于容器的服务或功能。 这是 Knative 的无服务器能力不可或缺的一部分;必须有一种机制在需要时告知系统启动某项功能。 “事件”组件支持团队表达对某些类型事件的兴趣,然后它会自动连接到事件制造者,并将事件路由到容器,从而不必对这些连接进行编程。
Kubernetes 是历史上发展速度最快的开源项目之一,而且加速的势头有增无减。 在开发者及其所在公司之间,采用数量仍在不断飞涨。 以下一些数据点值得关注:
如果您准备开始使用 Kubernetes,或者希望培养有关 Kubernetes 和 Kubernetes 生态系统工具的技能,可尝试学习以下某个教程:
借助 Red Hat OpenShift on IBM Cloud,OpenShift 开发人员可以快速安全地实现企业工作负载容器化,并将其部署到 Kubernetes 集群中。
使用一组通用云服务(包括工具链、数据库和 AI),跨任何云供应商的本地、边缘计算和公有云环境一致地部署和运行应用。
IBM Cloud Code Engine 是一个完全管理的无服务器平台,帮助您在完全管理的容器运行时中运行容器、应用代码或批处理作业。