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

## はじめに
[Zabbix 6.0 が 2022.02.14 に リリース](https://www.zabbix.com/jp/rn/rn6.0.0) された
[Kubernetes 監視](https://www.zabbix.com/jp/whats_new_6_0#kubernetes_monitoring)や [TLS/SSL証明書ネイティブ監視](https://www.zabbix.com/jp/whats_new_6_0#tls_ssl_monitoring)が実装されたので、試してみた内容を記載する

### 記載している内容

- [Zabbix 6.0 install (docker-compose)](#zabbix-60-installdocker-compose)
- [Kubernetes クラスタへ Zabbix-Agent 設定 (Zabbix helm)](#zabbix-helm-chart)
- [Zabbix 6.0 での Kubernetes 向け設定テスト (デフォルトにある 2テンプレート適用例)](#kubernetes-向け設定テスト-デフォルトにある-2テンプレート使用)
- [Zabbix 6.0 での SSL/TLS 証明書監視設定テスト](#ssltls-証明書監視設定テスト)

### 実施環境

- 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) での構築クラスタ ([詳細](https://qiita.com/suzuyui/items/ed6534dd4181bc2c93a1))

## Zabbix 6.0 install　(docker-compose)

[zabbix-docker](https://github.com/zabbix/zabbix-docker)を使用して Docker サーバ上に Zabbix 6.0 を構築する

前提： docker-ce インストール済み Linux サーバ上で実施

下記コマンドで必要な資材をダウンロードする

```sh
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 は環境による)

```sh
cp -p env_vars/.env_srv env_vars/.env_srv.org
vi env_vars/.env_srv
```

```diff:.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 (下記コマンド)で起動する

```sh
./docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml --profile=full up -d
```

※centos版は[更新がなく](https://github.com/zabbix/zabbix-docker#base-docker-image)、2022.02.19実施時には`docker-compose_v3_centos_mysql_latest.yaml`を指定してもimageが見当たらず起動できなかった

※mysql 版は現状 (2022.02.20時点)正常に動かなそう

※`--profile=full` (または all ) をつけないと`zabbix-agent`が動かないので付けること (フィルタミスのBug?)

下記構築後の状態

```sh
# ./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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/82017dfa-0159-293b-36bc-298f14e8a3a5.png)

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

![スクリーンショット 2022-02-20 15.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/c8f1881f-2c07-9cde-cfad-14ef8414a594.png)

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

![スクリーンショット 2022-02-20 15.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/90fb9ec8-a413-11f2-9528-25be5bb79340.png)

以上で、Zabbix 6.0 環境準備は完了

Zabbix のその他設定や Slack 連携は、[Zabbix 5.0 時点で記載](https://qiita.com/suzuyui/items/e1cc751185f6b0768b0f)したものがあるのでよければそちらも参照 (同様に実施できること確認済)


## Zabbix Helm Chart

Kubernetes 監視のために、[Zabbix Tools Kubernetes Helm](https://git.zabbix.com/projects/zt/repos/kubernetes-helm/browse)を対象クラスタへインストールする

### Prerequisites

[Kubernetes Helm](https://git.zabbix.com/projects/zt/repos/kubernetes-helm/browse)の前提条件は下記の通り

- Kubernetes cluster 1.18+
- Helm 3.0+
- Zabbix server 6.0+
- kube-state-metrics 2.13.2+

今回は Kubernetes v1.21.6 の[オンプレ環境](https://qiita.com/suzuyui/items/ed6534dd4181bc2c93a1)で実施した

#### Helm

Helm 3 をインストールする (下記コマンド[参照先](https://helm.sh/ja/docs/intro/install/
))

```sh
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](https://git.zabbix.com/scm/zt/kubernetes-helm.git)をインストールする ([サイトにあるREDEME]((https://git.zabbix.com/projects/ZT/repos/kubernetes-helm/browse/README.md))手順とほぼ同じ)

```sh
cd ~
git clone https://git.zabbix.com/scm/zt/kubernetes-helm.git
cd kubernetes-helm
```

```sh
helm show values . > ./zabbix_values.yaml
```

```sh
kubectl get namespaces
```

インストール先の namespace を作成する (ここでは、サイト例と同じ monitoring　にしているが変更可能)

```sh
kubectl create namespace monitoring
```

```sh
helm install zabbix . --dependency-update -f ./zabbix_values.yaml -n monitoring
```

下記出力例

```sh
$ 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ノードのクラスタの場合)

```sh
$ 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以外)

```sh
helm delete zabbix -n monitoring
```

## Kubernetes 向け設定テスト (デフォルトにある 2テンプレート使用)

ノード監視([Kubernetes nodes by HTTP](https://www.zabbix.com/jp/integrations/kubernetes#kubernetes_nodes_http))とクラスタ監視([Kubernetes cluster state by HTTP](https://www.zabbix.com/jp/integrations/kubernetes#kubernetes_state_http))の 2つのテンプレートが用意されているので実施する
※その他にある Kubernetes 向けテンプレートはクラスタ監視のテンプレートのディスカバリ後に作成されるホストで使用される

### Kubernetes ノード監視

[Kubernetes nodes by HTTP](https://www.zabbix.com/jp/integrations/kubernetes#kubernetes_nodes_http) テンプレートを使用する

`Configuration` > `Create host` をクリックしてクラスタの各ノードのホストを追加する (ここでは 1ノードのみ記載)

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

![スクリーンショット 2022-02-23 12.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/dd13a050-eddf-020f-9c4f-d90d682320d3.png)

`Macros` タブで、下記マクロを設定する

| Macro | Value | Default |
|:-:|:-:|:-:|
| {$KUBE.API.ENDPOINT} | `<scheme>://<host>:<port>/api` (ここでは `https://192.168.129.21:6443/api`) | <PUT YOUR KUBERNETES API ENDPOINT> |
| {$KUBE.API.TOKEN}	 | secret zabbix-service-account 内容結果(下記コマンド) | `` |

`$KUBE.API.TOKEN`は、helm で install した際に zabbix が作成した secret から取得できる

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

![スクリーンショット 2022-02-23 12.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/9a5a6a98-01f8-5a71-5503-ade91983afb2.png)

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

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

![スクリーンショット 2022-02-23 14.51.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/f9f2c53b-c7c2-cc67-f0f8-75040109d6e5.png)

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

![スクリーンショット 2022-02-23 17.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/5ee25565-f03b-bf8e-6eee-8be34198434e.png)

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

![スクリーンショット 2022-02-23 17.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/b18589aa-0163-9ce2-bffa-030606f09c8e.png)

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

### Kubernetes コンポーネント監視

[Kubernetes cluster state by HTTP](https://www.zabbix.com/jp/integrations/kubernetes#kubernetes_state_http)テンプレートを使用する

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

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

![スクリーンショット 2022-02-23 14.54.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/f3693cb7-45c9-e6cf-fc76-bfc8839afe77.png)

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

| Macro | Value | Default |
|:-:|:-:|:-:|
| {$KUBE.API.HOST} | API の IP (ここでは `192.168.129.21`) | <PUT YOUR KUBERNETES API HOST> |
| {$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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/75eaeb4b-3ed1-129a-e02b-fa0be54a41f7.png)

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

![スクリーンショット 2022-02-23 14.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/5d157f76-9eca-885a-1833-64c147ac43ff.png)

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

![スクリーンショット 2022-02-23 17.21.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/fc8df40c-9da3-92c7-95be-828795d9b62c.png)


以上で設定完了

### 動作テスト

存在しない Image を Pull する Deployment を apply して、
`CrashLoopBackOff` を発生させてアラートが出るかをテストする

```sh
% 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/1c603e07-e9d6-bbbe-d8f0-dd34c6460d7d.png)

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

![スクリーンショット 2022-02-23 14.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/61e1c736-5ca5-a2f6-2a07-2d5fefcc34c1.png)


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

![スクリーンショット 2022-02-23 16.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/273d9615-a836-a726-102e-8559ae110c71.png)

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

![スクリーンショット 2022-02-23 16.07.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/e9a2f463-9265-5424-55ab-dc1b8e6c3a30.png)

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

![スクリーンショット 2022-02-23 16.08.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/3f5c607a-9e4f-72c9-d176-19ead20dbd27.png)

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


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

Zabbix 6.0 では [SSL/TLS 証明書監視](https://www.zabbix.com/whats_new_6_0#tls_ssl_monitoring)が実装された

[Website certificate by Zabbix agent 2](https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/certificate_agent2/README.md)という Template が用意されている

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

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

![スクリーンショット 2022-02-23 11.47.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/419d1852-a53f-9db2-3ef3-8d5752c0850e.png)

設定マクロは下記のようにしている (ここではアラートを試験するために 360 日設定にしている。デフォルトは 7日前と短めなので要注意(30~60日にしておくと良いかも))

| Macro | Value | Default |
|:-:|:-:|:-:|
| {$CERT.WEBSITE.HOSTNAME} | Kubernetes API の IP(この環境では 192.168.129.21) | <Put DNS name> |
| {$CERT.WEBSITE.PORT} | 6443 | 443 |
| {$CERT.EXPIRY.WARN} | 360 | 7 |

![スクリーンショット 2022-02-23 16.37.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/5ccd3ae5-6ee6-e14c-6382-ec32ad169b0c.png)


追加できたら Add する

![スクリーンショット 2022-02-23 16.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/68118ef2-0ee9-e14e-ba58-11dbb42098c4.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/509b40e6-458b-9ade-82ca-45919f1cfc4a.png)

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

![スクリーンショット 2022-02-23 16.51.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/b87c013e-d899-ad46-03ec-6a4e1b0fb0bb.png)

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

![スクリーンショット 2022-02-23 16.51.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/bb9a105c-a695-0bc1-8a94-df53aa8524ae.png)


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

![スクリーンショット 2022-02-23 16.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326183/a143b1cd-3f9b-bb8a-de09-85932a56adb5.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';
```

## 参考

https://www.zabbix.com/jp/rn/rn6.0.0

https://github.com/zabbix/zabbix-docker

https://git.zabbix.com/projects/zt/repos/kubernetes-helm/browse

https://www.zabbix.com/integrations/kubernetes#kubernetes_http

https://www.zabbix.com/documentation/6.0/en/manual/config/templates_out_of_the_box/http

https://www.zabbix.com/documentation/6.0/en/manual/config/templates_out_of_the_box/zabbix_agent2

https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates/app/certificate_agent2/README.md