博文 | 如何通过Docker实现自动扩容Zabbix监控平台?

网友投稿 680 2022-05-30

本文介绍新的Zabbix高可用性的方法,并讨论在使用Docker Swarm、Docker、Gitlab和CI/CD等技术实现Zabbix时所面临的挑战。

本文是2020Zabbix全球峰会演讲主题,感谢译者Geekwolf。

目录

一 Zabbix项目需求

二 高可用思路

01 HAProxy

02 NFS共享

03 Docker和Docker Swarm

04 反向代理Traefik

三 编排Compose文件并部署

01 反向代理

02 Zabbix Server

03 前端

04 部署

五 Gitlab CI/CD

六 总结

一 Zabbix项目需求

第一次使用Docker部署Zabbix是一个挑战,Zabbix环境需要满足一下要求:

NVPS(每秒写入新值数量)超过3000+

具备容错能力

具备弹性

可以水平扩容环境

安装Zabbix有五种方法: 使用包安装、编译、Docker部署、云或设备。我们使用虚拟机或者物理服务器直接安装Zabbix。在这种情况下,有必要安装并更新操作系统以提高性能。然后在安装Zabbix,备份配置文件和数据库。

但是,在这种方案中,当Zabbix服务器或者Zabbix前端关闭时,服务将不可用,通常解决方案是人工干预重启或从备份中恢复重建新实例。

为了创建一个更加智能的环境,我们可以使用一些标准的解决方案如Corosync和Pacemaker。但是,对于Zabbix高可用性建设有更好的解决方案。

二 高可用新思路

Zabbix可以使用一下技术进行部署,例如:

Docker

Docker Swarm

反向代理Traefik

Git

CI/CD

最初,Zabbix监控平台部署,被划分成多个组件:

01 HAProxy

HAProxy负责接收请求并转发定向到Docker Swarm集群节点。因此,每次请求Zabbix前端,都会先将请求发到HAProxy,HAProxy检测后端服务,并将请求转发定向到后端可用的节点。如果某个节点不可用,HAProxy将不再向这些节点发送请求。

HAProxy配置(haproxy.cfg)

使用HAProxy配置负载均衡器时,需要定义两个类型的节点:前端节点和后端节点。这里以Traefik服务为例进行说明:HAProxy监听前端节点的连接。

—在前端,配置端口以接收请求,并将后端与之关联

frontend traefik mode http bind 0.0.0.0:80 option forwardfor monitor-uri /health default_backend backend_traefik

—在后端,配置定义安歇服务正在使用traefic服务、检查模式、运行服务的IP和端口

backend backend_traefik mode http cookie Zabbix prefix server DOCKERHOST1 10.250.6.52:8080 cookie DOCKERHOST1 check server DOCKERHOST2 10.250.6.53:8080 cookie DOCKERHOST2 check server DOCKERHOST3 10.250.6.54:8080 cookie DOCKERHOST3 check stats admin if TRUE option tcp-check

—我们还可以定义Zabbix服务器可以运行的位置。在这里,我们只有一个Zabbix服务器容器在运行

frontend zabbix_server mode tcp bind 0.0.0.0:10051 default_backend backend_zabbix_server backend backend_zabbix_server mode tcp server DOCKERHOST1 10.250.6.52:10051 check server DOCKERHOST2 10.250.6.53:10051 check server DOCKERHOST3 10.250.6.54:10051 check stats admin if TRUE option tcp-check

02 NFS共享

NFS服务器负责将存储的文件映射到容器中。

配置安装NFS

NFS服务的配置

mkdir /data/data-docker vim /etc/exports /data/data-docker/ *(rw,sync,no_root_squash,no_subtree_check)

NFS客户端配置

博文 | 如何通过Docker实现自动扩容Zabbix监控平台?

vim /etc/fstab :/data/data-docker /mnt/data-docker nfs defaults 0 0

03 Docker和Docker Swarm

Docker和Docker Swarm负责运行和编排容器。Swarm由一个或多个节点组成,集群可用分为两类:

管理节点:负责维护集群状态、调度及为Swarm模式提供HTTP API服务

工作节点:是Docker引擎的实例,为了执行容器

04 反向代理Traefik

反向代理是该方案当中另一个重要组件,负责接收HTTP和HTTPS请求,并转发重定向到后端可用的容器。本方案中,有三个Traefik容器。反向代理可以使用Nginx,也可以使用Traefik。

三 编排Compose文件并部署

编写文件docker-compose.yml——定义服务、网络和卷的YAML文件。在这个文件中,我们决定使用哪个Zabbix镜像、容器将连接到哪个网络、服务名称以及其他必要配置。

01 反向代理

下面是使用Traefik配置的反向代理示例:

traefik: image: traefik:v2.2.8 deploy: placement: constraints: - node.role == manager replicas: 1 restart_policy: condition: on-failure labels: # Dashboard traefik - "traefik.enable=true" - "traefik.http.services.justAdummyService.loadbalancer.server.port=1337" - "traefik.http.routers.traefik.tls=true" - "traefik.http.routers.traefik.rule=Host(`zabbix-traefik.mydomain`)" - "traefik.http.routers.traefik.service=api@internal"

参数说明:

traefik: — 服务名字(第一行)

image: — 定义使用什么镜像

deploy: — 部署的创建规则

constraints: — 约束条件

replicas: — 给服务创建多少副本

restart_policy: — 如果服务有问题,使用什么策略

labels: — 为traefik定义标签,包括调用服务的规则

配置认证和HTTP跳转HTTPS

# Auth Dashboard - "traefik.http.routers.traefik.middlewares=traefik-auth" - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:" # Redirect all HTTP to HTTPS permanently - "traefik.http.routers.http_catchall.rule=HostRegexp(`{any:.+}`)" - "traefik.http.routers.http_catchall.entrypoints=web" - "traefik.http.routers.http_catchall.middlewares=https_redirect" - "traefik.http.middlewares.https_redirect.redirectscheme.scheme=https" - "traefik.http.middlewares.https_redirect.redirectscheme.permanent=true"

最后,我们定义在容器启动后要执行的命令:

command: - "--api=true" - "--log.level=INFO" - "--providers.docker.endpoint=unix:///var/run/docker.sock" - "--providers.docker.swarmMode=true" - "--providers.docker.exposedbydefault=false" - "--providers.file.directory=/etc/traefik/dynamic" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443"

02 Zabbix Server

Zabbix服务器配置可以在这个环境中定义——Zabbix服务器的名称、镜像、操作系统等。

zabbix-server: image: zabbix/zabbix-server-mysql:centos-5.0-latest env_file: - ./envs/zabbix-server/common.env networks: - "monitoring-network" volumes: - /mnt/data-docker/zabbix-server/externalscripts:/usr/lib/zabbix/externalscripts:ro - /mnt/data-docker/zabbix-server/alertscripts:/usr/lib/zabbix/alertscripts:ro ports: - "10051:10051" deploy: <<: *template-deploy labels: - "traefik.enable=false"

在本例中,我们可以使用Zabbix 5.0。例如,在这里,我们可以定义数据库地址、数据库用户名、将要启动的轮询程序数量、外部脚本和警报脚本的路径以及其他选项。

在本例中,我们使用两个卷——用于外部脚本和必须存储在NFS服务器中的警报脚本。

对于这个Zabbix,服务器traefik没有启用。

03 Zabbix 前端

对于前端,我们有另外一个选择,使用Zabbix镜像:

zabbix-frontend: image: zabbix/zabbix-web-nginx-mysql:alpine-5.0.1 env_file: - ./envs/zabbix-frontend/common.env networks: - "monitoring-network" deploy: <<: *template-deploy replicas: 5 labels: - "traefik.enable=true" - "traefik.http.routers.zabbix-frontend.tls=true" - "traefik.http.routers.zabbix-frontend.rule=Host(`frontend.domain`)" - "traefik.http.routers.zabbix-frontend.entrypoints=web" - "traefik.http.routers.zabbix-frontend.entrypoints=websecure" - "traefik.http.services.zabbix-frontend.loadbalancer.server.port=8080"

这里,5个副本意味着我们可以开始5个Zabbix前端。这可以用于更广泛的环境,这也意味着我们有5个容器和5个连接。

在这里,为了访问前端,我们可以使用’ front '。域的名字。如果我们使用不同的名称,将无法访问前端。

5个副本,意味着我们有5个Zabbix 前段节点或容器;我们可以使用frontend.domain来访问前端。负载均衡器定义了容器监听的端口。

04 部署

到目前为止,部署都是手动完成的。你需要连接到一个具有Docker群管理功能的服务,进入NFS目录,并部署服务:

# docker stack deploy -c docker-compose.yaml zabbix

其中-c定义compose文件名和Stack名字:zabbix。

五 Gitlab CI/CD

使用CI/CD,不再需要手动运行来创建映像和部署服务。

1.为每个组件分别创建一个仓库:

Zabbix Server

Frontend Web

Zabbix Proxy

2.启用Piplines

3.创建.gitlab-ci.yml文件

六 总结

如果Zabbix组件停止,Docker Swarm会自动启动一个新的服务或容器

不需要连接到终端来启动环境

部署简单

管理维护简单

Docker Zabbix

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:玩转python多线程【生长吧!Python】
下一篇:Hadoop环境搭建测试以及MapReduce实例实现
相关文章