Docker mesos在生产环境的应用

我们是一家做生鲜电商的公司,从系统搭建初期,我们就采用微服务的架构,基于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集群

    ETCD_AUTHORITY=10.10.195.193:2379

    export ETCD_AUTHORITY

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

    ./calicoctl node –libnetwork –ip=10.10.3.210

  • 增加可用的地址池ip pool

    ./calicoctl pool add 10.4.10.0/24 –nat-outgoing

    ./calicoctl pool show

  • 创建网络

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

    docker network create -d calico –ipam-driver calico –subnet=10.4.10.0/24 online_net

  • 启动容器,网络指定刚才创建的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容器集群需要和它们打通,做服务和数据的访问交互。那么只需要在物理机(虚拟机)上把当前节点加入容器网络集群即可

ETCD_AUTHORITY=10.10.195.193:2379

export ETCD_AUTHORITY

./calicoctl node –ip=10.10.16.201

服务自注册和发现

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提供的参数来设置自己想要的重启策略:

“upgradeStrategy”:{ “minimumHealthCapacity”: N1, “maximumOverCapacity”: N2 }

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

"healthChecks": [{
                "protocol": "COMMAND",
                 "command":{
                 "value":"sh /data/soft/healthcheck.sh  app  10.10.195.193"
                 },
                "gracePeriodSeconds": 90,
                "intervalSeconds": 60,
                "timeoutSeconds": 50,
                "maxConsecutiveFailures": 3
        }]

healthcheck.sh通过负载均衡调用HealthMonitor来获取应用实例的监控状态,

HealthMonitor是我们的健康检查中心,可以获取应用实例的整个拓扑信息。

容器监控、日志

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

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

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

时间: 2024-10-13 23:27:30

Docker mesos在生产环境的应用的相关文章

docker应用到生产环境的前提

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

Docker适合生产环境了吗?

之所以称为生产环境就是因为它可以为企业创造利润.所以答案非常清晰:视情况而定. Docker.是现今最前沿的科技. 同时,它也是近10年最具挑战性的技术,原因在于它革新了软件开发.运维.系统架构.测试以及常规做法. Dokcer至今才诞生仅两年时间.你会用一个仅发展两年左右的数据库技术吗?亦或是一个操作系统?向前兼容性很差,升级会造成对先前软件的不兼容,这是Docker存在的问题,但请不要因这个事实丧失尝试的勇气. 同时,也还有一些大的碎片问题围绕在持续部署,网络及认证管理上.对于生产环境而言,

Docker在生产环境中的应用--开篇

Docker是什么?(官方定义)Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的.可移植的.自给自足的容器,开发者在笔记本上编译测试通过的容器,可以批量地在生产环境中部署,包括VMS(虚拟机).bare metal.OpenStack集群和其它应用平台. Docker通常应用到以下几种场景: 1.web应用的自动化打包和发布: 2.自动化测试和集成.发布: 3.在服务型环境中部署和调整数据库或其它的后台应用: 4.从头编译或者扩展现有的OpenShift或Cloud Found

中小企业可以用docker来标准化开发、测试、生产环境

一.使用 Docker 搭建 Tomcat 运行环境 1 Docker与虚拟机 2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统,具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核: # uname -r 2.2 安装Docker # yum install docker 可使用以下命令,查看 Docker 是否安装成功: # docker version 若输出了 Docker 的版本号,则说明安装成功了,可通过以

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环

docker技术剖析--中小企业可以用docker来标准化开发、测试、生产环境

一.使用 Docker 搭建 Tomcat 运行环境 1 Docker与虚拟机 2 搭建过程 2.1 准备宿主系统 准备一个 CentOS 7操作系统,具体要求如下: 必须是 64 位操作系统 建议内核在 3.8 以上 通过以下命令查看您的 CentOS 内核:   # uname -r 2.2 安装Docker   # yum install docker 可使用以下命令,查看 Docker 是否安装成功:   # docker version 若输出了 Docker 的版本号,则说明安装成功

在生产环境使用Docker部署应用

导读 Docker现在越来越流行,但是真正在生产环境部署Docker还是个比较新的概念,还没有一个标准的流程.作者是ROR的程序员,作者结合平时的部署经验,联系Docker的特点,向大家分享了其在生产环境使用Docker部署应用程序的一个实践. Docker是现在开发应用程序的不错选择:因为对于一个研发组来说,部署一个应用再也不用像以前那样繁琐的修改.设置配置文件了:因为对于Docker来说它“屏蔽”了应用程序的运行环境,不管你使用Mac.Linux还是Windows都能用相同的方式运行. 但是

Docker标准化开发测试和生产环境

对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资源小,在一台 E5 128 G 内存的服务器上部署 100 个容器都绰绰有余,可以单独抽一个容器或者直接在宿主物理主机上部署 samba,利用 samba 的 home 分享方案将每个用户的 home 目录映射到开发中心和测试部门的 Windows 机器上. 针对某个项目组,由架构师搭建好一个标准的

Docker生产环境配置——设置direct-lvm模式

CentOS/RHEL 的用户需要注意的事项 来源:https://yeasy.gitbooks.io/docker_practice/image/rm.html 在 Ubuntu/Debian 上有 UnionFS 可以使用,如 aufs 或者 overlay2,而 CentOS 和 RHEL 的内核中没有相关驱动.因此对于这类系统,一般使用 devicemapper 驱动利用 LVM 的一些机制来模拟分层存储.这样的做法除了性能比较差外,稳定性一般也不好,而且配置相对复杂.Docker 安装