前沿:

本篇文章意在介绍如何使用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-serverzabbix-agentzabbix-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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐