CNCF(Cloud Native Compute Foundation) 是 Linux 基金会旗下的一个组织,旨在推动以容器为中心的云原生系统。从 2016 年 11 月,CNCF 开始维护了一个 Cloud Native Landscape 的 repo,汇总目前比较流行的云原生技术,并加以分类,希望能为企业构建云原生体系提供参考。
2017 年 12 月 06 日,landscape 的 v1.0 版本发布,本文就按照下面这种图介绍云原生系统的大致情况。
云原生以容器为核心技术,分为运行时(runtime)和 orchestration 两层,runtime 负责容器的计算、存储、网络;orchestration 负责容器集群的调度、服务发现和资源管理。
往下是基础设施和配置管理,作为容器底层的基石。容器可以运行在各种系统上,包括公有云、私有云、物理机等;容器还依赖自动化部署工具、容器镜像工具、安全工具等运维系统才能工作。
往上是容器平台上的应用层,类似于手机的 app store,图中分为数据库和数据分析、流处理、SCM 工具、CI/CD 和应用定义几类,每个公司根据业务需求会有不同的应用体系。
右边有两块:平台和观察分析。平台是指基于容器技术提供的平台级的服务,比如常见的 Paas 服务,和 Serverless 服务。观察分析是容器平台的运维,从日志和监控方面给出容器集群当前的运行情况,方便分析和 debug。
NOTE:因为图中给出的软件很多,所以文中会挑选一些比较有名的以及本人比较熟悉的介绍,会略过一些信息;此外,也因为个人的水平有限,并没有对所有产品都一一使用过,因此有些内容未免有偏颇或者错误之处,如果读者发现,还望能不吝指出。
容器需要运行在操作系统上,系统可以运行在虚拟机或者物理机上。从使用方式上来分,操作系统这层(Iaas) 可以分为公有云和私有云。
公有云国外以亚马逊 AWS、微软 Azure、谷歌 GCP、DigitalOcean 为代表,国内有阿里云、腾讯云、华为云,此外IBM、oracle、Fujitsu 都有自己的云产品,Joyent 也是国外很有名的云计算公司;packet 是物理机云服务商,直接为用户提供物理机资源。
企业一般会选择其中一个平台来使用,也有不少企业同时选择两种或者多种云服务商,以提高可用性和避免厂商锁定。
私有云是指用户在自己的数据中心搭建的云服务,除了自己研发之外,常见搭建私有云的方法有 Vmware(商业化的虚拟化软件) 和 openstack(python 编写的开源 Iaas 平台软件);此外 Maas 提供物理机自动安装和管理服务,分为免费版和收费版;foreman 是虚拟机和物理机的系统配置工具。
建设私有云的成本很高,但是当公司成长到一定规模的时候,私有云建设也是必要的一件事。除了能缩减成本,也能提高技术实力,而且也有更多的灵活性满足内部的各种需求。
有了物理机和虚拟机,在运行容器服务之前,我们还需要为容器准备标准化的基础环境,以及保证基础设施的自动化,拿盖房子来比较,Iaas 和这部分共同组成了容器平台的地基。
自动化配置工具,保证容器运行的系统配置的一致性,并提供升级、补丁等功能,一般也可以用来 bootstrap 容器服务。
这里的几家软件功能大同小异:
ansible
比较简洁,用 ssh 来自动化部署,使用 python 编写cfEngine
是这个领域非常老的工具,可以说是配置管理的元老,用 C 编写,因此性能会更好,但是学习曲线也更曲折chef
用 ruby 编写,而且配置文件格式也是 ruby DSL,因此对于 ruby 程序员非常亲切友好saltstack
采用 zeroMQ 作为消息队列,实现 master-salve 模式,兼具性能和灵活性,但同时整个系统也更加复杂puppet
是这个领域的老大哥,以成熟稳定著称,社区文档也更丰富这篇博客 和这篇文章比较了 CFEngine vs Puppet vs Chef vs Ansible vs Salt 这几个工具的异同,如果纠结如何选型,推荐阅读。
其实,对于大多数需求,根据开发语言、配置文件风格等选择其中一种就行。
Iaas 平台提供了基础设施服务,但是对于复杂的场景来说,直接使用这些服务提供的接口还是会很麻烦,所以有了基础设施自动化。这部分做的事情就是能够让基础设施的配置自动化,一次完成多个资源的部署,提高效率。
Bosh
:CloudFoundry 旗下的产品Cloudify
:云应用编排系统,能够让用户定义软件,然后部署到不同的云环境中CloudFormation
:AWS 提供的基础配置服务,能够通过配置文件定义要创建的各种 AWS 服务,然后一键完成集群或者系统的搭建Ubuntu Juju
:Ubuntu 提供的管理工具,能够自动化把几百种服务部署到不同的平台Terraform
:HashiCorp 旗下的基础设施配置工具,通过定义一份配置文件,Terraform 能够在不同云提供商运行服务,是 Infrastructure as Code 的信奉者Manage IQ
:统一管理云主机、容器、网络、存储的 IT 平台kubicorn
:管理多个 kubernetes 集群的工具,集群可以在不同的云上Helm
:kubernetes 软件包安装工具,能够安装多个 kubernetes 资源,类似于 ubuntu 的 apt 工具总的来说,这些工具就是在云平台或者 kubernetes 平台上再封装一层,让用户能够通过一次定义,在不同平台部署多个资源或者服务,并做到版本升级和跟踪。如果云平台提供相关服务(比如 AWS 的 CloudFormation)直接使用即可,如果是混合云,则需要选择 Juju、Terraform 这样的管理工具。
容器的镜像 registry 是容器平台的基础需求,毕竟所有的容器应用就是通过镜像来定义的,镜像服务分为自建和公有服务两种。
很多公司提供了它们公开的容器 registr 服务,比如 docker 官方的 registry,亚马逊 ECR(Elastic Container Registry)、Azure 和 Google 云 registry、此外 Quay、project atomic、JFrog Artifactory 也是比较著名的容器镜像服务提供商。
Harbor 是开源的企业级容器镜像管理平台,Portus 专门为 Docker registry 提供授权服务。
国内一般企业会选择自建 registry,因为国外的 registry 访问速度都很慢,而国内并没有非常流行的 registry 服务(当然很多容器服务公司都会提供 registry 服务),另一方面自建 registry 的技术并不复杂。
随着镜像和容器标准化的完善,镜像和容器的安全也越来越受到企业的关注。虽然在大多数情况下,安全往往是软件开发者最后才关心的事情,但是容器安全却是不容忽视的一个环节。
notary 和 tuf(the update framework) 是 CNCF 旗下的两个项目,tuf 是开源的安全和验证标准,notary 是它的一个实现,notary 可以用来验证镜像的安全性,也可以用来安全地发布软件包。
和安全相关的另一个问题是机密信息,包括密码数据、密钥等。
Keywhiz、pinterest 开源的 knox、lyft 开源的密码存储工具 confidant 和 HashiCorp 开源的 vault 想要解决机密信息的存储,它们通过加密的方式把内容保存到后端存储中,而且提供了 auditing 等额外功能。
spiffe 和 spire 是一对的,spiffe 定义了服务的认证标准和认证信息的标准,spire 是它的一个实现,但是目前还没有达到生产可用。
容器运行时这块是容器核心的技术,关注的是主机容器的技术模块,分为计算、存储、网络三块。
我们知道,整个容器技术就是因为 docker 的出现才变得炙手可热,可以说 docker 重新定义了容器,也成为了容器技术的代名词。但是随着容器的标准化,docker 把核心组件抽象出 containerd,作为容器运行时,而更多公司也推出自己的容器实现,容器一词的含义开始扩展,而且也逐渐标准化了。
随着容器运行时的稳定,普通用户对其关注会逐渐下降。如果把运行时比作内核,那么容器调度系统就是操作系统,开发者应该更关心操作系统的功能和性能,只有遇到特殊需求或者问题时才会关注内核。
OCI(Open Container Initiative)是一个促进容器标准化的组织,主要工作是容器 runtime 和镜像的标准化协议,这部分内容可以参考我之前的介绍文章。
CRI-O 是 kubernetes 推出的东西,它是 kubelet 和 OCI runtime 之间的桥梁,它内部采用 OCI 标准,因此可以兼容各种 runtime(比如 runc、Clear Container等),对上它提供 CRI 接口供 kubelet 调用。这样的话,CRI-O 的存在能够让 kubelet 使用任何 OCI 兼容的 runtime,从而绕过 docker、rkt 这种完整容器管理工具。
容器从一出现就非常契合微服务中无状态服务的设计理念,因此初期甚至给了一些人容器只适合无状态服务的印象,但是随着容器技术的成熟和用户理念的变化,容器目前已经全面进入有状态服务领域。因为容器存活时间很短的特点,容器的状态(存储的数据)必须独立于容器的生命周期,也因为此,容器的存储变得非常重要,云原生存储这块介绍了很多相关的技术。
作为 IT 领域的核心技术,存储早在容器火起来之前就已经有发展了很多年,从单机的各种文件系统、到网络存储,再到现在比较热门的分布式存储、以及云计算催生的块存储、文件存储、对象存储,不同需求不同分类的存储早就五花八门了:
除了这些开源的存储技术之外,还有很多容器存储圈的技术公司:
因为不同用户对存储需求不同,采取的存储方案也不同,不管是开源方案、商业方案还是自研方案,或者是文件存储、对象存储还是块存储,怎么把这些技术用到容器平台,以及保证标准化和统一化的接口,是非常有挑战性的事情,目前也有很多努力:
网络最重要的功能是提供不同计算资源的连通,随着虚拟化和容器技术的发展,传统的网络方案已经无法满足云计算快速增长、不断变化的网络需求。不同用户对网络的要求也越来越高:
因此,在云计算和容器这块涌现出很多网络解决方案和厂商,试图解决这些问题:
也有很多的商业公司为企业提供网络解决方案:
当在生产环境中使用容器时,单台主机上的容器已经不能满足需求,需要管理多主机容器集群,也就需要有个工具能够提供资源管理、容器调度和服务发现等功能,保证多主机容器能够正常工作。可以说,对于云原生系统,orchestration 才是最核心的东西。
调度和集群管理一直是容器技术的热点领域,竞争也非常激烈。打个可能不那么恰当的比喻,如果把容器 runtime 比作引擎,那么容器集群管理工具就是汽车。用户购买的是汽车,尽管引擎非常重要,但是它终归只是个可以替换的零件。
集群管理竞争还在,并没有最终的唯一胜利者,但总的来说 google 公司的 kubernetes 处于绝对的领先状态,也是目前社区发展最快的平台,随着 docker 官方支持 kubernetes,以及 azure 和 aws 。目前社区三个主流的容器调度平台是:
对于公有云上的容器服务,各大云服务商也有对应的产品:
有了容器集群管理工具,容器的规模逐渐变多,另外一个需要解决的问题是服务之间怎么互相发现对方。因为集群的容器是不断变化的,IP 地址也是不稳定的。这个问题再往下思考,就是集群的状态应该怎么保存,才能让所有节点能当前集群自己想要的信息,而且保证不会发生冲突和错误。
目前,集群的状态都会保存在一个分布式的键值存储里,这个存储保证数据的一致性,目前三款常用的键值存储工具是:
有了分布式键值存储保证一致性,还需要工具把集群数据自动写入到里面,并且需要格式化地读取和解析数据。围绕这一话题,周边也有很多工具:
除外,还有两个公司开源的服务发现工具要提一下:
总的来说,这些工具保证这个集群的动态信息能统一保存,并保证一致性,这样每个节点和容器就能正确地获取到集群当前的信息。
伴随着容器技术而变得火热的一个话题是微服务,每个服务作为容器或者 pod 运行,不同服务之间通过服务发现知道对方的地址进行通信。随着集群规模的增大、服务数量的增多,用户的需求也不断增加,微服务架构也面临更多的问题:
这些东西都是每个微服务平台必须要考虑的,如果放在每个服务代码中实现某些功能,不仅增加了每个服务的复杂性,也会导致重复的工作,所以,微服务需要更好的框架和平台统一提供这些功能。总的来说,微服务虽然降低了单个服务的复杂性,但是把复杂性下沉到微服务管理平台层面。
针对这些问题,有很多软件和方案。对于负载均衡来说,HAProxy、nginx 和 F5 都是常用的方案,Traefik 是后起之秀,专门为微服务设计;RPC 框架用来在微服务内部进行通信,因为比 HTTP API 效率高而被大量使用,常用的用 Google 开源的 GRPC 、apache 旗下的 thrift 框架、Netflix 开源的自带负载均衡的 ribbon 和 avra 数据序列化框架。
微服务 gateway 是统一化管理 API 注册接入、权限认证、限速、日志等功能,是微服务对外的接口。
这个领域也有一些公司在提供产品,比如 datawire 就专门为 kubernetes 应用提供 API gateway 和自动化源码部署的工具。
微服务开发框架 Hystrix 是 Netflix 开源的项目,能够帮助程序处理微服务交互的超时处理和容错的问题,提供熔断、隔离、降级等功能,但是只能用于 Java 语言项目,需要在程序中修改代码。
特别要强调一下微服务领域最近比较热门的概念:Service Mesh,它的主要想法是把微服务通用的功能单独抽象为一层,部署在容器管理平台中,对应用透明,并且通过简单自动化的接口来控制整个微服务的连通、灰度访问、升级、降级等功能。
service mesh 相较于之前微服务框架的最大优势是它对业务是透明的,不需要像 Netflix 提供的很多微服务工具那样对应用有侵入性,因此就不再和任何语言绑定,可以看做整个网络栈的另一个抽象层。
平台这块主要是基于容器技术做的更上面一层的封装,有直接是接管公有云或者私有云的容器平台,也有 Faas 这一类服务。
因为容器技术的隔离性,以及对应用非常友好,因此可以直接拿来做 Paas 服务,当然也有种叫法是 Caas(Container as a service)。很多初创公司的业务也就是这块,基于容器提供应用的发布、升级、运维等管理工作。大部分公司做的事情都大同小异,因为最终的需求是一样的:让应用的开发、部署、扩展、升级、运维更轻松,用户无需关心基础架构,只需要考虑如何去实现业务逻辑就行,主要的区别在于侧重点,有些侧重私有的数据中心部署和管理,有的侧重 docker 容器的管理,有的测试 kubernetes 等容器集群的维护,有的提供应用平台,有的和公有云平台深度集成……
heroku 是老牌的公有云类型的 PaaS 平台,界面友好,成熟稳定,所有操作提供命令行实现自动化,提供完整的监控和日志方案。
cloud foundry 和 openshift 是两款重要的开源 Paas 平台,其中 cloud foundry 是 Pivotal 开源,支持多种语言、框架、云平台,旨在让开发者能够忽略架构问题,快速部署和扩展应用;openshift 是 redhat 开源的,功能和 cloud foundry 差不多,网络上有很多两者的对比文章,这里不再赘述。目前两者都已经开始拥抱容器、docker、kubernetes 技术,希望能和容器深度集成。它们的特点是功能强大,可扩展性强,但是相应的,复杂程度也高。
随着 kubernetes 的快速发展,很多以 kubernetes 为容器管理平台和应用管理的公司也都出来了,datawire 基于 kubernetes,侧重于微服务的管理;containerShip 也是 kubernetes 的管理平台,可以在多个云平台自动化部署和统一管理;Giant Swarm 提供混合云和多租户的 kubernetes 管理;kubermatic 能够给用户提供一键 kubernetes 集群安装和多集群管理服务;Gravitational 提供多 region 的 kubernetes 集群管理。
atomist 和 cloud66 侧重于 devOps 流程;flynn 是基于 docker 容器技术的开源 PaaS 软件,相比 cloud foundry 算是轻量级的实现;hyper.sh 比较有趣,它们以容器接口来提供虚拟机服务。
其他一些平台提供的服务如下:
这块内容主要是容器创业公司,提供的都是基于 docker、kubernetes 或者其他容器技术的方案,因此做的事情大同小异,就不再一一介绍了,感兴趣的可以根据图中列出的公司自行了解。
容器技术把微服务的概念吵得火热,随后也让 serverless 这个词出现了大众的面前。既然容器能够屏蔽基础设施,让开发者只关心交付的应用(容器镜像),那么我们可不可以更进一步,让开发者也不要关心交付的镜像,只关注业务的核心逻辑呢?这就是 serverless 的想法,开发者定义好基于事件触发的业务逻辑,其他一切都交给平台,当用户发出请求或者其他事件发生时,平台会根据事先的配置自动运行响应的业务逻辑代码,从而实现真正的按需服务。如果说容器关心的是应用,那么 serverless 关心的则是函数。serverless 不是没有服务器,而是不用关心服务器和系统。
serverless 是一个很新颖的技术,虽然理念非常好,但现阶段还不适用于所有的应用,主要是因为它的性能问题,以及距离成熟使用还缺少很多工具和方案,另外开发流程要接纳这种理念还需要一段时间。
AWS Lambda 服务算是商业产品中比较成熟的,它的出现让 serverless 从概念化和实验化的东西变成了可行的方案。微软家的云平台也推出了 Azure functions;Google 家对应的产品叫做 cloud functions,从命名来看亚马逊略胜一筹。
openFaas、fission 和 kubeless 都是基于 docker 和 kubernetes 开源的 serverless 开发框架,如果要想打造自己的 serverless 平台可以参考。
基于云原生的平台建立起来之后,我们要保证整个平台能够正常工作,保证运行在其上的服务不会因为平台错误而导致不可用,而且还要知道应用整体的运行情况,提前对某些可能出错的地方进行报警,一旦出错能够提供合适的信息便于调试和修复……这些都是观察(observability)和分析(analysis)要做的工作,为了方便下面统一使用监控(monitoring)一词。
NOTE:对于监控、观察、分析、日志等词语的使用并没有非常严格的定义,监控是 IT 行业比较传统的叫法,表示对应用和系统运行情况的数据统计和展示。目前有个叫法是观察,分为metrics/monitoring、logging 和 tracing 三个部分。为了容易理解,我们使用监控一词来代替,它广义地包含了以上所有内容。
监控对于系统来说非常重要,没有监控的平台就像没有仪表盘的飞机。监控的目标有几点:
简单来说,监控就是了解应用和系统运行情况。
我们最常见的监控是对主机的监控,了解 CPU、内存、磁盘 IO、网络等资源的使用数据,以此了解主机是否正常,是否需要加硬盘或者扩展集群,是否有内存泄露等等。另外一个监控是应用的监控,不管是数据库、缓存服务器、消息队列、代理和缓存服务器,还是自己编写的应用,我们需要知道它们的运行情况,这个监控依据每个应用而定,监控方法、监控的数据以及解读方法对不同的应用来说会千差万别。
而容器的出现,让监控出现了另外一个维度:容器和平台的监控。我们不仅要知道每个主机的运行数据,还需要知道每个容器的数据,这个容器使用的 CPU、内存、磁盘 IO 和网络等,这个新的需求也就催生了新的监控思想和工具。
zabbix 是老牌的监控工具,功能强大,最近界面也改进了不少;Nagios 和 graphite 是另外两个经典的监控工具。sensu 是一款较新的监控工具,Riemann 也能够进行分布式系统的集中式监控处理。
influxdb 和 openTSDB 都是时序数据库,后者是基于 HBase 的。
AWS CloudWatch 是AWS 自家的监控工具,当然是负责 AWS 云上的服务监控;Azure Log Analytics 是微软家日志监控工具。很多商业公司也提供各种各样的监控产品:AppNeta、Axibase、APPDynamics、datadog、dynatrace、NewRelic 和 splunk 都提供应用级别的监控和数据分析业务。
再介绍一下经常听到的监控工具:
图中列出的监控公司和工具还有很多,这块的创业公司也很多,因为监控的数据不像业务数据那样机密,因此很多公司愿意使用 SaaS 监控服务。
日志容易理解,就是程序运行输出的信息,它们是调试的利器,当程序出错的时候,有效的日志分析能够快速定位问题。同时日志也能承担一部分的监控功能,反应系统运行是否正常。
fluented 是一个开源的基于数据流(stream)的日志收集框架;graylog 是另外一个开源的选择,它们的思想都是把日志从系统各处收集起来进行统一分析、过滤和管理;elastic 提供 ELK(Elasticsearch、Logstash、Kibana) 技术栈负责日志收集,也提供在线的企业级 Saas 服务。
除了使用开源的组件自己搭建日志服务平台,还可以使用一些公司提供的在线日志服务,只要把日志数据导入到它们的平台,不用关心日志服务的维护工作。loggly 是一个在线的日志分析服务,需要付费使用;logz.io 提供管理的 ELK 在线服务,提供 ELK as a service,并且可以基于 AI 对数据进行分析;另外一家声称支持 AI 分析的日志服务公司是 loom systems;splunk 这家公司也提供日志分析服务;papertrail、sematext、sumologic 也都提供类似的日志分析服务。
随着微服务的采用,用户的一个请求可以中间会经过多个不同的微服务才最终得到应答。传统的监控、日志都是针对单个组件的分析,用来了解当前组件的健康和运行状态,并不能给我们一个整体的动态的情况。
对于微服务来说,我们需要知道一个请求到底经过了哪些组件,每个组件耗费了多少时间,错误发生在中间的哪个步骤,每次调用的网络延迟是多少等等。对于使用不同语言、开发框架、数据库、和系统的微服务,我们需要有统一的跟踪标准,这就是 tracing 要做的事情。分布式的 tracing,一般都受到 google Daper 系统的设计影响。
opentracing是一个开放的 tracing 接口标准和文档,提供了各种语言客户端的实现,支持的 tracing 工具包括 Jaeger、appdash 和 Zipkin(twitter 开源);Cloud Sleuth 是 spring cloud 全家桶中一员,主要负责 tracing 功能。
这些 tracing 工具都需要在应用中编写对应的代码,和 logging 和 metrics 类似,用户可以自定义要 tracing 代码块的范围和父子关系。此外,也有很多工具会自动化嵌入服务组件之间的 tracing 数据,比如之前讲过的 Istio。
tracing 可以和 metrics 结合一起使用,tracing 负责组件和微服务之间的数据分析,metrics 负责单个组件内的性能数据监控。
容器平台最终还是要跑应用的,最主要的应用当然是各个公司的业务应用,除此之外还有一些比较通用的应用,这个表格里也有列举,可以根据需求提供类似应用市场的功能。
数据库一直是软件领域的核心组件,所以包括了很多老牌的数据库软件,比如 MySQL、DB2、oracle DB、postgreSQL、MariaDB 等关系型数据库。基于这些传统的数据库也有很多周边的工具和软件,比如 vitess 这种数据库集群工具;阿里巴巴开源的 SQL 数据库连接池工具 druid,它还同时提供了监控功能。
NoSQL 的发展也让很多新型的数据库出现在了我们的视野:有 redis、couchbase 这一类的 KV 数据库;也有 MongoDB、rethinkDB、ravenDB 为代表的文档类数据库;Cassandra、Hbase、vertica(列式关系数据库)、scylla(kvm 之父的作品,旨在成为下一代的 Cassandra 数据库) 这样的 column 数据库。它们最重要的特点是能够轻松进行集群扩容,不支持 SQL 查询,因此接口上都以其他形式满足用户各种各样的数据需求。
后来 newSQL 的概念出现,旨在结合 SQL 和 NoSQL 的优势,还是以 SQL 方式使用,但同时支持快速横向扩容和分布式事务,google 内部的 F1/spanner 是这方面的先驱,发过论文但是没有把项目开源,cockroachDB 和 TiDB 是这类数据库的代表,都是开源项目。
其他相关的数据库产品包括:
数据库是整个软件技术的基础,现在有个很流行的观念是:数据是一家公司最重要的资产之一。我们对数据库的要求也是更快、更多、更好,所以会有很多数据库相关的产品来解决各种各样的数据存储和处理需求。
流处理与批处理对应,要求对海量数据的实时采集、计算和查询,很多业务场景要求尽可能快得对数据进行分析,从而做出决策,比如传感器、流量监控、股市行情、游戏数据分析等,对此类需求也催生了很多实时处理工具。
Kinesis 是亚马逊官方的流数据处理平台,是其云计算产品的一部分;cloud dataflow 是 google 的流处理产品;开源方面,Apex 是 apache 旗下开源的新型实时数据处理平台;heron 是 twitter 开源的数据处理平台,是 apache storm 的继承者;spark 和 flink 支持流处理的同时也支持批处理操作,两者定位非常相似,但内部实现的差距挺大
kafka 和 rabbitMQ 这类消息队列可以做到数据的快速收集;nifi 是另一个 apache 项目,是一个数据整合和分发系统,专门为数据流设计。
和大数据一样,流处理这个领域也是 apache 占据了大半的江山。
虽然容器让产品以镜像的作为产出,但是代码还是要维护的,最有名的社区源码管理平台自然是 github,gitlab 是开源自建 SCM 的推荐选择,bitbucket 和 github 定义类似,提供免费也提供商业版本的服务。
应用定义并没有明确的定义,大概要做的事情是屏蔽底层基础设置、云平台以及容器运行时,封装一个标准化的应用定义,从而实现应用自动化运行在任何地方。
持续集成和持续部署主要用于自动化地处理所有的 ops 的工作,包括从代码提交一直到应用部署到线上的整个过程的自动化。CI 侧重于构建和测试,CD 侧重于部署。
网络也有很多文章对 CI/CD 的软件进行比较,比如这篇就比较了 jenkins vs travis vs teamcity vs codeship vs gitlab vs bamboo,其他的工具就不一一介绍了,感兴趣可以自行搜索。
如果做个总结的话,2017 年 CNCF 云原生生态目前有如下的趋势:
CNCF 列出的生态只是一个参考,很多软件和公司并没有出现在这里,在构建云原生应用时不必拘谨于此。构建云原生架构是一个过程,不同的阶段会选择不同的工具和平台,并没有完全”标准”的做法。
另外一个没有出现在这里,但是随平台规模增长变得越发重要的话题是性能分析和优化,因为这个话题并没有统一的标准和方案,只能具体问题具体分析,而且整个过程比较复杂,所以很少有提供一站式方案的软件和公司。
每个特定的问题都有多个工具和解决方案,这样的情况就要求我们必须做出选择,知道每个工具要解决什么问题,有哪些取舍,和其他组件是否容易集成,社区活跃度……然后根据自身的情况和需求,找到最适合自己当前发展的工具。切不可一心求新求全,不然会带来严重的后果:
推荐的方式是循序渐进,以满足最核心需求为主去选择合适的技术,优先使用比较稳定、文档丰富和社区活跃的。充分了解选择版本哪些功能是非常稳定可以直接使用的;哪些功能不太稳定,但是可以在开发和测试环境中小规模使用的;哪些功能是不稳定,需要测试开发或者等待社区进度的。如果有应用需要从旧环境迁移,编写自动化工具,并提供回滚的功能,以灰度发布的方式逐步迁移到容器集群。对于新技术,可以花时间去跟进,在合适的时候及时引进。
切不可听到别的公司使用了某个技术,自己就一定要用。如果没有问题要解决,引入新工具只会带来新的问题而已。
原文链接