您的位置:首页 > 运维架构 > Docker

DevOps干货 | 基于Docker的zabbix部署实战

2020-01-14 01:47 239 查看

 

 

前言

 

有人说人生在世要“与时俱进”,还有人说”识时务者为俊杰”。然而作为金融IT从业者,却发现实际并不是这样。

 

我们都知道金融系统瞬息万变,稍微有点风吹草动就会反映在市场上,这些通过大盘的涨跌可见一斑,但是后面保障金融数据稳定呈现的金融信息系统却犹如大山一般,任你外面互联网技术如何更新换代、风云变幻,它却岿然不动,当然这里面的原因有很多,最主要的还是求“稳”。比如银行、券商和基金公司,里面的信息系统普遍较老旧,甚至充斥着大量的Windows服务器。

 

近年来金融公司的互联网转型也如火如荼的进行着,各种创新业务层出不穷,而这也依赖新型的架构支撑。业务的激增带来的是海量的数据和服务,以及服务器资源的扩容等,其中“自动化”就显得尤为重要。

 

本着新技术的调研,以及实现自动化的目标,我们引入了docker容器来管理应用,并结合zabbix监控部署尝试容器化,遂成此文。

 

为什么要容器化?

 

很多高大上的金融公司,大部分情况下一个系统通常从商务立项到开发实施到运维上线仅由一个或者几个人来负责,从而形成的大大小小系统生态。不仅对技术人员要求较高,而且自动化测试、自动化运维程度低,系统出现异常时定位问题慢耗时久。

 

通常一个服务上线是一台PC一套应用环境,不易复制,搭建环境麻烦。而且资源利用率低。即使利用虚拟化,后期也会由OS消耗大量的计算、存储资源和物理机的运维成本相当。并且这种部署方式扩容慢,遇到突发流量,疲于奔命,系统迁移慢且繁琐。我们之前有遇到系统是window服务器的,需要扩容20台,一台台系统通过离线电话激活,可想而知的痛苦。

 

而实现容器化,可以做到应用隔离,某个服务消耗资源不会占用其他应用资源。可移植支持多种云部署公有云,私有云,混合云,多重云;可扩展: 模块化,插件化,可挂载,可组合。在自动化方面表现尤为突出,利用dockerswarm,mesos,k8s等跨服务器的编排工具可以实现自动部署,自动重启,自动复制,自动伸缩扩展。其中docker和虚拟机对比如下:

 

企业级应用容器化,一般怎么做?

 

1、部署docker应用,省去依赖环境的配置。由依赖JVM、weblogic、Nginx等二进制来部署的,过渡到基于docker镜像的单主机模式使用Docker部署。镜像仓库服务,本地打包好上传,服务器直接拉取即可,和yum安装软件一样简单。

2、用docker compose来管理各个应用的容器部署,部署docker swarm集群,实现容器集群管理,由单机容器到集群容器

3、通过K8s这种分布式系统管理平台,实现各容器服务的调度和管理。K8S的抽象性允许将容器化的应用程序部署到集群,而不必专门将其绑定到单个计算机。可以实现自动部署,自动重启,自动复制,自动伸缩/扩展等智能运维操作。

 

以上三步,每一步的调升都是一个技术栈的升级,千里之行始于足下,本文实现基于docker的zabbix监控部署,即完成容器化战略的第一步。

 

 

基于docker的zabbix监控部署实现

 

zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。通过C/S模式采集数据通过B/S模式在web端展示和配置,通过SNMP协议传输,而被监控对象只需要支持SNMP协议或者运行Zabbix-agents代理程序即可。

 

既然是分布式监控系统,那么用分布式部署方案才能发挥其最大功效,官方通过Zabbix proxies提供有效可用的分布式监控。zabbix proxy 可以代替 zabbix server 收集性能和可用性数据,然后把数据汇报给 zabbix server,并且在一定程度上分担了zabbix server 的压力。架构如下:

 

 

假设我们有五个生产网段需要监控,分别为第三方外联区、DMZ、F5前置、业务网段、应用网段。那么至少需要部署一台zabbix-server、5台zabbix-proxy,根据需要部署zabbix-agent若干。

 

部署步骤

 

参考zabbix官网配置建议,要监控1000+台服务器,以频率1件每秒的告警频率,历史趋势数据存储90天,我们需要内存4g,硬盘300G,8核CPU即可满足server要求,而proxy只是数据转发,我们硬盘用100G也绰绰有余了,所需资源情况如下:

 

Server

内存4G

CPU:8核

300G

Centos7.6

Docker1.13.1

Proxy

内存4G

CPU:8核

100G

Centos7.6

Docker1.13.1

 

一、配置环境准备:

1、因为需要挂在本地目录到docker容器,所以需要关闭selinux
#setenforce 0
永久关闭
vi /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
2、关闭防火墙或者增加防火墙规则
3、添加zabbix用户和组,做到最小权限原则
#groupadd zabbix
#useradd -g zabbix zabbix
如果普通用户下docker不可使用将用户加入docker组
#groupadd docker
#gpasswd -a zabbix docker
重启docker生效
#systemctl restart docker
4、环境准备好后,情况如下:
[zabbix@N-VM-ZABBIXSRV ~]$ docker images
REPOSITORY  TAG  IMAGE ID  CREATED  SIZE
[zabbix@N-VM-ZABBIXSRV ~]$ docker -v
Docker version 1.13.1, build b2f74b2/1.13.1
二、server部署由于我们网络规则限制,这里server需要的docker镜像是离线下载好再导入的,Load三个镜像:mysql5.7(数据库)、zabbix-server(服务接口)、zabbix-web-nginx(前置页面)

直接启动相关即可

三、proxy部署Proxy服务器同样通过离线方式导入需要的mysql5.7(必须与server分离)、zabbix-proxy的镜像,并启动服务即可,不过为了安全通讯,这里server和proxy我们使用了共享密钥方式部署(配置注意参见附录部分)

通过简单的镜像导入与启动即可快捷的使用到zabbix监控服务器,只要培训运维人员执行脚本启动和停止就可以部署发布了,启动停止时间秒级,这在使用docker之前是不可以想象的便捷,下图便是添加了路由器和几台主机通过proxy方式接入的配置状态。

 

总结

 

一种技术的选择,就像两地交通工具的选择,比如从上海到北京,有汽车、火车、飞机等等,每一种方式都可以到达,但是耗费的经历和时间是不一样的,当然花费的钱财和人力也不一样,以前一个项目的上线部署需要10几天,用docker容器化后可能只要一两天。尤其是在扩展方面,在server服务器上用docker可以一个脚本就再起一个server服务只不过换一个端口即可,可以用于测试或者升级亦或是升级前的回退备份,但是传统方式可能需要另准备一台独立的服务器或者虚拟机了。当然要面实现信息系统的容器化和自动化还有更多的事情等着我们去挑战,路漫漫其修远兮,吾将上下而求索,我们已经迈出了这一步

附录1 中文乱码问题

我们切换了中文语言后会发现图形里面有不可失败的乱码,主要是因为web的字体配置不支持引起,通过上传中文字体文件和更改defines.inc.php配置信息即可解决:

 

上传字体文件和更改defines.inc.php配置信息

# docker cp simkai.ttf zabbix-web-nginx-mysql:/usr/share/zabbix/assets/fonts/.
# docker cp defines.inc.php zabbix-web-nginx-mysql:/usr/share/zabbix/include/.
中文字体取的是windows自带的楷体

重启服务,中文乱码问题解决

附录2 Proxy配置注意事项

附录 3 zabbix相关启动脚本

------------------------------server服务-------------------
1. 首先,启动空的 MySQL 服务器实例。
# docker run --name mysql-server -t \
-p 3306:3306 \
-v /var/zdocker/data:/var/lib/mysql \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="root" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
2. 然后,启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例。
# docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="root" \
--link mysql-server:mysql \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
Zabbix server 实例将 10051/TCP 端口(Zabbix trapper)暴露给主机。
3. 最后,启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例。
# docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="root" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
------------------------proxy服务---------------------------
生成psk密钥并写入文件zabbix_proxy.psk
#openssl rand -hex 32
1. mysql 安装同server
2. proxy 安装
# docker run --name zabbix-proxy-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-e MYSQL_ROOT_PASSWORD="root" \
-e ZBX_SERVER_HOST="IP" \
-e ZBX_SERVER_PORT="10051" \
-e ZBX_TLSCONNECT="psk" \
-e ZBX_TLSPSKIDENTITY="zbxproxy" \
-e  ZBX_TLSPSKFILE="zabbix_proxy.psk" \
-e  ZBX_HOSTNAME="zbxproxy" \
-e  ZBX_CONFIGFREQUENCY="90" \
-v /var/zdocker/enc:/var/lib/zabbix/enc \
--link mysql-server:mysql \
-p 10051:10051 \
-d zabbix/zabbix-proxy-mysql:latest
Zabbix proxy 实例将 10051/TCP 端口(Zabbix trapper)暴露给主机。
 

参考资料:

1、zabbix官网文档

2、docker官网文档

3、其他互联网相关检索资料

  • 点赞
  • 收藏
  • 分享
  • 文章举报
思快奇 发布了28 篇原创文章 · 获赞 0 · 访问量 137 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: