9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Zabbix 6.0 を docker-compose で構築して Kubernetes 監視を試す

Last updated at Posted at 2022-02-23

はじめに

Zabbix 6.0 が 2022.02.14 に リリース された
Kubernetes 監視TLS/SSL証明書ネイティブ監視が実装されたので、試してみた内容を記載する

記載している内容

実施環境

  • 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
.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)

スクリーンショット 2022-02-19 12.14.48.png

Zabbix server の設定で、Agent の設定を DNS name へ zabbix-agent 入力し、Connect toDNSに設定して Update する

スクリーンショット 2022-02-20 15.53.00.png

うまくいくと、下記の通り、ZBX がグリーンになる

スクリーンショット 2022-02-20 15.55.21.png

以上で、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ノードのみ記載)

TemplatesKubernetes nodes by HTTP とその他ノード監視設定を選択する
Interfaces > Agent に各ノードの IP を入力する

スクリーンショット 2022-02-23 12.27.57.png

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 から取得できる

$KUBE.API.TOKEN取得コマンド
kubectl get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d

スクリーンショット 2022-02-23 12.28.09.png

Update をクリックして設定を完了する

下記ノード登録後(8ノード分)の出力例

スクリーンショット 2022-02-23 14.51.24.png

1ノードの Latest Data を見てみると TAG VALUESpod があることが確認できる

スクリーンショット 2022-02-23 17.10.08.png

pod の 1つをクリックしてみると、下記のように Pod の情報を見ることができる

スクリーンショット 2022-02-23 17.12.30.png

以上で Kubernetes ノード監視設定完了

Kubernetes コンポーネント監視

Kubernetes cluster state by HTTPテンプレートを使用する

Configuration > Create host をクリックしてクラスタ監視向けのホストを追加する

TemplatesKubernetes cluster state by HTTP とその他ノード監視設定を選択する
Interfaces > Agent に Kubernetes のマスターノード 1台の IP を入力する

スクリーンショット 2022-02-23 14.54.32.png

マクロの値は下記のように設定する

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日で十分な場合は設定不要

スクリーンショット 2022-02-23 14.56.16.png

ディスカバリされた後に、各コンポーネントがホストで自動作成される

スクリーンショット 2022-02-23 14.59.15.png

試しに API [ノード名]の Latest Data を見てみると TAG VALUES に Kubernetes API 関連のデータが表示されていることを確認でき、さまざまなデータが取得されていることが確認できる

スクリーンショット 2022-02-23 17.21.07.png

以上で設定完了

動作テスト

存在しない 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の不具合が検知できることが確認できた

スクリーンショット 2022-02-23 14.20.36.png

Slack 通知設定をしていると下記のようなアラートが出力される

スクリーンショット 2022-02-23 14.22.44.png

次に、証明書期限切れアラート試験として{$KUBE.API.CERT.EXPIRATION}360に変更して発報試験をする

スクリーンショット 2022-02-23 16.10.05.png

反映されると(時間がかかる)、下記のようにアラートが出る

スクリーンショット 2022-02-23 16.07.35.png

Slack 通知設定をしていると下記のようなアラートが出力される

スクリーンショット 2022-02-23 16.08.52.png

以上で Kubernetes 監視(一部)テスト終了

SSL/TLS 証明書監視設定テスト

Zabbix 6.0 では SSL/TLS 証明書監視が実装された

Website certificate by Zabbix agent 2という Template が用意されている

ここでは手頃なサーバが用意できなかったので (Let'Encrypt + Webサーバとか立ててればよかったが今はなかった)、
Kubernetes API 向けに設定テストを実施する (Kubernetes テンプレートに含まれているので、Kubernetes テンプレート監視しているクラスタへは個別設定不要)

クラスタ設定に下記のようにテンプレートを追加する

スクリーンショット 2022-02-23 11.47.20.png

設定マクロは下記のようにしている (ここではアラートを試験するために 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

スクリーンショット 2022-02-23 16.37.11.png

追加できたら Add する

スクリーンショット 2022-02-23 16.37.01.png

TLS/SSL 証明書が自己署名証明書だと、invalid と判定されて、invalid だと証明書の expire 監視が有効にならないので切っておく (TLS/SSL 証明書が認証局のものであれば不要・実施してはいけない手順)

対象クラスタの Triggers をクリックしてWebsite certificate by Zabbix agent 2: Cert: SSL certificate is invalid を無効化(Disabled)する

スクリーンショット 2022-02-23 16.48.03.png

設定が完了すると下記のようなアラートになる

スクリーンショット 2022-02-23 16.51.00.png

Slack 通知設定をしていると下記のようなアラートが出力される

スクリーンショット 2022-02-23 16.51.33.png

データとしては下記のように取得できている

スクリーンショット 2022-02-23 16.52.17.png

以上で 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';

参考

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?