基于 K8s 的物联网平台运维体系:Ansible+Zabbix 自动化监控与故障自愈(一)—— 环境准备与 Zabbix Server 部署

一、项目背景

在之前的《从 Docker Compose 到 Kubernetes:物联网管理系统迁移实战》系列中,我们成功将物联网管理系统迁移到了 K8s 集群。系统跑起来了,但运维才刚刚开始。

问题来了

  • 系统挂了谁先知道?

  • 资源用了多少?有没有风险?

  • 三台机器怎么批量管理?

于是有了这个项目:在现有 K8s 集群上,搭建 Ansible 批量管理 + Zabbix 监控告警 + Grafana 可视化 + 故障自愈,形成一套完整的自动化运维体系。


二、整体架构

节点 IP 角色 部署内容
master 192.168.116.168 运维控制中心 K8s 控制平面、Ansible、Zabbix Server、Zabbix Web、Grafana
node1 192.168.116.169 数据节点 MySQL(Zabbix 专用数据库)、Zabbix Agent、备份存储
node2 192.168.116.170 业务节点 物联系统所有 Pod(前端+后端+数据库)、Zabbix Agent

数据流向

  • 用户访问 → master 前端入口 → node2 业务 Pod

  • 监控数据 → node2/nodel/master Agent → Zabbix Server → node1 MySQL

  • 批量管理 → master Ansible → node1/node2


三、实验进度(第一篇)

阶段 步骤 状态
第一阶段 SSH 免密 + Ansible 安装 ✅ 完成
第二阶段 node1 创建 Zabbix 数据库 ✅ 完成
第三阶段 安装 Zabbix Server + 导入 SQL ✅ 完成
第三阶段 配置 PHP 时区 ✅ 完成
第三阶段 启动 Zabbix Server 完成

四、详细操作记录

4.1 Ansible 安装(master)
复制代码
# 配置 SSH 免密(master → node1/node2)
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
ssh-copy-id root@192.168.116.169
ssh-copy-id root@192.168.116.170

# 安装 EPEL 源和 Ansible
yum install -y epel-release
yum install -y ansible

# 配置 Inventory
cat > /etc/ansible/hosts << 'EOF'
[node1]
192.168.116.169
[node2]
192.168.116.170
[all:vars]
ansible_user=root
ansible_ssh_private_key_file=/root/.ssh/id_rsa
EOF

# 验证
ansible all -m ping
4.2 创建 Zabbix 数据库(node1)

已有环境 :node1 MySQL 已安装,root 密码为 jjsg_2yj

复制代码
# 登录 node1
ssh root@192.168.116.169

# 创建数据库和用户
mysql -uroot -p'jjsg_2yj' << EOF
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'zabbix'@'%' IDENTIFIED BY 'Zabbix@2026';
GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%';
FLUSH PRIVILEGES;
EOF
4.3 安装 Zabbix Server(master)
复制代码
# 添加 Zabbix 6.0 仓库
rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/7/x86_64/zabbix-release-6.0-4.el7.noarch.rpm
yum clean all

# 安装组件
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts
4.4 导入 Zabbix 初始 SQL

遇到的问题

复制代码
# 尝试导入(失败)
zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix
# 报错:No such file or directory

原因 :Zabbix 6.0 版本 SQL 文件拆分到了 /usr/share/zabbix-mysql/ 目录,需要按顺序导入。

解决

复制代码
cd /usr/share/zabbix-mysql

# 临时开启函数创建权限
mysql -h 192.168.116.169 -uroot -p'jjsg_2yj' -e "SET GLOBAL log_bin_trust_function_creators = 1;"

# 按顺序导入
mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix < schema.sql
mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix < images.sql
mysql -h 192.168.116.169 -uzabbix -p'Zabbix@2026' zabbix < data.sql

# 恢复设置
mysql -h 192.168.116.169 -uroot -p'jjsg_2yj' -e "SET GLOBAL log_bin_trust_function_creators = 0;"
4.5 配置 Zabbix Server
复制代码
# 修改配置文件
vi /etc/zabbix/zabbix_server.conf

修改以下参数:

复制代码
DBHost=192.168.116.169
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix@2026
4.6 配置 PHP 时区
复制代码
sed -i 's/^;date.timezone =/date.timezone = Asia\/Shanghai/' /etc/php.ini
systemctl restart httpd
4.7 启动 Zabbix Server(卡住)
复制代码
systemctl start zabbix-server
systemctl status zabbix-server

输出:

复制代码
Active: failed (Result: exit-code)
Main PID: 16929 (code=exited, status=1/FAILURE)

排查过程

步骤1:查看日志文件
复制代码
tail -100 /var/log/zabbix/zabbix_server.log

原因:zabbix 用户不存在,且配置文件路径不对。

步骤2:创建 zabbix 用户
复制代码
useradd -r -s /sbin/nologin zabbix
步骤3:修复配置文件路径和权限
复制代码
# 配置文件实际在 /etc/zabbix/ 下,程序默认找 /etc/
ln -s /etc/zabbix/zabbix_server.conf /etc/zabbix_server.conf

# 设置目录权限
chown -R zabbix:zabbix /etc/zabbix
chmod 644 /etc/zabbix/zabbix_server.conf
步骤4:创建 PID 和日志目录
复制代码
mkdir -p /var/log/zabbix /var/run/zabbix
chown -R zabbix:zabbix /var/log/zabbix /var/run/zabbix
步骤5:完整配置文件内容
复制代码
cat > /etc/zabbix/zabbix_server.conf << 'EOF'
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=10
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=192.168.116.169
DBName=zabbix
DBUser=zabbix
DBPassword=Zabbix@2026
StartPollers=5
StartPollersUnreachable=1
StartTrappers=5
StartPingers=1
StartDiscoverers=1
StartHTTPPollers=1
Timeout=4
EOF
步骤6:手动启动测试
复制代码
sudo -u zabbix /usr/sbin/zabbix_server -f -c /etc/zabbix/zabbix_server.conf

看到 Press Ctrl+C to exit 表示成功。

步骤7:用 systemctl 启动
复制代码
systemctl start zabbix-server-mysql
systemctl status zabbix-server-mysql
复制代码
systemctl enable zabbix-server

4.9 Zabbix Web 界面访问异常排查

Zabbix Server 启动成功后,浏览器访问 http://192.168.116.168/zabbix,尝试进入 Web 安装界面。

结果:访问失败,先后遇到了六种不同的错误。


4.9.1 503 Service Unavailable

现象

浏览器显示 Service Unavailable,页面无法访问。

排查

复制代码
systemctl status httpd      # Apache 正常
systemctl status php-fpm    # PHP-FPM 未启动

原因:PHP-FPM 服务没有运行。

解决

复制代码
systemctl start php-fpm

结果:启动失败,出现新错误。


4.9.2 PHP-FPM 启动失败:listen.acl_users 不支持

现象

复制代码
systemctl start php-fpm
# Job for php-fpm.service failed

查看错误日志

复制代码
journalctl -u php-fpm -n 30 --no-pager

错误日志

复制代码
ERROR: [/etc/php-fpm.d/zabbix.conf:6] unknown entry 'listen.acl_users'
ERROR: FPM initialization failed

原因/etc/php-fpm.d/zabbix.conf 中的 listen.acl_users 配置项在当前 PHP 版本(5.4)中不支持

解决

复制代码
# 注释掉不支持的配置项
sed -i 's/^listen.acl_users/# listen.acl_users/' /etc/php-fpm.d/zabbix.conf

# 重新启动 PHP-FPM
systemctl start php-fpm
systemctl status php-fpm

结果:503 错误消失,但出现 500 错误。


4.9.3 500 Internal Server Error(PHP 版本太低)

现象

浏览器显示 HTTP ERROR 500

复制代码
php -v
# 输出 PHP 5.4.16

原因:Zabbix 6.0 要求 PHP 7.2.5 以上,CentOS 7 默认的 PHP 5.4 版本太低。

解决:升级 PHP 到 7.4

复制代码
# 安装 REMI 仓库
yum install -y epel-release
yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# 启用 PHP 7.4 模块
yum-config-manager --enable remi-php74
# 安装 PHP 7.4 及相关模块
yum install -y php php-fpm php-mysqlnd php-gd php-xml php-bcmath php-ldap php-mbstring php-json
# 创建软链接
ln -sf /usr/bin/php74 /usr/bin/php

# 验证版本
php -v
# 输出 PHP 7.4.33

4.9.4 PHP 7.4 的 php-fpm 启动失败(端口占用)

现象

复制代码
systemctl start php74-php-fpm
# 启动失败

查看错误

复制代码
journalctl -u php74-php-fpm -n 30 --no-pager

错误日志

复制代码
ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use

原因:旧的 PHP-FPM(版本 5.4)还在运行,占用了 9000 端口。

排查

复制代码
netstat -tlnp | grep 9000
# 显示旧的 php-fpm 进程占用

解决

复制代码
# 停止旧版 php-fpm
systemctl stop php-fpm
systemctl disable php-fpm

# 杀掉残留进程
pkill -f php-fpm

# 启动 PHP 7.4 的 php-fpm
systemctl start php74-php-fpm
systemctl enable php74-php-fpm
systemctl status php74-php-fpm

4.9.5 浏览器显示 PHP 源代码(Apache 配置错误)

现象

访问 Zabbix 页面时,浏览器直接显示 PHP 代码,而不是正常页面。

复制代码
curl http://192.168.116.168/zabbix
# 返回 <?php 开头的源代码

排查

复制代码
# 查看 Apache 配置
cat /etc/httpd/conf.d/zabbix.conf | grep -A2 "FilesMatch"

发现配置为:

复制代码
<FilesMatch \.(php|phar)$>
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

原因<FilesMatch \.(php|phar)$> 的正则表达式写法错误。Apache 要求正则表达式用双引号包裹。

解决

改为:

复制代码
<FilesMatch "\.(php|phar)$">
    SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>

4.9.6 500 Internal Server Error(权限不足)

现象

原因 :Zabbix 需要读取 /etc/zabbix/web/ 目录下的配置文件,但 Apache 用户(apache)没有读取权限。

解决

复制代码
# 查看当前权限
ls -la /etc/zabbix/web/

# 修复权限
chown -R apache:apache /etc/zabbix/web/
chmod 755 /etc/zabbix/web/
chmod 644 /etc/zabbix/web/*.inc.php 2>/dev/null

重启 Apache

复制代码
systemctl restart httpd

结果 :访问 http://192.168.116.168/zabbix,正常显示 Zabbix 安装向导页面。


4.9.7 复盘
错误 原因 解决方案
503 Service Unavailable PHP-FPM 未启动 systemctl start php-fpm
PHP-FPM 启动失败 listen.acl_users 不支持 注释该配置项
500 Internal Error PHP 5.4 版本太低 升级到 PHP 7.4
PHP 7.4 启动失败 端口 9000 被占用 停止旧 php-fpm
显示 PHP 源代码 Apache FilesMatch 语法错误 修正正则表达式
500 Internal Error /etc/zabbix/web/ 权限不足 修改目录权限

关键经验

  1. CentOS 7 默认 PHP 5.4 不满足 Zabbix 6.0 要求,需要升级到 PHP 7.4

  2. /etc/php-fpm.d/zabbix.conf 中的 listen.acl_users 在低版本 PHP 中不支持,需要注释

  3. 升级 PHP 后,旧版本的 php-fpm 会占用 9000 端口,必须先停止

  4. Apache 的 <FilesMatch> 正则表达式必须用双引号包裹

  5. 查看 /var/log/httpd/error_log 是定位 500 错误最有效的手段

六、小结

本篇完成了 Zabbix 监控系统的核心部署:

  • Ansible 批量管理环境

  • Zabbix Server 6.0 + MySQL 数据库

  • PHP 7.4 升级与 Apache 配置修复

  • Zabbix Web 界面成功登录

下篇预告:安装 Zabbix Agent 将三台机器纳入监控,对接 Grafana 实现可视化大屏,并配置 K8s Pod 状态监控。

本系列将持续更新,欢迎关注。

相关推荐
杨云龙UP1 小时前
一次 Oracle 11g 异常不可用排查:从 ORA-01034 到磁盘 I/O 故障定位_2026-05-17
运维·数据库·windows·sql·oracle·centos
艾莉丝努力练剑1 小时前
【Linux网络】Linux 网络编程:HTTP(二)HTTP协议请求应答宏观格式(附代码演示)
linux·运维·服务器·网络·tcp/ip·计算机网络
Donk_671 小时前
高可用-Keepalived 解析
运维·服务器·apache
fiveym1 小时前
Linux systemctl服务管理全解析:命令+原理+运维最佳实践
linux·运维·服务器
learning-striving2 小时前
华为云欧拉操作系统的服务器实例中手工部署 Docker
linux·运维·服务器·docker·容器·华为云
小此方2 小时前
Re:Linux系统篇(十五)工具篇 ·六:GDB 调试从底层逻辑到高阶实战
linux·运维·服务器·chrome
白菜欣10 小时前
Linux — 进程控制
android·linux·运维
JoneBB10 小时前
ABAP Webservice连接
运维·开发语言·数据库·学习
Tolalal11 小时前
Vmware Ubuntu虚拟机扩容
linux·运维·ubuntu