云原生应用和容器设计模式的综述和展望

  • 时间:
  • 浏览:0

宠物是有名字的,有记忆的,需用主人悉心照顾的;宠物死了,主人是要伤心流泪的。这就好像大多非云计算公司的计算机系统或虚拟机系统,运维人员要悉心维护,十几个 劲更新操作系统和用户密码,开放端口要申请审批,万一以外宕机了,运维人员要心疼的。牲畜则不一样,牲畜居于的唯一意义是提供肉制品和奶制品,牲畜不需用有名字,牲畜也如此 记忆(大约主人不关心它有如此 记忆),主人对牲畜是大规模集约化养殖,牲畜死了,我希望完整性总要传染病大规模死亡,主人是不会为它伤心的。这和谷歌亚马逊那些公司的情况汇报之类,单独一台计算机再次出现故障的概率很低,有之前 在上万台计算机里再次出现一台故障的概率就很高。那些公司可你可不能不能 机会一台计算机再次出现的故障而影响业务,一点一点一定要使系统可不能不能 自动化维护,对再次出现故障的计算机像处里牲畜尸体一样处里掉就算了。

个人面,就像前面提到的,“平台”和“应用”的概念可可不能不能 算不算相对的,而PaaS和SaaS的概念,在实际中也机会是相对的。之类,十几个 建筑信息云平台系统,相对于通用的PaaS如CloudFoundry和Openshift,它有之前 SaaS;而它相对于建筑公司个人在里边运行的应用有之前 PaaS。

功能分割的主要过程也有之前 微服务分割的过程。随着容器技术的风靡,微服务架构也成为软件技术领域的热门词汇。微服务架构的理念,是将十几个 完整性的应用,按照业务拆分成彼此独立的模块以支撑服务的独立开发、部署和伸缩。微服务分割也有之前 业务功能分割。微服务分割和传统软件模块分割的一大区别是,微服务分割强调领域数据模型的分割,也有之前 数据存储服务的分割,以保证不同微服务之间如此 持久化数据方面的依赖性,从而使得不同的微服务真正可可不能不能 否在运行时独立进行部署和伸缩。传统的软件模块分割,比较多的是考虑代码的重用性和各模块开发的独立性,但机会并如此 为超高用户压力的弹性要求做准备,比较少考虑数据持久化层面的伸缩性。而如前所述,Y轴业务功能分割是Z轴数据分片的前提,有之前 要想真正应对超高用户压力的弹性计算要求,进行业务功能分割是第一步。

一提到云原生应用,大伙 儿就总要提到12要素应用包括本系列文章的第二篇,也完整性解读了12要素。作为本系列文章的最后一篇,本文想对于概念采取灵活宽容的态度,正如前文所述,“应用”和“平台”可可不能不能 否理解为相对的概念。12要素应用是PaaS平台Heroku提出的理念,其中不得劲要的十几个 理念,有之前 无情况汇报化Stateless。在Heroku团队的语境下,所有有情况汇报服务完整性总要其Heroku“平台”提供的,而所有其客户的“应用”当然都应该是无情况汇报的。个人面,对于以私有云为基础的企业应用,机会是对一点有情况汇报服务有特殊需求的应用,除了无情况汇报服务,机会也需用个人构建不得劲的有情况汇报服务,将那些有情况汇报服务作为个人无情况汇报服务的后台支撑服务(Backing Service)。

2016-12-12 作者:王昕 来源:InfoQ

针对分布式系统的情况汇报管理的这名难题,k8s系统的设计中原生融入了谷歌多年来运维管理大型分布式系统的经验。对于每个管理的分布式对象,并完整性总要仅仅有十几个 情况汇报,有之前 有理想情况汇报(之类k8s中API对象的Spec)和实际情况汇报(之类k8s中API对象的Status)两种生活情况汇报。如下图,用户输入设置理想情况汇报后,管理服务器(之类k8s API Server)将理想情况汇报存入到共享情况汇报存储(之类Etcd)并通知子系统控制器(之类Replication Controller),有之前 马上将理想情况汇报返回,而何必 会等待英文实际情况汇报的处里结果。系统中的子系统控制器,会不断从共享情况汇报存储读取理想情况汇报和实际情况汇报,有之前 相应地控制对应集群中的子系统(之类Pod)。子系统再完成个人的处里任务后,会将个人的实际情况汇报设置到共享情况汇报存储。对于运维管理k8s系统的用户,机会他想查看任何十几个 系统的实际情况汇报,需用单独向管理服务发送读取情况汇报的请求,管理服务器会将所请求对象的理想情况汇报和实际情况汇报共同返回给客户。

在设计开发硬件的过程中,硬件设计者的意图固化在硬件中,在开发固件的过程中,固件设计者的意图固化在固件中,软件开发过程中软件开发者的意图固化在软件中,配置系统过程中系统运维人员的意图加载到系统中,用户输入数据进行处里时,用户的意图输入到系统中。自底向上,从硬件到数据,对应角色对信息系统居于作用的频率如此 高,信息有效作用的周期如此 短。越靠低层,信息固化得越稳定;越靠上层,信息的变化越灵活。

前面介绍的是k8s系统两种生活所应用的设计模式,此外,在本系列文章的前面几篇中,结合一点简单案例介绍了k8s社区推出的针对应用的容器设计模式。云原生应用运行的环境完整性总要复杂性的分布式环境,在这名情况汇报下,一点有用的设计模式可可不能不能 否起到四两拨千斤的作用。那些设计模式主要用来处里在分布环境中的一点通用难题,比如模块解耦的难题,主控节点选举的难题,并行处里任务调度的难题和在分布式系统中应用分治法的难题。与传统的面向对象设计模式的最明显地区别在于,容器设计模式是跨编程语言的,这名当然也来自于容器两种生活的编程语言无关性。

Kubernetes是原生为生产环境而设计的平台,其十几个 原生的设计目标,有之前 让基于容器的为服务实例Pod,全面取代虚拟机。虚拟机既可可不能不能 否提供无情况汇报服务,也可可不能不能 否提供有情况汇报服务,这也是k8s在有了Replication Controller和ReplicaSet之前 ,又持续推出PetSet(或StatefulSet)的由于。在云计算领域,十几个 劲有宠物和牲畜的呼告。那些有上万台物理服务器的云计算领军公司,比如谷歌和亚马逊,将个人的服务器比作牲畜,将一般企业悉心维护的计算机比作宠物。

容器技术和容器即服务近两年机会Docker的崛起而在云计算领域独领风骚,一点人把基于容器的云计算服务归为PaaS,一点人把它归为IaaS;基本上来说,这有之前 介于PaaS和IaaS之间的服务,有之前 事实上证明,这名层服务有必要有之前 非常受欢迎,也就如此 必要再纠结名字了。不同层次的云计算服务所相关的技术和产品见下表。

对于管理多个子系统的情况汇报,加入仍然采取同步操作并返回情况汇报的最好的办法,如下图所示,有两种生活情况汇报机会造成难题。第一,机会需用分发的字系统个数不得劲多,则非常有机会再次出现某十几个 或十几个 字系统联系不上或反映很快的难题,这将造成管理服务器的返回很快;第二,一点情况汇报,子系统两种生活的情况汇报转变有之前 很快的,这将给管理服务器同步返回结果造成原生困难。事实上,在像OpenStack和Kubernetes曾经的云平台管理系统中,需用处里很长时间的任务是多量居于的,比如OpenStack中启动虚拟机的任务和Kubernetes中调度多量Pod的任务。

机会大伙 儿回顾DevOps得以实现的过程,其由于在于之类Docker、Kubernetes、Ansible、Python、Go、Jave、Scala、Groovy、Nodejs、Swift等等那些软件工具和线程池池运行开发语言表达能力如此 强,共同也如此 简单易学易用,使得开发和运维两要素工作可可不能不能 否合二为一。我希望大伙 儿将曾经的智能工具向信息系统的下层和上层继续扩展;向下,使得硬件和固件也可可不能不能 否用相对高级简易的语言进行编程;向上,进一步让工具语言智能化和简单化,甚至发展到从用户自然语言实现自动编程,曾经,普通用户对于系统来说也就和开发人员一样,而系统可可不能不能 否从用户处获取完整性的用户意图,完整性遵循最终用户的意图处里信息。大伙 儿可可不能不能 否称曾经的系统为意图即代码系统,机会干脆称为人工智能系统,只不过这名系统不具有独立意识,完整性按照用户的意图工作。

在信息系统的各个层次中,最起决定作用也是最智能的要素,是软件这名层次。传统的企业软件,主要有操作系统、里边件和应用十几个 层次。随着虚拟化和云计算技术的发展,各个层次都产生了虚拟化技术,机会说将其服务化的技术。在硬件和固件之上,产生了硬件虚拟化的技术,以下面的硬件资源为基础,虚拟化出虚拟计算机,对于上层,下层就像真实的一点一点个独立的物理机器一样。在操作系统里边,产生了系统虚拟化技术,对于上层,下层就像真实的一点一点个独立的操作系统一样。在里边件(之类Web应用里边件Tomcat,数据库里边件MySQL)里边,产生了里边件虚拟化技术,对于上层,下层就像真实的一点一点个独立的里边件服务一样。在应用里边,产生了应用虚拟化技术,对于上层,下层就像真实的一点一点个独立的应用软件一样。

目前,基于Docker、Kubernetes、Ansible、Puppet、Chef、Jenkins等一系列自动化工具系统,机会使得软件系统运维和开发过程变得异常地自动化和智能化,形成了将软件开发和运维一体化整合的DevOps系统。DevOps带来的自动化和智能化由于减少人力成本和系统稳定,共同,也由于向信息系统输入意图的开发人员减少。毕竟,信息系统是给用户使用的,是要满足用户的需求,体现用户的意图,有之前 ,在整个系统的生命周期中,掺杂与用户无关的人的意图越少越好。

不同层次的虚拟化技术,正好对应不同层次的云计算服务交付最好的办法。管理硬件虚拟化的云计算服务称为基础设施即服务IaaS,管理系统虚拟化的云计算服务称为容器即服务 CaaS,管理里边件虚拟化的云计算服务称为平台即服务PaaS,管理应用软件虚拟化的云计算服务称为软件即服务SaaS。

从云计算的定义出发,云计算系统十几个 基本价值形式有之前 计算能力的弹性和伸缩性。弹性和伸缩性的意思是可不能不能 根据实际的需用,随时增多或减少计算能力。弹性伸缩针对不同的处里对象,有不同的伸缩模式,如下图,分别居于X、Y、Z轴十几个 不同维度。

大伙 儿平常所使用的所有应用软件,机会从根本上看,都可可不能不能 否看作两种生活信息处里系统。大伙 跟那些系统的关系,无非是人输入信息处里的请求意图,经过信息处里系统的处里,系统返回十几个 输出结果给人。机会只考虑十几个 系统的使用者,似乎对系统的输入者只有系统用户和系统运维,运维人员负责配置信息系统,用户负责使用信息系统。然而考虑十几个 信息系统的整个生命周期,着实十几个 信息系统的构建者也对这名系统不断有输入。经过了多年的工业化、信息化的过程,十几个 信息系统的构建划分成了一点一点的阶段,共同一整个系统也可可不能不能 否划分成多个层次,从最低层到最上层,可可不能不能 否分为硬件、固件、软件、配置和数据几层信息。

以Kubernetes容器平台为例,在其上可可不能不能 否构建高可用高可伸缩的有情况汇报服务,之类Redis、MySQL、MongoDB、Cassandra等。机会在这名语境下,将Kubernetes作为“平台”,Redis、MySQL、MongoDB、Cassandra那些作为应用,那那些应用则是有情况汇报的。对于有情况汇报服务(应用),要怎样实现云原生应用理念,还如此 像12要素那样的公认标准,但可可不能不能 否确认的是Kubernetes平台机会结束在探索,不得劲是它的StatefulSet(之前 的PetSet)对象有之前 专门为有情况汇报服务而设计的。机会从“云原生”的基本定义出发,云原生应用是专门为部署在云平台而设计的,自带集群扩展伸缩能力,可不能不能 利用云平台的资源调度能力进行应用层集群扩展伸缩的应用,我希望具备了这名动态伸缩能力,就可可不能不能 否称为云原生应用,随着k8s平台上Redis、 MySQL、MongoDB和Cassandra等有情况汇报服务跟StatefulSet的深入集成,大伙 儿将可可不能不能 否更清晰地看出有情况汇报的云原生应用的模式。

在本系列文章主题介绍的Kubernetes系统,正是为自动化运维而设计的系统,有之前 其Pod从一结束就被设计成牲畜的角色;依靠Replication Controller和Deployment控制创建的Pod,其名字是个随机ID,如此 人会记得这名名字,也可可不能不能 否说如此 名字。这名Pod也是符合12要素应用模型的无情况汇报服务实例,是如此 记忆的。

这里所说的完整性的意图即代码系统固然还是畅想,但着实目前还是可可不能不能 否在一点领域看多一点技术对这名远景的靠近。之类向上,利用数据可视化的技术D3(Data Driven Document),用户只需用输入人人一看就懂的数据列表,就可可不能不能 否产生表意充裕有之前 支持互动的动态图表;再比如向下,机会有固件FPGA系统支持用C语言编程,相信在未来FPGA技术像容器一样在云计算领域爆发流行的节点,更快会再次出现对更高级的编程语言的支持。总之,作为云计算系统的设计开发者,希望能开发出一站式处里用户需求的系统,给用户最大的灵活度共同让用户能以最简单的最好的办法实现个人的意图。

在k8s系统中,所有所含分布式情况汇报的API对象都以同样的模式设计,这使得在现有功能基础上不断创新增加新功能和新API对象的最好的办法变得非常直观,也使得k8s的开发者和使用者理解系统的机制变得非常容易。能把如此 复杂性的分布式情况汇报管理的难题总结出如此 清晰直观的设计模式,在k8s系统之前 我几乎如此 见到过。

当然那些基础设施管理的逻辑可不能不能 交给应用开发者用代码管理的十几个 前提是,机会像Docker和Kubernetes曾经的技术将部署和应用自动化运维管理的接口封装得如此 得体而简单,使得应用开发者只需用编写两种生活声明式的编排文件,就可可不能不能 否得到个人你可不能不能 的信息系统,机会说,应用开发者可可不能不能 否非常简单地向系统表达个人关于应用组合编排和基础设施管理的意图,并让系统按照个人的意图工作。

有关宠物与牲畜、机器人与人的概念,似乎从技术到哲学再到文艺完整性总要之类呼告。宠物与人,是有灵魂的、有名字的,而牲畜与机器人是如此 灵魂如此 名字的,顶多有个编号。机会看多日本导演宫崎骏电影《千与千寻》,机会也记得里边的人物机会被抛弃了名字,也就变成了牲畜机会只有给别人埋头工作的奴隶了。不同计算实例类型对应的特点比较见下表。

微服务架构的理念,在以Docker为代表的容器技术风靡之前 就机会居于,像亚马逊、Netflix那些需用应对超高用户压力公司,早早就以微服务架构分割个人的应用,利用虚拟机技术部署个人的微服务。不过要利用微服务架构在系统弹性伸缩方面的好处,十几个 前提是每个服务实例仅部署十几个 微服务,处里不同微服务之间互相影响,而这在虚拟机时代,带来的开销是比较大的,不得劲是对于那些如此 应对高用户压力需求的企业。十几个 传统的电商应用,按照微服务架构尽量拆分,机会拆分为6到7个服务;机会利用虚拟机部署,这6到7个服务运行总要附带虚拟机操作系统的开销,这对十几个 如此 很大压力的应用来说,未免得不偿失。而容器技术,刚好处里了应用轻负载情况汇报下的额外开销难题,使得分割后独立部署的微服务,与应用无关的额外资源开销很小,这就使得微服务架构有了如鱼得水的感觉。

分布式系统的情况汇报管理十几个 劲是个云计算领域的难题。在传统的服务器系统中,软件开发人员十几个 劲以同步操作的最好的办法保证系统情况汇报的一致性。对于只有单个计算机节点的系统,曾经的最好的办法是自然而然的。像下图曾经的系统,用户输入配置,服务器处里请求,设置情况汇报,等待英文情况汇报设置完成返回配置结果,对于单个计算机节点的系统是合情合理的。

在介绍那些容器设计模式的过程中,大伙 儿也对Metaparticle项目窥豹一斑。Metapaticle项目的目的在开发并展示两种生活基础设施即代码的编程模式,力图将基础设施管理逻辑和功能运算逻辑以同两种生活语言实现在同一短小精干的线程池池运行中。在分布式计算系统中,不仅功能性计算的逻辑是重要的,对计算系统的逻辑拓扑价值形式的控制也是重要的。大伙 儿可可不能不能 否想象,依靠流行大数据分析框架Hadoop MapReduce、Spark、Storm和Flink等进行分布式大数据运算,代码中往往所含逻辑拓扑价值形式的逻辑。

不过Kubernetes系统的设计目标远不止无情况汇报容器,需用支持有情况汇报服务实例。有之前 ,Kubernetes引入了新的资源类型PetSet,用来提供有情况汇报服务。如本系列文章前文所述,PetSet里的Pod有十几个 固定的编号和身份,对应固定的存储,一旦某个编号的Pod宕机,同样编号的Pod要被启动起来并挂在到同样的存储设备上,接替之前 编号的Pod工作。以较真的淬硬层 说,“PetSet”这名名字是不贴切的,机会着实PetSet是有情况汇报的,但工程师设计这名资源,肯定完整性总要为了要当宠物来照顾的。设计PetSet的唯一目的是要它可不能不能 持续干活,它所具备的名字,也完整性总要十几个 真正有意义的名字,而仅仅是十几个 为了识别身份的编号而已。事实上,PetSet里Pod不像十几个 宠物,而更像十几个 智能组织里的机器人或是奴隶。机器人死了,主人不会伤心,只会要十几个 同样的机器人来继承它的记忆,继续做同样的工作。有之前 说,PetSet着实完整性总要个贴切的名字,事实上,在最新的Kubernetes版本中,工程师们也着实认识到这点,正打算把它的名字改成StatefulSet。

随着信息技术的不断发展,各个层次的界限如此 模糊,机会说,各个层次之间的关系如此 具有相对性。机会大伙 儿把系统下层叫做“平台”,系统上层叫做“应用”,曾经说来,固件是跑在硬件上的“应用”,软件是跑在固件上的“应用”,配置是跑在软件上的“应用”,数据是跑在配置上的“应用”。机会大伙 儿把系统下层叫做“硬件”,系统上层叫做“软件”,曾经说来,固件是跑在硬件上的“软件”,软件是跑在固件上的“软件”,配置是跑在软件上的“软件”,数据是跑在配置上的“软件”。曾经,“平台”与“应用”的区别,机会说“硬件”与“软件”的区别,本质并完整性总要用那些最好的办法实现;有之前 相对来说,谁更稳定,谁更灵活,要想在上层灵活地做东西,需用要下层的稳定。