阅读264 返回首页    go 微软 go windows


细数阿里云在使用 Docker 过程中踩过的那些坑

755ce786979fa38d9c4a7f54c65571a05ac53eaf

昨天下午道哥在微信上丢给我一条新闻,看看,我们阿里云支持 Docker 企业版了。我打开一看,果然,阿里云发布了飞天敏捷版,开始支持企业级的 Docker 容器。

美国中部时间4月19日,阿里云在容器技术大会 DockerCon 2017上正式推出了 Apsara Stack Agility,也就是飞天的敏捷版。Docker 公司首席执行官 Ben Golub 在大会上宣布了 Apsara Stack Agility 的正式发布,这也是国内第一个支持 Docker 官方企业版(Enterprise Edition,EE)的容器类产品,可以部署在企业自有数据中心环境内,特别适用于企业专有云及混合云场景。

Ben 在演讲中表示,阿里巴巴电商平台已经全面容器化,能够部署和管控超过几十万容器规模,在双11狂欢节稳定支撑了每秒175000次的订单交易。阿里云不但是 Docker 的首家业务合作伙伴,同时也在为 Docker 带来大规模容器应用的实践经验。深受开发人员喜爱的 Docker Hub 服务将于近期在国内推出。

Docker 及其创始人有着一个峰回路转的故事。Docker 是一种容器技术,但是容器技术由来已久,比如 Linux Containers,历史悠久,爷爷辈的技术,但是真正让容器进入人们视野的,是 Docker。


2010年,几个年轻人在旧金山成立了一家做 PaaS 平台的公司,起名为「dotCloud」。dotCloud 主要是基于 PaaS 平台为开发者或开发商提供技术服务。什么是 PaaS 呢?PaaS 的全称是 Platform as a Service,也就是平台即服务,无论你选择什么技术栈,PaaS 都会为你提供相关的配套设置,包括语言环境、运行环境、存储和各种基础服务。

dotCloud 花费了大量时间把手工工作和重复劳动抽象成组件和服务,并放到了云端,另外,它还提供了各种监控、告警和控制功能,方便开发者管理和监控自己的产品。PaaS 的概念虽好,但是由于认知、理念和技术的局限性,早期市场的接受度并不高,规模也不够大。虽然 dotCloud 在2011年初拿到了1000万美元的融资,但依然举步维艰。

在这种情况下,dotCloud 的创始人 Solomon Hykes 做了一件漫不经心的小事,他把 dotCloud 的核心容器引擎开源了。这个基于 Linux Container 技术的核心管理引擎一经开源立刻得到了「业界」的热烈追捧,容器管理引擎大大降低了容器技术的使用门槛,轻量级虚拟化,可移植,语言无关,写了程序扔上去做成镜像可以随处部署和运行,开发、测试和生产环境彻底统一了,还能进行资源管控和虚拟化。程序员们流着口水惊呼,太方便了,太方便了。引擎的名字叫做 Docker,以 Go 语言写成。

这个结果大大出乎 dotCloud 创始人的意外,从此以后,他们开始专心研发 Docker 产品和维护相关社区,2013年10月 dotCloud 公司更名为 Docker 股份有限公司,从此王子和公主过上了幸福而快乐的生活。


Docker 的技术特点现在大家都很清楚了,比如它能够以容器的方式自动部署任何应用;容器是一系列进程的集合;基于 namespaces 和 cgroups 实现容器资源的隔离和限制;基于 copy-on-write 技术创建文件系统,分层、快速、占用空间少;提供交互式 shell 和 remote api 等等。但是,与任何一门新兴技术的兴起一样,Docker 一路走来,给工程师和技术尝鲜者挖坑无数,有进程管理的问题,资源隔离的问题,内存泄露问题,包依赖问题,网络问题等等。

0feea4c55feddbdf6ca815c1a8bee990700a47fd

基于这些考量,我很想知道阿里云在这方面到底遇到了那些坑,解决了什么样的技术问题。于是有了我和阿里云容器服务负责人易立的一段对话:

阿里在使用 Docker 技术的时候碰到过那些坑,解决了哪些业务问题,对 Docker 做了什么改进呢?

Docker 的版本迭代速度很快,在快速发展的同时,必然会给使用者带来很多挑战,比如:

  • Docker Engine 和 Swarm 在可伸缩性上的问题。在早期版本中,集群规模比较大的情况下 Swarm 调度会变很慢,CPU 利用率非常高,同时 Docker Engine 中 libnetwork 对 etcd 的压力会非常大,也存在死锁的风险。我们对此做了大量改进,若干个 PR 已经被合并到 Docker 主干,大大提升了 Docker 集群的伸缩性。
  • 阿里云服务的集成和优化。在云端 Docker 环境的部署和线下有一些不同之处。比如,我们为阿里云 VPC 提供了符合 CNM 网络规范的容器网络驱动,其带宽和时延都优于原生的 overlay 网络,可以方便地实现混合云环境中容器的互联互通。为了便于 K8S/Mesos 用户在阿里云部署,我们也将其贡献给了开源的 Flannel 项目。
  • 内核兼容性。长时间压测容器还是会遇到各种奇怪的问题。阿里云容器服务为用户提供经过兼容性测试的 OS 和 Kernel 版本。由于社区的努力,目前主流操作系统 CentOS 7.3和 Ubuntu 16.04/14.04的最新版本内核对容器兼容性的支持也越来越好。
  • Docker Hub 访问是国内开发者普遍的痛,阿里云提供了免费的加速器服务和镜像仓库服务,可以帮助用户方便地拉取和构建镜像。另外也为 Docker 社区贡献了 Docker Registry 的阿里云 OSS 存储后端,支持海量数据的低成本镜像存储,同时修复不少 Registry 相关的性能和兼容性问题,这些也都回馈给社区了。

使用阿里云提供的 Docker 服务和自建 Docker 环境有什么不同?

Docker Engine 在单机上使用很方便,但要部署出一个可用于生产的集群,有很多问题需要考虑。跟手工部署 Docker Engine 和 Swarm 相比,使用阿里云容器服务有下列优势:

  • 一键部署安全的集群。阿里云容器服务帮助用户自动完成 ECS 创建、安全组配置、Docker Engine 和 Swarm 部署等繁琐工作。更加重要的是集群自带 SSL 证书,且支持证书下载、吊销等。
  • 针对阿里云能力进行了优化和集成,内置了容器在云上最佳部署和运维实践:比如支持阿里云 VPC/经典网络/SLB 负载均衡;集成日志服务 SLS、云监控;支持阿里云 OSS,NAS 的共享数据存储卷和云盘等等。
  • 容器服务在兼容原生 Docker 编排技术的同时进行了扩展。
  • 支持GPU/CPU混合的资源调度,可以轻松部署深度学习应用。
  • 提供离线应用、定时任务等扩展的调度能力,适应不同应用需求。
  • 支持蓝绿发布等多种发布方式,可以更快、更安全地发布应用。
  • 容器启动顺序依赖困扰了很多用户,我们结合容器的健康检查,提供了优雅的依赖检测方案。

共用 Linux Kernel,让 Docker 安全性先天不足,阿里是怎么解决的?

安全性是一个系统性问题,这里只针对 runtime 安全说一下。

  • 一方面,我们可以借助于虚拟化的隔离能力来达到更强的隔离。比如,在阿里云容器服务中,集群里所有 ECS 节点都是同一个用户的,不会和其他用户共享资源,这样避免了用户间的资源争抢和安全问题。
  • 另一方面,在针对需要采用容器进行多租户支持的场景中,比如我们对容器 User Namespaces 进行了映射,对操作系统配置了 security profile 和内核加固,同时对容器使用的存储,网络资源进行了额外限制。这些可以解决限定场景下的安全和资源隔离问题。

提升容器的资源隔离性和安全性,还有很多的路要走。也在和其他团队配合,在Linux 内核层面进行探索。任何一项新技术的应用、推广和普及都需要大量的实践和改进,一个技术或者环境,能够在你自己的笔记本上跑起来和投入成千上万台集群机器中完全是两个概念。我在锤子科技和极客邦科技的研发和生产环境里都用到了 Docker 技术,但数据体量和实践让我们很难进行类似的改进,因为你正常使用就没问题啊,只有数据量足够大,机器足够多的时候,很多瓶颈,比如扩展性、安全性、兼容性和长期的可用性才会出现挑战,如果是提供给别人的商用系统,要求就更多了。

飞天敏捷版充分体现了云 + 容器的独特价值。不仅大大了降低容器服务的操作难度,移植性也很强,能在不同环境中进行应用部署。有了它,客户可以在一组主机上通过 Docker 容器来进行分布式应用的部署、更新和弹性伸缩,轻松实现混合云方案。当业务出现峰值流量时,快速将本地数据中心应用扩展到云端,利用云资源更好的进行灾备、应对峰值流量。


易立对我说,「除了产品技术层面的合作,阿里云还将加大在社区的投入,并通过一系列技术活动提升中国 Docker 技术和应用的水平。」 

我曾经写过一句话,大数据量胜于优秀算法,如果数据足够多,可能产生出意想不到的应用。无论算法好坏,更多的数据总是能够带来更好的效果。目前这些数据和机器节点都在中国的大型互联网公司里。

算法再好,没有量,也是无源之水,无本之木。从这个角度看,大型互联网公司更有责任去推进技术社区的发展,基于数据优势对开源社区做出更多贡献。当然,极客邦科技也会在其中发挥重要的作用。


来源:MacTalk 作者:池建强
原文链接

最后更新:2017-04-22 13:30:29

  上一篇:go 阿里NASA计划“亮剑”:谢崇进和他追求的科学极限
  下一篇:go java基础之集合类