Close

Kubernetes 与 Docker

Kubernetes 和 Docker 之间的主要区别,以及它们与容器化有何关系

Josh Campbell 头像
Josh Campbell

的 Cloud 应用概述

投稿:Chandler Harris

Docker 是一个容器化平台和运行时环境,而 Kubernetes 则是一个用于通过众多容器运行时环境来运行和管理容器的平台。Kubernetes 支持包括 Docker 在内的许多容器运行时环境。

Docker 于 2013 年推出,现代容器时代由此开端,同时也迎来了基于微服务的计算模型。由于容器不依赖于自身的操作系统,因此允许团队以声明方式将应用、其依赖项和配置打包为容器镜像,从而促进松散耦合且可扩展微服务的开发。

然而,应用变得越来越复杂,无法容纳分布于众多服务器的容器,各种挑战也随之出现,例如:如何协调和安排多个容器,如何实现容器间的通信,以及如何扩展容器实例等。Kubernetes 作为应对这些挑战的一种手段应运而生。

在谈论容器技术时,Docker 和 Kubernetes 便常被提及。您可能会问:哪一个比较好?但在很多时候,这不是非此即彼的问题,而是如何同时利用两者来发挥自己的优势。

什么是 Docker?


Docker 是一种商业容器化平台和运行时环境,它可帮助开发人员构建、部署和运行容器。它采用客户端-服务器架构,通过单个 API 提供简单的命令和自动化功能。

Docker 还提供一个工具包,它常用于将应用打包为不可变的容器镜像,即通过编写 Dockerfile,然后运行相应的命令来使用 Docker 服务器构建镜像。开发人员可以不使用 Docker 创建容器,但使用 Docker 平台可以让创建过程更加便捷。然后,可以将这些容器镜像部署到任何支持容器的平台上运行,例如 Kubernetes、Docker Swarm、Mesos 或 HashiCorp Nomad。

虽然 Docker 提供了一种高效方式来打包和分发容器化应用,但仅使用 Docker 来实现大规模运行和管理容器仍面临挑战。跨多个服务器/集群协调和调度容器,在零停机的前提下升级或部署应用,以及监控容器的运行状况,这些还只是需要考虑的其中部分因素。

为解决这些问题以及其他问题,容器编排解决方案以 Kubernetes、Docker Swarm、Mesos、HashiCorp Nomad 等形式陆续诞生,它们可让组织管理大量容器和用户、高效平衡负载、提供身份验证和安全性,以及开展多平台部署等等。

代码库图标
相关资料

Microservices vs. monolithic architecture

三环图标
查看解决方案

使用 Compass 来管理组件

什么是 Kubernetes?


Kubernetes(有时也称为 K8s)是一个广受欢迎的开源平台,可以跨越网络资源集群来编排容器运行时系统。不论有无 Docker,均可使用 Kubernetes。

Kubernetes 最初由 Google 开发,该公司需要一种全新方式来每周大规模运行数十亿个容器。2014 年,Kubernetes 由 Google 以开源形式发布,现被广泛认为是容器和分布式应用部署领域的市场领导者和行业标准编排工具。Google 表示,Kubernetes 的“主要设计目标是简化复杂分布式系统的部署与管理,同时仍然受益于容器带来的更高利用率。”

Kubernetes 将一系列容器捆绑成一组,并在同一台机器上进行管理,以减少网络开销并提高资源使用效率。例如,应用服务器、Redis 缓存和 SQL 数据库便是此此类容器集。Docker 容器的特点是每个容器一个进程。

Kubernetes is particularly useful for DevOps teams since it offers service discovery, load balancing within the cluster, automated rollouts and rollbacks, self-healing of containers that fail, and configuration management. Plus, Kubernetes is a critical tool for building robust DevOps CI/CD pipelines.

但是,Kubernetes 并非纯粹的平台即服务 (PaaS) 架构,因此在构建和管理 Kubernetes 集群时需要考虑多个注意事项。管理 Kubernetes 所衍生相关的复杂性是许多客户选用云供应商提供的托管 Kubernetes 服务的一个重要原因。

Kubernetes 的优点


Kubernetes 常被称为“云之 Linux”,成为最受欢迎的容器编排平台,这不是平白无故的。其中部分原因如下:

自动化操作

Kubernetes 附带一个强大的 API 和名为 kubectl 的命令行工具,可让您自动执行操作,从容应对容器管理中的诸多繁重工作。Kubernetes 中的控制器模式可确保应用/容器完全按照指定的方式运行。

基础架构抽象

Kubernetes 可以替您管理向其提供的资源。如此一来,开发人员就能专注于编写应用代码,而不是底层计算、网络或存储基础架构。

服务运行状况监控

Kubernetes 可监控正在运行的环境,并将其与所需状态进行比较。它会自动对服务执行运行状况检查,并重新启动出现故障或停止运行的容器。只有当服务运行且准备就绪时,Kubernetes 才会提供这些服务。

Kubernetes 与 Docker


Kubernetes 与 Docker 对比图像

Docker 是一个容器运行时环境,Kubernetes 则是一个用于通过众多容器运行时环境来运行和管理容器的平台。Kubernetes 支持众多容器运行时环境,包括 Docker、containerd、CRI-O 以及 Kubernetes CRI(容器运行时接口)的任意实现。做个恰当比喻,如果 Kubernetes 是“操作系统”,那么 Docker 容器就是您安装在“操作系统”上的“应用”。

就其本身而言,Docker 对现代应用开发助益良多。它解决了“在我的机器上工作”的典型问题,但并未涉足其他地方。容器编排工具 Docker Swarm 能够应付部署有少许容器的生产容器工作负载。当系统扩大并需要添加许多彼此联网的容器时,单纯使用 Docker 可能会遭遇一些不断加剧的难题,而 Kubernetes 则可帮助解决这些问题。

若要比较二者,最好是将 Kubernetes 与 Docker Swarm 进行比较。Docker Swarm 也被称为 Docker swarm 模式,它是一种类似于 Kubernetes 的容器编排工具,这意味着它允许管理在运行 Docker 服务器的多个主机上部署的多个容器。默认情况下,Swarm 模式处于禁用状态,需要由 DevOps 团队进行设置和配置。

Kubernetes 编排计算机集群以协同工作,并根据可用的资源安排容器在这些机器上运行。通过声明式定义,将多个容器组合成容器集 (Pod),后者是 Kubernetes 的基本单元。Kubernetes 自动管理诸如服务发现、负载平衡、资源分配、隔离以及垂直或水平扩展容器集一类的操作。如今它已被开源社区采纳,成为云原生计算基金会的一部分。Amazon、Microsoft 和 Google 均在自己的云计算平台上提供托管 Kubernetes 服务,从而大大减轻了运行和维护 Kubernetes 集群及其容器化工作负载的运营负担。

Docker 或 Kubernetes:哪一个适合您?


Docker 或 Kubernetes:哪一个适合您?

如果 Docker Swarm 和 Kubernetes 都是容器编排平台,您会如何取舍?

如果您在构建和运行自己的基础架构,Docker Swarm 需要的设置和配置通常比 Kubernetes 少。它提供与 Kubernetes 相同的优点,例如通过声明式 YAML 文件来部署应用、自动将服务扩展到所需状态、在集群内的容器之间进行负载平衡,以及跨服务的安全保护和访问控制。如果您运行的工作负载很少,也不介意自行管理基础架构或是不需要 Kubernetes 提供的特定功能,那么 Docker Swarm 也许是个不错的选择。

Kubernetes 的初始设置比较复杂,但提供更大的灵活性和功能。欣欣向荣的开源社区也为它提供了广泛的支持。Kubernetes 支持多种开箱即用的部署策略,可以管理您的网络入口,并在容器中提供开箱即用的可观察性。所有主流云供应商都提供托管 Kubernetes 服务,用户可以更加轻松地入门并利用云原生功能(如自动扩展)。如果您运行着大量工作负载并需要云原生互操作性,而且组织中设立了多个团队,需要进一步隔离服务,那么您或许应考虑选择 Kubernetes 平台。

Compass 和容器编排


无论您选择哪一种容器编排解决方案,均须随着规模扩大使用工具来管理复杂的分布式架构。Atlassian Compass 是一个可扩展的开发人员体验平台,可将有关工程产出及团队协作的分散信息整合到一个集中且可搜索的位置。除通过组件目录帮助您控制微服务蔓延之外,Compass 还可帮助您制定最佳实践并使用记分卡来衡量软件的运行状况。此外,您也可借助在 Atlassian Forge 平台上构建的扩展功能,获得整个 DevOps 工具链的数据和洞察信息。

Josh Campbell
Josh Campbell

Josh Campbell is a product manager for Atlassian and has worn many hats in his career. He enjoys working on things that make the job of an engineer easier and has deep customer empathy, especially when it comes to working with bad technology tools. In his spare time, Josh likes biking with his daughters, eating and drinking things that are bad for him, and playing with new technologies.


分享这篇文章
下一个主题

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

Devops 示意图

Compass 社区

克服障碍插图

教程:创建组件

地图插图

免费试用 Compass

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up