Zabbix Server 6.0 with container in GCP 安裝小記
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 / 以及方便擴充 …
Cloud SQL 的介紹 https://cloud.google.com/sql
規劃兩個 Load Balancer 來對應 Zabbix 管理 以及 Zabbix agent 回報資訊
Zabbix 管理者或是 Zabbix agent 回報對應到 LB, 對之後的資源調度以及調整保留彈性
首先來建立 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 位址範圍
請勿與地端的 IP 位址重複
點選 CONTINUE
確認相關資訊
點選 CREATE CONNECTION
確認相關資訊
其他的部份按照預設
點選 CREATE INSTANCE
需要一點時間來建立
確認 Instance 已經建立完成
點選左方的 Databases 選單
點選 CREATE DATABASE
輸入 Database 名稱 zabbix
點選 CREATE
這邊大概就是使用 Cloud SQL 的好處之一, 可以直接在介面上建立 database
如果是使用 openSUSE 可能要使用 #zypper install postgresql 然後使用 psql -h xxx.xxx.xxx.xxx -U postgres 來進行連線, 然後再下 CREATE DATABASE zabbix;
接下來進行 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 TZ=Asia/Taipei \
-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 輸入的密碼
加入 TZ=Asia/Taipei 之後發通知的時候才會對應到正確的時區
可以參考 Cloud SQL 的頁面資訊
然後記得要在 GCP 的 Firewall 上面開放 port 10051 的存取
這樣之後 zabbix client 來存取的時候才不會 Timeout
# 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
這個部份我用 #docker network inspect zabbix-net 查詢 Server IP
使用 --privileged 來啟用 Privileged mode, 有使用 Privileged 的話 Graph 會多了磁碟的相關資訊
因為 預設的 Zabbix Server host 設定無法移除 Interface 設定, 所以這個部份採取 Passive 的方式來進行, 然後是在此主機的 zabbix-net 比較沒有相關顧慮
執行 Zabbix 管理者密碼變更
在 GCP 的 Firewall 建立只允許自己固定IP 連入 port 80 的規則
我個人比較喜歡用 Tag 方式來套用, 不是全部套用
在剛剛建立的 openSUSE Leap 15.3 套用 Network tags, 讓防火牆生效
開啟網頁 http://YOUR_SERVER_IP
登入 Zabbix
預設帳號 Admin
密碼 zabbix
變更 Zabbix Admin 密碼 ( 建議馬上變更 )
User settings -- > Profile -- > Change password
Zabbix Server 的主機設定更新 ( 讓 zabbix agent 對應正確 )
在 Zabbix 頁面
Configuration -- > Hosts
點選 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 服務管理與資訊呈現 -- port 80
zabbix-server-pgsql
接收 Zabbix agent 主動回報的資訊 -- port 10051
這邊規劃使用 2 個 Load Balancer 來接收上述兩個需求, 使用 LB 的好處是可以保持機器調度的彈性, Client 只要單一指向 LB 的 IP 或是 FQDN, 後面的架構要如何調整不會受到影響
但是由於我們是將這兩個角色放在一個 GCE 上面, 原則上 GCE 不能同時被 2 個 LB 連接, 所以另外一個使用 Network Endpoint Group (NEG) 來處理.
目前規劃如下
建立 TCP Load Balancer ( L4 )
接收 Zabbix Agent 主動回報的資訊
後端使用 NEG 來連接 GCE
建立 HTTP(S) Load Balancer ( L7 )
用來管理 Zabbix Server 相關設定與資訊的呈現
後端使用 Unmanaged Instance Group 來指定
在 Load Balancer 上面綁定憑證, 讓外部連線使用 Https 連線
首先來建立 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 就貼上私鑰
憑證的部份可以參考我之前的文章 https://sakananote2.blogspot.com/2022/04/certbot-ssl-with-opensuse-leap-153-in.html
Certificate 就貼上 fullchain.pem 的內容
點選 CREATE
點選 Review and finalize
確認資訊無誤
點選 CREATE
確認 Load Balancer 狀態
Firewall 要允許的部份, 已經在上面說過了, 記得要開
最後一個步驟
建立一筆 FQDN 指向剛剛建立的 HTTP(S) Load balancer
例如 zabbix.YOUR.DOMAIN -- > 指向 LP IP
開啟 https://zabbix.YOUR.DOMAIN
確認可以正常使用 https 登入 Zabbix
~ 收工
~ Enjoy it
Reference
https://sakananote2.blogspot.com/2022/02/zabbix-server-60-with-container-in-azure.html
Microfusion 夥伴的幫忙 / 強者同事的筆記
https://sakananote2.blogspot.com/2022/04/certbot-ssl-with-opensuse-leap-153-in.html
沒有留言:
張貼留言