本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

京东从 OpenStack 转向 Kubernetes 的内幕

编者按:今天的文章由京东基础设施平台部门团队撰写,讲述了他们从 OpenStack 过渡到 Kubernetes 的过程。京东是中国最大的公司之一,也是第一家进入全球财富500强的中国互联网公司。

集群建设历程

物理机时代 (2004-2014)

2014年之前,我们公司的应用都部署在物理机上。在物理机时代,应用上线资源分配平均需要等待一周时间。由于缺乏隔离,应用之间会相互影响,导致许多潜在风险。当时,每台物理机上的 tomcat 实例平均不超过九个。物理机资源严重浪费,调度不灵活。由于物理机故障,应用迁移需要数小时。并且无法实现自动扩缩容。为了提高应用部署效率,我们开发了编译打包、自动化部署、日志收集、资源监控等系统。

容器化时代 (2014-2016)

2014年秋,由京东首席架构师刘海峰领导的基础设施平台部门 (IPD) 寻求新的解决方案。Docker 进入了我们的视野。当时 Docker 正在兴起,但略显稚嫩,在生产环境中缺乏经验。我们反复测试了 Docker。此外,Docker 也被定制化以解决一些问题,例如设备映射器导致的系统崩溃和一些 Linux 内核 bug。我们还向 Docker 中添加了许多新功能,包括磁盘限速、容量管理以及镜像构建中的分层合并等。

为了妥善管理容器集群,我们选择了 OpenStack + Novadocker 驱动的架构。容器被当作虚拟机进行管理。这被称为京东第一代容器引擎平台——JDOS1.0 (JD Datacenter Operating System)。JDOS 1.0 的主要目的是将基础设施容器化。自那时起,所有应用程序都运行在容器中,而不是物理机上。至于应用程序的运维,我们充分利用了现有工具。开发人员在生产环境中请求计算资源的时间从一周缩短到几分钟。计算资源池化后,即使是扩容1000个容器也能在几秒内完成。应用实例之间相互隔离。应用平均部署密度和物理机利用率都提高了三倍,带来了巨大的经济效益。

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

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

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

新容器引擎平台 (JDOS 2.0)

平台架构

当 JDOS 1.0 从2000个容器增长到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
容器工具Docker
容器网络Cane
容器引擎Kubernetes
镜像仓库Harbor
CI 工具Jenkins
日志管理Logstash + Elastic Search
监控Prometheus

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

JDOS 2.0 的大部分组件(GitLab / Jenkins / Harbor / Logstash / Elastic Search / Prometheus)也都被容器化并部署在 Kubernetes 平台上。

一站式解决方案

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

  1. 1.JDOS 2.0 以 Docker 镜像为核心,实现持续集成和持续部署。
  2. 2.开发者将代码推送到 Git。
  3. 3.Git 触发 Jenkins master 生成构建任务。
  4. 4.Jenkins master 调用 Kubernetes 创建 Jenkins slave Pod。
  5. 5.Jenkins slave 拉取源代码,编译和打包。
  6. 6.Jenkins slave 将软件包和 Dockerfile 发送到带有 Docker 的镜像构建节点。
  7. 7.镜像构建节点构建镜像。
  8. 8.镜像构建节点将镜像推送到镜像仓库 Harbor。
  9. 9.用户在不同区域创建或更新应用程序 Pod。

JDOS 1.0 中的 Docker 镜像主要由操作系统和应用程序的运行时软件栈组成。因此,应用程序的部署仍然依赖于自动化部署和其他工具。而在 JDOS 2.0 中,应用程序的部署在镜像构建期间完成。镜像包含完整的软件栈,包括应用程序。通过镜像,我们可以实现应用程序在任何环境中按设计运行的目标。

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 组件为 Pod 提供了内部 DNS 解析服务。

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

灵活调度

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

总结

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

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

——京东基础设施平台部门团队