岳飞 2020-06-04
大多数现代软件开发人员可以证明,容器为我们提供了更大的灵活性,可以在物理和虚拟基础架构上运行云原生应用程序。容器将组成应用程序的服务打包,并使其可在不同的计算环境中移植,以供开发/测试和生产使用。使用容器,可以轻松地快速扩展应用程序实例以适应需求的高峰。而且由于容器利用了主机OS的资源,因此它们的重量比虚拟机轻得多。这意味着容器可以高效利用基础服务器基础架构。到目前为止,一切都很好。
但是,尽管容器运行时API非常适合于管理单个容器,但在管理可能包含分布在多个主机上的数百个容器的应用程序时,它们仍然远远不足。需要管理容器并将其连接到外部,以执行诸如调度,负载平衡和分发之类的任务,这就是诸如Kubernetes这样的容器编排工具所独有的地方。
Kubernetes是一个用于部署,扩展和管理容器化应用程序的开源系统,可处理将容器调度到计算集群上的工作,并管理工作量以确保它们按用户预期的方式运行。Kubernetes并没有在事后再加上操作,而是通过设计将软件开发和操作结合在一起。通过使用声明性的,与基础结构无关的构造来描述应用程序的组成方式,它们如何交互以及如何管理它们,Kubernetes使得现代软件系统的可操作性得到了大幅度的提高。Kubernetes是由Google根据自己在生产中运行容器的经验而构建的,它的成功很大程度上归功于Google的参与。Google拥有地球上一些最有才华的软件开发人员,并且按规模运行着一些最大的软件服务。这种结合确保了Kubernetes将成为坚如磐石的平台,几乎可以满足任何组织的扩展需求。
本文解释了Kubernetes为什么如此重要以及为什么它标志着Devops团队向前迈出了重要的一步。
当今的基础架构框架
如今,开发人员被要求编写在多个操作环境中运行的应用程序,包括专用的本地服务器,虚拟化的私有云以及诸如AWS和Azure的公共云。传统上,支持它们的应用程序和工具与底层基础结构紧密联系在一起,因此尽管具有潜在优势,但使用其他部署模型的成本很高。这意味着应用程序在多个方面都依赖于特定环境,包括与特定网络体系结构有关的性能问题;遵守特定于云提供商的架构,例如专有的编排技术;以及对特定后端存储系统的依赖性。PaaS试图解决这些问题,但通常以在编程语言和应用程序框架等领域提出严格要求为代价。因此,PaaS对许多开发团队来说都是禁区。Kubernetes通过为容器提供核心功能而没有施加限制,从而消除了基础架构锁定。它通过结合Kubernetes平台内的功能(包括Pod和Services)来实现此目的。
通过模块化改善管理
容器允许将应用程序分解为较小的部分,并且可以将关注点清楚地分开。为单个容器映像提供的抽象层使我们可以从根本上重新考虑分布式应用程序的构建方式。这种模块化的方法可以使规模较小,专注程度更高的团队加快开发速度,每个团队分别负责特定的容器。它还使我们能够隔离依赖关系,并广泛使用经过调整的较小组件。但是,仅靠容器是无法实现的;它需要一个用于集成和编排这些模块化部件的系统。Kubernetes在某种程度上使用Pod来实现这一目标-Pod通常是作为单个应用程序控制的一组容器。容器共享资源,例如文件系统,内核名称空间和IP地址。通过允许以这种方式并置容器,Kubernetes消除了将太多功能塞入单个容器映像的诱惑。Kubernetes中的服务概念用于将执行类似功能的Pod集合组合在一起。可以轻松配置服务以实现可发现性,可观察性,水平扩展和负载平衡。
大规模部署和更新软件
Devops作为一种加快构建,测试和发布软件过程的方法而出现。其必然结果是将重点从管理基础结构转移到管理软件的大规模部署和更新方式。大多数基础架构框架都不支持该模型,但是Kubernetes可以部分支持Kubernetes Controller。借助控制器,可以轻松使用基础架构来管理应用程序生命周期。部署控制器简化了许多复杂的管理任务。例如:
1. 可扩展性:可以首次在Pod中以横向扩展方式部署软件,并且可以随时扩展或横向扩展部署。
2. 可见性:使用状态查询功能来识别完成,进行中和失败的部署。
3. 节省时间:随时暂停部署,再之后再恢复。
4. 版本控制:如果当前版本不稳定,则使用较新版本的应用程序映像更新已部署的Pod,并回滚到较早的部署。
在其他可能性中,Kubernetes简化了一些特定的部署操作,这些操作对于现代应用程序的开发人员特别有价值。其中包括:
1. 水平自动伸缩:Kubernetes自动缩放器会根据指定资源的使用(在定义的限制内)自动确定部署的Pod数量。
2. 滚动更新:Kubernetes部署的更新在部署的Pod中以“滚动方式”编排。在对可能不可用的Pod数量和可能临时存在的备用Pod数量进行可选的预定义限制时,精心策划了这些滚动更新。
3. 金丝雀部署:部署新版本的部署时,一种有用的模式是先在生产环境中与先前版本并行测试新部署,并扩大新部署,同时缩减先前部署。
与传统的包罗万象的PaaS产品不同,Kubernetes为支持的应用程序类型提供了广泛的自由度。它不会规定应用程序框架(例如Wildfly),限制受支持的语言运行时(Java,Python,Ruby),仅迎合12个因素的应用程序,也不会区分“应用程序”与“服务”。Kubernetes支持各种各样的工作负载,包括无状态,有状态和数据处理工作负载。如果应用程序可以在容器中运行,那么它应该在Kubernetes上运行良好。
为云原生应用奠定基础