写点什么

从 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:059797
用户头像

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

关注

评论

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

彻底告别传统FTP,新的替代FTP产品比你想象的好的多

镭速

传输协议 FTP传输替代方案

跨网传输文件时,如何通过日志记录来审计追溯?

镭速

跨网文件传输

HarmonyOS使用多线程并发能力开发

HarmonyOS开发者

HarmonyOS

WorkPlus私有化部署IM即时通讯平台,构建高效安全的局域网办公环境

WorkPlus

Redis类型(Type)与编码(Encoding)

Java随想录

redis

上新啦!腾讯云云原生数据湖产品DLC 2.2.5版本发布,来看特性详解

腾讯云大数据

数据湖

rabbitMQ到底是个啥东西?

程序员万金游

Java 开发 #java Rabbit MQ

使用Optional优雅避免空指针异常

Java随想录

Java 异常

华为智慧屏,吹尽狂沙始到金

脑极体

AI智慧屏

华为云耀云服务器L实例:带你探索轻量应用服务器的魅力

YG科技

从技术创新到应用实践,百度智能云发起大模型平台应用开发挑战赛!

不叫猫先生

百度智能云 千帆大模型平台

Github上线即遭狂转!上百人通过这份算法手抄本成功上岸字节

程序员万金游

#java java 架构 #算法 #数据结构 #java编程

Java训练营毕业总结

jjn0703

IoTDB 在国际数据库性能测试排行榜中位居第一?测试环境复现与流程详解第一弹!

Apache IoTDB

腾讯Java后端社招三面,差点就挂了!

程序员小毕

Java 程序员 面试 程序人生 架构师

企业内部通讯,WorkPlus助您打造高效沟通平台

WorkPlus

Redis内存碎片:深度解析与优化策略

Java随想录

Java redis

火山引擎边缘云:数智化项目管理助力下的业务增长引擎

火山引擎边缘云

数字化 飞书 数智化 #项目管理

为什么要使用zookeeper

Jerry Tse

zookeeper 分布式锁 分布式系统 共识算法 数据强一致性

活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术

墨天轮

MySQL 数据库 oracle postgresql zabbix

Generative AI 新世界 | 扩散模型原理的代码实践之采样篇

亚马逊云科技 (Amazon Web Services)

机器学习 #人工智能 生成式人工智能 Amazon SageMaker 大语言模型

华为阅读“鲁迅专栏”已上线,读国内名家作品就上华为阅读

最新动态

Python 中的数字类型与转换技巧

小万哥

Python 程序员 软件 后端 开发

用友系列之 YonBuilder 低代码平台概论和基本使用

YonBuilder低代码开发平台

低代码 可视化

WorkPlus Meet 视频会议,自主可控,支持私有化部署

WorkPlus

TinyEngine 低代码引擎到底是什么?

英勇无比的消炎药

开源 前端 低代码

大道总是孤独的——查理芒格如是说

少油少糖八分饱

投资 长期主义 能力圈 查理芒格 股东大会

开启 Kerberos 安全认证的大数据环境中如何正确指定 HS2 的 jdbc url 地址?

明哥的IT随笔

大数据 hive kerberos

ICCV 2023|小红书 4 篇入选论文亮点解读,「开集视频目标分割」获得 Oral

小红书技术REDtech

算法 ICCV

福利贴|这是一个程序员不看一定会后悔的问题

Zilliz

非结构化数据 Milvus Zilliz 向量数据库

close()关闭文件方法

芯动大师

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