本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
京东从 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 的平台架构如下图所示。
功能 | 产品 |
---|---|
源代码管理 | 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 平台上。
一站式解决方案
- 1.JDOS 2.0 以 Docker 镜像为核心,实现持续集成和持续部署。
- 2.开发者将代码推送到 Git。
- 3.Git 触发 Jenkins master 生成构建任务。
- 4.Jenkins master 调用 Kubernetes 创建 Jenkins slave Pod。
- 5.Jenkins slave 拉取源代码,编译和打包。
- 6.Jenkins slave 将软件包和 Dockerfile 发送到带有 Docker 的镜像构建节点。
- 7.镜像构建节点构建镜像。
- 8.镜像构建节点将镜像推送到镜像仓库 Harbor。
- 9.用户在不同区域创建或更新应用程序 Pod。
JDOS 1.0 中的 Docker 镜像主要由操作系统和应用程序的运行时软件栈组成。因此,应用程序的部署仍然依赖于自动化部署和其他工具。而在 JDOS 2.0 中,应用程序的部署在镜像构建期间完成。镜像包含完整的软件栈,包括应用程序。通过镜像,我们可以实现应用程序在任何环境中按设计运行的目标。
网络和外部服务负载均衡
JDOS 2.0 采用 JDOS 1.0 的网络解决方案,该方案通过 OpenStack Neutron 的 VLAN 模型实现。该解决方案实现了容器之间的高效通信,非常适合公司内部的集群环境。每个 Pod 在 Neutron 中占用一个端口,并拥有独立的 IP。基于容器网络接口标准 (CNI),我们开发了一个新的项目 Cane,用于集成 kubelet 和 Neutron。
同时,Cane 也负责 Kubernetes 服务中 LoadBalancer 的管理。当创建/删除/修改 LoadBalancer 时,Cane 会调用 Neutron 中 lbaas 服务的创建/删除/修改接口。此外,Cane 项目中的 Hades 组件为 Pod 提供了内部 DNS 解析服务。
Cane 项目的源代码目前正在完成,并将很快在 GitHub 上发布。
灵活调度
JDOS 2.0 接入了包括大数据、Web 应用、深度学习等多种类型的应用,并采用了更多样化和灵活的调度方式。在一些 IDC,我们实验性地混合部署了在线任务和离线任务。与 JDOS 1.0 相比,整体资源利用率提高了约30%。
总结
Kubernetes 丰富的功能使我们能够更多地关注平台整体生态系统,例如网络性能,而不是平台本身。特别是,SREs 高度赞赏了复制控制器功能。有了它,应用程序的扩缩容在几秒钟内即可完成。JDOS 2.0 目前已接入约20%的应用程序,并部署了2个集群,每天运行约20,000个 Pod。我们计划接入更多公司应用程序,以取代当前的 JDOS 1.0。我们也很高兴与社区分享在此过程中的经验。
感谢 Kubernetes 和其他开源项目的所有贡献者。
——京东基础设施平台部门团队
- 在 GitHub 上参与 Kubernetes 项目
- 在 Stack Overflow 上提问(或回答问题)
- 下载 Kubernetes
- 在 Slack 上与社区交流
- 在 Twitter 上关注我们 @Kubernetesio 获取最新动态