星期日, 5月 15, 2022

Zabbix Server 6.0 with container in GCP 安裝小記

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 / 以及方便擴充 … 

  • 規劃兩個 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 就貼上私鑰

點選 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



沒有留言: