小伙伴儿们,如果觉得文章干货满满,欢迎加入公众号【编程识堂】,更多干货等着你们来哦!
通过我前面的文章Docker-Swarm,已经简单了解了容器集群化部署; 长期以来,Kubernetes 和 Docker Swarm被看做是vs的对手,在接下来的对比中,我们看一下它们 应该在何时被使用,以及怎么一起工作的。
目前主流的容器化集群部署方案主要有以下几种:
Docker Compose:帮助在 同一个节点 上部署多个容器。
Docker Swarm:多台机器上部署容器。开箱即用,快速部署容器。偏重容器部署
K8s:社区活跃度高,组件丰富。微服务化,偏重应用的部署。
Kubernetes和Docker Swarm不是竞争对手! 两者都有各自的优缺点,可以根据你应用程序的需求来选择使用。(择优选用,相互协作) ,下面我先介绍下各自概念和优缺点:
Docker是一种容器管理服务,它帮助开发人员设计应用程序,使用容器能更容易地创建、部署和运 行应用程序。Docker有一个用于集群容器的内置机制,称为“集群模式”(swarm mode)。使用集群模 式,你可以使用Docker引擎在多台机器上启动应用程序。
Docker Swarm是Docker自己针对Docker容器的原生集群解决方案,它的优点是紧密集成到 Docker的生态系统中,并且使用自己的API。它监视跨服务器集群的容器数量,是创建集群docker应用 程序的最方便的方法,不需要额外的硬件。它为Dockerized应用程序提供了一个小型但有用的编排系统。
更快的运行速度 以更快的速度运行: 当您使用虚拟环境时,您可能已经意识到它需要很长时间,并且包含了启动和 启动您 想要运行的应用程序的冗长过程。对于Docker Swarm来说,这不再是一个问题。Docker Swarm不需要启动一个完整的虚拟机,就可以让应用程序在虚拟和软件定义的环境中快速运行,并 有助于DevOps的实现。
快速简单的配置 提供简单快速的配置: Docker Swarm的一个主要优点是它简化了问题。Docker Swarm使用户可 以自己配置,将其放入代码中并轻松部署。由于Docker Swarm可以在各种环境中使用,因此需求 不受应用程序环境的约束。
确保程序独立(容器间低耦合) 确保应用程序是隔离的:Docker Swarm负责将每个容器与其他容器隔离,并拥有自己的资源。你 可以部署各种容器,以便在不同的堆栈中运行单独的应用程序。除此之外,Docker Swarm将在每 个应用程序在自己的容器上运行时清除应用程序的删除。如果不再需要应用程序,可以删除它的容 器。它不会在您的主机OS上留下任何临时文件或配置文件。
版本控制与组件重用 版本控制和组件重用:使用Docker Swarm,您可以跟踪容器的连续版本、检查差异或回滚到前面 的版本。容器重用来自前一层的组件,这使得它们非常轻量级。
跨平台支持效果差 Docker依赖于平台: Docker Swarm是一个为Linux设计的平台。虽然Docker支持Windows和Mac OS X,但它使用虚拟机在非linux平台上运行。设计为在Windows上的Docker容器中运行的应用程 序不能在Linux上运行,反之亦然。
不提供存储选项 Docker Swarm不提供将容器连接到存储的简便方法,比如不能存储服务配置文件,秘钥等数据,这是主要缺点之一。它的数 据量需要对主机和手动配置进行大量的改进。如果你想要Docker Swarm解决存储问题,也能办 到,但是方式并不高效,且这种方式对用户并不友好。
监控信息不足 Docker Swarm提供关于容器的基本信息,如果您正在寻找基本的监控解决方案,那么使 用Stats命令就足够了。如果您正在寻找先进的监控,那么Docker集群不是好的选择。虽然有像 CAdvisor这样的第三方工具可以提供更多的监控,但是使用Docker本身实时收集更多关于容器的 数据是不可行的。
当在多台机器上的多个容器中使用不同组件开发应用程序时,需要一个工具来管理和协调容器。这只有 在Kubernetes的帮助下才可行。
Kubernetes是一个用于在集群环境中管理容器化应用程序的开源系统。以正确的方式使用Kubernetes 可以帮助DevOps作为一个服务团队自动扩展应用程序,并在零停机的情况下进行更新 。
它的速度很快 在不停机的情况下持续部署新功能时,Kubernetes是一个完美的选择。 Kubernetes的目标是以恒定的正常运行时间更新应用程序。它的速度通过您每小时可以运送的许 多功能来衡量,同时保持可用的服务。
遵循不可变基础架构的原则: 在传统的方法中,如果多个更新出现错误,您没有任何关于部署了多少个更新以及发生错误的时间点的记录。在不可变的基础架构中,如果想要更新任何应用程序,需要使用新标记构建容器映像并部署它,用旧映像版本销毁旧容器。这样,你就会有一个记录,并了 解你做了什么,万一有什么错误;您可以轻松地回滚到前面的映像。
提供声明式配置 用户可以知道系统应该处于什么状态以避免错误。源代码控制、单元测试等传统 工具不能与命令式配置一起使用,但可以与声明式配置一起使用。
大规模部署和更新软件 由于Kubernetes具有不可变的声明性,因此扩展很容易。Kubernetes提 供了一些用于扩展目的的有用功能:
学习曲线陡峭 K8s是一种复杂的系统,需要花费一定的时间和精力来学习和掌握。
部署和维护成本高 K8s需要一定的硬件资源和人力资源来部署和维护,成本较高。
需要专业知识 K8s需要一定的专业知识和技能来操作和管理,不适合初学者使用。
安全性问题 K8s的安全性问题需要得到重视,否则可能会出现安全漏洞和攻击。
正如前面所讨论的,Kubernetes和Docker都在不同的级别上工作,但都可以一起使用。 Kubernetes可以集成Docker引擎来执行Docker容器的调度和执行。由于Docker和Kubernetes都是容 器编排器,所以它们都可以帮助管理容器的数量,还可以帮助DevOps实现。两者都可以自动化运行容 器化的基础架构中涉及的大部分任务,并且都是开源软件项目,由Apache License 2.0管理。除此之 外,两者都使用YAML格式的文件来控制工具如何编排容器集群。当两者同时使用时,Docker和 Kubernetes都是部署现代云架构的最佳工具。随着Docker Swarm的豁免,Kubernetes和Docker都相互补充。
如果使用Kubernetes: 您正在寻找成熟的部署和监控选项 您正在寻找快速可靠的响应时间 您正在寻求开发复杂的应用程序,并且需要高资源计算而不受限制 你有一个非常大的集群
如果使用Docker: 您希望在不花费太多时间进行配置和安装的情况下启动工具; 您正在寻找开发一个基本和标准的应用程序,它足够使用默认的docker镜像; 在不同的操作系统上测试和运行相同的应用程序对您来说不是问题; 您需要zdocker API经验和兼容性。
一个 Kubernetes 集群包含 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的 容器化应用。集群具有至少一个工作节点和至少一个主节点。
工作节点托管作为应用程序组件的 Pod 。主节点管理集群中的工作节点和 Pod 。多个主节点用于为集 群提供故障转移和高可用性。
本文概述交付正常运行的 Kubernetes 集群所需的各种组件。 这张图表展示了包含所有相互关联组件的 Kubernetes 集群 。
kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。 比如资源的公平性调度,将通信频繁的一个节点调度到另外一个节点;负载均衡情况的调度等等;
负责整个集群的管理,确保集群中各种资源都处于一种期望的状态, 它通过apiserver监控整个集群的状态 ,当监控到某个资源或者容器处于不正常状态时,这个管理控制器会触发kube-scheduler 去调度资源;
这些控制器包括:
kubectl是客户端管理工具,主要操作的激素apiserver, 提供一个rest风格的请求, apiserver会将kubectl请求的信息(如delete、update、create请求) 存储到etcd数据中,再通过apiserver交由kube-scheduler 调度,etcd和 kube-scheduler 是不能直接通信的,调度之后再通过controller-manager 协同工作绑定到某个 具体工作节点上;
节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。
一个在集群中每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执 行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节 点自身信息,定期向master节点汇报节点的资源使用情况,整个容器运行接口都是由kubelet帮忙协调完成的;
负责网络代理,处理外面用户如何访问容器,维护网络规则;
一个在集群中每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service 和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,是让我们的服务在集群 外可以被访问到的重要方式。