Kubernetes 与 Docker:差异解释

云计算 云原生
了解 Docker 和 Kubernetes 容器解决方案,并发现 Kubernetes 和 Docker 之间的差异,以选择最适合您需求的解决方案。

了解 Docker 和 Kubernetes 容器解决方案,并发现 Kubernetes 和 Docker 之间的差异,以选择最适合您需求的解决方案。

Kubernetes 与 Docker:差异解释

容器化已经存在了几十年,但近年来在应用程序开发和现代化方面越来越多地被采用。本文涵盖两种容器解决方案及其用途:

Docker,即容器引擎解决方案,它的容器编排解决方案Docker Compose,以及Docker Swarm,这是一个集群-容器编排解决方案。

Kubernetes 是另一种集群容器解决方案,将其与 Docker Swarm 进行比较,以帮助您选择最符合您要求的解决方案。

什么是容器化?

容器化是应用程序级别的一种虚拟化形式。它旨在将应用程序及其所有依赖项、运行时、库和配置文件打包在一个独立的可执行包中,称为容器。操作系统(OS)不包含在容器中,这使得它与虚拟机(VM)不同,虚拟机(VM)在硬件级别虚拟化并包含操作系统。

虽然虚拟化背后的概念是在多个虚拟机之间共享物理资源,但容器在多个容器之间共享一个操作系统的内核。与虚拟机不同,容器是轻量级的,因为它们不包含操作系统。这就是容器需要几秒钟才能启动的原因。此外,容器可以轻松部署在不同的操作系统(Windows、Linux、macOS)和不同的环境(云、VM、物理服务器)上,而无需进行任何更改。

2013 年,Docker Inc. 引入了 Docker,试图标准化容器以在不同平台上广泛使用。一年后,谷歌推出了 Kubernetes 作为管理容器主机集群的解决方案。这两个解决方案的定义将显示Kubernetes 和 Docker 之间的区别。

什么是Docker ?

Docker 是一个开源平台,用于在标准容器中打包和运行应用程序,这些容器可以以相同的行为跨不同的平台运行。使用 Docker,容器化应用程序与主机隔离,这提供了将应用程序交付到运行任何操作系统的任何平台的灵活性。此外,Docker 引擎管理容器并允许它们在同一主机上同时运行。

由于客户端-服务器架构,Docker 由客户端和服务器端组件(Docker 客户端和 Docker 守护进程)组成。客户端和守护进程 (Dockerd) 可以在同一系统上运行,或者您可以将客户端连接到远程守护进程。除了管理其他 Docker 对象(容器、网络、卷、图像等)之外,守护进程还处理客户端发送的 API 请求。

Docker Desktop 是 Docker 客户端和守护进程的安装程序,包括其他组件,如 Docker Compose、Docker CLI(命令行界面)等。它可以安装在不同的平台上:Windows、Linux 和 macOS。

开发人员可以将应用程序设计为在同一主机上的多个容器上运行,这就产生了同时管理多个容器的需要。为此,Docker Inc. 推出了 Docker Compose。Docker vs Docker Compose 可以概括为:Docker 可以管理一个容器,而 Compose 可以管理一台主机上的多个容器。

Docker compose

在同一主机上管理多容器化应用程序是一项复杂且耗时的任务。Docker Compose 是用于单个主机的编排工具,它使用 Compose 文件格式管理在一个主机上定义的多容器化应用程序。

Docker Compose 通过创建一个定义所有容器的 YAML 配置文件,允许同时运行多个容器。Compose 允许您将应用程序拆分到多个容器中,而不是将其构建在一个容器中。您可以将应用程序拆分为称为微服务的子服务,并在容器中运行每个微服务。然后,您可以通过 Compose 运行一条命令来启动所有容器。

Docker swarm

开发人员可以将应用程序设计为在不同主机上的多个容器上运行,这就需要为跨不同主机的容器集群提供编排解决方案。为此,Docker Inc. 推出了 Docker Swarm。

Docker Swarm 或 Swarm 模式下的 Docker 是一个 Docker 引擎集群,可以在安装 Docker 后启用。Swarm 允许在不同主机上管理多个容器,不像 Compose 只允许在同一主机上管理多个容器。

什么是 Kubernetes?

Kubernetes (K8s) 是一种编排工具,用于管理一个或多个主机上的容器。K8s 将主机集群,无论它们是在本地、云端还是在混合环境中,并且可以与 Docker 和其他容器平台集成。谷歌最初开发并引入了 Kubernetes 来自动化容器的部署和管理。K8s 提供了多种功能来支持弹性,例如容器容错、跨主机负载平衡以及自动创建和删除容器。

Kubernetes 管理一个由一台或多台主机组成的集群,这些主机要么是主节点,要么是工作节点。主节点包含 Kubernetes 的控制面板组件,而工作节点包含非控制面板组件(Kubelet 和 Kube-proxy)。建议至少拥有一个由四台主机组成的集群:至少一个主节点和三个工作节点来运行您的测试。

控制面板组件(主节点)

主节点可以跨越多个节点,但只能在一台计算机上运行。建议您避免在主节点上创建应用程序容器。master 负责管理集群。它响应集群事件,做出集群决策,使用容器调度操作,启动一个新的 Pod(同一主机上的一组容器,是 Kubernetes 中的最小单元),运行控制循环等。

Apiserver 是控制面板前端,它向其他 Kubernetes 组件公开 API。它处理其他组件的访问和身份验证。

Etcd 是一个存储所有集群键/值数据的数据库。每个主节点都应该有一份 etcd 以确保高可用性。

Kube scheduler 负责为新创建的 Pod 分配一个节点。

Kube 控制管理器是一组控制器进程,它们在单个进程中运行以降低复杂性。控制器进程是一个控制循环,它通过 apiserver 监视集群的共享状态。当集群的状态发生变化时,它会采取措施将其更改回所需的状态。控制管理器监控节点、作业、服务帐户、令牌等的状态。

云控制器管理器是一个可选组件,它允许集群与云提供商的 API 进行通信。它将与云交互的组件与与内部集群交互的组件分开。

节点组件(工作节点)

工作节点是非主节点。有两个节点组件:kubelet 和 kube-proxy。除了像 Docker 这样的容器运行时软件之外,它们还应该在每个工作节点上运行。

Kubelet 是运行在工作节点上的代理,以确保每个容器都运行在一个 Pod 中。它管理由 Kubernetes 创建的容器,以确保它们在健康状态下运行。

Kube-proxy 是运行在每个工作节点上的网络代理,是 Kubernetes 网络服务的一部分。它允许 Pod 与集群或外部网络之间的通信。

其他组件

服务是在给定时间一起工作的一组逻辑 Pod。与 Pod 不同,服务的 IP 地址是固定的。这修复了删除 Pod 时产生的问题,以便其他 Pod 或对象可以改为与该服务通信。一个服务的一组 Pod 是通过为服务分配一个策略来根据标签过滤 Pod 来选择的。

标签是一对键/值属性,可以分配给 Pod、服务或其他对象。标签允许根据公共属性查询对象并将任务分配给选择。每个对象可以有一个或多个标签。一个键只能在一个对象中定义一次。

Kubernetes 与 Docker Swarm:哪个更好?

Kubernetes 和 Docker 是不同范围的解决方案,可以相互补充以形成强大的组合。因此,Docker 与 Kubernetes 并不是一个正确的比较。Docker 允许开发人员将应用程序打包在隔离的容器中。开发人员可以将这些容器部署到其他机器上,而不必担心与操作系统的兼容性问题。

开发者可以使用 Docker Compose 来管理一台主机上的容器。但是 Docker Compose 与 Kubernetes 也不是一个准确的比较,因为解决方案适用于不同的范围。Compose 的范围仅限于一台主机,而 Kubernetes 的范围是针对一组主机。

当容器和主机数量变多时,开发者可以使用 Docker Swarm 或 Kubernetes 编排 Docker 容器,并在集群中进行管理。Kubernetes 和 Docker Swarm 都是集群设置中的容器编排解决方案。

Kubernetes 在大型环境中比 Swarm 使用更广泛,因为它提供高可用性、负载平衡、调度和监控,以提供永远在线、可靠和健壮的解决方案。

以下几点将突出显示使 K8s 成为值得考虑的更健壮解决方案的差异。

安装

Swarm 已经包含在 Docker 引擎中。使用某些 Docker CLI(命令行界面)标准命令,可以轻松启用 Swarm。

不过,Kubernetes 部署更为复杂,因为您需要学习新的非标准命令才能安装和使用它。此外,您还需要学习使用 Kubernetes 中使用的特定部署工具。集群节点应该在 Kubernetes 中手动配置,比如定义 master、controller、scheduler 等。

注意:Kubernetes 安装的复杂性可以通过使用 Kubernetes 即服务 (KaaS) 来克服。各大云平台都提供Kaas;其中包括谷歌云平台 (GCP) 的一部分谷歌 Kubernetes 引擎 (GKE) 和亚马逊弹性 Kubernetes 服务 (EKS)。

可扩展性

两种解决方案都支持可扩展性。但是,使用 Swarm 更容易实现可扩展性,而使用 Kubernetes 则更灵活。

Swarm 使用简单的 Docker API 以更简单、更快速的方式按需扩展容器和服务。

另一方面,Kubernetes 支持自动缩放,这使得可伸缩性更加灵活。但由于它使用统一的 API,可扩展性更加复杂。

负载均衡

Swarm 具有内置的负载平衡功能,并使用内部网络自动执行。对集群的所有请求都在主机之间进行负载平衡。Swarm 使用 DNS 来负载平衡对服务名称的请求。无需在 Swarm 中手动配置此功能。

应手动配置 Kubernetes 以支持负载平衡。您应该在 Pod 中定义负载均衡策略。因此 Pod 应该被定义为服务。Kubernetes 使用 Ingress 进行负载均衡,这是一个允许从外部网络访问 Kubernetes 服务的对象。

高可用性

这两种解决方案本身都支持高可用性功能。

swarm 管理器监视集群的状态并采取措施修复实际状态中的任何更改以满足所需状态。每当工作节点崩溃时,群管理器就会在另一个正在运行的节点上重新创建容器。

Kubernetes 还会自动检测故障节点并无缝故障转移到新节点。

监控

Swarm 没有内置的监控和日志记录工具。为此,它需要第三方工具,例如 Reimann 或 Elasticsearch,以及 Kibana (ELK)。

Kubernetes 内置了 ELK 监控工具,可以原生监控集群状态。此外,还支持一些监控工具来监控其他对象,如节点、容器、Pod 等。

结论

Docker 是一个容器化平台,用于在容器中独立于操作系统构建和部署应用程序。它可以在 Windows、Linux 或 macOS 上使用 Docker Desktop 安装,并包括其他解决方案,如 Compose 和 Swarm。当在同一主机上创建多个容器时,管理它们会变得更加复杂。在这种情况下,可以使用 Docker Compose 轻松管理同一主机上一个应用程序的多个容器。

在大型环境中,多个节点的集群成为确保高可用性和其他高级功能的需要。这就需要像 Docker Swarm 和 Kubernetes 这样的容器编排解决方案。对比这两个平台的特性,可以看出两者都支持可扩展性、高可用性和负载均衡。但是,Swarm 更易于安装和使用,而 Kubernetes 支持自动扩展和内置监控工具。这解释了为什么大多数大型组织将 Kubernetes 与 Docker 用于主要分布在数百个容器中的应用程序。

责任编辑:华轩 来源: 今日头条
相关推荐

2020-12-04 14:19:08

KubernetesDocker容器

2019-12-04 11:00:42

前端DockerKubernetes

2019-11-11 21:34:33

DockerKubernetes容器

2022-05-12 08:01:18

KubernetesDocker容器

2018-02-02 16:32:10

KubernetesDocker命令

2018-07-23 09:02:18

容器KubernetesAmazon

2015-08-31 14:12:12

DockerKubernetesPaaS

2020-12-11 09:35:58

Kubernetes容器

2010-10-29 09:36:49

完全备份增量备份差异备份

2020-12-03 18:29:30

KubernetesDocker容器

2020-03-19 11:12:21

云计算KubernetesDocker

2017-11-07 12:15:26

Docker容器云端

2015-07-17 10:25:43

kubernetesDocker集群系统

2017-04-01 10:30:32

Clear ContaDockerKubernetes

2018-05-21 09:03:00

NASSAN案例

2021-03-16 08:35:14

Kubernetes Docker容器

2018-02-08 10:57:35

LinuxUnix操作系统

2019-09-12 10:43:44

DockerKubernetes软件

2021-09-14 08:50:38

Kubernetes容器Docker

2020-01-09 15:28:30

KubernetesDocker:容器
点赞
收藏

51CTO技术栈公众号