写点什么

从 Docker 运维看知乎容器平台的优雅整合

  • 2016-07-26
  • 本文字数:4051 字

    阅读完需:约 13 分钟

传统的部署是安装、配置和运行;而 Docker 的出现革命性地改变了传统模式,部署被简化为复制和运行两个步骤。因此,越来越多企业使用 Docker 提高分布式应用的构建与交付;但是与此同时,Docker 带来了很多不可避免的挑战,其中运维需要克服的挑战尤为突出。知乎曾经在 QCon 上与大家首次分享 Docker 架构和经验,也即将在 CNUTCon 全球容器技术大会详细讲述容器平台的实战历程。本次 InfoQ 就在 Docker 整合入原有架构过程中,如何实现的 Docker 运维对知乎两位专家进行了采访。

受访嘉宾介绍

林晓峰:知乎技术平台团队负责人。负责建设知乎各类基础设施平台、抽象各个基础设施的服务,以及为业务开发提供统一的基础设施平台接入。高性能 Linux 网络协议栈实现 Fastsocket 协议作者。

张阜兴:知乎平台架构工程师。负责知乎内部弹性计算平台,以及知乎容器平台搭建实施和各业务容器化进程。在高性能网络流量处理和分布式存储系统方面有过多年实践经验,目前致力于构建统一资源调度框架,分布式系统设计等方向。

InfoQ:可以简要介绍下知乎现在的 Docker 研发及使用情况吗?

林晓峰:知乎平台架构团队,采取研发和运维一体的 DevOps 模式;其中容器平台项目组目前的人数是 2.5 人。知乎几乎全部业务和服务(100+)都运行在容器平台(Bay)上,服务器资源申请已经对业务部门关闭。在业务峰值时段,平台整体容器数量会动态扩容到接近万个。

InfoQ:是在怎样的情况下,知乎选择了 Docker?它是否帮你们实现了所有的预期目标呢?为什么知乎认为使用容器方案是“重要决策”?

林晓峰:随着知乎业务的增长和微服务化的演进,越来越迫切的需要解决三个问题:

1. 环境隔离:在物理机时代,由于每个业务依赖的系统环境不同,服务器之间无法通用,服务器负载也各不相同;各个业务都需要独立管理服务器容量,处理服务器故障,对业务开发造成较大负担。
2. 精细资源隔离: 服务隔离要求按照服务接口对进程物理隔离,防止因为某一个接口而影响整体服务的问题,同时也需要根据不同接口的特性,设置不同的进程数、CPU 和内存配置,实现更加精细的资源管理。
3. 资源动态调整: 业务需要快速自动适应流量负载的变化。在负载高峰期快速增加资源,保证业务服务质量;在负载低峰期释放资源给其它服务,提高集群资源利用率。

上述问题抽象出来,其实需要一套高效的资源管理和调度系统

容器技术可以帮助我们实现应用环境的封装隔离以及 CPU、内存等资源限制;结合集群管理方案,能够实现资源的统一调度和动态调整:由此解决上述三个问题。从而实现业务开发人员可以专注开发业务逻辑,而资源调度和管理、负载监控、服务器故障等处理统一交于平台自动处理或者在必要时人工干预。

知乎容器平台(Bay)建设和实践到现在,从最初“邀请”业务迁移到容器平台,到现在业务要求使用容器平台,间接证明容器平台实现了预期目标。总体来说,容器平台有力的支撑了知乎的微服务化和迅速增大的业务规模,已经成为知乎基础架构的重量级组成。

InfoQ:能否介绍下知乎在搭建 Docker 平台架构时,是怎样考虑 Docker 运维模块的?

林晓峰:在搭建 Docker 平台时,我们的一个主要理念是 DevOps,通过这种模式来解决各个层面的运维效率问题。

  1. 对业务用户层面,容器平台明确业务开发能够完成的工作都由业务开发人员来操作,如日常的服务发布、配置变更。通过这种方式,既充分满足业务开发人员操作的便捷性,同时也减轻平台维护人员的日常工作量。
  2. 对平台内部层面,也是通过开发的思路来解决运维问题,即日常的处理尽量自动化完成。 以下面三类情况举例说明:
  • 容器集群扩容:在新服务器安装系统时,会运行 Salt 配置、安装并运行 Docker 相关后台进程和 Mesos-Slave 节点,这样机器就自动加入到了容器集群。
  • 服务运行的容器数量:可以通过预定义的指标实现自动的伸缩,业务流量增长和正常的流量波动无须人工调整资源。
  • 个别容器或者服务器故障:我们认为它是一种日常的、节点级别的“正常现象”,对其进行自动处理,而不是作为异常情况报警等待人工干预。相对的,容器组和集群整体的健康情况才是平台维护人员的关注对象,具体细节可以参考 QCon 北京 2016 知乎关于容器云平台分享的 Slides 和视频。

InfoQ:Docker 的使用都给知乎运维带来了哪些挑战?可否介绍下针对这些挑战,知乎采取了怎样的措施?

张阜兴:总结而言有三大挑战:

  • 容器平台的工作负担加重
  • 系统的整体复杂性增加
  • 某些异常情况出现

首先,原本由业务本身负责的系统运维工作转交给了容器平台(如业务资源变更,物理机异常处理等),加重了容器平台的工作负担。对此知乎的解决方案是:一方面通过设计集群的容错机制,自动处理物理机故障,避免人工响应;另一方面,总结业务通用的需求,例如业务容量的动态调整,开发新的平台功能来满足。

其次,Docker 集群方案引入了一些其他系统组件,如 Consul,HAProxy,Cadvisor,Graphite 等,增加了系统的整体复杂性。同时 Docker 本身还在快速发展,存在各种不稳定因素,相比于成熟的物理机运行环境需要处理的异常更多。为了解决此问题,知乎采用的措施是:针对容器平台的特点,合理使用这些系统组件,简化调用方式,例如在使用 Consul 做服务发现时,使用了 Consul 的 kv 功能来实现实例的批量注册和反注册对于 Docker 自身的问题,一方面借助社区力量修复 BUG,另一方面通过开发一些工具来处理。例如 Docker 网络方案在使用 Iptables 时会存在配置清理失败的情况,我们分析原因后,定制了 Iptables 系统包,避免了这种情况。

最后,随着容器平台集群规模的增大,某些异常情况出现的概率大大增加,某些组件的性能瓶颈逐渐暴露。对此,知乎的解决方案包含三个部分:一是在设计阶段尽量避免性能单点,如 Docker Registry 默认为单机版,我们改用 HDFS 作为其存储后端,实现了 Registry 的分布式水平扩展。二是在预估的集群规模下进行充分的压力测试,例如验证单机能够容纳的容器数以及启动速度;三是监控集群性能,在接近性能瓶颈时及早报警发现。

InfoQ:现有 Docker 几个监控开源方案,比如 Prometheus、Sysdig、cAdvisor,你们有研究或使用过吗?如果有,可否评论下这些开源方案?

张阜兴:在使用容器前,知乎已经有了一套比较完善的监控系统,采用的是 Statsd(采集)+ Graphite(存储)+ Grafana(图表展示)+ Halo(自研报警系统)。这套系统已经能较好的满足知乎业务运维需求,因此容器平台监控主要是采集指标与这些已有的系统进行整合

对于这三个监控开源方案:

  • Prometheus 的指标存储,展示,报警等功能与知乎已有系统重合,整体替换风险较大,所以未做考虑。
  • Sysdig 是一个将各种调试工具集成在一起快速诊断应用行为的方案,但是不适合做常规指标监控使用。
  • 我们采用了 cAdvisor 作为容器指标收集工具,并根据业务需求对 cAdvisor 进行了定制开发,实现了容器指标与已有监控系统的整合。

InfoQ:知乎是如何实现的 Docker 及 Docker 集群的监控呢?

张阜兴:我们使用 cAdvisor 收集容器指标,存入 Graphite,前端使用 Grafana 展示,通过自研报警系统 Halo 发送报警。

具体监控指标分为如下几类:

  1. 业务容器实例监控:容器的 CPU、内存、网络、磁盘;
  2. 业务容器组监控:容器组内容器重启次数,容器组内健康容器比例等指标;
  3. 平台层面监控:Mesos 集群指标,Docker 进程及附属组件状态等监控;
  4. 服务器层面监控:服务器的 CPU、内存、硬盘、网络等指标。

监控的意义在于及早发现问题,要避免和减少监控对服务的影响。作为一个 DevOps 式的平台,应该将合适的监控报警发送至合适的人员,比如业务层面的指标会通知业务开发人员处理;而平台和服务器层面的报警发给平台维护人员,同时还应该设置合适的报警阈值,避免无效报警带来的干扰。

InfoQ:能否说明当一个 Docker 容器服务发生故障时,平台的处理流程?

张阜兴:对于在线调用的 RPC 服务,一个容器发生故障时,服务反向代理 HAPrxoy 会通过健康检查发现该容器故障,并将流量转发到其它容器;同时 Mesos 探测到容器故障后会在服务发现上解注册该容器,并在集群中重新启动该容器:整个过程都是自动完成的。

InfoQ:自动扩容的流程又是怎样的呢?

张阜兴:用户开启了自动扩容功能后,监管进程会定时采集应用容器指标,如 CPU 利用率,根据一定算法设置合适容器数目,进而完成自动扩容或者缩容。在实际应用中,为了避免定时间隔的滞后效应和负载的震荡,一方面我们会控制定时间隔,另一方面我们采用了“快增慢减”的策略,在负载升高时快速的增加容器,在负载降低时缓慢的减少容器。

InfoQ:对于 Docker 日志处理,你们采用的是什么技术栈呢?

张阜兴:Docker 日志处理分为两部分:

  1. 业务日志由进程直接写入 Kafka,其他组件通过订阅 Kafka 实现更丰富的日志处理。例如,使用 Flume 订阅 Kafka,并将日志写入 HDFS 和 ElasticSearch。
  2. 容器的标准输入输出则通过 json 文件写到本地磁盘,从而在进程异常时候,能够通过 Mesos 提供的 url 获取故障信息。Mesos 可以定时帮助我们清除过期容器日志,不用担心磁盘空间占用的问题。

InfoQ:在整个 Docker 平台的实践中,两位有什么感触最深的经验或者建议可以分享给其他的 Docker 使用者们?

林晓峰:Docker 作为一种容器技术,为企业提高产品研发效率和改善基础设施提供了新的思路和方向,应该是作为一个组件融入到企业整体的研发体系中,而不是“革现有研发体系的命”;引入 Docker 让某个解决方案变得优雅,而不是为了 Docker 而 Docker。实践 Docker,应该在充分理解业务需求和现有基础设施后,找到适合自己的 Docker 的使用姿势,这样才能真正让 Docker 技术在企业内落地,并服务于业务,实现 Docker 的价值。

张阜兴:在平台搭建过程中,由于 Docker 本身还在快速发展,不可避免的会存在一些不稳定因素,需要通过上层的容错机制来降低影响

InfoQ:非常谢谢两位接受采访,同时很期待张阜兴在全球容器大会即将带来的分享!


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-07-26 23:059762
用户头像

发布了 58 篇内容, 共 43.9 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

热门实践丨如何结合实际业务进行 ECS 规格选型与容量验证

阿里巴巴云原生

阿里云 云原生 ECS PTS

基于STM32的300W无刷直流电机驱动方案

元器件秋姐

驱动 无刷电机 直流电机 SMT32 FOC

谈谈分布式事务

Monin

分布式事务 微服务 云原生 事务 java 编程

云拨测全面升级丨单次拨测低至 0.001 元

阿里巴巴云原生

阿里云 云原生 可观测 云拨测

NFTScan 成为 Binance NFT 官方 NFT 数据提供商

NFT Research

NFT\ API 接口

protobuf 详解

快乐非自愿限量之名

protobuf

实例讲解看nsenter带你“上帝视角”看网络

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 7 月 PK 榜

wrk - 本地压测工具实操

Monin

高性能 压测 性能调优 #性能测试 wrk

一道经典面试题:BeanFactory 和 FactoryBean 有何区别?

江南一点雨

spring

喜讯!AntDB数据库入围上海信创公共服务平台产品目录

亚信AntDB数据库

数据库 AntDB AntDB数据库

工业物联网协议对比:MQTT Sparkplug vs OPC-UA

EMQ映云科技

mqtt 工业物联网 opc sparkplug

MegEngine 使用小技巧:如何使用 MegCC 进行模型编译

MegEngineBot

深度学习 开源 AI 模型编译器 模型编译器

七月创作之星挑战赛开始咯~

Openlab_cosmoplat

开源 开源社区 创作活动

使用第一性原理思维思考如何打造提高生产力的平台 | 京东云技术团队

京东科技开发者

数字化转型 平台工程 企业号 7 月 PK 榜

科兴未来|2023“直通乌镇” 全球互联网大赛

科兴未来News

一辆没有“刹车”的跑车,你敢开多快?

原点安全

数据资产价值 数据安全管理 贴源保护

小白逆袭研发工程师 ——HDC.Cloud 2023华为云Astro分论坛

华为云PaaS服务小智

云计算 华为云 华为开发者大会2023

全新技术驱动预算管理全面升级

用友BIP

全面预算

从混沌到秩序的蜕变,SRE解码云计算运维奥秘

鲸品堂

云计算 SRE SRE实践 企业号 7 月 PK 榜

那些不用js也能实现的效果

高端章鱼哥

CSS JavaScript html css3

APP流水线测试领域探索与最佳实践 | 京东物流技术团队

京东科技开发者

测试 app测试 app自动化测试 企业号 7 月 PK 榜

一文搞懂Git,掌握日常命令和基本操作

互联网工科生

git 知识

Arthas深入学习

Monin

华为云GaussDB亮相2023可信数据库发展大会,荣获三项评测证书!

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

Pytorch: autograd与逻辑回归的实现

timerring

人工智能

网易三个S级项目制作人,为什么选择在这个渠道“爆料”?

最新动态

Python案例分析|科学计算和数据分析 | 社区征文

TiAmo

Python 数据分析 科学计算 年中技术盘点

CST电磁仿真软件配置的CPU、内存、显卡显存越大越好吗?

思茂信息

cst cst使用教程 cst操作 cst电磁仿真 cst仿真软件

从Docker运维看知乎容器平台的优雅整合_语言 & 开发_木环_InfoQ精选文章