Kubernetes允许用户随处部署云原生应用程序,并以其偏好的方式对加以管理。

同是容器管理系统,Kubernetes为什么那么火?

正如大多数现代软件开发人员通过实践所证明,容器技术确实能够为用户在物理及虚拟基础设施之上运行云原生应用程序提供更为理想的灵活性。容器技术能够将多层服务打包为一款应用程序,并确保其能够在不同计算环境之间往来移植,从而实现开发/测试,及生产性使用。

利用容器技术,用户能够更轻松地启动应用程序实例,快速满足峰值需求。另外,由于容器直接使用主机操作系统资源,体量较虚拟机更轻,这意味着容器能够高效发挥底层基础设施的固有优势。

说到这里,容器的前途似乎一片光明。然而必须承认,尽管容器运行时API非常适合管理单个容器,但一旦面对着分布在多台主机上且拥有数百套容器的大规模应用程序时,这些API就会变得力不从心。在这种情况下,容器需要接受管理并有序接入外部环境,从而实现调度、负载均衡以及分配等任务——Kubernetes正是能够实现上述目标的一款容器编排工具。

作为一套用于容器化应用程序部署、扩展与管理工作的开源系统,Kubernetes能够处理计算集群上的容器调度与工作负载管理,确保其严格按照用户的意愿运行。

Kubernetes由谷歌公司构建,融入了其在生产环境内运行容器时积累下的大量专业知识与经验。众所周知,谷歌公司拥有众多全球最为睿智且极具才华的软件开发人员,亦运行着规模最大的软件服务体系之一。这样的体系储备使得Kubernetes成为一套坚如磐石的平台,能够满足几乎一切组织机构的规模需求。

在今天的文章中,我们将具体探讨Kubernetes的重要意义及其将给DevOps团队带来的深远影响。

1

面向当下的各类基础设施框架

时至今日,开发人员往往需要面向多套操作环境编写应用程序,具体包括本地专用服务器、虚拟化私有云以及AWS与Azure等公有云。

从传统角度讲,应用程序以及相关工具必须与其底层基础设施紧密契合。虽然这种作法确实具备一定潜在优势,但此类部署模型的实施成本亦相当昂贵。这意味着应用程序将在多个方面高度依赖于特定环境,包括与特定网络架构相关的性能特征、遵循云服务供应商提出的特定架构(例如专有编排技术)以及对特定后端存储系统的依赖性等等。

PaaS尝试解决这些问题,但随之而来的代价则往往包括在程序语言,以及应用程序框架等领域施以严格要求。因此,对于多数开发团队而言,PaaS通常并不适用。

Kubernetes通过为容器提供核心功能但又不施加强制性约束的方式解决了这种基础设施锁定难题。其通过将Kubernetes平台之内的多项功能加以结合实现这项目标,包括Pods与Services等。

2

通过模块化提升管理效果

容器技术允许将各应用程序拆分成更小的部分,同时让各部分拥有更为明确的功能关注点。该抽象层提供的独立容器镜像允许我们从根本上重新考量如何构建分布式应用程序。

另外,这种模块化方法亦使得开发团队能够着眼于小处、更为专注地实现功能开发,这意味着各团队负责对应的特定容器即可。再有,其还允许用户对依赖关系加以隔离,同时对小型组件更为广泛地加以调优。

但这一切并不能单纯通过容器技术实现,还需要配合一套用于对这些模块化组件加以集成与编排的系统。Kubernetes利用Pods机制实现这一目标。

所谓Pods,代表着能够作为单一应用程序加以控制的一组容器集合。这些容器共享同样的资源集,包括文件系统、内核命名空间以及IP地址等。通过这种容器协作方式,Kubernetes能够有效避免将太多功能集中到单一容器镜像这样的错误实践中。

Kubernetes中的Services概念用于将具备类似功能的多个Pods整合为一组。Services可轻松进行配置以实现其可发现性、可观察性、横向扩展以及负载均衡。

3

实现软件的规模化部署与更新

Devops是一种新兴方法,用于加快软件构建、测试与发布的整体过程。其结果是将软件团队的关注点由管理基础设施转向管理软件的规模化部署与更新工作。

大多数基础设施框架并不支持这一模式,但Kubernetes在这方面拥有出色的表现,特别是在KubernetesControllers的支持之下。归功于这些控制器,用户能够轻松利用基础设施管理整个应用程序生命周期。

部署控制器(Deployment Controller)能够简化多种复杂的管理任务,例如:

  • 可扩展性。软件可以向外扩展跨越多个Pods实现初步部署,且相关部署可随时进行规模伸缩。
  • 可见性。提供状态查询功能以判断部署工人和的完成情况、当前执行状态以及失败问题。
  • 节约时间。用户可随时暂停部署并在稍后加以恢复。
  • 版本控制。利用新的应用程序镜像版本对已部署Pods进行更新,并在发现当前版本存在不稳定问题时回滚至早期部署版本。

另外,Kubernetes还能够显著简化多种特定部署操作,这一点对于现代应用程序开发者而言极具现实意义。其中具体包括:

  • 自动横向扩展。Kubernetes autoscalers能够自动根据特定资源的使用量对Pods的部署数量进行调整(在已定义的限制范围内)。
  • 滚动更新。Kubernetes采取“滚动方式”实现编排,且可跨越部署范围内的全部Pods。这些滚更新可进行编排,并以预定义方式配合当前可能尚不可用的Pods数量以及暂时存在的闲置Pods数量。
  • 金丝雀部署。作为一项实用性模式,我们在部署新版本之前,通常需要以实验性方式在生产环境中进行试部署,同时保证新旧版本并行运作。在确定一切正常后,逐步提升新部署规模并同步降低原有部署版本规模。
  • 与存在强烈专用属性的传统方案不同,Kubernetes能够为广泛的应用类型提供支持。它不会限定应用程序框架(例如Wildfly)、指定受支持语言运行时(Java、Python与Ruby等)、仅适用于12因素应用程序或者区分“应用程序”与“服务”。相反,Kubernetes支持极为广泛的工作负载类型,其中包括无状态、有状态以及数据处理型工作负载。如果应用程序能够在容器内运行,其即可在Kubernetes上正常起效。

4

为云原生应用奠定基础

鉴于当前容器技术获得的高度关注,越来越多管理与编排工具开始陆续出现。目前流行的方案包括Apache Mesos with Marathon、Docker Swarm、AWS EC2 Container Service(简称ECS)以及HasiCorp的Nomad。

当然各类方案皆拥有自己的特色与优势。Docker Swarm能够与Docker运行时紧密对接,帮助用户更轻松地由Docker过渡至Swarm;Mesos with Marathon不仅限于容器范畴,亦可部署各种类型的其它应用程序;AWS ECS可供AWS用户轻松访问。

然而,Kubernetes集群能够运行在EC2之上,并与AWS旗下的各类服务实现对接,具体包括Amazon弹性块存储(Elastic Block Storage)、弹性负载均衡(Elastic LoadBalancing)、自动规模伸缩组(Auto Scaling Groups)等。

这些框架在功能与特性方面存在大量交集,不过凭借着自身架构、创新成果以及庞大的开源技术社区等优势,Kubernetes仍然保持着极高人气。

Kubernetes的出现标志着DevOps的发展迎来突破,因为其允许开发者充分满足现代软件的开发要求。在缺少Kubernetes的情况下,开发团队常常被迫自行编写软件部署、扩展及更新工作流。部分企业甚至会建立大型团队单独处理此类任务。Kubernetes能够帮助我们充分发挥容器技术的既有优势,同时构建起能够在任意环境下运行的云原生应用程序,而不再需要受缚于云特定要求。

总结而言,Kubernetes代表着我们长久以来一直期待的高效应用程序开发与操作模式。 ')}