JD.com从OpenStack向Kubernetes的转变

编者注:今天的帖子由JD.com的基础设施平台部团队撰写,内容涉及他们从OpenStack过渡到Kubernetes的过程。京东(JD.com)是中国最大的公司之一,也是首家进入“全球财富500强”榜单的中国互联网公司。

集群建设的历史

物理机器的时代(2004年至2014年)

2014年之前,我们公司的应用程序全部部署在物理机上。在物理机器时代,我们平均需要等待一个星期才能在线分配应用程序。由于缺乏隔离性,应用程序会相互影响,从而导致很多潜在的风险。当时,每台物理机上的tomcat实例平均数量不超过9个。物理机资源严重浪费,调度不灵活。由于物理计算机的故障,应用程序迁移时间花费了数小时。并且无法实现自动缩放。为了提高应用程序部署的效率,我们开发了编译打包,自动部署,日志收集,资源监视和其他一些系统。

集装箱时代(2014-2016)

基础设施平台部(IPD由JD.COM首席架构师刘海峰领导)在2014年秋季寻求新的解决方案。Docker闯入了我们的视野。当时,泊坞窗一直在上升,但略微虚弱,缺乏生产环境的经验。我们已经反复测试了docker。此外,还对docker进行了自定义,以修复几个问题,例如由设备映射器和一些Linux内核错误导致的系统崩溃。我们还向docker添加了许多新功能,包括磁盘速度限制,容量管理以及映像构建中的图层合并等。

为了正确管理容器集群,我们选择了OpenStack + Novadocker驱动程序的体系结构。容器作为虚拟机进行管理。它被称为第一代JD容器引擎平台-JDOS1.0(JD数据中心操作系统)。 JDOS 1.0的主要目的是容器化基础结构。从那时起,所有应用程序都在容器中运行,而不是在物理机中运行。至于应用程序的运行和维护,我们充分利用了现有工具。开发人员在生产环境中请求计算资源的时间减少到几分钟而不是一周。合并计算资源后,即使扩展1,000个容器也将在几秒钟内完成。应用程序实例已相互隔离。应用程序的平均部署密度和物理机利用率都增加了三倍,带来了巨大的经济效益。

我们在每个IDC中部署了群集,并提供了统一的全局API,以支持在IDC中进行部署。在我们的生产环境中,单个OpenStack分布式容器集群中最多有10,000个计算节点,至少有4,000个节点。第一代容器引擎平台(JDOS 1.0)在2015年和2016年成功支持了“ 6.18”和“ 11.11”促销活动。到2016年11月,已经有15万个在线容器在运行。

“ 6.18”和“ 11.11”是京东最受欢迎的两个在线促销活动,类似于黑色星期五促销活动。 2016年11月11日已完成订单达到3000万。 

在开发和推广JDOS 1.0的实践中,应用程序直接从物理机迁移到了容器。本质上,JDOS 1.0是IaaS的实现。因此,应用程序的部署仍然严重依赖于编译打包和自动部署工具。但是,JDOS1.0的实践非常有意义。首先,我们成功地将业务转移到了容器中。其次,我们对容器网络和存储有深刻的了解,并且知道如何将它们最佳化。最后,所有经验为我们开发全新的应用程序容器平台奠定了坚实的基础。

新的容器引擎平台(JDOS 2.0)

平台架构

当JDOS 1.0从2,000个容器增长到100,000个时,我们启动了一个新的容器引擎平台(JDOS 2.0)。 JDOS 2.0的目标不仅是基础架构管理平台,而且是面向应用程序的容器引擎平台。在JDOS 1.0和Kubernetes的基础上,JDOS 2.0集成了JDOS 1.0的存储和网络,通过CI / CD从源到映像,再到部署的整个过程。此外,JDOS 2.0还提供一站式服务,例如日志,监视,故障排除,终端和编排。 JDOS 2.0的平台体系结构如下所示。

D:\百度云同步盘\徐新坤-新人培训计划\docker\MAE\分享\arc.png

功能产品
源代码管理Gitlab
容器工具码头工人
容器网络甘蔗
集装箱发动机Kubernetes
图像注册表港口
CI工具詹金斯
日志管理Logstash +弹性搜索
监控普罗米修斯

在JDOS 2.0中,我们定义了两个级别,系统和应用程序。一个系统包含多个应用程序,一个应用程序包含多个提供相同服务的Pod。通常,一个部门可以申请一个或多个与Kubernetes命名空间直接对应的系统。这意味着同一系统的Pod将位于同一命名空间中。

大多数JDOS 2.0组件(GitLab / 詹金斯 / Harbour / Logstash / Elastic Search / 普罗米修斯)也已容器化并部署在Kubernetes平台上。

一站式解决方案

D:\百度云同步盘\徐新坤-新人培训计划\docker\MAE\分享\cicd.png

  1. 1.JDOS 2.0以docker镜像为核心,实现持续集成和持续部署。
  2. 2.Developer将代码推送到git。
  3. 3.Git触发詹金斯大师生成构建作业。
  4. 4,詹金斯大师调用Kubernetes创建詹金斯奴隶Pod。
  5. 5.Jenkins slave从源代码中提取,编译和打包。
  6. 6,Jenkins从属将软件包和Dockerfile发送到具有docker的映像构建节点。
  7. 7.image构建节点将构建图像。
  8. 8.映像构建节点将映像推送到映像注册表Harbor。
  9. 9.User在不同区域中创建或更新应用Pod。

JDOS 1.0中的docker映像主要由应用程序的操作系统和运行时软件堆栈组成。因此,应用程序的部署仍然取决于自动部署和其他一些工具。在JDOS 2.0中,应用程序的部署是在映像构建期间完成的。图像包含完整的软件堆栈,包括App。使用该映像,我们可以实现在任何环境中设计运行应用程序的目标。

D:\百度云同步盘\徐新坤-新人培训计划\docker\MAE\分享\image.png

网络和外部服务负载平衡

JDOS 2.0采用JDOS 1.0的网络解决方案,该解决方案是通过OpenStack Neutron的VLAN模型实现的。该解决方案可实现容器之间的高效通信,非常适合公司内的集群环境。每个Pod占用Neutron中的一个端口,并带有单独的IP。基于容器网络接口标准(CNI )标准,我们已经开发了一个新项目Cane,用于整合kubelet和Neutron。

D:\百度云同步盘\徐新坤-新人培训计划\docker\MAE\分享\network.png

同时,Cane还负责Kubernetes服务中LoadBalancer的管理。创建/删除/修改LoadBalancer时,Cane会在Neutron中调用lbaas服务的创建/删除/修改接口。此外,Cane项目中的Hades组件为Pods提供了内部DNS解析服务。

甘蔗项目的源代码目前正在完成中,并将很快在GitHub上发布。

弹性排程

D:\百度云同步盘\徐新坤-新人培训计划\docker\MAE\分享\schedule.pngJDOS 2.0访问应用程序,包括大数据,Web应用程序,深度学习和其他一些类型,并采用更加多样化和灵活的调度方法。在某些IDC中,我们实验性地混合了在线任务和离线任务的部署。与JDOS 1.0相比,整体资源利用率提高了约30%。

概要

Kubernetes的丰富功能使我们可以更加关注平台的整个生态系统,例如网络性能,而不是平台本身。特别是,SRE高度赞赏复制控制器的功能。有了它,可以在几秒钟内完成应用程序的扩展。 JDOS 2.0现在已经访问了大约20%的应用程序,并部署了2个群集,每天运行大约20,000个Pod。我们计划访问我们公司的更多应用程序,以替换当前的JDOS 1.0。我们也很高兴与社区分享我们在此过程中的经验。

感谢Kubernetes和其他开源项目的所有贡献者。

-JD.com的基础设施平台部团队