我们是一家做生鲜电商的公司,从系统搭建初期,我们就采用微服务的架构,基于DevOps体系来不断提高我们的交付的质量和效率, 随着业务和团队规模的发展,服务逐渐进行拆分,服务之间的交互越来越复杂,目前整个微服务已经近几十个应用模块, 整体架构上包括负载均衡、API网关、基于Dubbo的微服务模块、缓存、队列、数据库等,目前整个集群的资源利用率也没有一个合理的规划评估,虚拟机上部署多个应用服务隔离性也存在问题,考虑到越来越多门店以及第三方流量的接入,需要考虑系统的快速的伸缩能力,而基于统一资源管理的Docker容器技术在这些方面有一些天然的优势,并且和微服务架构、DevOps体系完美衔接。

经过调研和对比,最终我们采用Mesos作为底层资源的管理和调度,Marathon作为Docker执行的框架,配合ZooKeeper、Consul、Nginx作为服务注册发现。目前已经有部分的核心业务已经平稳的运行在基于Docker容器的Mesos资源管理平台上。

实现的主要功能特性

  • 平滑与虚拟机集群共存,容器独立IP,跨主机和遗留系统互通

  • 实现无缝发布(滚动发布),发布过程不影响在线业务,平滑升级

  • 应用健康检查,快速扩容,升级,回退

  • 服务自动注册和发现,负载均衡

逻辑架构

部署架构

在发布流程中,在发布上线之前的环节是预发布,预发布环境验证完成后进行打包,生成Docker镜像和基于虚拟机部署的应用部署包,push到各自对应的仓库中,并打Tag。

生产环境发布过程中,同时发布到Mesos集群和原有的虚拟机集群上,两套集群网络是打通的。

网络架构

在网络架构选型时,会考虑一下几个原则:

  1. 一容器一IP

  2. 多主机容器互联,主机和容器互联

  3. 网络隔离、细粒度的ACL

  4. 性能损耗低

docker bridge使用默认的docker0网桥,容器有独立的网络命名空间,跨主机的容器通信需要做端口NAT映射;Host的方式采用和宿主机一样的网络命名空间,网络无法做隔离,等等这些方式有非常多的端口争用限制,效率也较低。

Docker Overlay的方式,可以解决跨主机的通信,现有二层或三层网络之上再构建起来一个独立的网络,这个网络通常会有自己独立的IP地址空间、交换或者路由的实现。

Docker在1.9中libnetwork团队提供了multi-host网络功能,能完成Overlay网络,主要有隧道和路由两种方式, 隧道原理是对基础的网络协议进行封包,代表是Flannel。

另外一种是在宿主机中实现路由配置实现跨宿主机的容器之间的通信,比如Calico。

Calico是基于大三层的BGP协议路由方案,没有使用封包的隧道,没有NAT,性能的损耗很小,支持安全隔离防护,支持很细致的ACL控制,对混合云亲和度比较高。经过综合对比考虑,我们采用calico来实现跨宿主机的网络通讯。

安装好ETCD集群,通过负载均衡VIP方式(LVS+keepalived)来访问ETCD集群。

构建Calico网络集群,增加当前节点到集群中,Calico 节点启动后会查询 Etcd,和其他 Calico 节点使用 BGP 协议建立连接。

增加可用的地址池ip pool

创建网络,通过Calico IPAM插件(Driver(包括IPAM)负责一个Network的管理,包括资源分配和回收),-d指定驱动类型为Calico,创建一个online_net的driver为Calico的网络:

启动容器,网络指定刚才创建的online_net,容器启动时,劫持相关 Docker API,进行网络初始化。 查询 Etcd 自动分配一个可用 IP,创建一对veth接口用于容器和主机间通讯,设置好容器内的 IP 后,打开 IP 转发,在主机路由表添加指向此接口的路由,宿主机10.10.3.210的路由表:

宿主机10.10.50.145的路由表:

容器包发送包的路由过程如上图,宿主机10.10.3.210上的容器IP 10.4.10.64通过路由表发送数据包给另外一个宿主机10.10.50.145的容器10.4.10.55。

对于有状态的数据库,缓存等还是用物理机(虚拟机),来的应用集群用的是虚拟机,Docker容器集群需要和它们打通,做服务和数据的访问交互。那么只需要在物理机(虚拟机)上把当前节点加入容器网络集群即可:

服务自注册和发现

API网关提供统一的API访问入口,分为两层,第一层提供统一的路由、流控、安全鉴权、WAF、灰度功能发布等功能,第二层是Web应用层,通过调用Dubbo服务来实现服务的编排,对外提供网关的编排服务功能,屏蔽业务服务接口的变更;为了能够快速无缝的实现web层快速接入和扩容,我们用Consul作为服务注册中心实现Web服务的自动注册和发现。

对于Web服务注册,我们自己实现了Register,调用Consul的API进行注册,并通过TTL机制,定期进行心跳汇报应用的健康状态。

对于Web服务的发现,我们基于Netflix Zuul进行了扩展和改造,路由方面整合Consul的发现机制,并增加了基于域名进行路由的方式,对路由的配置功能进行了增强,实现配置的动态reload功能。API网关启动定时任务,通过Consul API获取Web服务实例的健康状态,更新本地的路由缓存,实现动态路由功能。

平台的微服务框架是基于Dubbo RPC实现的,而Dubbo依赖ZooKeeper做服务的发现和注册。

Consul在Mesos Docker集群的部署方案:

不建议把Consul Agent都和Container应用打包成一个镜像,因此Consul Agent部署在每个Mesos Slave宿主机上,那么Container如何获取宿主机的IP地址来进行服务的注册和注销,容器启动过程中,默认情况下,会把当前宿主机IP作为环境变量传递到Container中,这样容器应用的Register模块就可以获取Consul代理的IP,调用Consul的API进行服务的注册和卸载。

在日常应用发布中,需要保障发布过程对在线业务没有影响,做到无缝滚动的发布,那么在停止应用时应通知到路由,进行流量切换。

docker stop命令在执行的时候,会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行,如果等待时间达到设定的超时时间,或者默认的10秒,会继续发送SIGKILL的系统信号强行kill掉进程。这样我们可以让程序在接收到SIGTERM信号后,有一定的时间处理、保存程序执行现场,优雅的退出程序,我们在应用的启动脚本中实现一段脚本来实现信号的接受和处理, 接收到信号后,找到应用的PID,做应用进程的平滑kill。见上面图中的脚本。

应用的无缝滚动发布、宕机恢复

Marathon为运行中的应用提供了灵活的重启策略。当应用只有一个实例在运行,这时候重启的话,默认情况下Marathon会新起一个实例,在新实例重启完成之后,才会停掉原有实例,从而实现平滑的重启,满足应用无缝滚动发布的要求。

当然,可以通过Marathon提供的参数来设置自己想要的重启策略:

如何判断新的实例是否启动完成可以提供服务,或者当前容器的应用实例是否健康,是否实例已经不可用了需要恢复,Marathon提供了healthchecks健康监测模块

healthcheck.sh通过负载均衡调用HealthMonitor来获取应用实例的监控状态, HealthMonitor是我们的健康检查中心,可以获取应用实例的整个拓扑信息。

容器监控、日志

下图是我们的整体平台监控的体系架构。

监控平台涵盖了系统各个层面的指标体系,这块后续单独列章节详细介绍。

对于容器的监控,由于我们是采用Mesos Docker的容器资源管理的架构,因此采用mesos-exporter+Prometheus+Grafana的监控方案,mesos-exporter的特点是可以采集 task 的监控数据,可以从task的角度来了解资源的使用情况,而不是一个一个没有关联关系的容器。mesos-exporter导出Mesos集群的监控数据到Prometheus,Prometheus是一套监控报警、时序数据库组合,提供了非常强大存储和多维度的查询,数据的展现统一采用Grafana。

看完本文有收获?请转发分享给更多人


欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群


Docker Mesos在生产环境的应用相关推荐

  1. docker应用到生产环境的前提

    如果Docker出现不可控风险,是否考虑了其它的解决方案 是否需要对Docker容器做资源限制,以及如何限制,如CPU,内存,网络,磁盘等 公司内部私有仓库的管理,镜像的管理问题是否解决 跨主机容器互 ...

  2. 使用Docker快速搭建生产环境

    Docker安装 CentOS 6.5: yum install -y docker-io service docker start 下载镜像 配置使用国内镜像:修改Docker配置文件/etc/de ...

  3. Docker生产环境技术栈有哪些

    导语   生产环境的Docker设置包括的内容有一些基本的架构组件,这些组件对于运行容器话服务器以及传统服务器集群都是通用的,在很多的时候可以简单认为构建和运行容器的方式与构建和运行虚拟机的方式是一样 ...

  4. Docker生产环境实践指南

    技术栈: 1. 构建系统 2. 镜像仓库 3. 宿主机管理 4. 配置管理 5. 部署 6. 编排 7. 日志 8. 监控 镜像: 1. 如果用户像往常一样运行包安装命令,这些永远也用不上的缓存包文件 ...

  5. 生产环境运行Docker的9个关键决策

    本文讲的是生产环境运行Docker的9个关键决策,[编者的话]生产环境运行Docker并没有想象的那么简单,如何实现稳定安全的部署和扩容? 又有哪些需要考虑的关键决策? 本文就此做了一些分析和阐述,赶 ...

  6. Docker学习文档之三 其他相关-生产环境

    ###测试环境部署和生产环境的部署 在测试完成之后,按照上面的步骤将容器打成对应版本的镜像,然后在生产环境中应该这个镜像,基本上这两个环境进行的内容基本上是一致的,所以很少存在测试环境没问题,部署到生 ...

  7. 如何在开发和生产环境中使用 Docker 容器化 Golang 应用

    你是否想写一个使用 Docker 容器化的 Golang 应用程序?本文的目的就是帮助你快速将你的 Golang 应用程序容器化,以用于 开发 (带热加载)和 生产 目的. 开始之前 请先安装 Doc ...

  8. Docker 生产环境之使用可信镜像 - 在内容信任(content trust)沙盒中演示

    原文地址 本页面介绍了如何设置和使用沙盒(sandbox)进行信任实验.沙盒允许你在本地配置和尝试信任操作,而不会影响生产镜像. 在开始这个沙盒实验之前,应该仔细阅读 信任概述. 1. 先决条件 这些 ...

  9. [转帖]生产环境(基于docker)故障排除? 有感于博客园三番五次翻车

    生产环境(基于docker)故障排除? 有感于博客园三番五次翻车 https://www.cnblogs.com/JulianHuang/archive/2019/08/19/11365593.htm ...

  10. 生产环境(基于docker)故障排除? 有感于博客园三番五次翻车

    前言 如题,有感于博客园最近多次翻车,感觉像胡子眉毛一把抓, 定位不了生产环境的问题. 抛开流程问题,思考在生产环境中如何做故障排除, 发现博客园里面这方面的文章比较少. .Net 本身是提供了sos ...

最新文章

  1. 什么?神经网络还能求解高级数学方程?
  2. 【Java】LeetCode 20 有效的括号 (运用数据结构:栈 解题)
  3. 控制信号(单脉冲信号)的跨时钟域传输问题
  4. python extractor_Python pyextractor包_程序模块 - PyPI - Python中文网
  5. Mikrotik RouterOS 日常问题解析 ROS 5.4下载
  6. linux环境特性的文件夹,在Linux环境下如何消减可执行文件或者动态库的大小
  7. java 如何秒速写一个线程启动
  8. c语言模拟计算机程序阶乘,辽宁省计算机二级(C语言)模拟试卷B(无答案).doc
  9. k近邻算法 r语言_推荐 :R语言中K邻近算法的初学者指南(从菜鸟到大神-附代码&链接)...
  10. 游戏充值平台系统PHP,游戏支付平台源码+游戏充值平台+第3方支付平台源码+游戏网关支付接口...
  11. FFmpeg使用教程
  12. html下拉折叠菜单,纯CSS实现折叠菜单下拉菜单
  13. 绘制业务流程图—入门篇
  14. matlab 524288,Cannot display summaries of variables with more than 524288 elements. 怎么...
  15. FT-TRN-BEG-C安装教程及问题解决
  16. java毕业设计多少钱?不如自己尝试做一下
  17. 算法设计与分析基础知识点
  18. 在 MaCA 根目录运行所有 py 文件
  19. Docker教程(1)Docker 入门
  20. HTML5七夕情人节表白网页制作【纯HTML+CSS实现3D动态相册-蓝色海洋 】HTML+CSS+JavaScript

热门文章

  1. 值得关注:Ubuntu 14.04服务器版提供了虚拟化、自动化、存储相关更新
  2. Linux c学习--进程基础学习
  3. Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题
  4. Linux管理员常用网络资源(收集帖)
  5. UMl user guide读书笔记
  6. 「leetcode」617. 合并二叉树:【三种递归】【一种迭代】详解
  7. poj 1962 Corporative Network 并查集,很容易超时,大家要注意合并
  8. 在苹果Mac上找不到文件存储位置怎么办?
  9. Movavi Video Editor如何添加影片慢动作效果
  10. nginx安装lua/replace-filter-nginx-module