OS: openSUSE Leap 15.3 in GCP
Zabbix: 6.0 docker image
Cloud SQL: Postgres SQL

今天這篇 Zabbix 的安裝小記應該會更貼近提供服務的架構
先談一下規劃的想法
Zabbix 的服務提供使用容器的方式來提供
DB 的部份使用 Cloud SQL with Pregres SQL 來提供服務, 好處是全代管 / HA / 以及方便擴充 …
規劃兩個 Load Balancer 來對應 Zabbix 管理 以及 Zabbix agent 回報資訊
首先來建立 Cloud SQL
登入 GCP 並且到 Cloud SQL 頁面
點選 +CREATE INSTANCE

點選 Choose PostgreSQL

輸入 instance ID 名稱
輸入 DB密碼
選取 Database 版本 ( 我這邊使用 PostgreSQL 13, 請依照自己的需求調整 )
選取 Region ( 我這邊選的是 Taiwan )
Zonal availability 選 Multiple zone (Highly available) ( Primary zone 要不要指定看個人 )

Machine type 的部份
因為是實驗使用
我使用 Custom ( 1 vCPU / 3.75 GB Memory ) ( 請依照專案需求調整 )
Storage 使用 HDD 並自訂大小 500 GB ( 請依照專案需求調整 )

Connections 的部份
專案本身的 VPC 已經有建立自訂的 VPC 以及 Subnet
取消勾選 Public IP
勾選 Private IP
選取自訂的 VPC

如果遇到必須使用私人服務存取連線的提示
點選 SET UP CONNECTION
點選 ENABLE API

點選 Select one or more existing IP ranges or create a new one
點選 下拉式選單
點選 ALLOCATE A NEW IP RANGE

輸入 名稱, 輸入 分配的 IP 位址範圍
點選 CONTINUE

確認相關資訊
點選 CREATE CONNECTION

確認相關資訊

其他的部份按照預設
點選 CREATE INSTANCE
需要一點時間來建立
確認 Instance 已經建立完成

點選左方的 Databases 選單
點選 CREATE DATABASE

輸入 Database 名稱 zabbix
點選 CREATE

接下來進行 Zabbix with container 的部份
在 GCP 建立 openSUSE leap 15.3 的 VM ( Compute Engine )
使用 Web SSH 或是 SSH 連入 openSUSE Leap 15.3, 並切換為 root
啟用 docker 服務, 設定開機啟動
# systemctl start docker
# systemctl enable docker
建立 zabbix-net 網路
# docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net
啟動相關 container

# docker run --name zabbix-snmptraps -t \
-v /zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw \
-v /var/lib/zabbix/mibs:/usr/share/snmp/mibs:ro \
--network=zabbix-net \
-p 162:1162/udp \
--restart unless-stopped \
-d zabbix/zabbix-snmptraps:alpine-6.0-latest
# docker run --name zabbix-server-pgsql -t \
-e DB_SERVER_HOST="YOUR_DB_IP" \
-e POSTGRES_USER="postgres" \
-e POSTGRES_PASSWORD="YOUR_PW" \
-e POSTGRES_DB="zabbix" \
-e ZBX_ENABLE_SNMP_TRAPS="true" \
--network=zabbix-net \
-p 10051:10051 \
--volumes-from zabbix-snmptraps \
--restart unless-stopped \
-d zabbix/zabbix-server-pgsql:alpine-6.0-latest
DB_SERVER_HOST 的部份請對應到 Cloud SQL 的內部IP
POSTGRES_USER 對應到 CLOUD SQL 的 User name
POSTGRES_PASSWORD 對應到當初建立 Cloud SQL 輸入的密碼
可以參考 Cloud SQL 的頁面資訊


然後記得要在 GCP 的 Firewall 上面開放 port 10051 的存取
# docker run --name zabbix-web-nginx-pgsql -t \
-e ZBX_SERVER_HOST="zabbix-server-pgsql" \
-e DB_SERVER_HOST="YOUR_DB_IP" \
-e POSTGRES_USER="postgres" \
-e POSTGRES_PASSWORD="YOUR_PW" \
-e POSTGRES_DB="zabbix" \
-e PHP_TZ="Asia/Taipei" \
--network=zabbix-net \
-p 443:8443 \
-p 80:8080 \
-v /etc/ssl/nginx:/etc/ssl/nginx:ro \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest
確認 container 狀態
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
238e05935125 zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest "docker-entrypoint.sh" 14 seconds ago Up 12 seconds 0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp zabbix-web-nginx-pgsql
b6d16347aa21 zabbix/zabbix-server-pgsql:alpine-6.0-latest "/sbin/tini -- /usr/…" 5 minutes ago Up 5 minutes 0.0.0.0:10051->10051/tcp, :::10051->10051/tcp zabbix-server-pgsql
812544455ecd zabbix/zabbix-snmptraps:alpine-6.0-latest "/usr/sbin/snmptrapd…" 12 minutes ago Up 12 minutes 0.0.0.0:162->1162/udp, :::162->1162/udp zabbix-snmptraps
等等要安裝 Zabbix agent 監控 Zabbix Server 自己, 先觀察剛剛建立 zabbix-net 網段使用狀況
# docker network inspect zabbix-net
[
{
"Name": "zabbix-net",
"Id": "4af902735988ad791a12dbbb98afd1c88ec00de061c6c5ffb712ef78503e19d0",
"Created": "2022-05-12T13:53:29.638267706Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.20.0.0/16",
"IPRange": "172.20.240.0/20"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"238e05935125afddf96794c674d3961a3de06741891bfe071c2c350ab0a764c1": {
"Name": "zabbix-web-nginx-pgsql",
"EndpointID": "0508d9d715ba3c78add4fc22d02e93af9cd740664e4a08e6639d8e8ce5a57bcc",
"MacAddress": "02:42:ac:14:f0:03",
"IPv4Address": "172.20.240.3/16",
"IPv6Address": ""
},
"812544455ecdfc79882cd1ec57e98a29dfd37b7c3c748b727e5884b2d5a15491": {
"Name": "zabbix-snmptraps",
"EndpointID": "2f1612243e2cc97ff942204b9c7c19779f5e45d446e8f3d5f4fce49cec29e018",
"MacAddress": "02:42:ac:14:f0:01",
"IPv4Address": "172.20.240.1/16",
"IPv6Address": ""
},
"b6d16347aa216ca6ff2f683bde533604207f5eb7285899ab4a06adebb1f12d57": {
"Name": "zabbix-server-pgsql",
"EndpointID": "206cdf98adda30bdea8f0584749e974b8d347d5e2dcbb335200e8a607e49d85a",
"MacAddress": "02:42:ac:14:f0:02",
"IPv4Address": "172.20.240.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
這邊可以觀察到 目前 zabbix-server-pgsql 的 IP 為 172.20.240.2
# docker run --name zabbix-agent \
--network=zabbix-net \
-e ZBX_HOSTNAME="zabbix-server" \
-e ZBX_SERVER_HOST="172.20.240.2" \
--privileged \
--restart unless-stopped \
-d zabbix/zabbix-agent2:alpine-6.0-latest
ZBX_HOSTNAME 為要登記到 host 的主機名稱, 必須與 Configuration -- > Host 上面的 Host name 一致
ZBX_SERVER_HOST 為Server 的 IP 或是 FQDN
使用 --privileged 來啟用 Privileged mode, 有使用 Privileged 的話 Graph 會多了磁碟的相關資訊
因為 預設的 Zabbix Server host 設定無法移除 Interface 設定, 所以這個部份採取 Passive 的方式來進行, 然後是在此主機的 zabbix-net 比較沒有相關顧慮
執行 Zabbix 管理者密碼變更
在 GCP 的 Firewall 建立只允許自己固定IP 連入 port 80 的規則

在剛剛建立的 openSUSE Leap 15.3 套用 Network tags, 讓防火牆生效
開啟網頁 http://YOUR_SERVER_IP

登入 Zabbix
變更 Zabbix Admin 密碼 ( 建議馬上變更 )
Zabbix Server 的主機設定更新 ( 讓 zabbix agent 對應正確 )
在 Zabbix 頁面
點選 Zabbix server

Host name 的部份填入剛剛 zabbix agent 2 的 ZBX_HOSTNAME ( zabbix-server )
Interfaces Agent 的 IP 從 127.0.0.1 改為目前 agent IP, 例如 172.20.240.4 ( 透過 #docker network inspect zabbix-net 查詢 Client IP )
點選 Update
放一段時間就會看到正常了


最後來建置 Load Balancer
如同我們上面的架構圖, 因為目前我們是將角色使用容器的方式放在 1 台 GCE 上面來執行, 上面有兩個角色會使用到
zabbix-web-nginx-pgsql
zabbix-server-pgsql
這邊規劃使用 2 個 Load Balancer 來接收上述兩個需求, 使用 LB 的好處是可以保持機器調度的彈性, Client 只要單一指向 LB 的 IP 或是 FQDN, 後面的架構要如何調整不會受到影響
但是由於我們是將這兩個角色放在一個 GCE 上面, 原則上 GCE 不能同時被 2 個 LB 連接, 所以另外一個使用 Network Endpoint Group (NEG) 來處理.
目前規劃如下
首先來建立 TCP Load Balancer
在建立 Load balancer 之前, 我們先來建立 Unmanaged Instance Group 來指向我們的 GCE, 好讓等等的 LB 可以指定到我們的 GCE.
點選 左上角選單 Compute Engine -- > Instance groups
點選 CREATE INSTANCE GROUP

點選 New unmanaged instance group

輸入名稱
選取 Region and Zone

Network and instance 部份
選取 VM 所在的 Network 與 Subnet
選取 Zabbix 所在的 VM

Port mapping 的部份
點選 ADD PORT
輸入 Port name 以及對應的 port

點選 CREATE 建立 Unmanaged Instace Group

確認建立資訊

接下來建立 TCP Load Balancer
點選左上角 選單, 點選 Network services -- > Load balancing

點選 CREATE LOAD BALANCER

點選 TCP Load Balancing 的 START CONFIGURATION

這邊使用預設值即可
點選 CONTINUE

輸入名稱
選取 Region

右邊要設定 Backends
New backend 部份選取剛剛建立的 Unmanaged instance group
接下來要利用這個畫面建立 Health Check
點選 Health check 的下拉式選單, 點選 CREATE A HEALTH CHECK

輸入名稱
將 Port 改為 10051
點選 SAVE

確認 Backend 已經設定 UIG 以及 Health Check
點選 Frontend configuration

這邊主要要將 Port 指定到 10051
在 Port number 輸入 10051
IP address 的部份可以考慮設定 Static IP
點選 DONE

點選 Review and finalize
觀察是否有缺漏?
點選 CREATE 建立

補充資訊
建立完成之後, 可能會遇到 Health Check 沒過的狀況

那是因為我們使用自己建立的 VPC and Subnet, 要另外開 Firewall Rules 允許 Google進行 Health Check, 請見官方文件

建立相對應的 Firewall 檢查就過了

接下來處理 HTTP(S) Load Balancer 建立
跟之前一樣, 在建立 HTTP(S) Load Balancer 之前, 我們先來建立 Network endpoint group (NEG), 以方便等等 LB 的連接
點選左上角 選單, 點選 Compute Engine -- > Network endpoint groups

點選 CREATE NETWORK ENDPOINT GROUP
輸入 名稱
選取 Network / Subnet / Zone
輸入 Default port 80
點選 CREATE

觀察建立後的資訊
目前連接的 Network endpoints 為 0

點選剛剛建立的 Network endpoint group ( neg-zabbix )
點選 ADD NETWORK ENDPOINT

在 VM Instance 的地方, 選取 Zabbix 所在的 VM
IP address 的部份, 輸入 Zabbix VM 的內部IP
點選 CREATE

接下來建立 HTTP(S) Load Balancer
點選左上角 選單, 點選 Network services -- > Load balancing
點選 CREATE LOAD BALANCER
點選 HTTP(S) Load Balancing 的 START CONFIGURATION

這邊一樣使用預設值
點選 CONTINUE

輸入 名稱

點選 Backend service & backend buckets 的下拉式選單
點選 CREATE A BACKEND SERVICE

輸入名稱
Backend type: 選取 Zonal network endpoint group
Protocol: 選取 HTTP

點選 Network endpoint group 的下拉式選單
選取剛剛建立的 Network endpoint group
設定 Maximum RPS (請按照需求設定)
點選 DONE

接下來設定 Health check
點選 Health Check 的下拉式選單
點選 CREATE A HEALTH CHECK

輸入名稱
其他按照預設值
點選 SAVE

點選 CREATE

點選 OK
這樣 Backend 的部份就設定完成

點選 Frontend configuration

輸入名稱
Protocol: 選取 HTTPS(includes HTTP/2)

接下來處理憑證的部份
點選 Certificate 的下拉式選單
點選 CREATE A NEW CERTIFICATE

輸入名稱
這邊我是用自己的憑證
Certificate 的部份要貼上 公鑰與中繼憑證合併
Private Key 就貼上私鑰
點選 CREATE

點選 Review and finalize
確認資訊無誤
點選 CREATE

確認 Load Balancer 狀態

最後一個步驟
建立一筆 FQDN 指向剛剛建立的 HTTP(S) Load balancer
例如 zabbix.YOUR.DOMAIN -- > 指向 LP IP
開啟 https://zabbix.YOUR.DOMAIN
確認可以正常使用 https 登入 Zabbix
~ 收工
~ Enjoy it
Reference