本文介绍新的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会自动启动一个新的服务或容器
- 不需要连接到终端来启动环境
- 部署简单
- 管理维护简单