Docker实践,来自沪江、滴滴、蘑菇街架构师的经验之谈

架构师小组交流会:每期选一个时下最热门的技术话题进行小组交流。

第一期主题:容器实践。Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化、可移植性是CI/CD,DevOps,微服务的重要实现技术。但目前技术还不够成熟,在生产实践中会遇到不少坑。本期参与小组交流的是国内较早采用 Docker 实践的公司。

参与嘉宾:沪江架构师黄凯、滴滴架构师田智伟、蘑菇街架构师张振华、蘑菇街运维架构师向靖、七牛技术总监袁晓沛、扇贝技术总监丁彦

第一轮:自由交流

沪江黄凯:大家好,我是来自沪江的 Java 架构师,我叫黄凯。在加入沪江之前,曾在 HP 和 IBM 的云计算部门担任核心开发和架构职位。对 IaaS、Paas、SaaS,尤其是云存储有较深入的了解。2015 年加入沪江,担任架构师职位,主导的产品有:课件云存储,云转码等等。在这些项目中,我们使用 Mesos 和 Marathon 做 Docker 的编排工具,并开发了一个 Mesos Framework 做云转码的核心框架。

那么我们为什么要使用 Docker,也是机缘巧合。由于我们的服务开始的时候不是特别多,采用的就是一种普通的架构,后来随着服务的增多,发现部署和运维花的时间太长,我们想使用一些新的方式。开始的时候研究过 Openstack,后来觉得 Openstack 慢慢没落,于是我们就选中现在使用的 Docker。我们并不把 Docker 当成 VM 在用,而是使用它的原生的,在 Baremetal 上直接安装 Docker,这样运行效率比在 VM 运行 Docker 要来的快。课件云是由很多微服务组成,不光是一些存储,这种微服务是使用 Docker 部署,就相当于编排,把这些微服务部署上去。转码这一块是使用了 Mesos 框架,和 Docker 没有特别大的关系,但是转码的应用程序,比如说我们现在应用 FFmpeg,这个程序是运行在 Docker 里面的。

为什么要选择 Marathon?第一,我觉得 Mesos+Marathon 非常的容易理解。我们也研究过 Kubernetes 和其他的一些方法,发现从运维和研究的方面来说的话,Kubernetes 实在是太重而且太复杂,后来选择了Marathon。我们现在是内部服务使用,两个部门在使用转码集群,大概是 Baremetal 有 20 台的物理机。除去我们 API 的一些服务,还有一些第三方组件的服务的话,大概是有 400 多个 Docker 容器在跑。

滴滴田智伟:大家好,我是滴滴代驾事业部架构师,代驾事业部是公司最早尝试 Docker 虚拟化的事业部。目前主要方向是业务系统及部分中间件的 Docker 化,我们做的时间也不太长,半年多的时间。线上是因为我们有老的一套发布系统,集成涉及的部门比较多,所以我们基于原来的发布系统完成了预发布环境 Docker 的部署。线下环境基于 Docker+K8s 开发内部的自动化持续交付系统及开发测试环境管理。我们在做开发和测试环境的自动化,另一方面也是做环境管理的,两套环境。对于项目并行的时候发现原来很多不够用,原来很多配置是基于端口绑死的情况。现在基于开发 Kubernetes 的话,网络隔离用了一部分,然后主要是用环境变量这一部分,主要考虑是解决一个配置可以应用到在多个环境的情况,基于这个需求才用它。开发 Kubernetes 基于 Namespace,同一个服务在不同的 Namespace 下,它其实环境变量名可以是相同的,但是IP不同,而这一部分 IP 其实是由开发 Kubernetes 自己去管理的。基于环境变量获取一些配置的话,比如 IP 地址这种,就可以做到拿一份配置可以打出多套环境。

考虑业务的安全性和稳定性,线上基于纯 Docker 的方式在做。我们是基于裸的 Docker 来工作,主要是用资源隔离,没有借助调度框架,也没有自动伸缩。我们是两步走,一步是验证 Docker,其次是做开发 Kubernetes 线下使用和预研。为什么没有考虑 Mesos?刚才跟沪江的同学,我们的考虑是相反的。Mesos 侧重点更专一一点,首先不会有模块的划分,比如 Kubernetes 有 Replication controller ,Namespace 这种概念,而 Mesos 下几乎没有这种概念。我们拿 Kubernetes 主要是做一些编排的功能,而正好开发 Kubernetes 在整个发布和编排上,体系更全面一点。Mesos 最早是做资源管理,基于 Docker 做一个 Framework 接进来的话,它不是专门为编排而生。Kubernetes 首先解决我们的问题是,我们可能不需要加多份配置就可以搭多套不同的环境,它就是基于 Namespace 做一个多租户的概念,会对 Service 做一层隔离,对于动态配置,扩容这一部分暂时我们没用到,确实用到的一些场景比较少。主要是做不同环境的隔离,并没有太多使用编排细节上的东西,动态伸缩之类的目前线下没有太大必要,线上可能会用到。