阿里搜索业务容器化中的一些经验和思考

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:  从个人对容器的发展来看。大会上几位问到一些隔离的问题,分享嘉宾都说这个比较复杂,要么说这块他们没有解决,确实经常出问题,要么说私下来讨论;其实我们在接入和调度容器的时候,也发现了目前的容器技术在隔离上还欠缺很多,如果要能更好的提高物理机的资源利用率,降低成本,单机隔离和单机弹性将是一大关键技术和核心竞争力。

概要

参加了上一次CNUTCON 大会,有来自coreos的李响,分享了很多关于etcd的事情,以及关于k8s包括自己和coreos公司的一些观点;还有来自mesos的tim chen, 他分享了很多mesos的思路以及一些接入容器过程中踩过的一些坑;swarm kit的负责人陈东洛也分享了swarm的思路,这方面由于刚出来没多久以及分享的同学也只有他,所以东西并不多;总的来说,感触很深。

关于容器和编排,想到开源和创业

  从会议分享者来看。相比去年,容器技术有了更大的发展;docker很热,每一个主题都在涉及docker。且基本上大家都认同docker的镜像。对于容器,虽然也有其他的一些选择,比如rkt,lxc等,但对于runtime以及接口,大家基本趋于一致,短期也不会期望有大的变化,大家开始从更高层次思考容器的应用,比如直接提供给用户编排的工具,服务或系统,而不是一个容器。swarmkit的发布就有这个意思,大家开始把重心转移到编排和调度。
  从个人对容器的发展来看。大会上几位问到一些隔离的问题,分享嘉宾都说这个比较复杂,要么说这块他们没有解决,确实经常出问题,要么说私下来讨论;其实我们在接入和调度容器的时候,也发现了目前的容器技术在隔离上还欠缺很多,如果要能更好的提高物理机的资源利用率,降低成本,单机隔离和单机弹性将是一大关键技术和核心竞争力。

     我们采用了跟mesos一样的架构和思路,因此我重点听了mesos相关的topic,希望是能够吸取到好的经验,能实际实施到我们的系统中,然后听了更多的k8s的topic。整体个人感觉,在开源解决方案中,k8s目前要热过mesos,k8s在web service这方面确实占据了很大的市场,吸引了很多开发者,但在有状态服务的应用特别是大数据上面目前并没有很好的解决方案,社区也一直在讨论和抽象当中。相反mesos在大数据服务场景下能够很好的解决,并在集群规模上也有很好的优势,但拿到mesos是不能直接解决用户的需求,需要用户写一个scheduler。swarm的思路则是另外一种哲学,或是另一个极端,跟docker的思路是同承一脉的,把更多的东西集成进系统里,提供给用户简单统一的接口,装好docker就可以编排调度了,这方面后续发展如何,很难说,暂且不论。总的来说,这一开源领域目前仍是K8s、Swarm、Mesos三足鼎立,近期也看不到谁会完全胜出。它们的功能比较如下图所示。

orchestrators
  无论mesos这种2次调度,扩展性强的哲学,还是swarm kit这种集装箱式的哲学,其次是k8s先取其中,优先发展自己优势的思路。国外这种开源以及项目创业的一些共性值得我们思考和学习,这里举一个例子, coreos公司他们把他们的目标和使命定义为"secure the internet", 在zookeeper的发展满足不了他们需求的时候,他们能做出这么大的决定重新build一个如此大的项目,并且成功了,成为容器界基本都依赖的一个项目,这个勇气和思路值得学习。

   我们的项目前身是hippo,跟google borg相似,采用自建的方式,借鉴了很多mesos的思路,但确没有使用mesos开源版本进行改进,与社区缺乏交流,不能共享mesos社区新的feature,也不能对开源进行影响;另外我们系统暂时也不能对国内技术全产生很大的影响,吸收群体的智慧有限,这是一大遗憾。都说开源是有利益目的的,你认同吗? 

从mesos接入docker,想到hippo接入docker

  为什么想到这个,实际上我们在接入的过程当中踩到了相同的坑,有的mesos解决的好,有的还没有解,可以作为后续改进的一个参考。

mesos和hippo容器化之路 (Containerizer)

容器接入的接口设计

  我们团队关注docker很早,在hippo启动前就开始就关注docker。
  14年我们直接用cgroup和namespace等标准的os feature完成了引擎进容器的demo,证明了隔离的可行性。
  一直想完善我们的隔离,docker开始崭露头角,但docker在2.6.32内核上要跑到生产还不行,而t4在阿里在生产已经跑了一段时间,因此我们14年为了让混布,提高资源利用率,节省成本,选择了t4进行落地。
  跟mesos一样,在容器技术没有完全统一的情况下,我们当时在设计的时候也考虑了支持不同的容器以及不同的隔离策略,以实现用户的定制需求和可插入性,或者可配置性。
  mesos在最开始的时候,为了支持External Containerizer,定义了一套回调的脚本接口,用户可以在脚本里完成各个阶段的工作。但docker非常火,连k8s也在学习docker的接口设计理念,而且External Containerizer变得很难用,最终这种方式被废弃掉。
  hippo是自建方案,有一个好处我们不需要考虑太多其他人的兼容性,这样我们在设计实现的时候,相对的在接口设计方面做得直接些,没有过度设计,从t4到docker基本上,对主体结构代码没有太多的侵入性。createInstance,destoryInstance,checkInstance几个简单的接口不论是什么容器,都适用。

 现在的mesos,对docker是native integration。没有额外的setup。只需要docker daemon和docker client。可以说在这方面和hippo是殊途同归了。

容器接入踩了很多坑,还有很多未解决的

  真的就是3个接口那么简单吗?mesos在接入docker的时候,在处理日志,recovery, tag containers, cgroup资源更新等等踩了很多坑。以docker update为例,docker在1.2以前是一直不支持的,且后续版本也支持的不够。

 更能说明这个问题的是如果mesos自己跑在容器里,如何去更新其他容器的资源,因为这个时候已经chroot。mesos采用了一个跑在宿主机的docker exectute的代理(如图2)。这个方案我觉得比我们做的好,我们的pouch(阿里自研容器产品)把很多的逻辑直接做在了docker daemon,这样侵入性太高,跟踪最新的docker版本成本很高,无法及时享受修复的bug以及新的feature。

docker

还讲到一些cgroup的坑,我们最近在升级7u的过程也踩到过。主要是systemd+docker+mesos。这三者都会涉及cgroup节点。在7u中,systemd管控了整个系统的资源。https://issues.apache.org/jira/browse/MESOS-3009 ,他们踩到一些坑复现后发现是docker创建的容器,systemd有在干预它的cgroup。hippo也踩到了这样的坑,对应的内存,cpu限制不住,我们的实际做法是通过采用cgroup driver为systemd,并在pouch里面通过systemd api来控制cgroup来避开这些冲突。

systemd

还有很多解决了的坑,暂且不论,还有很多我们未解决的坑,这些可能每一个都需要开一个topic去讨论,这里有兴趣的可以私下讨论。

docker会妨碍我们的容器发展吗?

  mesos的经验,docker相对比较重,在一台机器上跑很多的docker容器是会带来额外很多问题。
  hippo希望做的更强大,希望能支持更多的离线和在线job,来提供资源利用率,最终降低成本。但有的场景需要很轻量级的容器,有的需要更强的隔离。比如,随着图像处理需求的增强,AR/VR的发展,对GPU的隔离需求会越来越强烈,如果我们一直等docker来提供这些feature来解决这些问题,肯定是不行的,这是一个很大的问题。因此,和mesos一样,hippo也需要考虑解决这个问题,因此可能如何支持不同级别的隔离是未来需要思考的。
screenshot

容器里面跑容器

  这个在集群调度中心群也集中讨论过这个问题,当时是为了解决case的资源问题,据部分同学说docker不支持这个。但mesos表态要支持这个,他们举了几个需求,这里讲一个。

一个是在跑CI(Jenkins)时,希望jenkins申请一个大的资源,然后jenkins分给跑在上面的case,tim说这样做是为了设计简单,感觉没有说到点子上,但估计他对这块不是很熟,但我们的场景有一点很明确,就是各二层测试的时候,需要部署hippo一层来创建出各类的异常case。这个时候就需要二层起的hippo跑在容器的容器里。

还有一个很重要的需求其实来源于pod。需要容器里跑容器,来进行更细粒度的资源控制,以及更灵活的调度。

How to solve utilization, fairness and performance when

running all of these services at scale?

 这才是最根本的问题,tee选择离开mesos,选择创业,需求也来源于此。
 这个我们还在探索当中,大师从谷歌带回来的消息是,他们的cpu利用率超乎你的想象,我们还在探索当中,这里暂且不论。

其他

一口气写了这么多,零零碎碎,仅仅作为容器大会的一次观后作业。 整个2天下来,东西很多,对国内的这么大的分享也是第一次参加,会前并不太会选topic,所以会场里面的topic,有收获的,也有纯粹看热闹了,总体感觉国外请过来的嘉宾干货多,国内的广告多;国内张磊workshop专场讲k8s技术点以及发展还不错,ppt都在上面,大家可以下载下来看看,http://ppt.geekbang.org/cnutcon

 另外阿里新一代基础设施调度系统sigma正在如火如荼的统一所有资源池,后面我们也会在这方面分享对应的技术和思考。
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
6月前
|
Docker 容器
百度搜索:蓝易云【docker容器/etc/hosts文件修改教程】
现在,你已经成功修改了Docker容器中的 `/etc/hosts`文件,添加了主机名和IP地址的映射关系。这使得在容器内部可以使用指定的主机名来访问相应的IP地址。请确保在修改 `/etc/hosts`文件时小心,避免错误的配置导致意外的问题发生。
183 0
|
6月前
|
网络安全 数据安全/隐私保护 Docker
百度搜索:蓝易云【SSH远程直连Docker容器教程。】
希望以上教程能够帮助你通过SSH远程直连Docker容器。如有更多疑问,请参考相关的文档和资源进行进一步学习。
79 0
|
6月前
|
运维 IDE Serverless
Serverless 应用引擎产品使用之阿里函数计算中,阿里云容器镜像服务(Container Registry)中创建自定义镜像,然后将其部署到FC上如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
Web App开发 安全 前端开发
百度搜索:蓝易云【Docker WebRTC容器部署方案】
以上是一个简单的Docker WebRTC容器部署方案。在实际应用中,你可能需要根据自己的需求进行更复杂的配置和优化。此外,要确保你的WebRTC应用程序在Docker容器中能够正确运行,可能需要处理一些网络和安全方面的问题。
159 6
|
6月前
|
存储 关系型数据库 MySQL
百度搜索:蓝易云【Docker创建Mysql容器教程】
请注意,在生产环境中,应该更加详细地配置MySQL容器,包括设置持久化存储、指定MySQL版本、配置安全性等。此外,还可以使用Docker Compose来管理和部署多个容器,以满足复杂的应用程序需求。
93 0
|
6月前
|
存储 Docker 容器
百度搜索:蓝易云【【Docker存储】Docker的容器迁移方式详解】
通过以上方式,可以在不同的Docker环境中迁移容器和相关的数据。根据具体需求和环境情况,选择适合的迁移方式。
72 0
|
6月前
|
应用服务中间件 nginx Docker
百度搜索:蓝易云【关于在容器中,nignx代理后端多个服务如何保证后端服务的地址不变呢?】
通过这种方式,您可以保证在容器中使用Nginx代理后端多个服务时,后端服务的地址不变,无论后端服务的容器如何重启或迁移。
66 0
|
6月前
|
Docker 容器
百度搜索:蓝易云【docker篇-重启策略+run容器常用参数】
总结: 通过重启策略和 `docker run`的参数,你可以在Docker中管理容器的重启行为和配置。重启策略定义了容器在退出或崩溃后的重启行为,而 `docker run`的参数可以用来设置容器的其他行为,如运行模式、端口映射、文件挂载等。
102 0
|
6月前
|
安全 网络安全 数据安全/隐私保护
百度搜索:蓝易云【SSH远程直连Docker容器教程。】
请注意,为了安全起见,确保在连接到Docker容器时采取适当的安全措施,并仅允许经过身份验证的用户访问容器。
112 0
|
Ubuntu NoSQL C++
百度搜索:蓝易云【搭建ubuntu容器内C/C++开发调试环境】
以上是搭建 Ubuntu 容器内 C/C++ 开发调试环境的一般教程。你可以根据实际需求进行进一步的定制和配置。请注意,使用容器进行开发调试可以提供一种隔离的环境,但也需要注意容器的资源限制和安全性。建议参考 Docker 官方文档和其他可靠资源,以获取更详细和特定于你的需求的指导。
54 1