精华内容
下载资源
问答
  • 该文档非常详细的介绍了云原生应用的专业体系知识,涵盖了云原生应用设计,云原生架构原则,云原生应用平台,云原生中间件,云原生应用软件交付流程,这几部分的核心内容。
  • 快速交付云原生应用 包含原生kubernetes环境下应用的快速构建和发布;快速交付云原生应用 包含原生kubernetes环境下应用的快速构建和发布;快速交付云原生应用 包含原生kubernetes环境下应用的快速构建和发布;
  • 什么云原生应用程序

    千次阅读 2015-08-17 14:45:49
    本文介绍的云原生应用的出发点,还可以清晰明白在非云应用往云生应用的发展框架是什么,会带来什么样的好处等等,以及如何处理好不同域间容量、数据、状态的关系。 我们通常都会在设想什么是一个Cloud ...

    本文介绍的云原生应用的出发点,还可以清晰明白在非云应用往云生应用的发展框架是什么,会带来什么样的好处等等,以及如何处理好不同域间容量、数据、状态的关系。


    我们通常都会在设想什么是一个Cloud Native Appliction,这也是我们为什么不停地去测试、学习各种云服务,学习、使用docker的原因。本文介绍的云原生应用的出发点,可能和我们的有着异曲同工的地方,可能在某些方面说的还是比较抽象,但是通过图片,我们还是可以清晰明白在非云应用往云生应用的发展框架是什么,会带来什么样的好处等等,以及如何处理好不同域间容量、数据、状态的关系。

    最近有试着描述“现代应用程序”或“现代工作负载”。

    Twelve-Factor App就是一个很好的尝试。

    这是一个很好的方法来描述这样的工作量但我认为这些概念需要降低一个数量级使普通人正常理解他们。

    这就是我想要在这个博文上做的。我们将省略一些重要的细节通过这样做但没关系。

    让我直接点:在(我的意思是非常)高水平云本机应用程序是一个应用程序,该应用程序有一个明确的“基础设施”和“数据”之间的分离。至少在我看来,设计一个云本机应用程序没有画这个明确的分离。

    我用数据作为一个非常松散的术语。你可能正在考虑一个“基于数据”(哪个都行)但这真的应该包括“配置”。

    另一种方法来描述这种分离可能是“容量”和“状态”。不仅仅是这样。

    让我们立刻开始用一幅画来描述这一概念:

    云原生应用程序(傻瓜教程)

    请注意这两个域的特征。

    基础设施容量没有你需要或想要保护的自己的状态(至少在本地存储中)。

    这是完全无状态,你可以通过自动化轻松地(反复)创建它,因此,它不需要有弹性。

    另一方面承载了你的持久性的域(在每一个可能的形状和形式)具有完全不同的特征,因为它需要可靠的、高可用性、耐用和这一切。

    此时,您可能想知道这是如何不同与传统模式相比在3层web应用程序。在我看来,云本机应用程序在隔离传统“应用层”与传统的“数据层”将envelope推到极端。

    基础设施容量域

    这就是虚拟机(又名实例)实时托管原生云应用的代码。他们完全是无状态的,他们是一群vm所有相同配置(基于角色)和整个生命周期的自动化。在这样一个环境中传统IT概念通常关联到虚拟机甚至没有任何意义。下面是一些例子。

    • 不安装这些服务器(传统方法),因为它们是由自动生成脚本由外部事件或政策触发(如基于用户需求自动定量前端层)
    • 不操作这些服务器,原因同上。
    • 不记录这些服务器做什么和如何提供它们,因为代码生成文档。
    • 不备份这些服务器,因为他们没有状态。如果你失去了服务器,你重新实例这些服务器,从头开始。
    • 你没有这些服务器从一个地方迁移到另一个,因为同样的原因。你重新实例这些服务器,从头开始。
    • 你不用云平台级别提供高可用性来保护这些服务器。没有任何保护,如果他们失败了,你重新实例服务器。
    • 你不需要为这些服务规划基础设施的大小,你只需为任何给定的时间点上的消费。

    你配置基础设施的本质与运行代码中的一部分一样。你听说过“基础设施及代码”的概念吗?这就是了。

    现今,相当常见的看到实现这类模式被用于实现配置工具组合,然后切换到配置管理工具。

    这个想法是为了提供虚拟机,让配置工具给客人创建适当的个性和角色。

    AWS Cloudformations,HashiCorp Terraform,VMware Application Director,RightScale CMP这些都是专注于可编程初始化实例的几个例子。

    Puppet, Chef, Ansible (等等) 是配置管理工具,专注于通过自动化确保实例融合,给定一致的配置和状态。

    截至2014年底,这几乎是目前的状况(和最佳实践)。

    然而几个新趋势和模式在上升。他们可能最终收敛汇聚,在某种程度上,你可以看作为一种趋势。

    第一个被称为不变的工作负载。目前为止,我们已经讨论了被称为可变负载,这意味着他们的配置可以改变加班一样配置管理工具配置和重新配置他们需要让他们收敛到一个理想的最终状态。换句话说云本机应用程序当前的最佳实践建议提供一个基础模板和在操作系统核心模板,确保核心模板使用特定的配置。不变工作量的哲学表明,实例相对应的应该是不变的,如果你需要重新配置一个实例(如更新应用程序代码),你应该摧毁这个实例并重新立即部署它最新的配置到模板中。

    第二个趋势是朝着简化整个堆栈包括这些工作负载。目前电脑上门维修常见的做法是使用虚拟机作为一个占位符,用于运行时(例如AWS EC2实例或VMware虚拟机)。这些天有一所新学校的想法说虚拟机太大,太臃肿和云本机应用程序太重,容器是一个更好的方式来打包和部署云本机应用程序。我相信你听说过Docker和相关的动量(或者说是科技泡沫?)。这也很符合另一个趋势(微服务),这一个博文不够说了。

    有趣的是,许多人也认为这种容器化趋势只是某个东西更大(呃,或者说更小?)的过渡。

    援引:Invent 2014 AWS介绍了一项新服务,被称为Lambda云本机应用程序。这个可以允许开发人员编写代码并把代码作为数据的一部分。当数据发生变化时,事件触发代码运行。没有虚拟机,没有选择的容器,代码只是突然地运行起来。换句话说,基础设施没有简化,它只是消失了。

    下图描述了图形化这一概念:

    云原生应用程序(傻瓜教程)

    你可以想象这些概念将会话通向PaaS-ish模型。


    展开全文
  • 原文转自InfoQ云原生应用的基本概念云原生应用,是指原生为在云平台上部署运行而设计开发的应用。公平的说,大多数传统的应用,不做任何改动,都是可以在云平台运行起来的,只要云平台支持这个传统应用所运行的...

    原文转自InfoQ

    一、云原生应用的基本概念

    云原生应用,是指原生为在云平台上部署运行而设计开发的应用。公平的说,大多数传统的应用,不做任何改动,都是可以在云平台运行起来的,只要云平台支持这个传统应用所运行的计算机架构和操作系统。只不过这种运行模式,仅仅是把虚拟机当物理机一样使用,不能够真正利用起来云平台的能力。

    二、云原生应用与相关技术理念的关系

    1.云原生应用与云平台的关系

    云平台是用来部署、管理和运行SaaS云应用的。SaaS是云计算的三种服务模型之一,即跟业务相关的应用即服务。云计算最根本的特性是提供按需分配资源和弹性计算的能力,而云原生应用的设计理念就是让部署到云平台的应用能够利用到云平台的能力,实现按需使用计算资源和弹性伸缩,成为一个合格的SaaS应用。

    2. 云原生应用与12要素的关系

    12要素是PaaS平台Haroku团队提出的应用设计理念,是有关SaaS应用设计理念的红宝书;可以说,12要素应用就是云原生应用的同义词。

    3. 云原生应用与Stateless和Share Nothing架构的关系

    为了实现水平伸缩的能力,云原生应用应该是Stateless和Share Nothing的。

    4. 云原生应用与微服务架构的关系

    微服务架构是实现企业分布式系统的一种架构模式,即将一个复杂的单体应用按照业务的限定上下文,分解成多个独立部署的组件。这些独立部署的组件,就称为微服务。而在谈论云原生应用与微服务架构关系的时候,根据上下文不同可能是有两种不同的含义。一种含义是宏观的云原生应用,即将整个分布式系统看作一个应用,这种语境下,微服务架构是实现云原生应用的一种架构模式;另一种含义是微观的云原生应用,即每个微服务是一个应用,这种语境下,每个微服务要按照云原生应用的设计理念去设计,才能真正实现微服务架构所要达到的目的,即让分布式系统具备按需使用计算资源和弹性伸缩的能力,这里“应用”和“服务”变成了同义词。

    5. 云原生应用与宠物和牲畜的关系

    云原生应用的设计理念是希望把应用当作牲畜来养,而不是当作宠物来养。部署一个云原生应用的集群,就好像圈养了一大群奶牛,目的主要是为了产奶,对待每头牛就像对待机器一样没有什么感情,死了一头就再养一头,而不会像对待宠物那样细心呵护。而传统应用,因为往往因为对运行环境依赖严重,运维人员需要细心照顾、维护,万一出现宕机,一般要在原来的服务器上修复问题再恢复运行;如果恢复不了,整个应用系统就瘫痪了,因此会令运维人员像“宠物死了”一样伤心。

    三、云原生应用的设计理念——12要素

    1. 一个应用对应一套代码多次部署

    这一理念主要是强调应用应该清晰明确地区分什么是应用,什么是部署。一个应用对应的就是一个代码仓库,一个软件产品;一次部署对应的是一个运行起来的应用;因此应用与部署的关系是一对多。这种一对多的关系也体现了应用代码的可重用性,一套代码可以重用到多次的部署中去;不同部署之间的区分是配置,而代码是共享的。对应用架构来说,最基本的是要区分运行时行为和非运行时行为,一个应用的非运行时的代表就是一个代码仓库,它可能有多个运行时实例,每个实例就是一次部署。

    2. 明确地声明并隔离依赖的程序库

    不管用什么语言开发应用,编程语言一定都有管理程序库的机制。这一理念强调所有依赖库一定要明确的声明出来,因为只有这样,在运行应用的时候,才能保证所有运行所需要的程序库都正确部署到了云环境中。

    3. 将配置存储到部署环境中

    正像前面所说,一个应用的不同部署之间是共享一套代码的,不同之处是配置。代码是存储到代码仓库中的,那自然配置不应该是存到代码仓库中。每次部署都有自己独立的部署环境,每次部署所对应的配置要存到这次部署所对应的部署环境中去,因此配置的另一个同义词就是环境变量。这里的部署,不包括应用内部的配置,例如Java的Properties文件或者是Servlet的映射配置文件web.xml等,这些算作是代码而不是配置。这是一个容易令人混淆的地方,那到底什么算代码,什么算配置?判断的标准很简单,就是变化的频率。变动导致产品版本更新的,就是代码;每次部署都可能变更,而每次变动不导致产品版本更新的,就是配置,就是环境变量。

    4. 将后端支撑服务作为挂载资源来使用

    这一理念强调应用使用后台支撑服务的方式。不同的服务之间的区别就只是资源的URL不同,也就是设定这个资源的相关环境变量不同。不管是本地资源还是远程资源,应用程序都可以正常使用,区别只是环境变量的值不同,而应用本身并不会因为环境变量不同而有所区别。最常用的后台支撑服务就是数据库、缓存、消息队列等服务。这一理念可以保证应用在任何环境都可以正常运行,不会因为后台支撑服务的变化而导致应用无法运行。

    5. 严格区分构建阶段和运行阶段

    这一理念跟区分应用和部署类似,本质上也是要严格区分应用的非运行时行为和运行时行为。构建是将应用的代码仓库编译打包成可运行的软件的过程,是非运行时行为。因此说,这一理念另一方面也说明要防止在运行阶段改代码的行为,这样才能够保证运行中应用的稳定性。

    6. 将应用作为无状态的进程来运行

    这一理念要求所有的用户数据都要通过后端支撑服务来存储,而应用本身是无状态的,因为只有这样,应用才能做到水平伸缩,从而利用云平台弹性伸缩的能力。

    7. 仅需要绑定一个端口就可以对外发布一个服务

    这一理念强调应用本身对于发布服务的环境不应该有过多的要求,而应该是完全自包含的,也就是说不需要依赖云平台提供应用运行容器,而只需要云平台分配某个端口对外发布服务。这一理念保证应用可以使用云平台中任意分配的端口发布服务。

    8. 可以像UNIX进程一样水平扩展

    在UNIX操作系统上,不同的进程彼此独立地运行着,共享这整个操作系统管理的计算机资源。云原生应用在云平台上的运行模式也是类似的,云平台就是分布式操作系统,不同的云原生应用彼此独立互补干扰的运行在一个云平台上,可以充分利用云平台的整体计算能力。

    9. 可以快速启动和优雅地关闭

    快速启动是为了能充分利用云平台根据需要调度资源的能力,能够在需要的时候,以最小的延时扩展计算能力提供服务。优雅地关闭,一方面是为了释放资源,将不再使用的计算资源归还云平台;另一方面也是为了保证应用逻辑的完整性,将该完成的任务正确完成,未能完成的任务重新交回到系统由其它应用的运行实例来继续完成。要假设云原生应用的目标工作环境中随时有大量同样的应用实例在运行、启动和关闭,因此快速启动和优雅关闭对高性能和稳定的系统非常重要。

    10. 保持开发环境、预发布环境和生产环境尽量一致

    保持环境一致,是为了提高开发单元测试、功能测试和集成测试的有效性,避免出现开发测试中正常而在生产环境中出现问题的情况。

    11. 将日志作为事件流来处理

    云原生应用运行在复杂的分布式基础设施之上,如果日志不通过简单统一的模式来管理,将给系统排错或通过日志挖掘信息带来很大困难。同时,如果应用将日志输出到系统的文件中,也会给系统的存储空间造成压力,增加系统运维的复杂性。因此这一理念推荐应用将日志输出到标准输出,然后由云平台统一收集处理。

    12. 将应用管理任务当作一次性进程来运行

    将应用的管理任务与应用的业务请求以相似的方式运行,以同样的方式进行调度、日志和监控,将有利于系统的稳定性和分析系统的整体行为。

    四、云原生应用的挑战

    1. 处理分布式系统的网络通信问题

    云原生应用必须要针对分布式系统中网络通信的复杂性进行设计。对于分布式系统,如果还像单一进程应用那样考虑问题,就会进入所谓的“分布式系统的认识误区”,包括武断地认为:网络是可靠的;网络的延时为零;网络带宽是无限大的;网络是安全的;网络拓扑是不变的;系统中只有一个管理员和网络环境都是统一一致的。也许现在很少会有人幼稚到真的认为分布式环境中的交互处理和运行在单一进程中的函数调用是一样的;但开发的复杂度、功能上线的压力,经常会使开发人员把这些复杂问题暂时放在一边,不断积累起越来越多的“技术负债”。

    2. 处理分布式系统的状态一致性问题

    分布式系统的CAP理论认为,在分布式系统中,系统的一致性、可用性和分区容忍性,三者不可能同时兼顾。当然,实际在分布式系统中,由于网络通信固有的不稳定,分区容忍性是必须要存在的,因此在设计应用的时候,就要在一致性和可用性之间权衡选择。

    3. 最终一致性

    很多情况下,在一致性和可用性之间,云原生应用比传统应用更加偏向可用性,而采用最终一致性代替传统用事务交易保证的ACID一致性。传统的ACID一致性编程模型与业务无关,开发人员对它经验丰富,而最终一致性的交互模式与业务相关,必须通过业务的合理性来校验阶段不一致的合理性,这使得最终一致性比ACID一致性复杂得多。

    4. 服务发现和负载均衡

    云原生应用的运行实例随时可能关闭和启动,因此需要机制使得访问应用服务的客户端随时都能找到健康运行的实例,放弃对宕机实例的访问,这就是服务发现的问题。与服务发现同时存在的,是在多个健康实例中选择一个实例真正为某个客户请求提供服务的过程,这就是负载均衡。

    5. 任务分解和数据分片

    大的任务要分解成很多小任务,分配到各个运行实例上去执行,然后再将执行结果汇总,这就是任务分解。数据分布到各个实例上做处理和存储,这个就是数据分片。这些都需要适应云计算环境的机制去支持。

    6. 主控角色选举

    不管是任务分解还是数据分片,每个应用实例上负责的子任务和数据分片虽然是不同的,但如何分解、谁负责谁这种分配映射表一定是完全相同的;因此在这种情况下,需要负责计算分配映射表的主控角色;而因为云计算环境下没有实例是永远保证健康运行的,主控角色不可能是永远固定的;这就需要主控角色选举的机制,能够在主控角色空白或出现故障宕机的情况下,自选举出新的主控角色。

    像设计模式解决面向对象设计中的复杂问题一样,面对云原生应用的复杂应用场景,我们也需要一些典型的设计模式能够可重用地解决一些特定场景的问题。

    展开全文
  • 今天和大家一起聊一聊云原生这个话题,内容来自蚂蚁金服中间件服务与容器团队。由于内容比较多,我们分为上下两个半场。前言特别指出:这次分享主要是希望起到抛砖引玉的作用,让大家更多的参与到云原生这个话题的...

    今天和大家一起聊一聊云原生这个话题,内容来自蚂蚁金服中间件服务与容器团队。

    由于内容比较多,我们分为上下两个半场。

    前言

    \"\"

    特别指出:这次分享主要是希望起到抛砖引玉的作用,让大家更多的参与到云原生这个话题的讨论,希望后面有更多更好的分享。我们笨鸟先飞,起一个头。

    \"\"

    内容主要围绕这几个问题,上半场我们将围绕前三个问题。

    如何理解云原生?

    第一个话题:如何理解“云原生”?之所以将这个话题放在前面,是因为,这是对云原生概念的最基本的理解,而这会直接影响到后续的所有认知。

    每个人对云原生的理解都可能不同,就如莎士比亚所说:一千个人眼中有一千个哈姆雷特。

    \"\"

    我们来快速回顾一下云原生这个词汇在近年来定义的变化。

    \"\"

    先看Pivotal,云原生的提出者,是如何定义云原生的。

    \"\"

    这是2015年,云原生刚刚开始推广时,Matt Stine给出的定义。

    \"\"

    两年之后,同样是Matt Stine。

    \"\"

    而这是Pivotal最新官方网站的描述。可见Pivotal对云原生的定义一直在变。

    \"\"

    再来看看目前云原生背后最大的推手,CNCF,这是2015年CNCF刚成立时对云原生的定义。

    \"\"

    2018年CNCF更新了云原生的定义。

    \"\"

    这是新定义中描述的代表技术,其中容器和微服务两项在不同时期的不同定义中都有出现,而服务网格这个在2017年才开始被社区接纳的新热点技术被非常醒目的列出来,和微服务并列,而不是我们通常认为的服务网格只是微服务在实施时的一种新的方式。

    \"\"

    云原生自身的定义一直在变,这让我们该如何才能准确的理解云原生呢?

    \"\"

    这里我们尝试,将Cloud Native这个词汇拆开来理解,先看看什么是Cloud。

    \"\"

    快速回顾一下云计算的历史,来帮助我们对云有个更感性的认识。

    \"\"

    云计算的出现和虚拟化技术的发展和成熟密切相关,2000年前后x86的虚拟机技术成熟后,云计算逐渐发展起来。

    \"\"

    基于虚拟机技术,陆续出现了IaaS/PaaS/FaaS等形态,以及他们的开源版本。

    \"\"

    2013年docker出现,容器技术成熟,然后围绕容器编排一场大战,最后在2017年底,kubernetes胜出。2015年CNCF成立,并在近年形成了cloud native生态。

    \"\"

    这是云的形态变化,可以看到:供应商提供的功能越来越多,而客户或者说应用需要自己管理的功能越来越少。

    \"image\"

    当云发生如此之大的变化时,云上的应用要如何适应?

    \"image\"

    在回顾完云计算的历史之后,我们对Cloud有更深的认识,接着继续看一下:什么是Native?

    \"image\"

    这是从字典中摘抄下来的对Native词条的解释,注意其中标红的关键字。

    \"image\"

    Native,总是和关键字 Born 联系在一起。

    \"image\"

    那Cloud和native和在一起,又该如何理解?

    \"image\"

    这里我们抛出一个我们自己的理解:云原生代表着原生为云设计。详细的解释是:应用原生被设计为在云上以最佳方式运行,充分发挥云的优势。

    这个理解有点空泛,但是考虑到云原生的定义和特征在这些年间不停的变化,以及完全可以预料到的在未来的必然变化,我觉得,对云原生的理解似乎也只能回到云原生的出发点,而不是如何具体实现。

    云原生应用应该是什么样子?

    \"image\"

    那在这么一个云原生理解的背景下,我再来介绍一下我对云原生应用的设想,也就是我觉得云原生应用应该是什么样子。

    \"image\"

    在云原生之前,底层平台负责向上提供基本运行资源。而应用需要满足业务需求和非业务需求,为了更好的代码复用,通用型好的非业务需求的实现往往会以类库和开发框架的方式提供,另外在SOA/微服务时代部分功能会以后端服务的方式存在,这样在应用中就被简化为对其客户端的调用代码。

    然后应用将这些功能,连同自身的业务实现代码,一起打包。

    \"\"

    这是传统非云原生应用的一个形象表示:在业务需求的代码实现之后,包裹厚厚的一层非业务需求的实现(当然以类库和框架的形式出现时代码量没这么夸张)。

    \"\"

    而云的出现,可以在提供各种资源之外,还提供各种能力,从而帮助应用,使得应用可以专注于业务需求的实现。

    \"\"

    在我们设想中,理想的云原生应用应该是这个样子:业务需求的实现占主体,只有少量的非业务需求相关的功能。

    \"\"

    非业务需求相关的功能都被移到云,或者说基础设施中去了,以及下沉到基础设施的中间件。

    \"image\"

    以服务间通讯为例:需要实现上面列举的各种功能。

    \"image\"

    SDK的思路:通过一个胖客户端,在这个客户端中实现各种功能。

    \"image\"

    Service Mesh的思路,体现在将SDK客户端的功能剥离出来,放到Sidecar中。

    \"image\"

    通过这种方式,实现应用的轻量化。此时绝大部分的功能都在剥离,应用中只留下一个轻量级的客户端。这个轻量级客户端中还保留有少数功能和信息,比如目标服务的标识(指出要调用的目标),序列化的实现。

    这里特别指出,有一个功能是我们努力尝试但是始终没有找到办法的:业务动态配置的客户端。也就是如何获取和应用业务逻辑实现相关的动态配置信息。如果有哪位同学对此有研究,希望可以指教。

    \"image\"

    我们的想法,云原生应用应该超轻量化的方向努力,尽量将业务需求之外的功能剥离出来。当然要实现理想中的状态还是比较难的,但是及时是比较务实的形态,也能比非云原生下要轻量很多。

    \"image\"

    在这里举一个效果比较理想的实际案例,在service mesh中实现密文通讯。

    由于客户端和服务器端两个sidecar的存在,因此我们可以通过Sidecar之间的协商与合作分别实现加密和解密,从而实现远程通讯的密文传输,而这个加密和解密的过程对于原有应用是透明的。

    云原生下的中间件该如何发展?

    \"image\"

    云原生涉及到的面非常广,对开发测试运维都会有影响,我们这里将聚焦在中间件,给出我们的一些粗浅的想法,因为我们来自中间件部门。大家也可以将中间件自行替换为自己关心的领域,尝试思考一下这个问题。

    \"image\"

    前面我们讲到云原生应用的理想形态和轻量化方向,这里隐含了一个前提:不管云原生应用的形态如何变化,云原生应用最终对外提供的功能应该是保持一致的。

    \"image\"

    而要实现这一点,应用需要依赖于云提供的能力,来替换因应用轻量化而剥离的原有能力,云提供的能力是应用形态演变的基础和前提。

    \"image\"

    理想状态下,我们期望云能够提供应用需要的所有能力,这样应用就可以以最原生化的形态出现。但是现实是这一点远还没有做到,我们依然需要在云之外额外提供一些功能,比如原有中间件的功能。

    \"image\"

    在云原生之前,中间件的做法通常是以类库和框架的形式出现,近年来也有服务形式。而在云原生时代,我们的想法是让中间件下沉到基础设施,成为云的一部分。

    \"image\"

    在这里解释一下,在前面就提到了“下沉”,什么是下沉?

    \"\"

    我们的想法是:云原生下的中间件,功能应该继续提供,但是中间件给应用的赋能方式,应该云原生化:

    • 在云原生之前,应用需要实现非常多的能力,即使是以通过类库和框架的方式简化,其思路是加强应用能力,方式如左图所示,通过提供更大更厚的衣物来实现御寒御寒能力。
    • 云原生则是另外的思路,主张加强和改善应用运行环境(即云)来帮助应用,如右图所示,通过提供温暖的阳光,来让轻量化成为可能。

    \"image\"

    我们以Service Mesh模式为例来详细讲解,首先我们以白盒的视角来看Service Mesh的工作原理:

    1. 以原生模式开发应用:应用只需具备最基本的能力,如客户端简单发一个请求给服务器端
    2. 部署时动态插入Sidecar:当我们将开发的云原生应用部署到云上,具体说是部署在k8s的pod中时,我们会自动在pod中再部署一个Sidecar,用于实现为应用赋能
    3. 在运行时,我们会改变云原生应用的行为:如前面所说客户端简单发一个请求给服务器端,在这里会被改变为将请求劫持到Sidecar,注意这个改变对应用而言是透明无感知的
    4. 在Sidecar中实现各种功能:Sidecar里面就可以实现原有SDK客户端实现的各种功能,如服务发现,负载均衡,路由等等
    5. Sidecar在实现这些功能时,可以对接更多的基础设施,也可以对接其他的中间件产品,这种情况下,Service Mesh产品会成为应用和基础设施/中间件之间的桥梁
    6. 可以通过控制平面来控制Sidecar的行为,而这些控制可以独立于应用之外

    \"image\"

    我们再以应用的视角,将云和下沉到云中的Service Mesh产品视为黑盒,来看Service Mesh模式:

    1. 以原生模式开发应用
    2. 以标准模式部署应用:底下发生了什么不关心
    3. 客户端简单发一个请求给服务器端:底下是如何实现的同样不关心,应用只知道请求最终顺利发送完成

    Service Mesh产品的存在和具体工作模式,对于运行于其上的云原生应用来说是透明无感知的,但是在运行时这些能力都动态赋能给了应用,从而帮助应用在轻量化的同时依然可以继续提供原有的功能。

    \"image\"

    Mesh模式不仅仅可以用于服务间通讯,也可以应用于更多的场景:

    • Database mesh:用于数据库访问
    • Message mesh:用于消息系统

    \"image\"

    中间件下沉到基础设施的方式,不只是有Mesh模式一种,而且也不是每个中间件都需要改造为Mesh模式,比如前面我们提到有些中间件是可以通过与Mesh集成的方式来间接为应用提供能力,典型如监控,日志,追踪等。

    我们也在探索mesh模式之外的更多模式,比如DNS模式,目前还在探索中。

    简单归纳一下我们目前总结的云原生赋能(Cloud Empower)的基本工作原理:

    • 首先要将功能实现从应用中剥离出来:这是应用轻量化的前提和基础
    • 然后在运行时为应用 动态赋能:给应用的赋能方式也要云原生化,要求在运行时动态提供能力,而应用无感知

    本次畅谈云原生分享的上半场内容就到这里结果了,欢迎继续观看下半场内容。

    如开头所说,这次分享是希望起到一个抛砖引玉的作用,期待后面会有更多同学出来就云原生这个话题进行更多的分享和讨论。也希望能有同学介绍更多云原生的实现模式,更多云原生的发展思路,拭目以待。

    展开全文
  • 云原生应用的12要素

    2021-01-27 11:04:21
    在云的时代,应用会更多的迁移到云端,基于云的架构设计和开发模式需要一套全新的理念去承载,于是云原生思想应运而生,而针对云原生应用开发的最佳实践原则,12-Factor脱颖而出,同时也带来了新的解读。12-Factor,...
  • 构建微服务云原生应用_云原生架构和 Kubernetes 容器云部署.pdf
  • 云原生应用云平台介绍.pptx
  • Rainbond 是云原生且易用的云原生应用管理平台,云原生应用交付的最佳实践,简单易用。专注于以应用为中心的理念。赋能企业搭建云原生开发云、云原生交付云。 对于企业: Rainbond 是开箱即用的云原生平台,借助 ...
  • 上一篇文章中我们介绍过CNCF 给出的云原生定义中包括微服务、容器、服务网格、不可变基础设施和声明式 API 等代表技术,构建云原生应用就主要靠这些关键技术。下面我们就来具体介绍下这 5 个关键技术。 1. 微服务 ...

    云原生的基础架构

    云原生中既有指导云原生开发的方法论,也包含实践的具体技术。上一篇文章中我们介绍过CNCF 给出的云原生定义中包括微服务、容器、服务网格、不可变基础设施和声明式 API 等代表技术,构建云原生应用就主要靠这些关键技术。下面我们就来具体介绍下这 5 个关键技术。

    1. 微服务

    单体应用开发简单,但随着业务复杂度的提升,单体应用的弊端逐渐显现,开发效率和系统应用的可扩展性等方面出现严重问题。微服务架构的出现就解决了这个问题,它根据领域模型将巨大的单体分成界限清晰的微服务,并保持每个服务独立可以迭代(如下图)。
    在这里插入图片描述
    单体应用架构 VS 微服务架构

    相比传统的单体应用架构,微服务架构具有服务高度自治、高效迭代、易于扩展和支持多语言编程等优点。

    但是从另一个角度来看,微服务架构的灵活、开发的敏捷也带来了一些新的问题,如数量众多的微服务运维、分布式系统固有的复杂性,以及分布式事务、服务之间的调用等。单体应用可能只需部署至“一个”应用服务器集群,而微服务架构则需要开发维护“很多个”独立的服务,并且还可能需要支持多种语言和环境,这当中的构建、测试、部署和运行成本提高了不少。

    2. 容器

    为了解决微服务架构下大量应用部署的问题,由此引入了容器。容器是一种轻量级的虚拟化技术,能够在单一主机上提供多个隔离的操作系统环境,通过一系列的命名空间隔离进程,每个容器都有唯一的可写文件系统和资源配额。

    容器化功能比较强大,不仅能解决虚拟机所能够解决的问题,同时也能够解决虚拟机由于资源要求过高而无法解决的问题。它具有的特点主要包括:隔离应用依赖、创建应用镜像并进行复制、创建容易分发的即启即用的应用、支持实例简单、快速地扩展等。

    Docker 是当前流行的开源应用容器引擎,基于 Docker 容器化技术,用户可以将微服务及其所需的所有配置、依赖关系和环境变量打包成容器镜像,并轻松移植到全新的安装了 Docker 的服务器节点上,运维人员无须关心底层操作系统,且无须重新配置环境,这使得容器成为部署单个微服务的最理想工具。

    但仅仅有容器还是不够的,毕竟人工部署成本高且易出错。

    因此容器技术又被分为了运行编排两层。运行层主要是指容器的基础设施,包括存储、网络、CPU 等。编排层主要是容器集群的管理,包括容器调度、服务注册与发现、资源的管理等;其相关工具有 Kubernetes 、Swarm 等,用以解决容器的管理和调度问题。其中,由 Google 开源的 Kubernetes 目前基本算是统一了容器编排的市场,实现了容器集群的自动化部署、扩缩容和维护等功能。

    就这样 Kubernetes 与 Docker 相互配合、相辅相成,其中 Docker 是作为 Kubernetes 内部使用的低级别组件,而 Kubernetes 又可以高效管理调度 Docker 集群。

    3. 服务网格

    微服务架构实践主要有侵入式架构非侵入式架构两种实现形式。侵入式架构是指服务框架嵌入程序代码,开发者组合各种组件,如 RPC、负载均衡、熔断等,实现微服务架构。非侵入式架构则是以代理的形式与应用程序部署在一起,代理接管应用程序的网络且对应用程序透明,这时开发者只需要关注自身业务即可,这种方式以服务网格(Service Mesh) 为代表。

    服务网格产品的存在和具体工作模式,对运行于其上的云原生应用来说是透明无感知的,但是在运行时这些能力都动态赋能给了应用,从而帮助应用在轻量化的同时依然可以继续提供原有的功能(如下图所示)。
    在这里插入图片描述
    服务网格的一般架构

    服务网格提供了分布式环境中几大核心问题的解决方案,比如服务间通信、限流、统一认证等功能,使得微服务的开发者更加关注业务,降低了微服务的门槛。

    服务网格目前的发展也比较火热,有多款开源软件,Linkerd 最早加入 CNCF,其他还有 Istio、Envoy、Dubbo Mesh 等。同时,为了让服务网格有更好的底层支撑,我们又将其运行在 Kubernetes 上。Kubernetes 对于资源的动态调度有极强的能力,用户可以快速编排出复杂环境、复杂依赖关系的应用程序,同时开发者又无须过分关心应用程序的监控、扩展性、服务发现和分布式追踪这些烦琐的事情,从而更专注于程序开发。

    1. 不可变基础设施与 DevOps
      Chad Fowler 于 2013 年提出了不可变基础设施(Immutable Infrastructure) 的构想,主要强调基础设施的状态性质。具体来说:一旦创建基础设施的实例,其将会变成只读状态,如果后续需要修改和升级,则需要使用新的实例替换旧实例。这种模式使得 DevOps 更加容易实践,可以为运维人员减少配置管理的负担。

    DevOps是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。DevOps 在一定程度上可以解决开发者与运维人员之间的协作问题,增强开发团队与运维部门之间的沟通和交流。
    在这里插入图片描述
    DevOps 是开发、运维和 QA 三者的交集

    你可能对精益软件开发中的敏捷、Scrum 不陌生,Scrum 是敏捷的一种具体实践,而 DevOps 则很好地补充了敏捷。DevOps 的目标是缩短开发周期,增加部署频率,更可靠地发布升级系统应用。DevOps 和云原生架构的结合能够实现精益产品开发流程,帮助软件产品及其开发持续改进,适应快速变化的市场,从而为企业提供更小的试错成本。

    5. 声明式 API

    声明式设计(Declarative) 是指通过向工具描述自己想要让事物达到的目标状态,然后由这个工具自己内部去计算如何令这个事物达到目标状态。简言之,声明式设计中,描述的是目标状态,即 How;与之相对的是过程式设计(Imperative),所描述的是一系列的动作,即 What。这一系列的动作如果被正确执行,最终结果就是这个事物达到了你期望的目标状态。

    声明式 API 和命令式 API 是两种不同的编程方式:在声明式 API 中,你声明了系统要执行的操作,然后系统将不断向该状态驱动;而在命令式 API 中,你可以直接发出服务器要执行的命令,如 “运行实例”“停止实例”等。SQL 就是一种常见的声明式编程语言,开发者可以自行指定获取所需的数据。在声明式语言中,描述一般为“创建三个 Web 实例的集群”,而不是把创建 Web 实例的命令运行三次组成一个集群。

    声明式设计是一种设计理念,同时也是一种工作模式,它使得你的系统更加健壮。分布式系统环境可能会出现各种不确定的故障,面对这些组件故障,如果使用声明式 API ,查看对应组件的 API 服务器状态,再确定需要执行的操作即可;而使用命令式 API 时,恢复组件则会变得比较困难。

    云原生应用的特征:云原生与“12 因素”

    Heroku于 2012 年提出“12因素(12-Factors)” 的云应用设计理念,(HeroKu 曾于2009 年推出公有云 PaaS),这些设计理念指导开发者利用云平台来开发易于维护、更具可靠性和扩展性的云原生应用

    1. 方法论和核心思想

    “12 因素”适用于任何语言开发的后端应用,并提供了很好的方法论和核心思想。“12 因素”为构建 SaaS 应用提供了如下的方法论:

    • 使用声明式格式来搭建自动化,从而使新的开发者花费最少的学习成本来加入这个项目;

    • 和底层操作系统保持简洁的契约,在各个系统中提供最大的可移植性;

    • 适合在现代的云平台上部署,避免对服务器和系统管理的额外需求;

    • 最小化开发和生产之间的分歧,持续部署以实现最大灵活性;

    • 可以在工具、架构和开发实践不发生重大变化的前提下实现扩展。

    2. 编码、部署和运维原则

    “12 因素”理论适用于以任意语言编写,并使用任意后端服务(数据库、消息队列、缓存等)的应用程序,它是关于如何编码、部署和运维的原则。这些是软件交付生命周期里最常见的场景,为多数开发者和 DevOps 整合团队所熟知(如下图)。
    在这里插入图片描述
    “12 因素”的内容

    • 编码有关:基准代码、构建发布运行、开发/生产环境等价 ,与源码管理相关;

    • 部署有关:显式依赖、配置、独立进程、后端服务、端口绑定,与微服务该如何部署以及如何处理依赖相关;

    • 运维原则:并发、易处理、日志、管理进程,与如何简化微服务的运维相关。

    3. 具体内容

    12 因素的具体内容如下所示。

    • Codebase:基准代码。一份基准代码,多份部署。在统一的代码库中为代码配置、测试和脚本部署建立独立的项目和模块。

    • Dependencies:显式声明依赖关系。通过 Bundler、NPM 等工具隔离依赖性,不依赖于部署环境。

    • Config:在环境中存储配置。通过操作系统级的环境变量将配置信息或其他可能存在的不同信息(如开发环境、预生产环境、生产环境)应用到各个部署环境中。

    • Backing services:把后端服务当作附加资源。数据库、缓存等均被作为附加资源在不同环境中被同等调用,每个不同的后端服务都是一份资源。

    • Build, release, run:严格分离构建和运行。基准代码进行部署需要三个步骤,构建阶段,将代码仓库转化为可执行包的过程;发布阶段,将构建的结果和当前部署所需的配置相结合,并能够立刻在运行环境中投入使用;运行阶段,是指针对选定的发布版本在执行环境中启动一系列应用程序的进程。

    • Processes:进程。以一个或多个无状态进程运行应用。

    • Port binding:通过端口绑定提供服务。互联网应用可以通过端口绑定来提供服务并随时监听所有发送至该端口的请求。

    • Concurrency:并发。通过进程模型进行扩展。

    • Disposability:易处理、快速启动和优雅终止可最大化健壮性。

    • Dev/prod parity:开发环境与生产环境等价。保持开发、预发布、线上环境的相似性来实现持续交付与部署。

    • Logs:日志。把日志当作事件流,允许执行环境通过集中式服务来收集、聚合、检索和分析日志。

    • Admin processes:管理进程。后台管理任务当作一次性进程运行,如数据库迁移。

    “12因素”对于构建 Web 应用程序或 SaaS 平台具有指导作用。虽说提出之后已有八年之久,可能有些细节跟不上最新的体系架构,但“12 因素”依旧是目前最为系统的云原生应用开发指南。你在开发时可以依旧参考它,但也不用拘泥于教条规则。

    小结

    以上我们主要介绍了云原生基础架构的组成:微服务、容器、服务网格、不可变基础设施和声明式 API ,这五大主要技术可以帮助你构建云原生应用;随后我们又介绍了“12 因素”的具体内容以及云原生应用具有的基本特征,它可以指导你如何去构建云原生应用。

    工欲善其事必先利其器,从本节课的介绍你可以知道,学习云原生不是一蹴而就的事,不仅需要你掌握相关的方法论,而且还需要大量的实践。这五大代表技术,展开来还有更加详细的知识体系,通过本节课你先有个整体的把握后,在后面的学习中才能够有侧重点,更加得心应手。

    好了,关于云原生我们暂时介绍到这里,你的云原生架构思维导图已经绘制好了吗?欢迎你在留言区分享你最熟悉的云原生技术。下节课我们将进入微服务相关的学习,这也是本课程的重点。

    转载文章:

    • https://kaiwu.lagou.com/course/courseInfo.htm?courseId=287#/detail/pc?id=3800
    展开全文
  • 云原生与云原生应用概念解析

    千次阅读 2018-09-25 17:10:35
    什么云原生云原生(Cloud Native)是由 Pivotal 的Matt Stine在2013年提出的一个概念,是他多年的架构和咨询总结出来的一个思想的集合。 在云的时代,应用会更多的迁移到云端,基于云的架构设计和开发模式需要...
  • 云原生应用实践.pdf

    2021-10-15 00:06:01
    云原生应用实践.pdf
  • 企业采用基于云原生的技术和管理方法,可以更好的把业务迁移到云平台,从而享受云的高效和按需资源能力,而容器云PaaS平台则是云原生应用重要的落地形态之一。企业在数字化转型中普遍面临IT系统架构缺乏弹性,
  • 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思,我们在开始设计应用的...
  • 阿里云边缘云原生应用实践.pdf
  • 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过CloudProvider、CRDController、Operator等等的方式从Kubernetes...
  • 构建云原生应用程序

    千人学习 2016-08-08 09:16:39
    pivotal云原生活动将与您一起遍览云原生软件的源起 、发展以及交付方法。我们将与您分享云原生软件组织的能力和预期成果,内容涵盖基础设施自动化、容器编排和生命周期管理及应用程序框架。
  • 下面将从云计算的发展历程引入云原生计算,请先看下图:云计算包含的内容十分繁杂,也有很多技术和公司牵强赴会说自己是云计算公司,说自己是做云的,实际上可能风马牛不相及。说白了,云计算就是一种配置资源的方式...
  • 开启云原生时代Serverless之门,教你Knative 云原生应用开发从入门到精通,结合云原生开发实战进行讲解,很不错,快来下载吧。
  • 云原生应用云平台解决方案.pdf
  • 云原生应用概念解析

    2020-03-26 00:35:07
    什么云原生云原生(Cloud Native)是由 Pivotal 的Matt Stine在2013年提出的一个概念,是他多年的架构和咨询总结出来的一个思想的集合。 在云的时代,应用会更多的迁移到云端,基于云的架构设计和开发模式需要...
  • 阿里云边缘云原生应用实践V1.pdf
  • Dapr是一个开源、可移植、事件驱动的云原生分布式应用运行时,它使开发人员能够轻松地构建运行在云平台和边缘的弹性而微服务化的无状态和有状态的应用程序,从而降低基于微服务架构构建现代云原生应用的准入门槛。...
  • 传统应用到云原生应用的重构
  • VMware的云原生应用技术揭秘

    千人学习 2016-07-25 13:44:52
    本次分享将主要介绍VMware全面开放的云原生应用平台,在演讲中将分别从开发栈、生产栈和DevOps等方面做具体的介绍,揭密相关的技术细节,包括Harbor企业级容器镜像Registry、企业级容器运行平台vSphere Integrated ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 75,960
精华内容 30,384
关键字:

云原生应用是什么意思