docker swarm部署zabbix监控系统(离线环境)
前沿:
本篇文章意在介绍如何使用docker swarm部署高可用zabbix监控系统,
架构设计方面:其中zabbix-server、zabbix-web、zabbix-agent均采用容器化部署,MySQL数据库采用本地化部署;
由于本次部署采用的挂载方式为bind模式,即主机硬盘挂载模式,server、agent、web需提前准备好启动所需的配置文件;
准备阶段:
一、修改主机名:
hostnamectl set XXX
二、防火墙、selinux、iptables设置(视具体生产环境要求)
1、关闭防火墙 / SELinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
2、检查内核参数
vim /etc/sysctl.conf
找到net.ipv4.ip_forward,将值修改为1
net.ipv4.ip_forward = 1
生效并检验:
加载 /etc/sysctl.conf 配置
sysctl -p
校验
sysctl net.ipv4.ip_forward
3、iptables策略配置(视具体情况自行添加)
三、docker包安装
1、安装 Docker(3台都装)
上传docker安装包,docker-ce-cli-26.1.3-1.el8.x86_64.rpm docker-ce-26.1.3-1.el8.x86_64.rpm containerd.io-1.6.9-3.1.el8.x86_64.rpm
rpm -ivh --force --nodeps *.rpm
2、检查docker服务状态:
systemctl status docker
四、zabbix镜像加载:
1、需预先准备三个docker镜像,分别是zabbixservermysql.tar zabbixwebnginxmysql.tar zabbix-agent-alpine-7.0-latest.tar
加载镜像:
docker load -i zabbixservermysql.tar
docker load -i zabbixwebnginxmysql.tar
docker load -i zabbix-agent-alpine-7.0-latest.tar
检查加载的镜像:
dock images
2、创建 YAML 里的挂载目录(三台都必须建)
mkdir -p /data/zabbix/server/{logs,alertscripts,externalscripts}
mkdir -p /data/zabbix/ssl/nginx
mkdir -p /data/zabbix/agent/etc
mkdir -p /data/zabbix/agent/externalscripts(用作性能指标脚本存放)
五、搭建 Docker Swarm 集群
1、在主节点执行:
docker swarm init --advertise-addr 你的Manager节点IP
执行成功后,终端会输出worker节点加入集群的命令,格式如下:
docker swarm join --token SWMTKN-1-xxxxxx 你的Manager节点IP:2377
PS:如果不小心弄丢这个命令,可在 Manager 节点执行以下命令重新生成:
docker swarm join-token worker
2、将work节点提升为manager管理节点(在主节点执行)
提升指定节点为docker node promote <节点名/节点ID>
docker node promote zbm2
降级管理节点为工作节点(备用):
docker node demote <节点名/节点ID>
3、验证集群状态
回到manager节点,执行:
docker node ls
正常输出示例(三个节点,status均为ready):

正式部署阶段:
一、mysql数据库(主备集群搭建不在这里详细编写):
1、部署完成后记得开启远程访问模式,需要和容器进行网络通信
1) 登录本地 MySQL(物理机上执行)
mysql -uroot -p
2) 授权 Zabbix 账号从「任意地址」访问(容器网段也包含在内)
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%' IDENTIFIED BY '你的zabbix数据库密码';
3) 刷新权限
FLUSH PRIVILEGES;
4) 退出 MySQL
exit;
注意:如果 MySQL 是 8.0+ 版本,密码认证方式需调整(否则容器连接会报错),额外执行:
ALTER USER 'zabbix'@'%' IDENTIFIED WITH mysql_native_password BY '你的zabbix数据库密码';
FLUSH PRIVILEGES;
2、修改本地 MySQL 配置(允许远程访问)
1) 编辑 MySQL 配置文件(不同系统路径可能不同)
vim /etc/my.cnf
2) 找到 bind-address 配置,修改为宿主机真实IP(比如 192.168.1.100),或 0.0.0.0(允许所有地址)
bind-address = 0.0.0.0
3、 重启本地 MySQL 服务
systemctl restart mysqld
二、zabbix-server、zabbix-agent、zabbix-web通过swarm正式启动前的一些配置文件的准备工作
由于本次部署采用的挂载方式为bind模式,即主机硬盘挂载模式,server、agent、web需提前准备好启动所需的配置文件;
1、临时启动容器,获取生成所需的配置文件
1)临时容器 + 整目录拷贝
启动临时休眠容器 (zabbix-server)
docker run -d --name tmp-zabbix-server zabbix/zabbix-server-mysql:alpine-7.0-latest sleep 3600
完整复制容器内 /etc/zabbix 所有文件/子目录到宿主机
docker cp tmp-zabbix-server:/etc/zabbix/. /data/zabbix/server/
清理临时容器
docker rm -f tmp-zabbix-server
2)修改配置文件(根据实际情况调整):
vi /data/zabbix/server/zabbix_server.conf
修改如下配置:
DBHost=XX(真实数据库)
DBName=zabbix
DBUser=zabbix
DBPassword=XXX(实际密码)
LogFile=/var/log/zabbix/zabbix_server.log
2、获取zabbix-agent的默认配置(按需调整)
1)启动临时容器:
docker run -d --name tmp-zabbix-agent zabbix/agent:alpine-7.0-latest sleep 3600
2)拷贝容器内整个 /etc/zabbix 到宿主机
整目录复制,包含所有文件、子文件夹
docker cp tmp-zabbix-agent:/etc/zabbix/. /data/zabbix/agent/etc/
3)清理临时容器
docker rm -f tmp-zabbix-agent
4)修改配置文件:
vi /data/zabbix/agent/etc/zabbix_agentd.conf
增加如下内容(作为带内性能指标获取数据的解析):
UserParameter=dz.mem7[*],/usr/lib/zabbix/externalscripts/GetMemUsed7.sh $1 $2
UserParameter=dz.disk[*],/usr/local/externalscripts/GetDiskUsed.sh $1 $2 $3
#UserParameter=dz.disk[*],/usr/lib/zabbix/externalscripts/GetDiskUsed.sh $1 $2 $3
3、准备zabbix-web的SSL证书(需自行生成/放置,注意命名不要随便更改)
cp ssl.crt /data/zabbix/ssl/nginx/
cp ssl.key /data/zabbix/ssl/nginx/
4、启动docker swarm;
根据实际的服务器的相关信息,修改yaml文件的相关配置内容,
docker stack deploy -c docker-compose.yaml zabbix
yaml文件内容如下:
version: '3.7'
services:
zabbix-server:
image: zabbix/zabbix-server-mysql:alpine-7.0-latest
networks:
- zabbix-net
environment:
DB_SERVER_HOST: "XX.XX.XX.XX"
MYSQL_USER: "zabbix"
MYSQL_PASSWORD: "你的密码"
MYSQL_DATABASE: "zabbix"
TZ: "Asia/Shanghai"
volumes:
- /data/zabbix/server/zabbix_server.conf:/etc/zabbix/zabbix_server.conf
#- /data/zabbix/server/logs:/var/log/zabbix
- /data/zabbix/server/alertscripts:/usr/lib/zabbix/alertscripts
- /data/zabbix/server/externalscripts:/usr/lib/zabbix/externalscripts
- /var/log/zabbix:/var/log/zabbix
deploy:
replicas: 1
restart_policy:
condition: any
delay: 5s
max_attempts: 10
placement:
constraints: [] # 允许漂移到任意节点
zabbix-web:
image: zabbix/zabbix-web-nginx-mysql:alpine-7.0-latest
ports:
- "80:8080"
- "443:8443"
networks:
- zabbix-net
environment:
DB_SERVER_HOST: "XX.XX.XX.XX"
MYSQL_USER: "zabbix"
MYSQL_PASSWORD: "你的密码"
MYSQL_DATABASE: "zabbix"
ZBX_SERVER_HOST: "zabbix-server"
TZ: "Asia/Shanghai"
PHP_TZ: "Asia/Shanghai"
ZBX_ENABLE_SSL: "true"
SSL_CERT_DIR: "/etc/ssl/nginx"
volumes:
- type: bind
source: /data/zabbix/ssl/nginx
target: /etc/ssl/nginx
read_only: true
deploy:
replicas: 3
placement:
preferences:
- spread: node.id # 均匀分到3台机器
zabbix-agent:
image: zabbix/agent:alpine-7.0-latest
networks:
- zabbix-net
ports:
- 10050:10050
environment:
- ZBX_SERVER_HOST=zabbix-server
- ZBX_SERVER_PORT=10051
- ZBX_HOSTNAME={{.Node.Hostname}}
- ZBX_LISTENIP=0.0.0.0
- ZBX_LISTENPORT=10050
- ZBX_PASSIVESERVERS=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
- TZ=Asia/Shanghai
volumes:
- /data/zabbix/agent/etc:/etc/zabbix
- /var/run/docker.sock:/var/run/docker.sock:ro
- /proc:/proc
- /sys:/sys
# - /data/zabbix/agent/externalscripts:/usr/lib/zabbix/externalscripts
- /data/zabbix/agent/externalscripts:/usr/local/externalscripts
- /var/log/zabbix:/var/log/zabbix
deploy:
# mode: global
mode: replicated
replicas: 1 # 只启动 1 个
placement:
constraints:
- node.hostname==zbm1 # 固定只在 zbm1 节点启动
privileged: true
networks:
zabbix-net:
driver: overlay
attachable: true
等待服务启动完成后,查看服务状态,查看副本是否都已启动完成:
docker stack services zabbix

更多推荐

所有评论(0)