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

2021-03-23 11:46:33 浏览数 (1)

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

本文是2020Zabbix全球峰会演讲主题,感谢译者Geekwolf,其个人公众号《云栈技术CSTC》。

目录

一 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监听前端节点的连接。

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

代码语言:javascript复制
frontend traefik
mode http
bind 0.0.0.0:80
option forwardfor
monitor-uri /health
default_backend backend_traefik

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

代码语言:javascript复制
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服务器容器在运行

代码语言:javascript复制
frontend zabbix_server
mode tcp
bind 0.0.0.0:10051
default_backend backend_zabbix_server
代码语言:javascript复制
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服务的配置

代码语言:javascript复制
mkdir /data/data-docker
vim /etc/exports
/data/data-docker/ *(rw,sync,no_root_squash,no_subtree_check)

NFS客户端配置

代码语言:javascript复制
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配置的反向代理示例:

代码语言:javascript复制
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

代码语言:javascript复制
# 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"

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

代码语言:javascript复制
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服务器的名称、镜像、操作系统等。

代码语言:javascript复制
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镜像:

代码语言:javascript复制
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目录,并部署服务:

代码语言:javascript复制
# 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会自动启动一个新的服务或容器
  • 不需要连接到终端来启动环境
  • 部署简单
  • 管理维护简单

0 人点赞