暴走漫画基于阿里云的全面容器化架构实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在做云上容器给业务架构带来的变化(微服务),开发过程带来的变化(DevOps),运维领域带来的变化(集群调度,比如K8s,Messos,Swarm等)选题之前,先看看这篇来自用户的实践分享。

【编者按】如果盘点今年技术热点,NO.1的肯定是Docker。业内比较流行的观点是容器技术之争已经通过Docker完胜而暂时告一段落,现在争的是容器的编排和调度。云栖社区在盘点6-7月份重点技术选题时,圈定了三个方向:云上容器给业务架构带来的变化(微服务),开发过程带来的变化(DevOps),运维领域带来的变化(集群调度,比如K8s,Messos,Swarm等)而在启动之时,恰好看到国内Docker公众号的一篇文章,《暴走漫画基于公有云的全面容器化架构实践》,基于阿里云,从实践角度的经验分享。很有感触,获得授权后分享给大家。也欢迎大家提供对于Docker领域的在线培训的建议,我们将在7月推出系列。


标题有所修改。


很高兴能和大家分享一些暴走漫画基于公有云的容器化架构的实践经验。


基于之前在暴漫的经验,我到了扇贝以后,大概用了一个月的时间,就将扇贝的产品成功迁移到了容器环境中,并做了很多改进,也有了更多的思考。

暴走漫画(以下简称”暴漫”)相信大家都不陌生,它应该算一个互联网应用。先简单介绍一下背景:暴漫主要做App和网站,后端主要是Ruby,也有一些Python、Scala的异构化系统。整体架构是标准的互联网应用架构。包括负载均衡、Nginx、应用服务器、数据库(MySQL),等等。这里暂时讲不到资源编排和调度(Mesos/Kubernetes)。

就在去年(2015)暴漫在推进容器。这当中一直在考虑的事情就是怎样更好的将容器为我们所用。原来暴漫的所有东西都是跑在云主机(Ucloud)上,环境也是零散的脚本拼凑起来的,经过了大概一年的摸索和实践,现在基本上所有的东西都实现了容器化。

这里简单提一下暴漫和扇贝的情况:1. 产品差别很大;2. 公司风格差别也很大,暴漫很轻松,扇贝则相反;3. 技术栈,暴漫后端主要为Ruby、Ucloud,扇贝是Python、阿里云;暴漫老板非技术出身,扇贝老板则是技术出身;4. 规模相差不大,暴漫6~70人,扇贝4~50人,服务器百台左右,都没有专业运维。

Consul简介

原来在暴漫用的是etcd,之后在扇贝换成了Consul。两者之间的特性和核心功能是一样的,为什么换成Consul呢?因为Consul在核心功能的基础上提供了三个非常重要的特性。etc要找对应的第三方的组件配合搭建,Consul已经直接包含了。1. 服务发现;2. Failure Detection;3. DNS;我觉得这三个特性很适合我们公有云用容器的场景。比如:启动ES的一个节点,往Consul服务器上发送一个http request,然后用DNS查询就能发现此节点。这样就可以提供高可用的ES服务。传统做法你需要维护一个节点列表,客户端随机往此列表发请求,或者在前面加HAProxy随机发请求,如果用Consul服务发现和DNS做负载均衡就简单多了:ES的集群每个节点都向Consul注册服务,利用DNS查询,Consul可以动态的改变节点在结果中的顺序,每次取到的节点都是随机的。

Failure Detection可以监控每个节点的健康情况,自动踢出DNS列表中挂掉的节点。

Consul支持多数据中心,我们实际应用中将生产环境和开发环境分离到了两个不同的数据中心中。

Docker简介

首先将容器和VM做一个对比:Docker是一个进程级别的包装,VM是一个环境的虚拟,这里用一个故事来比喻可能更形象一些:从前有一个国王,特别喜欢踩在牛皮上走路,不喜欢踩在地上。当时有两个大臣提了两个方案:一个大臣说给全国的路都铺上牛皮,这样不管走在哪里都是踩在牛皮上了;另一个大臣则说给国王做牛皮靴,只要穿着牛皮靴,走到哪儿都是踩在牛皮上。这刚好说明了VM和Docker在思路上的本质区别:VM是铺路,Docker则是牛皮靴

关于为什么用了云主机后还要上Docker,好处相信大家都知道:1. 对开发更友好,且保证了各环境的一致性;2. 环境的快速部署,避免了重复劳动和升级的麻烦;3. 节省资源,将一些不常用的服务跑在一台VM上而不是单独跑在几台VM上。

Service Distribution Workflow

现在总结一下:Consul用来做服务发现,负载均衡,Docker用来封装服务,我们内部所有的服务,从开发到运行都会经历三个步骤:1. build images,开发生产用的同一个image;2. upload,将build好的images上传;3. 在不同的VM上把服务跑起来,其中又分为三个小步骤:第一步从Consul拉取配置,第二步创建对应的容器,第三步就是向Consul注册服务了。

说到服务,通常书本上都喜欢把服务分为有状态服务和无状态服务,但我们是根据容器的重启方式来划分:一般服务和gracefully reload。容器重启可以先结束之前的容器再启一个新的,另一种则不能stop,暴漫和扇贝的日活还是很大的,如果stop一个节点或者该节点出了问题,会导致其它节点负载急剧增大,平均响应时间从一百多毫秒上升到七八百毫秒。

第一种操作很简单,通过Consul可以得到现在已有的节点信息,通过发送http request来检查节点是否活着;对于第二种不能随便重启的服务,我们直接通过docker kill而不是docker stop/run来重启,也就是给docker container主进程发不同的信号,这里用uWSGI举例:它提供了一种机制,你给它发不同的信号会有不同的反应,你发送HUP信号,它都会执行一次reload,过程大概是这样:uWSGI有一个主进程master,master不处理任何请求,它会fork出若干的worker进程,worker的个数可以自定义,我们以5个为例,如果发HUP给master,让master reload,master会先创建5个子进程,我们称之为新worker进程,等子进程创建完了以后,master会检查老的worker还有没有请求在处理,等待所有请求处理完就kill掉老的worker,没有请求的直接kill掉,reload以后的请求都转给新的worker处理,所以这是一个平滑的重启过程。除了信号之外,其次就是代码的更新。重启的目的就是为了更新的代码。在这种服务类型的容器中,我们的代码是通过mount数据卷来做的,image只有基础环境。比如:Python环境要一些数值计算的库,代码在数据卷上更新,更新完以后就去调这个函数,然后给它发HUP,重启以后运行的就是更新后的代码。

Web系统的架构

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

图为我们现在的架构。蓝色的部分都是放在Docker里的,灰色的部分跑在云主机VM上,黄色的部分是云服务商提供。从左往右看的话,所有的东西都是基于Docker,当然还有Consul。我们在注册服务和服务检查的时候都是和本地的Consul打交道,整个架构都是分布式的,就不存在一个Consul挂掉导致整个系统瘫痪的问题。Consul提供三个最主要的功能。比如Nginx到APP,APP到redis,App到MySQL都是通过DNS,不通过IP。

就我们现有的架构和Mesos/Kubernetes做了一个简单的类比,因为我们基于阿里云,我们不需要关心资源的计划、计算等。考虑到现有团队规模,水平、技能点等各种重要因素,觉得那一套并不适合我们。我们用的human schedule,基于阿里云的API资源的分配、Ansible/Scripts自动化、Consul负载均衡、Docker环境封装等。

最后强调一点:不管你怎么设计你的架构,怎么设计你的系统,我们现在还很难做到完全不用人去运维。而且在后续的升级、后续的重构、后续的改进当中都是需要人去做的。所以你选用什么样的架构,一定要先考虑到你们的团队,现有的构成,你们的预算,团队现有的水平也好,人数也好,技能点的分布也好,这些东西都是非常重要的,只有充分考虑到这些以后,你再去选对应的架构。我觉得我们现在这一套就适合几十人,可能100人以内还可以应付,如果技术团队哪天爆发到两三百人,这一套估计就不适合了,这个就是充分考虑到团队的,我们也没有专业的运维,就是开发在做运维,所以我们也尽可能希望我们的运维工作可编程化,所以我们会上Docker,会上这些工具。而且Docker+Consul已经足够了。

本文转载自Docker公众号张童根据2016年1月24日@Container容器技术大会·北京站上丁彦的演讲《暴走漫画基于公有云的全面容器化架构实践》整理而成。

目录
相关文章
|
29天前
|
SQL 存储 API
阿里云实时计算Flink的产品化思考与实践【下】
本文整理自阿里云高级产品专家黄鹏程和阿里云技术专家陈婧敏在 FFA 2023 平台建设专场中的分享。
110805 100
阿里云实时计算Flink的产品化思考与实践【下】
|
16天前
|
Kubernetes 安全 Java
构建高效微服务架构:从理论到实践
【4月更文挑战第9天】 在当今快速迭代与竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性及容错性,成为众多企业转型的首选。本文将深入探讨如何从零开始构建一个高效的微服务系统,覆盖从概念理解、设计原则、技术选型到部署维护的各个阶段。通过实际案例分析与最佳实践分享,旨在为后端工程师提供一套全面的微服务构建指南,帮助读者在面对复杂系统设计时能够做出明智的决策,并提升系统的可靠性与维护效率。
|
1天前
|
消息中间件 持续交付 数据库
构建高效可靠的微服务架构:策略与实践
【4月更文挑战第25天】 随着现代软件开发的复杂性日益增加,传统的单体应用已难以满足快速迭代和灵活部署的需求。本文深入探讨了如何构建一个高效且可靠的微服务架构,包括关键的设计原则、技术选型以及实践中的挑战和应对策略。通过分析多个成功案例,我们总结了一系列最佳实践,并提出了一套可量化的性能优化方法。文章不仅为开发者提供了具体的技术指导,同时也强调了团队协作和持续学习在微服务转型过程中的重要性。
|
9天前
|
消息中间件 运维 监控
现代化软件开发中的微服务架构设计与实践
本文将深入探讨现代化软件开发中微服务架构的设计原则和实践经验。通过分析微服务架构的优势、挑战以及常见的设计模式,结合实际案例,帮助开发者更好地理解如何构建可靠、可扩展、高效的微服务系统。
|
9天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
10天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
15 1
|
10天前
|
人工智能 Serverless 数据处理
利用阿里云函数计算实现 Serverless 架构的应用
阿里云函数计算是事件驱动的Serverless服务,免服务器管理,自动扩展资源。它降低了基础设施成本,提高了开发效率,支持Web应用、数据处理、AI和定时任务等多种场景。通过实例展示了如何用Python实现图片压缩应用,通过OSS触发函数自动执行。阿里云函数计算在云计算时代助力企业实现快速迭代和高效运营。
46 0
|
11天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
13天前
|
运维 Devops 持续交付
构建高效稳定的云基础设施:DevOps与容器化技术融合实践
【4月更文挑战第13天】 在当今快速迭代和持续部署的软件开发环境中,传统的IT运维模式已难以满足业务发展的需求。本文聚焦于如何通过融合DevOps理念与容器化技术,构建一个高效、稳定且易于管理的云基础设施。文章将探讨持续集成/持续交付(CI/CD)流程的优化、容器化技术的最佳实践、以及微服务架构下的应用管理,以期为企业提供一种改进运维效率、加速产品上市时间,同时保障系统稳定性的解决方案。
|
13天前
|
Linux 数据安全/隐私保护
Linux基础与服务器架构综合小实践
【4月更文挑战第9天】Linux基础与服务器架构综合小实践
1242 8