开发者中心 > 专栏 > 内容详情
分享
  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

京东云原生之路

  • 京东智联云开发者
  • 2020-07-22


如今,云原生被企业和开发者奉为一种标准,并被认为是云计算的未来。

 

严格来说,云原生并不是一个产品的名称,而是一套技术体系和一套方法论,它包括 DevOps、持续交付、微服务、容器、敏捷基础设施等内容。云原生(Cloud Native)概念在 2013 年被首次提出,在云原生技术爆发之前,我们开发的应用可以被称为非云原生应用,非云原生应用并没有考虑到应用的弹性和规模性,甚至很多都不具备扩展性,当业务规模扩大时,特别依赖硬件的升级,进而带来了很多问题。


云原生的出现,带来了一种新的建设思路和开发模式,使得服务交付方式改变,构建应用效率显著提升。同时,云原生也在拓展云计算的边界,一方面借助云原生技术,云端智能正在加速向边缘智能扩展。另一方面,多云、混合云形态逐渐成为主流。越来越多的企业愿意技术架构向“云原生”演进。


一、京东的云原生之路


在云原生技术全面爆发之前,早在2014年,京东就率先将Docker容器技术大规模应用至生产环境, 2016年上线了京东新一代容器引擎平台JDOS2.0,成功从OpenStack切换到JDOS 2.0Kubernetes技术栈,打造了完整高效的PaaS平台。2017年初基于Vitess建设了弹性数据库。2018年京东正式加入CNCF基金会,成为其首位白金会员,并在当年获得CNCF终端用户奖。

portal_developer_origin_fl1-pc.png


二、云原生在京东


京东在每年的 618、11.11 都会面临海量数据和流量增长,从前端网站、订单、结算、支付、搜索、推荐,到后端的仓储、配送、客服、售后各种业务系统都面临着前所未有的挑战。因此,京东自然需要一个灵活的、有弹性的、可规模化扩展的平台,这也决定了京东从很早开始就拥抱云原生。京东目前运营着全球最大规模的 Docker 集群、Kubernetes 集群,以及最复杂的 Vitess 集群之一,基本实现了“All in Containers”,是目前全球容器化最彻底的互联网企业之一。


全世界最大规模的Docker集群、Kubernetes集群

1.jpg

京东作为容器技术先行者,早在 2014 年,就率先将 Docker 容器技术大规模应用至生产环境。在 2016 年初开始实践 Kubernetes,在2017年初基于 Vitess 构建起弹性数据库,并且自研京东“阿基米德”调度系统。京东零售基础架构团队持续建设“阿基米德”平台,作为支撑京东万亿 GMV 的技术基础设施,阿基米德由大规模容器集群调度、数据库与存储技术平台、组件化微服务平台、商品图片技术平台、异地多活与智能运维、边缘计算平台构成。其中容器技术是所有平台服务的基石。在此过程中,采用容器最大化资源利用,节省数据中心数亿元采购成本。大促之前加机器的历史一去不复返。

 

最早的Harbor用户


搜狗截图20200723165046.png

同样在 2016 年,京东需要云原生的 Registry 用来维护其镜像中央存储库。在考察了包括Docker原生注册表在内的多个解决方案之后,京东选择了 Harbor。从那时起,京东就开始成为 Harbor 的忠实用户。Harbor 操作简单、运行稳定,为京东节省了大约 60% 的镜像中央存储库维护时间。

 

随着业务量的增长,存储镜像的数据会变得越来越庞大,京东需要一个稳定、可靠、高性能的存储方案。ChubaoFS 是京东开发的一款为云原生应用提供分布式文件存储服务的开源项目,在所有分布式文件系统中,ChubaoFS 最适合支持云原生工作负载,这得益于其几乎无限的可伸缩性和分布在多个节点工作内存中的健壮元数据子系统。京东选择其作为 Harbor 后端存储方案,多个 Harbor 实例可以同时使用 ChubaoFS 共享容器镜像,它给 Harbor 提供了稳定的,可弹性扩展的,高性能的分布式存储服务。


Prometheus在京东开源项目ChubaoFS的应用

3.jpg

对于已经服务于京东 2000 多个应用以及在线业务的 ChubaoFS 来说,一个优秀高效的监控系统是十分重要的。Prometheus 项目是由前 Google 员工发布的新一代云原生监控系统,2016 年 5 月正式加入 CNCF 基金会的项目,是第二个 CNCF 的毕业项目,Prometheus 具有天然的 K8S 生态优势,而京东基础设施都部署在 Kubernetes 集群中,使用 Prometheus 可以更好地将监控应用于生产环境。Prometheus 提供了一种更便捷、高效的资源组织和使用方式,让部署和维护变得更简单,便于资源的动态伸缩及可靠服务,大大提升了开发、交付、运维系列流程效率,让我们在软件开发中更关注应用逻辑本身,从而让开发更加高效。

 

京东运用Helm 轻松部署多款云原生应用


4.jpg

在当前的 Kubernetes 应用生态当中,Helm 是最被广泛使用的应用定义标准之一,是 CNCF 旗下第十个顺利毕业的项目。Helm 相对于 Kubernetes 而言,类似于 Ubuntu 上的 APT 或 CENTOS 上的 yum 命令。该项目采用一种名为图表(chart)的打包格式,用以描述一组彼此相关的 Kubernetes 资源文件集合,它可以把整个 Kubernetes 的资源进行打包。好处:第一是复用性,第二是标准化,第三是版本控制。通过使用 Helm 在 Kubernetes 平台上部署 ChubaoFS 集群,京东团队将部署时间从几个小时减少到几分钟。除了 ChubaoFS,京东还使用 Helm 来管理许多其他的 chart,包括 etcd、 grafana、MySQL、zookeeper 等等。


全球规模最大、最复杂的Vitess使用者之一

搜狗截图20200723165348.png

作为中国最大的零售商,京东的 MySQL 数据库在发展过程中变得越来越大,导致性能下降,运营和维护成本上升。这时迫切需要一个解决方案,帮助京东轻松快速地扩展 MySQL,方便操作和维护,并降低硬件和运维成本。Vitess 是用于部署、扩展和管理大型 MySQL 实例集群的数据库解决方案。作为 Vitess 的早期采用者,同时也是全球规模最大、最复杂的 Vitess 使用者之一,京东通过使用 Vitess 对大规模数据库服务进行可伸缩的管理,并支持 MySQL服务在线扩容。


三、京东的开源贡献


京东还致力于为云原生技术开源贡献价值,将内部孵化并经过实践验证的融合分布式文件系统与对象存储服务的ChubaoFS捐献给CNCF,将分布式数据库中间件Apache ShardingSphere开源项目捐献给Apache基金会,并成为从Apache孵化器毕业的顶级项目,持续在云原生领域推动技术创新,推动云原生计算可持续发展。


搜狗截图20200723162610.png

名称:ChubaoFS(储宝文件系统)

类型:存储

说明:ChubaoFS是一款云原生分布式存储系统,同时提供文件系统与对象存储两种接口。它为运行在Kubernetes容器平台之上的云原生应用提供了多租户、POSIX兼容、可挂载的文件系统,以实现计算与存储分离。而且,ChubaoFS通过流行的S3协议来提供对象存储功能。ChubaoFS内部高效实现了数据与元数据弹性扩展、顺序和随机读写模式、强一致复制算法、以及安全认证等核心特性。通过支持CSIContainer Storage Interface)HelmChubaoFS可以被轻松部署并与Kubernetes紧密配合。ChubaoFS项目由CNCF Cloud Native Computing Foundation,云原生计算基金会)托管。


搜狗截图20200723165430.png

项目介绍

名称:Apache ShardingSphere

类型:数据库

说明:Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBCProxy Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

Apache ShardingSphere 定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它通过关注不变,进而抓住事物本质。关系型数据库当今依然占有巨大市场,是各个公司核心业务的基石,未来也难于撼动,我们目前阶段更加关注在原有基础上的增量,而非颠覆。

Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、多数据副本、数据加密、影子库压测等功能,以及 MySQLPostgreSQLSQLServerOracle  SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。

 

四、京东最新的技术探索


基于内部探索,京东智联云打造的丰富的云原生产品,提供全方位技术服务外,也为企业快速发展提供源动力。

京东智联云虽然是一个云服务的提供者,但内部也需要进行云原生改造,比如京东智联云提供的对象存储服务,其下的数十个组件同样有服务治理的需求。因此,在这个过程中有很多 Service Mesh 相关实践,主要是通过 Service Mesh 的 sidecar 将原本需要写在代码中的逻辑替换掉,而微服务改造和容器化可以认为在此之前已经陆续完成。
在 Service Mesh 方面,目前比较有代表性的开源工具就是 Istio。
image.png
如上图,Istio 的核心组件主要包括 Proxy 代理、Mixer 混合器、Pilot 引导、Citadel 堡垒和 Galley。其中,Proxy 代理的代理组件主要是 Envoy,用来拦截所有想拦截的流量;Mixer 混合器混合了各种策略以及后端数据采集或遥测系统的适配器,实现了前端 Proxy 与后端系统的隔离与汇合;Pilot 引导提供了一系列 rules api,允许运维人员指定一系列高级的流量管理规则;Citadel 堡垒管理着集群的密钥和证书,是集群的安全部门;Galley 主要是用来验证用户编写的 Istio api 配置。
目前来看,Istio 并没有太大的问题,Envoy 可能成为 Istio 发展的阻碍,Envoy 本身是用 C++ 编写的,主要由核心团队维护,社区参与度一般。Envoy 支持了多种调用机制,但仍然不能满足部分工业界的需求(比如 Backup Request),而 Envoy 的复杂性又限制了使用者自行扩展,不排除未来 Envoy 会被更灵活的 Sidecar 组件替代掉。
除此之外,过去一段时间,在 Serverless 层面进行了大量实践,这也是整体改造中非常重要的一个环节。

Serverless 实践

2019 年,Serverless 被 Gartner 称为最有潜力的云计算技术发展方向,并被赋予是必然性的发展趋势。Serverless 从底层开始变革计算资源的形态,为软件架构设计与应用服务部署带来了新的设计思路。在行业内,对 Serverless 的解读并没有公认的准确定义,京东智联云认为 Serverless 技术目前有三种实现:
  • 真正的无服务器,就是所谓的函数计算 FaaS;

  • 类似京东智联云的原生容器,容器直接呈现给用户,并且背后不需要有虚拟机来支持;

  • 应用比较广泛的无服务器,背后虚拟机由云厂商来提供,但是对用户不可见,仍然是以虚拟机的方式来提供容器。

目前,京东智联云在 Serverless 还在开发中,完整的 Serverless 实践需要包括如下几个模块:
  • 负责提供计算能力的 FaaS

  • 负责提供通信能力的 Queue Service 和 Notification Service

  • 负责提供持久化能力的 Serverless KV 和 Object Storage

  • 负责提供入口的 API Gateway

  • 负责提供编排能力的 Step Function

目前已经提供了 FaaS, Queue Service, Object Storage 和 API Gateway, 其他模块也会在近期陆续发布。

FaaS

在 FaaS 层面,京东智联云和 AWS 的 Lambda 以及 Azure 的 Function 类似,都是需要用户提供一段代码,这段代码以 HTTP 的入口形式可以访问。代码可以用 Java 等多种语言写出,处理完用户请求后给出一定反馈,整体代码的生存周期就是请求的处理过程。代码是由函数计算来提供包括 CPU、内存、语言平台等运行环境,用户完全不用关心代码运行在什么地方。
当并发请求非常多时,平台就会运行这段代码容器的多个副本,这样就能做到:用户无需预留计算资源,仅根据调用的时长、次数来付费。这种情况是目前为止计算资源能做到的最小化分配粒度。粒度越小时,越有可能填满服务器的计算能力,粒度越大,后期就可能有越多的计算能力被闲置。
FaaS 的优势和劣势都很明显,主要优势包括:彻底的无运维、近乎无限的伸缩能力和零启动成本。劣势则包括:冷启动比较慢,相对常规服务延时较高、压力稳定时没有成本优势。不过这些劣势并不是 FaaS 的本质造成的,而是可以解决掉的问题,在解决掉这些问题之后,FaaS 就能获得更大的适用范围和更远大的前景。
现阶段,FaaS 比较适合的应用场景主要有两类:一是事件驱动型应用,比如 IoT、网页游戏等类型;二是实验性项目,这类项目租用虚拟机的成本比较高,而 FaaS 几乎是零成本,不调用的情况下不会产生开销。目前还有一个趋势是逐步用 FaaS 取代 AppEngine。京东智联云目前将 FaaS 应用在多媒体内容分析处理和 Serverless 后端服务两个场景:
  • 通过对象存储上传事件可以触发多个函数,完成实时图片或文件筛选、转存、创建缩略图、转换视频编码等处理分析。通过事件触发机制,您能够快速部署复杂的应用与服务,构建一个弹性、可靠的后端系统。

  • 通过函数服务和 API 网关构建后端,以验证和处理 API 请求。采用函数服务构建可灵活拓展架构,轻松创造丰富、个性化的应用程序体验。

image.png
如上,目前的 FaaS 主要支持 Python 2&3 和 Nodejs 6&8,这两者是目前 FaaS 适用场景中使用较多的语言,而接下来也会陆续支持 Java 和 PHP 等编程语言,毕竟几行代码就可以处理的事件通常开发者更愿意用 Python 而不是 Java。笼统地说,可以通过 K8s 和 Docker 来实现的服务,也可以选择用 FaaS 实现,但要认清楚 FaaS 的优劣
在本地调用函数时,响应基本是实时的,而云上的 FaaS 需要部署计算环境,这个过程的时间从数百毫秒到数秒不等,难于应对时延敏感型应用;此外,FaaS 的优势是极度弹性伸缩,这让其在调用量下降时会进行资源回收清理,下次调用时则又需要冷启动,这个过程一直反复存在于服务的整个生命周期中。

队列服务

京东智联云的队列服务(Queue Service)是一项基于 Serverless 架构的全托管消息队列服务,它可以提供高可靠并且几乎无限扩展的托管消息队列。
image.png
如上图是队列服务的架构图,主要分为底层分布式存储、功能及解决方案、安全管理及用户接入四层,其特点是毫秒级自动伸缩和无规格限制。在消息类型上,标准队列理论上无限制的 TPS 上限,最大努力的消息排序以及至少一次消息传达;FIFO 队列保证消息的传达顺序与消息发送顺序一致以及精确的一次性处理。主要的应用场景是如下两种:
  • 异步解耦,削峰填谷。上下游系统处理能力存在差距的时候,利用队列作为数据的缓冲器,增加系统架构的可用性和可靠性,平滑处理峰值流量,解耦系统架构,避免对业务主流程的影响。

  • 性能扩展,容错处理。由于队列服务会解耦分离用户应用的处理进程,因此对于有扩展需求的应用,可以轻松提高从队列服务发送或接收速率来增加用户应用的处理能力,对于部分故障的模块可以从整个系统中摘除。

原生容器

原生容器与普通意义的容器还是有一些差别,通常容器会被认为是在 PaaS 层,由 PaaS 团队负责,而原生容器在京东云内部属于 IaaS 团队,这也可以看出原生容器与底层的关联比较密切。简单来说,可以将原生容器理解为普通容器和削薄后的虚拟机的结合体。
如上文所言,容器的安全性和隔离性是很大的问题,一旦容器被入侵,入侵者很容易通过穿透容器到达下面的物理机,从而影响整个云平台上的用户,虽然这也是老生常谈的问题,但要想既保证性能和启动时间不受影响,又达到更高的安全级别,这本身就是一件棘手的事情,常规的安全手法成本又太高,最好的方式是将虚拟机隔离起来,通过这个弥补容器安全性上的不足,当容器被入侵时,入侵者不至于影响整个云平台的用户。同时,原生容器对虚拟机做了大幅简化,资源损耗和启动时间均有所降低,这就是所谓的原生容器的概念。坦白地说,用户申请的每一个原生容器里面跑的就是一个 Docker 或者 Pod。
在原生容器方面,京东的产品推出时,Kubernetes 还没这么流行。所以为了实现节点容量的无限大,是通过一个叫 virtual kubelet 的插件让 Kubernetes 集群拥有一个虚拟节点。而如今,原生容器完全看用户需求。如果是一次性的任务处理批量计算工作,这种方式非常有效,因为虚拟节点可能会在某些方面不能实现 Kubernetes 所有的接口,某些特殊应用可能需要一定的适配工作,例如 daemonset。京东智联云正在考虑把原生容器运行的节点暴露出来,并提供和现在 Kubernetes 所有接口兼容的一个应用。而在 Docker 方面,京东智联云希望能向轻量化发展,可以随时创建、随时销毁,并且可以随时随地创建更多的副本。

此外,京东智联云也希望能将原生容器和 Kubernetes 通过比较紧密的方式结合在一起。比如在 Kubernetes 里的 Kata Container,其在 Kubernetes 里使用了更安全的容器;还有 Rancher Labs 基于 K8s 推出的轻量级的 Kubernetes 发行版 K3s,可以满足在边缘计算环境中运行在内存和处理能力受限的小型、易于管理的 Kubernetes 集群日益增长的需求。

未来已来,愿云原生继续推动技术发展,不断变革!