title: 基于docker的云解决方案
date: 2015-12-16 21:52:17

show: hide

基于docker的云解决方案

版本 时间 作者 修订章节 修订内容
1.0 2015-12-16 秋波 全部 init
1.1 2016-01-28 秋波 5.8 增加网络部分

1. 应用

1.1 yiji-boot应用

应用切换到yiji-boot后,会提供如下能力:

以上能力还不够,我们后面会结合业界的最佳实践(比如spring cloud),完善yiji-boot。对于基于yiji-boot开发的应用来说,这些非功能性需求能力会随着yiji-boot的升级,能力一步一步增强。

1.2 非yiji-boot应用

很不幸,这个世界总有不完美的地方。某些应用可能因为一些限制,很难切换到yiji-boot上,这些应用没有上面谈到的yiji-boot的能力,但是我们要求应用必须遵循各种规范,规范也是契约,通过契约,我们来实现统一的监控、健康检查、日志收集。

2. 轻量级虚拟化-docker

docker提供了轻量级的、基于内核虚拟化的、高性能解决方案,运行视图称之为容器,它表现为linux上的一个进程,它通过cgroupsnamespaceunionfs实现了资源隔离。

docker镜像是容器的静态视角,镜像是程序、数据和及其所依赖的程序的集合。我们把应用build成一个docker镜像,镜像是自包含,通过一条命令把docker镜像run起来。

对于yiji-boot应用和非yiji-boot应用,构建docker镜像后,我们有了统一应用的启动、停止操作。

3. 集群-kubernetes

kubernetes是google开源的应用集群管理工具,我们使用它来管理docker容器。它吸收了borg的优秀理念.在google内部,借助于borg

We launch over 2 billion containers per week.

针对集群面临的问题,我们一一列举解决方案:

3.1 资源调度

集群核心的问题是资源调度。我们对应用进行分类并描述应用所需要的资源(比如cpu、内存),kubernetes会根据应用资源需求,并去对各个物理节点上的资源打分,选取合适的资源来运行应用。

通过metricshealthcheckwatcher提供的能力,我们在资源调度策略上能做到自动化水平扩展

3.2 请求路由

应用要对外提供服务,需要把用户的请求路由到对应的服务器。

3.2.1 入口系统

对于入口系统,我们应用前面会有nginxnginx来实现负载均衡和请求分发。(下图省略某些中间环节)

                    ---->web
browser->dns->ngnix-|
                    ---->web

通过kubernetes提供的services,我们的拓扑会调整为如下的结构:

                                              ---->web
browser->dns->ngnix(L4/L7)->dns->kub services-|
                                              ---->web

kubernetes会提供服务注册、服务发现、服务路由的能力,并通过健康检查实现动态请求调度。(kubernetes services的高可用和性能需要评估,如不满足,可以用固定ip的方式玩)

3.2.2 内部系统

目前我们内部系统使用了dubbo,dubbo自带服务注册,服务发现,服务路由能力。借助kubernetes的replication controller,控制应用副本数量。

3.3 应用优雅停机

当dubbo服务关闭时,会通知服务调用方,不要发送新的请求过来,服务把请求处理完毕并返回后才关闭应用。我们设置应用停机超时时长为3分钟,对于超时的应用,保留应用现场dump(系统层面和jvm层面,并持久化到物理机文件系统),杀死应用。通过应用现场dump数据,我们可以分析应用的问题。

对于入口系统,通过kubernetes提供的钩子,同样提供应用优雅停机的实现。

3.4 服务平滑升级

通过kubernetes提供的rolling update能力,实现多个应用逐步发布。

3.5 日志搜索

应用都在kubernetes集群内,看日志是个大问题。我们通过elk,把所有日志收集起来,为开发同学提供统一的查询视图。

3.6 应用状态监控

通过metricshealthcheckwatcher,我们暴露了容器的系统运行状态、组件运行状态、健康状态,我们会把这些数据实时收集起来,为应用自动动态水平扩容垂直扩容提供依据,为开发同学提供统一的状态视图。

3.7 业务监控

通过收集所有的业务日志,按照业务规则定制监控、统计指标,提供统一的查询视图。

3.8 容器状态视图

通过kubernetes容器数据收集插件,为运维提供容器状态统一视图。

3.9 dtrace

SOA架构体系下,服务能力由多套系统提供,如何快速定位出问题的节点是个麻烦的事。

通过dtracerpc框架埋点,我们能获得请求链路日志,为开发同学、运营同学提供多个系统之间请求流转视图,并能根据历史访问情况提供监控、报警能力。

通过dtrace对所有资源组件埋点,为开发同学提供应用内部的请求流转视图,为性能优化、故障分析提供数据支持。

4. 迁移计划

4.1 yiji-boot

我们计划在2016年3月份完成所有应用切换成yiji-boot。

4.2 kubernetes集群

我们计划在测试环境实现所有的无状态应用切换到kubernetes集群上。把测试环境所有的硬件资源充分利用起来,并验证整个体系,同时也增强各个功能组件(日志搜索、应用状态监控、dtrace)。

5. 主要任务

5.1 kubernetes

5.2 dtrace

5.2.1 实现应用内的资源调用跟踪

5.2.2 应用内跟踪数据统计

5.2.3 监控报警

5.3 实时状态采集

实时状态功能主要从应用中,获取应用当前信息(watcher、metric、healthcheck),应用运行环境信息。

5.4 日志收集

5.5 业务监控

5.6 服务鉴权

实现操作人和服务之间的认证、授权。认证授权信息从OA(OA中有人员组织关系,权限)中获取。

5.7 跨机房

我们的现状(金融在重庆,其他在天津)决定我们一个数据中心已经跨机房了。在多个机房中部署基础镜像(主机房推送到其他机房)。发布上线时,通过非专线网络传输应用镜像层(docker分层文件系统)。在其他机房build镜像发布上线。

有状态的服务不放入kubernetes集群,网络上维持原状,保证重庆集群和天津集群的互联互通。

5.8 网络

  1. 网络组件选型

    性能、安全、高可用

初步选型flunnel+ovs

6. 写在最后

愿景很宏大,很美好,但是还有不少路要走。还需要不少组件需要开发,还有一些关键组件的评估。先感谢各位同学能在2016年3月份之前完成应用切换。感谢帮助我们完成构想的同学,希望我们能一起来完成这个大工程。