24

支持 100+ 业务线、累计发布 17 万次,宜信容器云的 A 点与 B 点

 4 years ago
source link: https://www.infoq.cn/article/7C3IyriRV07l6m0VvKrv
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

宜信公司从 2018 年初开始建设容器云,至今,容器云的常用基本功能已经趋于完善,主要包括服务管理、应用商店、Nginx 配置、存储管理、CI/CD、权限管理等,支持 100+ 业务线、3500+ 的容器运行。伴随公司去 VMware 以及 DevOps、微服务不断推进的背景,后续还会有更多的业务迁移到容器云上,容器云在宜信发挥着越来越重要的作用。本次分享主要介绍宜信容器云平台的背景、主要功能、落地实践及未来规划。

一、宜信容器云平台背景

JnYvemz.png!web

宜信容器云平台的建设背景主要包括:

  • 提高资源利用率。容器云建设之前,每台物理机上平均运行的虚拟机大概是 20 个,使用了容器云之后,每台物理机上平均运行的容器数达到 50 个;之前的 CPU 利用率大概在 10% 左右,迁移到容器云后,CPU 利用率提高到 20% 以上,整个资源利用率得到了极大的提升。

  • 提升服务可靠性。传统的虚拟机运维方式下,当机器宕机或系统故障时,需要运维手动重启虚拟机和服务,整个过程最快需要几十分钟到几个小时才能解决;使用容器云后,通过健康检查的方式,一旦发现有问题就自动重启恢复服务,可以达到分钟级甚至秒级的恢复。

  • 节约成本。通过容器云提高了资源利用率,同时也节约了成本。公司每年会采购一些商业化软件,如虚拟化软件、商业存储等,费用动辄千万。我们基于开源技术自研一套容器解决方案,每年为公司节省上千万的软件采购和维保费用。

  • 弹性伸缩。我们公司每年都会组织财富峰会,在这里有一个很经典的场景:秒杀,秒杀场景需要很快扩展业务的计算能力。为了快速应对互联网突发流量,如上述的财富峰会、APP 线上活动,我们为服务设置了自动伸缩的策略:当 CPU 利用率达到 60% 的时候,自动做容器扩容,应对突发的业务流量,提高响应速度;活动过后,自动回收资源,提高资源的利用率。

3uiyqqi.png!web

  • DevOps 整合。DevOps 和敏捷开发的理论已经提出很多年了,为什么 DevOps 一直没有得到很好的推进和实践呢?因为缺乏一种工具把 Dev 和 Ops 联系起来,而容器的诞生很好地解决了这个问题。开发人员在开发完代码并完成测试以后,可以拿着测试的产物直接到生产环境部署上线,而部署的问题可以直接反馈给开发,形成闭环。也就是说,通过容器的方式,可以实现一次构建多次运行。由此可见,通过容器的方式实现 DevOps 是最佳的方案,企业亟需一套成熟的平台帮助开发和运维人员保持各个环境的一致性和快速发布、快速回滚。

在上述背景下,我们结合宜信的业务场景开发建设宜信容器云平台。

二、宜信容器云平台主要功能

宜信容器云平台经过一年多时间的建设和开发,基本的常用功能已经具备。如图所示。

fm2yyyi.png!web

上图左侧是宜信容器云平台的主要功能,包括:服务管理、CI/CD、代理出口、配置管理、文件存储、告警策略、镜像管理、用户管理、权限管理、系统管理等。

右侧是一个服务管理的界面,从中可以看到服务列表、服务名称、服务状态及当前服务数量,还有当前镜像版本及更新时间。

2.1 宜信容器云平台架构

VVv2Abi.png!web

上图所示为整个容器云平台的架构图,在各种开源组件(包括 Harbor 镜像仓库、Kubernetes 容器管理、Prometheus 监控、Jenkins 构建、Nginx 流量转发和 Docker 容器虚拟化等)的基础之上,我们自研开发了 5 个核心模块。

  • Cluster-mgr,负责多个 Kubernetes 集群之间的管理和调度,在一个 Kubernetes 集群出现问题后,将该集群的容器迁移到其他可用的 Kubernetes 集群,并且负责资源的计量。

  • Ipaas,负责对接各种资源,如调用 Kubernetes API 创建容器、对接 Ceph 创建存储、对接 Harbor 获取镜像等。前端页面通过 Ipaas 获取容器相关的新闻数据、监控指标等。

  • Codeflow,负责代码构建。通过对接 Jenkins 实现代码编译、打包镜像以及服务的滚动升级等工作。

  • Nginx-mgr,一个对接多个 Nginx 集群的管理系统,负责将用户在页面配置的规则转成 Nginx 配置,并下发到对应的 Nginx 集群。

  • Dophinsync,和公司 CMDB 系统打通,从 CMDB 系统同步公司所有项目和服务的相关数据和信息。

e6j63uj.png!web

最上面是对用户提供的 web-portal 页面,一个用户自助的终端。

本次分享的标题是《宜信容器云的 A 点与 B 点》,之所以称为 A 点和 B 点,这与我们的公司文化有关,我们以“A 点”代指现在已经做到的事情,以“B 点”代指未来或者下个阶段要做的事情。

目前整个宜信容器云平台已经完成了大部分主要功能点的开发,这部分已经实现的功能即为“A 点”,包括服务管理、应用商店、域名管理、CI/CD、镜像管理、文件存储、监控告警、定时任务、配置管理等。后续还有部分功能需要添加和完善,即为“B 点”,主要包括:对象存储、大数据容器云、全面日志收集、自定义指标伸缩、智能调度和混部、多集群管理、安全隔离、站点监控等,

2.2 宜信容器云功能模块

2qMjYbf.png!web

上图为宜信容器云平台的整体功能图,其中蓝色代表已经完成的功能、黄色代表需要优化和改善的功能。

整个系统从资源管理的角度来看:

  • 底层是硬件层面的计算、存储、网络;

  • 其上是资源管理层,负责容器、存储、域名、镜像、集群管理;

  • 往上是中间件层,包括 Kafka、MySQL 等中间件服务;

  • 再往上是应用层,提供给用户使用的终端;

  • 两侧分别是 CI/CD 的构建流程和安全认证相关的功能组件。

下面将通过页面截图的方式,详细介绍容器云的主要功能点。

2.2.1 主要功能点——服务管理

6vYBfye.png!web

上图是服务管理页面的截图,逐一介绍各个功能。

  • 容器列表。上侧的菜单是服务管理的列表,进入到某一个服务管理,就可以对服务进行具体操作,包括基本配置、升级、扩缩容、域名管理、同步生产环境等。

  • 历史容器。 服务升级或故障迁移之后,容器的名称、IP 地址等会发生变化,历史容器的功能是记录一个服务下面容器的变化情况,方便我们追踪容器的变化,追溯性能监控数据,进行故障定位。

  • 日志下载。可以通过页面方式直接下载用户日志数据。终端信息与前面的日志输出是有区别的。前面的日志下载是应用把日志保存到容器里的某一个指定路径下;终端信息是容器标准输出的日志,Event 信息里主要记录容器的状态信息,比如什么时候拉取镜像、什么时候启动服务等。Webshell 主要提供容器登录,可以像 SSH 一样通过页面的方式登录到终端。

  • 非 root 登录。为了保持容器生产环境的安全,我们以非 root 的方式登录容器控制台,避免误删数据。

  • Debug 容器实现,通过启动一个工具容器,挂载到业务容器里,共享网络、进程等数据。传统的方式希望容器镜像尽可能小、安装的软件尽可能少,这样启动更快、安全性更高,但由于容器本身只安装了程序必要的依赖,导致排查文件困难。为了解决这个问题,我们基于开源技术开发了 debug 容器功能:debug 容器挂载到业务容器中,共享业务容器的网络内存和主机相关的各种信息,这样一来,就相当于在业务容器中执行了 debug 命令,既方便运维和业务人员排查故障,保障了容器的快速安全,又为业务提供了一种更好的 debug 方式。安装的客户端如 Reids 客户端、MySQL 客户端、Tcpdump 等。

  • 容器性能监控,包括 CPU、内存、网络 IO、磁盘 IO 等监控指标。

  • 审计,用户所有操作命令都会通过审计工具进行审核。

  • 摘除实例,主要是针对一些异常容器的故障定位,将流量从负载均衡上摘除。

  • 销毁功能,当容器需要重建时会用到销毁功能。

除了上文介绍的一排容器按钮以外,还有一些针对服务的相关操作,比如服务的基本配置:环境变量、域名解析、健康检查,服务的升级,替换镜像、扩缩容等操作。

2.2.2 主要功能点——应用商店

YjQRRv2.png!web

很多业务场景有这样的需求:希望可以在测试环境里实现一键启动中间件服务,如 MySQL、Zookerper 、Redis、Kafka 等,不需要手动去配置 kafka 等集群。因此我们提供了中间件容器化的解决方案,将一些常用的中间件导入容器中,后端通过 Kubernetes 维护这些中间件的状态,这样用户就可以一键创建中间件服务。

但由于这些中间件服务本身相对来说比较复杂,所以目前我们的应用商店功能主要是为大家提供测试环境,等这部分功能成熟之后,会把应用商店这些常用的中间件拓展到生产环境上,到时候就可以在生产环境使用容器化的中间件服务了。

2.2.3 主要功能点——CI/CD

eeam6bv.png!web

CI/CD 是代码构建流,我们内部称为 codeflow。其实代码构建流程非常简单,一句话概括起来,就是:拉取仓库源代码,通过用户指定的编译脚本构建出执行程序,将执行程序放到用户指定部署路径,并通过启动命令启动这个服务。系统会为每个 codeflow 生成对应的 Dockerfile 用于构建镜像,用户不需要具备 Docker 使用经验。

上面的流程是代码编译,下面是通过系统预先生成的 Dockerfile,帮用户打包成 Docker Image,这就是从代码拉取、代码编译、打包到 Docker Image 并推送到镜像仓库的整个流程。

用户完成配置并点击提交代码后,就可以通过手动或 Webhook 的方式触发整个构建流程。也就是说只要用户一提交代码,就会触发整个构建流程,编译源代码、打包 Docker 镜像、推送镜像仓库并触发滚动升级,用户可以在分钟级别看到效果。

在这里我们还做了一些小的功能:

  • 非 root 构建。我们的后端其实是在一个 Jenkins 集群下构建的,这样就存在一个问题:如果用户在编辑脚本的时候,不小心写错代码就可能会将整个主机上的东西都删除,非常不安全。为了解决这个问题,我们在整个构建过程中采用非 root 构建的方式,避免某个用户因编译脚本执行某些特权操作而影响系统安全。

  • 自定义 Dockerfile。支持某些用户使用自己的 Dockerfile 构建镜像,用户通过上传 Dockerfile 的方式,覆盖系统生成的 Dockerfile。

  • 预处理脚本,主要针对 Python 类的镜像构建,Python 类的镜像构建本身不需要编译源代码,但运行环境需要依赖很多第三方的包和库,如果将这些依赖包都安装到基础镜像,不仅会导致基础镜像过大,而且后期维护也很麻烦。为了支持 Python 软件容器化的运行,我们提供了预处理脚本,即在业务镜像之前先执行预处理脚本,帮用户安装好所需要的依赖包,然后再把用户的代码拷贝过来,基于预处理脚本之后的镜像去生成业务镜像,下次构建的时候,只要预处理脚本不变,就可以直接构建业务镜像了。

  • Webhook 触发和 Gitlab 集成,通过 Gitlab 的 Webhook,当用户在提交代码或者 merge pr 的时候便可以触发 codeflow,执行自动上线流程。

2.2.4 主要功能点——文件存储

jiUBN3R.png!web

容器通常需要业务进行无状态的改造,所谓“无状态”是需要把一些状态数据放在外部的中间件或存储里。

我们提供了两种存储方式:NFS 和 Cephfs 文件存储。用户在页面选择存储的容量,然后点击创建,就可以直接创建一个 Cephfs 文件存储,并且可以在服务管理页面指定将这一存储挂载到容器的某一个路径下,当容器重启或者迁移后,文件存储会保持之前的目录挂载,从而保障数据不丢失。

2.2.5 主要功能点——Nginx 配置

公司有大概 100 多个 Nginx 集群,之前这些 Nginx 集群都是通过运维人员手动方式变更配置和维护,配置文件格式不统一,且容易配置错误,问题和故障定位都很困难。为此我们在容器云集成了 Nginx 配置管理,通过模板的方式生产 Nginx 配置。Nginx 配置的功能比较多,包括健康检查规则、灰度发布策略等相关配置。

2eQNnar.png!web

上图是一个系统管理员可以看到的页面,其中部分项目开放给业务用户,允许用户自己定义部分 Nginx 配置,如 upstream 列表,从而将公司域名配置模板化。

除此之外,我们还做了配置文件的多版本对比,Nginx 的每次配置都会生成一个对应的版本号,这样就可以看到在什么时间 Nginx 被谁修改了哪些内容等,如果发现 Nginx 配置修改有问题,可以点击回滚到 Nginx 的历史版本。

泛域名解析,主要适用于测试环境。之前每一个测试服务都需要联系运维人员单独申请一个域名,为了节省用户申请域名的时间,我们为每个服务创建一个域名,系统通过泛域名解析的方式,将这些域名都指定到特定的 Nginx 集群。

Nginx 后端可以包含容器也可以包含虚拟机,这是在业务迁移过程中非常常见的,因为很多业务迁移到容器都并非一蹴而就,而是先将部分流量切换到容器内运行。

2.2.6 主要功能点——配置文件管理

QNBji2q.png!web

现在的架构提倡代码和配置分离,即在测试环境和生产环境使用相同的代码,不同的配置文件。为了能够动态变更配置文件,我们通过 Kubernetes 的 Configmap 实现了配置文件管理的功能:将配置文件挂载到容器内,用户可以在页面上传或者编辑配置文件,保存后,系统将配置文件更新到容器内。

就是说当用户在页面上传或编译某个配置文件以后,平台会自动把配置文件刷新到容器里,容器就可以使用最新的配置文件了。为了避免用户误删配置文件,当系统发现配置文件被使用则不允许删除。

2.2.7 主要功能点——告警管理

rENRra2.png!web

告警管理功能基于 Prometheus 实现。平台会把所有的监控数据,包括容器相关的(CPU、内存、网络 IO 等)、Nginx 相关的、各个组件状态相关的数据,都录入到 Prometheus 里,用户可以基于这些指标设置监控阈值,如果达到监控阈值,则向运维人员或业务人员发送告警。

值得一提的是,我们提供了一种特殊的告警:单个容器性能指标。按常理,每个容器监控指标应该是类似的,没有必要针对单个容器设置告警,但在实际生产环境中,我们遇到过多次由于某个特定请求触发的 bug 导致 CPU 飙升的场景,所以开发了针对单个容器的性能告警。

三、容器容器云平台落地实践

前面介绍了系统的一些常用功能,接下来介绍宜信容器云平台落地过程中的实践。

3.1 实践——自定义日志采集

IjAfYvj.png!web

容器的使用方式建议用户将日志输出到控制台,但传统应用的日志都是分级别存储,如 Debug 日志、Info 日志、Error 日志等,业务需要采集容器内部指定目录的日志,怎么实现呢?

我们通过二次开发 Kubelet,在容器启动前判断是否有“KUBERNETES_FILELOGS”这个环境变量,如果存在,则将“KUBERNETES_FILELOGS”指定的容器目录挂载到宿主的“/logs/ 容器名称”这个目录下面,配合公司自研的日志采集插件 Watchdog 便可以将宿主机上这个目录下的文件统一收集。

3.2 实践——TCP 代理出口

ZN3ei2v.png!web

在实际过程中我们经常遇到网络对外提供服务的场景,系统中除了 Nginx 提供的 HTTP 反向代理以外,还有一些需要通过 TCP 的方式对外提供的服务,我们通过系统中指定的两台机器安装 Keepalive 和配置虚 IP 的方式,对外暴露 TCP 服务。

3.3 实践——自动扩容

mimQ3uV.png!web

自动扩容,主要是针对业务指标的一些突发流量可以做业务的自动伸缩。其原理非常简单:因为我们所有的性能指标都是通过 Prometheus 统一采集,而 Cluster-mgr 负责多集群管理,它会定时(默认 30s)去 Prometheus 获取容器的各种性能指标,通过上图的公式计算出每个服务的最佳副本个数。公式很简单:就是每个容器的性能指标求和,除以用户定义目标指标值,所得结果即为最佳副本数。然后 Cluster-mgr 会调用 Ipaas 操作多个集群扩容和缩容副本数。

举个例子,现在有一组容器,我希望它的 CPU 利用率是 50%,但当前 4 个副本,每个副本都达到 80%,求和为 320,320 除以 50,最大副本数为 6,得到结果后就可以自动扩容容器的副本了。

3.4 实践——多集群管理

FRfU32M.png!web

传统模式下,单个 Kubernetes 集群是很难保证服务的状态的,单个集群部署在单个机房,如果机房出现问题,就会导致服务不可用。因此为了保障服务的高可用,我们开发了多集群管理模式。

多集群管理模式的原理很简单:在多个机房分别部署一套 Kubernetes 集群,并在服务创建时,把应用部署到多个 Kubernetes 集群中,对外还是提供统一的负载均衡器,负载均衡器会把流量分发到多个 Kubernetes 集群里去。避免因为一个集群或者机房故障,而影响服务的可用性。

如果要创建 Kubernetes 相关或 Deployment 相关的信息,系统会根据两个集群的资源用量去分配 Deployment 副本数;而如果要创建 PV、PVC 以及 Configmap 等信息,则会默认在多个集群同时创建。

集群控制器的功能是负责检测 Kubernetes 集群的健康状态,如果不健康则发出告警,通知运维人员切换集群,可以将一个集群的服务迁移到另一个集群。两个集群之外通过 Nginx 切换多集群的流量,保障服务的高可用。

这里有 3 点需要注意:

  • 存储迁移。底层提供了多机房共享的分布式存储,可以随着容器的迁移而迁移。

  • 网络互通。网络是通过 Flannel + 共享 etcd 的方案,实现跨机房容器互通及业务之间的相互调用。

  • 镜像仓库间的数据同步。为了实现两个镜像仓库之间镜像的快速拉取,我们在两个机房内都部署了一个镜像仓库,这两个镜像仓库之间的数据是互相同步的,这样就不用跨机房拉取镜像了。

3.5 实践——如何缩短构建时间

如何加速整个 CI/CD 构建的流程?这里总结了四点:

  • 代码 pull 替换 clone。在构建代码的过程中,用 pull 替换 clone 的方式。用 clone 的方式拉取源代码非常耗时,特别是有些源代码仓库很大,拉取代码要耗费十几秒的时间;而用 pull 的方式,如果发现代码有更新,只需要拉取更新的部分就可以了,不需要重新 clone 整个源代码仓库,从而提高了代码拉取的速度。

  • 本地(私有)仓库、mvn 包本地缓存。我们搭建了很多本地(私有)仓库,包括 Java、Python 的仓库,不需要再去公网拉取依赖包,这样不仅更安全,而且速度更快。

  • 预处理脚本。只在第一次构建时触发,之后便可以基于预处理脚本构建的镜像自动构建。

  • SSD 加持。通过 SSD 硬件的加持,也提高了整个代码构建的速度。

3.6 实践——什么样的程序适合容器

什么样的程序适合运行在容器里?

  • 无操作系统依赖。目前主流容器方案都是基于 Linux 内核的 cgroup 和 namespace 相关技术实现的,这就意味着容器只能在 Linux 系统运行,如果是 Windows 或者 C#之类的程序是无法运行到容器里面的。

  • 无固定 IP 依赖。这个其实不算硬性要求,虽然容器本身是可以实现固定 IP 地址的,但固定的 IP 地址会为 Deployment 的自动伸缩以及集群迁移带来很多麻烦。

  • 无本地数据依赖。容器的重新发布是通过拉取新的镜像启动新的容器进程的方式,这就希望用户不要将数据保存到容器的本地,而是应该借助外部的中间件或者分布式存储保存这些数据。

3.7 避坑指南

在实践过程中会遇到很多问题,本节将列举一些已经踩过的坑,逐一与大家分享我们的避坑经验。

3.7.1 为啥我的服务没有起来?

这种情况可能是因为服务被放在了后台启动,容器的方式和之前虚拟机的方式有很大区别,不能把容器服务放在后台启动,容器启动的进程的 PID 是 1,这个程序进程是容器里唯一的启动进程,如果程序退出了容器就结束了,这就意味着程序不能退出。如果把程序放到后台启动,就会出现进程起来了但容器服务没有起来的情况。

3.7.2 为啥服务启动 / 访问变慢?

之前使用虚拟机的时候,由于配置比较高(4 核 8G),很多业务人员没有关心过这个问题。使用容器之后,平台默认会选中 1 核 1G 的配置,运行速度相对较慢,这就导致了业务在访问业务的时候会觉得服务启动和访问变慢。

3.7.3 为啥服务会异常重启?

这和配置的健康检查策略有关,如果某应用的配置健康检查策略不通过的话,Kubernetes 的 Liveness 探针将会重启该应用;如果业务是健康的,但提供的健康检查接口有问题或不存在,也会重启这个容器,所以业务要特别注意这个问题。

3.7.4 本地编译可以,为啥服务器上代码编译失败?

这个问题非常常见,大多是由于编译环境和服务器环境的不一致导致的。很多业务在本地编译的时候,本地有一些开发工具的加持,有一些工作开发工具帮助完成了,而服务器上没有这些工具,因此会出现这个问题。

3.7.5 为啥我的历史日志找不到了?

这个问题和容器使用相关,容器里默认会为用户保存最近两天的日志,主机上有一个清理的功能,日志超过两天就会被清理掉。那这些超过两天的日志去哪里查看呢?我们公司有一个统一的日志采集插件 Watchdog,负责采集存储历史日志,可以在日志检索系统中检索到这些历史日志。

3.7.6 为啥 IP 地址会变化?

每次容器重启,其 IP 地址都会发生变化,希望业务人员的代码不要依赖这些 IP 地址去配置服务调用。

3.7.7 为啥流量会打到异常容器?

容器已经异常了,为什么还有流量过来?这个问题具体表现为两种情况:业务没起来,流量过来了;业务已经死了,流量还过来。这种两种情况都是不正常的。

  • 第一种情况会导致访问报错,这种场景一般是通过配合健康检查策略完成的,它会检查容器服务到底起没起来,如果检查 OK 就会把新的流量打过来,这样就解决了新容器启动流量的异常。

  • 第二种情况是和容器的优雅关闭相结合的,容器如果没有匹配优雅关闭,会导致 K8s 先去关闭容器,此时容器还没有从 K8s 的 Service 中摘除,所以还会有流量过去。解决这个问题需要容器里面应用能够支持优雅关闭,发送优雅关闭时,容器开始自己回收,在优雅关闭时间后强制回收容器。

3.7.8 为啥没法登录容器?

很多时候这些容器还没有起来,此时当然就无法登陆。

3.7.9 Nginx 后端应该配置几个?OOM?Cache?

这几个问题也经常遇到。在业务使用过程中会配置 CPU、内存相关的东西,如果没有合理配置,就会导致容器的 OOM。我们新版的容器镜像都是自适应、自动调整 JVM 参数,不需要业务人员去调整配置,

3.8 faketime

YnQZrev.png!web

容器不是虚拟机,所以有些容器的使用方式并不能和虚拟机完全一致。在我们的业务场景里还有一个问题:业务需要调整时钟。

容器和虚拟机的其中一个区别是:虚拟机是独立的操作系统,修改其中一个虚拟机里的任何东西都不会影响其他虚拟机。而容器除了前面说的几种隔离以外,其他东西都不是隔离的,所有的容器都是共享主机时钟的,这就意味着如果你改了一个容器的时钟,就相当于改了整个所有容器的时钟。

如何解决这个问题呢?我们在网上找到一种方案:通过劫持系统调用的方式修改容器的时钟。但这个方案有一个问题:faketime 不能睡着了。

3.9 使用情况

AbiMFzZ.png!web

经过几年的推广,目前宜信容器云平台上已经支持了 100 多条业务线,运行了 3700 个容器,累计发布 17 万次,还荣获了“CNCF 容器云优秀案例”。

四、宜信容器云未来规划

nUz2euv.png!web

前文介绍了宜信容器云平台目前取得的一些小成就,即宜信容器云平台的 A 点,接下来介绍宜信容器云的 B 点,即未来的一些规划。

4.1 对象存储

7BjiUvI.png!web

公司有很多文件需要对外提供访问,如网页中的图片、视频、pdf、word 文档等,这些文件大部分都是零散地保存在各自系统的存储中,没有形成统一的存储管理。如果文件需要对外提供访问,则是通过 Nginx 反向代理挂载 NAS 存储的方式,这些文件的维护成本非常高,安全性也得不到保障。

我们基于 Ceph 开发一个统一的对象存储服务,把公司零散在各个系统的小文件集中到对象存储中去,对于可以提供外网或公网访问的部分,生成外网访问的 HTTP 的 URL。目前对象存储已经在业务的测试环境上线。

4.2 站点监控

eU7r6fa.png!web

站点监控是一个正在重点研发的功能。公司开源了智能运维工具 UAVstack,侧重于应用的监控,还缺乏服务外部的站点监控。站点监控是为了监控服务接口的运行状态,并发送告警。

我们通过在公司外部部署采集 Agent,这些 Agetnt 会根据用户定义的监控 URL 定时调用接口是否正常运行,如果接口返回数据不符合用户设定条件则发出告警,如 HTTP 返回 5xx 错误或者返回的 body 中包含 ERROR 字符等。

4.3 大数据容器云

BZNzeuR.png!web

在大部分业务迁移到容器后,我们开始尝试将各种大数据中间件(如 Spark、Flink 等)也迁移到 Kubernetes 集群之上,利用 Kubernetes 提供的特性更好地运维这些中间件组件,如集群管理、自动部署、服务迁移、故障恢复等。

4.4 混合部署

jMfiI33.png!web

公司有很多长任务,这些长任务有一个非常明显的特点:白天访问量较高,晚上访问量较低。对应的是批处理任务,批处理主要指公司的跑批任务,如报表统计、财务账单等,其特点是每天凌晨开始执行,执行时对 CPU 和内存的消耗特别大,但只运行十几分钟或几个小时,白天基本空闲。

为了得到更高的资源利用率,我们正在尝试通过历史数据进行建模,将批处理任务和长任务混合部署。

4.5 未来规划——DevOps 平台

最后介绍我们整个平台的 DevOps 规划。

QFNfEfA.png!web

回到之前容器云的背景,业务需要一套统一的 DevOps 平台,在这个平台上,可以帮助业务完成代码构建、自动化测试、容器发布以及应用监控等一系列功能。

其实这些功能我们基础研发部门都有所涉及,包括自动化测试平台 Gebat、应用监控 UAVStack、容器云平台等,但是业务需要登录到不同的平台,关联不同的数据,而各个平台之间的数据不一致、服务名称不对应,没办法直接互通,操作起来非常麻烦。

我们希望通过建立一个统一的 DevOps 平台,把代码发布、自动化测试、容器运行和监控放到同一个平台上去,让用户可以在一个平台完成所有操作。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK