每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。了解Docker和Kubernetes容器解决方案,并发现Kubernetes和Docker之间的差异,以选择最适合您需求的解决方案。Kubernetes与Docker:差异解释 容器化已经存在了几十年,但近年来在应用程序开发和现代化方面越来越多地被采用。本文涵盖两种容器解决方案及其用途:Docker,即容器引擎解决方案,它的容器编排解决方案DockerCompose,以及DockerSwarm,这是一个集群容器编排解决方案。Kubernetes是另一种集群容器解决方案,将其与DockerSwarm进行比较,以帮助您选择最符合您要求的解决方案。什么是容器化? 容器化是应用程序级别的一种虚拟化形式。它旨在将应用程序及其所有依赖项、运行时、库和配置文件打包在一个独立的可执行包中,称为容器。操作系统(OS)不包含在容器中,这使得它与虚拟机(VM)不同,虚拟机(VM)在硬件级别虚拟化并包含操作系统。 虽然虚拟化背后的概念是在多个虚拟机之间共享物理资源,但容器在多个容器之间共享一个操作系统的内核。与虚拟机不同,容器是轻量级的,因为它们不包含操作系统。这就是容器需要几秒钟才能启动的原因。此外,容器可以轻松部署在不同的操作系统(Windows、Linux、macOS)和不同的环境(云、VM、物理服务器)上,而无需进行任何更改。 2013年,DockerInc。引入了Docker,试图标准化容器以在不同平台上广泛使用。一年后,谷歌推出了Kubernetes作为管理容器主机集群的解决方案。这两个解决方案的定义将显示Kubernetes和Docker之间的区别。什么是Docker? Docker是一个开源平台,用于在标准容器中打包和运行应用程序,这些容器可以以相同的行为跨不同的平台运行。使用Docker,容器化应用程序与主机隔离,这提供了将应用程序交付到运行任何操作系统的任何平台的灵活性。此外,Docker引擎管理容器并允许它们在同一主机上同时运行。 由于客户端服务器架构,Docker由客户端和服务器端组件(Docker客户端和Docker守护进程)组成。客户端和守护进程(Dockerd)可以在同一系统上运行,或者您可以将客户端连接到远程守护进程。除了管理其他Docker对象(容器、网络、卷、图像等)之外,守护进程还处理客户端发送的API请求。 DockerDesktop是Docker客户端和守护进程的安装程序,包括其他组件,如DockerCompose、DockerCLI(命令行界面)等。它可以安装在不同的平台上:Windows、Linux和macOS。 开发人员可以将应用程序设计为在同一主机上的多个容器上运行,这就产生了同时管理多个容器的需要。为此,DockerInc。推出了DockerCompose。DockervsDockerCompose可以概括为:Docker可以管理一个容器,而Compose可以管理一台主机上的多个容器。Dockercompose 在同一主机上管理多容器化应用程序是一项复杂且耗时的任务。DockerCompose是用于单个主机的编排工具,它使用Compose文件格式管理在一个主机上定义的多容器化应用程序。 DockerCompose通过创建一个定义所有容器的YAML配置文件,允许同时运行多个容器。Compose允许您将应用程序拆分到多个容器中,而不是将其构建在一个容器中。您可以将应用程序拆分为称为微服务的子服务,并在容器中运行每个微服务。然后,您可以通过Compose运行一条命令来启动所有容器。Dockerswarm 开发人员可以将应用程序设计为在不同主机上的多个容器上运行,这就需要为跨不同主机的容器集群提供编排解决方案。为此,DockerInc。推出了DockerSwarm。 DockerSwarm或Swarm模式下的Docker是一个Docker引擎集群,可以在安装Docker后启用。Swarm允许在不同主机上管理多个容器,不像Compose只允许在同一主机上管理多个容器。什么是Kubernetes? Kubernetes(K8s)是一种编排工具,用于管理一个或多个主机上的容器。K8s将主机集群,无论它们是在本地、云端还是在混合环境中,并且可以与Docker和其他容器平台集成。谷歌最初开发并引入了Kubernetes来自动化容器的部署和管理。K8s提供了多种功能来支持弹性,例如容器容错、跨主机负载平衡以及自动创建和删除容器。 Kubernetes管理一个由一台或多台主机组成的集群,这些主机要么是主节点,要么是工作节点。主节点包含Kubernetes的控制面板组件,而工作节点包含非控制面板组件(Kubelet和Kubeproxy)。建议至少拥有一个由四台主机组成的集群:至少一个主节点和三个工作节点来运行您的测试。控制面板组件(主节点) 主节点可以跨越多个节点,但只能在一台计算机上运行。建议您避免在主节点上创建应用程序容器。master负责管理集群。它响应集群事件,做出集群决策,使用容器调度操作,启动一个新的Pod(同一主机上的一组容器,是Kubernetes中的最小单元),运行控制循环等。Apiserver是控制面板前端,它向其他Kubernetes组件公开API。它处理其他组件的访问和身份验证。Etcd是一个存储所有集群键值数据的数据库。每个主节点都应该有一份etcd以确保高可用性。Kubescheduler负责为新创建的Pod分配一个节点。Kube控制管理器是一组控制器进程,它们在单个进程中运行以降低复杂性。控制器进程是一个控制循环,它通过apiserver监视集群的共享状态。当集群的状态发生变化时,它会采取措施将其更改回所需的状态。控制管理器监控节点、作业、服务帐户、令牌等的状态。云控制器管理器是一个可选组件,它允许集群与云提供商的API进行通信。它将与云交互的组件与与内部集群交互的组件分开。节点组件(工作节点) 工作节点是非主节点。有两个节点组件:kubelet和kubeproxy。除了像Docker这样的容器运行时软件之外,它们还应该在每个工作节点上运行。Kubelet是运行在工作节点上的代理,以确保每个容器都运行在一个Pod中。它管理由Kubernetes创建的容器,以确保它们在健康状态下运行。Kubeproxy是运行在每个工作节点上的网络代理,是Kubernetes网络服务的一部分。它允许Pod与集群或外部网络之间的通信。其他组件服务是在给定时间一起工作的一组逻辑Pod。与Pod不同,服务的IP地址是固定的。这修复了删除Pod时产生的问题,以便其他Pod或对象可以改为与该服务通信。一个服务的一组Pod是通过为服务分配一个策略来根据标签过滤Pod来选择的。标签是一对键值属性,可以分配给Pod、服务或其他对象。标签允许根据公共属性查询对象并将任务分配给选择。每个对象可以有一个或多个标签。一个键只能在一个对象中定义一次。Kubernetes与DockerSwarm:哪个更好? Kubernetes和Docker是不同范围的解决方案,可以相互补充以形成强大的组合。因此,Docker与Kubernetes并不是一个正确的比较。Docker允许开发人员将应用程序打包在隔离的容器中。开发人员可以将这些容器部署到其他机器上,而不必担心与操作系统的兼容性问题。 开发者可以使用DockerCompose来管理一台主机上的容器。但是DockerCompose与Kubernetes也不是一个准确的比较,因为解决方案适用于不同的范围。Compose的范围仅限于一台主机,而Kubernetes的范围是针对一组主机。 当容器和主机数量变多时,开发者可以使用DockerSwarm或Kubernetes编排Docker容器,并在集群中进行管理。Kubernetes和DockerSwarm都是集群设置中的容器编排解决方案。 Kubernetes在大型环境中比Swarm使用更广泛,因为它提供高可用性、负载平衡、调度和监控,以提供永远在线、可靠和健壮的解决方案。 以下几点将突出显示使K8s成为值得考虑的更健壮解决方案的差异。安装Swarm已经包含在Docker引擎中。使用某些DockerCLI(命令行界面)标准命令,可以轻松启用Swarm。不过,Kubernetes部署更为复杂,因为您需要学习新的非标准命令才能安装和使用它。此外,您还需要学习使用Kubernetes中使用的特定部署工具。集群节点应该在Kubernetes中手动配置,比如定义master、controller、scheduler等。 注意:Kubernetes安装的复杂性可以通过使用Kubernetes即服务(KaaS)来克服。各大云平台都提供Kaas;其中包括谷歌云平台(GCP)的一部分谷歌Kubernetes引擎(GKE)和亚马逊弹性Kubernetes服务(EKS)。可扩展性 两种解决方案都支持可扩展性。但是,使用Swarm更容易实现可扩展性,而使用Kubernetes则更灵活。Swarm使用简单的DockerAPI以更简单、更快速的方式按需扩展容器和服务。另一方面,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上使用DockerDesktop安装,并包括其他解决方案,如Compose和Swarm。当在同一主机上创建多个容器时,管理它们会变得更加复杂。在这种情况下,可以使用DockerCompose轻松管理同一主机上一个应用程序的多个容器。 在大型环境中,多个节点的集群成为确保高可用性和其他高级功能的需要。这就需要像DockerSwarm和Kubernetes这样的容器编排解决方案。对比这两个平台的特性,可以看出两者都支持可扩展性、高可用性和负载均衡。但是,Swarm更易于安装和使用,而Kubernetes支持自动扩展和内置监控工具。这解释了为什么大多数大型组织将Kubernetes与Docker用于主要分布在数百个容器中的应用程序。