はじめに
Zabbix 6.0 が 2022.02.14 に リリース された
Kubernetes 監視や TLS/SSL証明書ネイティブ監視が実装されたので、試してみた内容を記載する
記載している内容
- Zabbix 6.0 install (docker-compose)
- Kubernetes クラスタへ Zabbix-Agent 設定 (Zabbix helm)
- Zabbix 6.0 での Kubernetes 向け設定テスト (デフォルトにある 2テンプレート適用例)
- Zabbix 6.0 での SSL/TLS 証明書監視設定テスト
実施環境
-
Docker サーバ (Zabbix Docker インストール先)
- CentOS Linux release 7.9.2009 (Core)
- 2vCPU / 4GB Mem
- docker : docker-ce 20.10.12
-
Kubernetes Cluster (監視試験対象用)
- kubernetes version : v1.21.6
- 3 master node, 3 worker node, 2 calico node
- kubespray (v2.17.1) での構築クラスタ (詳細)
Zabbix 6.0 install (docker-compose)
zabbix-dockerを使用して Docker サーバ上に Zabbix 6.0 を構築する
前提: docker-ce インストール済み Linux サーバ上で実施
下記コマンドで必要な資材をダウンロードする
git clone https://github.com/zabbix/zabbix-docker.git -b 6.0.0
cd zabbix-docker/
curl -L https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` -o ./docker-compose
chmod +x docker-compose
Kubernetes 監視をすると CACHE サイズが足りなくなりサーバがクラッシュ (please increase CacheSize configuration parameter
とかログをはいて zabbix-server がストップ)するので、
各 CACHESIZE を上げておく (必要 SIZE は環境による)
cp -p env_vars/.env_srv env_vars/.env_srv.org
vi env_vars/.env_srv
- # ZBX_CACHESIZE=8M
- # ZBX_HISTORYCACHESIZE=16M
- # ZBX_HISTORYINDEXCACHESIZE=4M
- # ZBX_TRENDCACHESIZE=4M
- # ZBX_TRENDFUNCTIONCACHESIZE=4M
- # ZBX_VALUECACHESIZE=8M
+ ZBX_CACHESIZE=128M
+ ZBX_HISTORYCACHESIZE=128M
+ ZBX_HISTORYINDEXCACHESIZE=128M
+ ZBX_TRENDCACHESIZE=128M
+ ZBX_TRENDFUNCTIONCACHESIZE=128M
+ ZBX_VALUECACHESIZE=128M
docker-compuse (下記コマンド)で起動する
./docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml --profile=full up -d
※centos版は更新がなく、2022.02.19実施時にはdocker-compose_v3_centos_mysql_latest.yaml
を指定してもimageが見当たらず起動できなかった
※mysql 版は現状 (2022.02.20時点)正常に動かなそう
※--profile=full
(または all ) をつけないとzabbix-agent
が動かないので付けること (フィルタミスのBug?)
下記構築後の状態
# ./docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml ps
NAME COMMAND SERVICE STATUS PORTS
zabbix-docker-db_data_pgsql-1 "sh" db_data_pgsql exited (0)
zabbix-docker-postgres-server-1 "docker-entrypoint.s…" postgres-server running
zabbix-docker-zabbix-agent-1 "/usr/bin/tini -- /u…" zabbix-agent running
zabbix-docker-zabbix-java-gateway-1 "docker-entrypoint.s…" zabbix-java-gateway running
zabbix-docker-zabbix-server-1 "/usr/bin/tini -- /u…" zabbix-server running 0.0.0.0:10051->10051/tcp
zabbix-docker-zabbix-snmptraps-1 "/usr/sbin/snmptrapd…" zabbix-snmptraps running 0.0.0.0:162->1162/udp
zabbix-docker-zabbix-web-nginx-pgsql-1 "docker-entrypoint.sh" zabbix-web-nginx-pgsql running (healthy) 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp
zabbix-docker-zabbix-web-service-1 "docker-entrypoint.s…" zabbix-web-service running
起動後はブラウザでアクセス (User/Password はデフォルトの Admin
/Zabbix
)
Zabbix server の設定で、Agent の設定を DNS name
へ zabbix-agent
入力し、Connect to
をDNS
に設定して Update
する
うまくいくと、下記の通り、ZBX
がグリーンになる
以上で、Zabbix 6.0 環境準備は完了
Zabbix のその他設定や Slack 連携は、Zabbix 5.0 時点で記載したものがあるのでよければそちらも参照 (同様に実施できること確認済)
Zabbix Helm Chart
Kubernetes 監視のために、Zabbix Tools Kubernetes Helmを対象クラスタへインストールする
Prerequisites
Kubernetes Helmの前提条件は下記の通り
- Kubernetes cluster 1.18+
- Helm 3.0+
- Zabbix server 6.0+
- kube-state-metrics 2.13.2+
今回は Kubernetes v1.21.6 のオンプレ環境で実施した
Helm
Helm 3 をインストールする (下記コマンド参照先)
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
Deploy Zabbix in Kubernetes
Kubernetes Helmをインストールする (サイトにあるREDEME手順とほぼ同じ)
cd ~
git clone https://git.zabbix.com/scm/zt/kubernetes-helm.git
cd kubernetes-helm
helm show values . > ./zabbix_values.yaml
kubectl get namespaces
インストール先の namespace を作成する (ここでは、サイト例と同じ monitoring にしているが変更可能)
kubectl create namespace monitoring
helm install zabbix . --dependency-update -f ./zabbix_values.yaml -n monitoring
下記出力例
$ helm install zabbix . --dependency-update -f ./zabbix_values.yaml -n monitoring
W0219 20:41:39.032102 1509337 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0219 20:41:39.110818 1509337 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME: zabbix
LAST DEPLOYED: Sat Feb 19 20:41:38 2022
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing zabbix-helm-chrt.
Your release is named zabbix.
Zabbix agent installed: "zabbix/zabbix-agent2:alpine-trunk"
Zabbix proxy installed: "zabbix/zabbix-proxy-sqlite3:alpine-trunk"
Annotations:
app.kubernetes.io/name: zabbix-zabbix-helm-chrt
helm.sh/chart: zabbix-helm-chrt-0.0.1
app.kubernetes.io/version: "trunk"
app.kubernetes.io/managed-by: Helm
Service account created:
zabbix-service-account
To learn more about the release, try:
$ helm status zabbix
$ helm get all zabbix
上記でインストール完了
pod 一覧は下記のようになった (8ノードのクラスタの場合)
$ kubectl get ds -n monitoring
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
zabbix-agent 8 8 8 8 8 kubernetes.io/os=linux 2d20h
$ kubectl get deploy -n monitoring
NAME READY UP-TO-DATE AVAILABLE AGE
zabbix-kube-state-metrics 1/1 1 1 2d20h
zabbix-proxy 1/1 1 1 2d20h
$ kubectl get po -n monitoring
NAME READY STATUS RESTARTS AGE
zabbix-agent-5pngj 1/1 Running 1 2d20h
zabbix-agent-g6fp8 1/1 Running 1 2d20h
zabbix-agent-nwwkv 1/1 Running 1 2d20h
zabbix-agent-rb8j7 1/1 Running 1 2d20h
zabbix-agent-rgknp 1/1 Running 1 2d20h
zabbix-agent-tnknw 1/1 Running 1 2d20h
zabbix-agent-v59n8 1/1 Running 1 2d20h
zabbix-agent-zlxp9 1/1 Running 1 2d20h
zabbix-kube-state-metrics-78868498-7ddd4 1/1 Running 2 2d20h
zabbix-proxy-77c577b6d7-zn27x 1/1 Running 1 2d20h
$ kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zabbix-kube-state-metrics ClusterIP 10.233.60.196 <none> 8080/TCP 2d20h
zabbix-zabbix-helm-chrt-agent ClusterIP 10.233.29.90 <none> 10050/TCP 2d20h
zabbix-zabbix-helm-chrt-proxy ClusterIP 10.233.62.132 <none> 10051:30646/TCP 2d20h
削除方法
削除したい場合は、下記コマンドで全削除可能 (namespace以外)
helm delete zabbix -n monitoring
Kubernetes 向け設定テスト (デフォルトにある 2テンプレート使用)
ノード監視(Kubernetes nodes by HTTP)とクラスタ監視(Kubernetes cluster state by HTTP)の 2つのテンプレートが用意されているので実施する
※その他にある Kubernetes 向けテンプレートはクラスタ監視のテンプレートのディスカバリ後に作成されるホストで使用される
Kubernetes ノード監視
Kubernetes nodes by HTTP テンプレートを使用する
Configuration
> Create host
をクリックしてクラスタの各ノードのホストを追加する (ここでは 1ノードのみ記載)
Templates
にKubernetes nodes by HTTP
とその他ノード監視設定を選択する
Interfaces
> Agent
に各ノードの IP を入力する
Macros
タブで、下記マクロを設定する
Macro | Value | Default |
---|---|---|
{$KUBE.API.ENDPOINT} |
<scheme>://<host>:<port>/api (ここでは https://192.168.129.21:6443/api ) |
|
{$KUBE.API.TOKEN} | secret zabbix-service-account 内容結果(下記コマンド) | `` |
$KUBE.API.TOKEN
は、helm で install した際に zabbix が作成した secret から取得できる
kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d
Update
をクリックして設定を完了する
下記ノード登録後(8ノード分)の出力例
1ノードの Latest Data を見てみると TAG VALUES
に pod
があることが確認できる
pod
の 1つをクリックしてみると、下記のように Pod の情報を見ることができる
以上で Kubernetes ノード監視設定完了
Kubernetes コンポーネント監視
Kubernetes cluster state by HTTPテンプレートを使用する
Configuration
> Create host
をクリックしてクラスタ監視向けのホストを追加する
Templates
にKubernetes cluster state by HTTP
とその他ノード監視設定を選択する
Interfaces
> Agent
に Kubernetes のマスターノード 1台の IP を入力する
マクロの値は下記のように設定する
Macro | Value | Default |
---|---|---|
{$KUBE.API.HOST} | API の IP (ここでは 192.168.129.21 ) |
|
{$KUBE.API.TOKEN} | secret zabbix-service-account 内容結果(ノード登録時と同じ) | `` |
{$KUBE.API.CERT.EXPIRATION} *1 | 60 | "7" |
*1 : {$KUBE.API.CERT.EXPIRATION} は Kubernetes API server by HTTPテンプレートの Macro、デフォルトでは1週間前(7日)に証明書切れ通知を出してくれるが早めに欲しいので2ヶ月前(60日)にした。7日で十分な場合は設定不要
ディスカバリされた後に、各コンポーネントがホストで自動作成される
試しに API [ノード名]
の Latest Data を見てみると TAG VALUES
に Kubernetes API 関連のデータが表示されていることを確認でき、さまざまなデータが取得されていることが確認できる
以上で設定完了
動作テスト
存在しない Image を Pull する Deployment を apply して、
CrashLoopBackOff
を発生させてアラートが出るかをテストする
% kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-85f6b894d5-2pl5v 0/1 ImagePullBackOff 0 8m35s 10.233.94.16 k8worker02 <none> <none>
nginx-deployment-85f6b894d5-7cmr6 0/1 ImagePullBackOff 0 8m35s 10.233.94.14 k8worker02 <none> <none>
nginx-deployment-85f6b894d5-kxjnq 0/1 ImagePullBackOff 0 8m35s 10.233.75.13 k8worker01 <none> <none>
しばらく経つ(10分以上)と下記のようにアラートが出力され、Pod
の不具合が検知できることが確認できた
Slack 通知設定をしていると下記のようなアラートが出力される
次に、証明書期限切れアラート試験として{$KUBE.API.CERT.EXPIRATION}
を360
に変更して発報試験をする
反映されると(時間がかかる)、下記のようにアラートが出る
Slack 通知設定をしていると下記のようなアラートが出力される
以上で Kubernetes 監視(一部)テスト終了
SSL/TLS 証明書監視設定テスト
Zabbix 6.0 では SSL/TLS 証明書監視が実装された
Website certificate by Zabbix agent 2という Template が用意されている
ここでは手頃なサーバが用意できなかったので (Let'Encrypt + Webサーバとか立ててればよかったが今はなかった)、
Kubernetes API 向けに設定テストを実施する (Kubernetes テンプレートに含まれているので、Kubernetes テンプレート監視しているクラスタへは個別設定不要)
クラスタ設定に下記のようにテンプレートを追加する
設定マクロは下記のようにしている (ここではアラートを試験するために 360 日設定にしている。デフォルトは 7日前と短めなので要注意(30~60日にしておくと良いかも))
Macro | Value | Default |
---|---|---|
{$CERT.WEBSITE.HOSTNAME} | Kubernetes API の IP(この環境では 192.168.129.21) | |
{$CERT.WEBSITE.PORT} | 6443 | 443 |
{$CERT.EXPIRY.WARN} | 360 | 7 |
追加できたら Add する
TLS/SSL 証明書が自己署名証明書だと、invalid と判定されて、invalid だと証明書の expire 監視が有効にならないので切っておく (TLS/SSL 証明書が認証局のものであれば不要・実施してはいけない手順)
対象クラスタの Triggers
をクリックしてWebsite certificate by Zabbix agent 2: Cert: SSL certificate is invalid
を無効化(Disabled)
する
設定が完了すると下記のようなアラートになる
Slack 通知設定をしていると下記のようなアラートが出力される
データとしては下記のように取得できている
以上で TLS/SSL 証明書監視のテスト終了
おわりに
Zabbix 6.0 を docker-compose で構築して、機能テストができた
Kubernetes 監視機能をフルには試させてなかったりするので追加検証が必要そう
今回試したテンプレートで設定されているトリガー以外に、環境に合わせて監視テンプレート追加などを検討する必要もありそう
2022.06.05 追記) パスワードリセット
Admin パスワードをリセットしたい場合は、下記のように DB サーバに入ってAdmin
のパスワードをセットすることで実施可能
# ./docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml exec postgres-server bash
bash-5.1# psql -U zabbix -d zabbix
psql (13.6)
Type "help" for help.
zabbix=# update users set passwd=md5(‘リセットするパスワード’) where username='Admin';
参考