在已经配置好 Traefik、cert-manager、Cloudflare DNS-01 和全局通配符证书的 k3s 上,部署 Zabbix Server、Web、PostgreSQL 数据库和四台 Agent 2。入口与证书基础设施见K3s Traefik 接管 Nginx 公网入口迁移实战。
架构与组件
本篇部署内容:
- Zabbix Server 7.4;
- Zabbix Web 7.4;
- Patroni PostgreSQL 数据库;
- 四台 Zabbix Agent 2;
- Traefik HTTPS Ingress。
分步部署
入口与证书前置条件
开始部署前,确认第一篇中的 Traefik 入口基础设施已经就绪:
k3s kubectl -n kube-system get certificate/hyperbola-cc-wildcardk3s kubectl -n kube-system get tlsstore/defaultk3s kubectl -n kube-system rollout status deployment/traefik证书 Secret 位于 kube-system,由 Traefik TLSStore/default 在 TLS 终止层全局使用;Zabbix namespace 不复制、也不跨 namespace 引用该 Secret。
初始化 Patroni PostgreSQL
数据库使用写端点 10.0.0.100:5432,不能误用只读端口 5433。
自动化流程:
- 检查
zabbix-dbSecret; - 不存在则生成随机应用密码;
- 从 Patroni 配置读取 superuser 密码;
- 幂等创建/更新
zabbixrole; - 幂等创建
zabbixdatabase; - 确保数据库 owner 正确;
- 所有凭据任务设置
no_log: true。
部署 Server 和 Web
镜像:
zabbix/zabbix-server-pgsql:alpine-7.4-latest;zabbix/zabbix-web-nginx-pgsql:alpine-7.4-latest。
两个 Deployment 都配置:
- 数据库 Secret 引用;
- readiness probe;
- CPU/memory request 与 limit;
IfNotPresent拉取策略。
配置 Traefik Ingress
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: zabbix-web namespace: zabbix annotations: traefik.ingress.kubernetes.io/router.entrypoints: websecurespec: ingressClassName: traefik rules: - host: zabbix.hyperbola.cc http: paths: - path: / pathType: Prefix backend: service: name: zabbix-web port: name: httpIngress 不声明 namespace 本地 tls.secretName,HTTPS 由 websecure EntryPoint 和 kube-system/default TLSStore 提供。HTTP→HTTPS 也已在 Traefik EntryPoint 全局处理,不需要 Zabbix 专属 HTTP Ingress。
Zabbix trapper 暴露到 10.0.0.100:10051。当前 Service 使用 externalIPs,新 Kubernetes 会产生 deprecated 警告;应规划 kube-vip/MetalLB,但在替代方案上线前不要直接删除。
安装 Agent 2
Server=10.0.0.0/24,10.42.0.0/16ServerActive=10.0.0.100:10051Hostname=serverServerActive:主动式,Agent 连接 Server 获取检查项并上报;Server:被动式,允许节点和 Pod 网段访问 10050;Hostname:必须与 Zabbix Host name 完全一致。
安装仓库后的 apt cache 坑
安装 zabbix-release 后必须强制刷新缓存:
- name: Install Zabbix Agent 2 and plugins ansible.builtin.apt: name: "{{ ['zabbix-agent2'] + zabbix_agent2_plugins }}" state: present update_cache: true cache_valid_time: 0否则 apt 会复用添加仓库之前的缓存,并误报 zabbix-agent2-plugin-postgresql 不存在。
Agent 在线但 UI 没数据
四台 Agent 均 active、监听 10050,agent.ping 返回 [s|1],Server 也收到 heartbeat,但日志显示:
host [server] not foundhost [wsl] not foundhost [txy] not foundhost [aly] not foundZabbix 不会根据 heartbeat 自动创建 Host。必须在 UI/API 创建:
| Host name | IP | 模板 |
|---|---|---|
server | 10.0.0.10 | Linux by Zabbix agent active |
wsl | 10.0.0.20 | Linux by Zabbix agent active |
txy | 10.0.0.30 | Linux by Zabbix agent active |
aly | 10.0.0.40 | Linux by Zabbix agent active |
默认 Zabbix server Host 与 Hostname=server 不一致,应禁用、删除或修改。
踩坑清单
- Patroni 和数据库密码任务必须
no_log。 - 新 apt 仓库安装后必须强制刷新 cache。
- sudo PATH 缺
/usr/sbin会让 dpkg 找不到系统工具。 externalIPs已 deprecated,需要后续替代方案。- Agent heartbeat 成功不代表 Host 自动注册。
- 默认 Host 名称与 Agent Hostname 不一致。
验收
k3s kubectl -n kube-system get certificate,secret,tlsstorek3s kubectl -n zabbix get deployments,services,ingresses
k3s kubectl get pods -A \ --field-selector=status.phase!=Running,status.phase!=Succeeded
systemctl is-active zabbix-agent2/usr/sbin/zabbix_agent2 -t agent.ping
k3s kubectl -n zabbix logs deployment/zabbix-server \ --since=30m | grep -E 'host .* not found|cannot process heartbeat'完整顶层 Playbook
---- name: Move host Nginx away from Traefik ports hosts: server:txy:aly become: true gather_facts: false
roles: - role: host_nginx_high_port
- name: Configure the container registry mirror on k3s nodes hosts: servers become: true gather_facts: false serial: 1
roles: - role: k3s_registry_mirror
- name: Restore Traefik and deploy Zabbix Server in k3s hosts: server become: true gather_facts: false serial: 1
roles: - role: k3s_traefik - role: zabbix_server_k3s
- name: Install and configure Zabbix Agent 2 on servers hosts: servers become: true gather_facts: true environment: PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
roles: - role: zabbix_agent2ANSIBLE_CONFIG="$HOME/.config/ansible/ansible.cfg" \ ansible-playbook --syntax-check playbook.yml
ANSIBLE_CONFIG="$HOME/.config/ansible/ansible.cfg" \ ansible-playbook playbook.yml部署结束后,仍需在 Zabbix UI/API 注册四个 Host,否则主动 Agent 会持续报告 host not found。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时
湘公网安备43010402002198号