ラズパイkubernetesにZabbix構築

以前docker-composeでZabbixを構築 したので 今度はkubernetesで構築してみました。
ちょっと入門編みたいな感じになっているんじゃないかと思います。

構築環境

以前構築したラズパイkubernetes を使って構築します。
docker hubでARM64版が公開されている公式イメージを利用させていただきます。

マニフェストファイル

いろいろ試行錯誤してとりあえず以下で動きました。
今回初めて書いたのでもっといい書き方があるかもです。

Deploymentについて少し説明すると、

  • DBとServerとWebのコンテナは1つのPodにして、
    コンテナ間の通信はPod内通信するようにしています。
    Pod内のコンテナは同じホストになるようで127.0.0.1で通信できました。

  • volumesはemptyDir なんですがこれ永続化されないようです。

  • mariadbのargsはこれを入れないと、 以下のエラーが発生したのでその対策 です。

cannot use database "zabbix": its "users" table is empty (is this the Zabbix proxy database?)
---
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: zabbix-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zabbix
  template:
    metadata:
      labels:
        app: zabbix
    spec:
      containers:
        - name: zabbix-db
          image: mariadb:10.5
          ports:
            - name: mysql
              containerPort: 3306
          env:
          - name: MYSQL_DATABASE
            value: zabbix
          - name: MYSQL_USER
            value: zabbix
          - name: MYSQL_PASSWORD
            value: zabbix
          - name: MYSQL_ROOT_PASSWORD
            value: P@ssword
          args:
          - --character-set-server=utf8
          - --collation-server=utf8_bin
          volumeMounts:
          - name: zabbix-db-volume
            mountPath: /var/lib/mysql
        - name: zabbix-server
          image: zabbix/zabbix-server-mysql:alpine-5.2-latest
          ports:
            - name: zabbix-server
              containerPort: 10051
          env:
          - name: DB_SERVER_HOST
            value: 127.0.0.1
          - name: MYSQL_DATABASE
            value: zabbix
          - name: MYSQL_USER
            value: zabbix
          - name: MYSQL_PASSWORD
            value: zabbix
        - name: zabbix-web
          image: zabbix/zabbix-web-nginx-mysql:alpine-5.2-latest
          ports:
            - name: http
              containerPort: 8080
          env:
          - name: ZBX_SERVER_HOST
            value: 127.0.0.1
          - name: DB_SERVER_HOST
            value: 127.0.0.1
          - name: MYSQL_DATABASE
            value: zabbix
          - name: MYSQL_USER
            value: zabbix
          - name: MYSQL_PASSWORD
            value: zabbix
          - name: PHP_TZ
            value: Asia/Tokyo
      volumes:
      - name: zabbix-db-volume
        emptyDir:
          medium: Memory

DBのパスワードとかはSecretを使ったほうがいいんでしょうね。

Serviceはこんな感じ。
MetalLBをインストールしているのでLoadBalancerにしています。
loadBalancerIPで固定IPにできるようです。

---
apiVersion: v1
kind: Service
metadata:
  name: zabbix-service
spec:
  type: LoadBalancer
  loadBalancerIP: 192.168.10.245
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: zabbix

マニフェストapply

kubectl applyを実行します。
ファイル名はご自身のファイル名に変更してください。

% kubectl apply -f zabbix_deploy.yml
% kubectl apply -f zabbix_svc.yml 

deleteすると書いてあるリソース全部消してくれるし、
変更は再度apply実行すれば再作成して反映してくれるし便利ですね。

kubectl get allを実行すると、
以下のようにpod、service、deployment、replicasetが作成されると思います。
(関係ない物は除外しています)

% kubectl get all                                                                
NAME                                 READY   STATUS    RESTARTS   AGE
pod/zabbix-deploy-86b9695796-88tsz   3/3     Running   0          4d4h

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
service/zabbix-service   LoadBalancer   10.103.151.48    192.168.10.245   8080:30834/TCP   4d4h

NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/zabbix-deploy   1/1     1            1           4d4h

NAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/zabbix-deploy-86b9695796   1         1         1       4d4h

うまくいかない場合は以下のコマンドなど利用するとデバッグしやすいと思います。

  • ログの確認
    複数コンテナのあるpodに対して、特定のコンテナのログを確認するには、以下のようにします。
    例えばmariadbの場合、
% kubectl logs pod/zabbix-deploy-86b9695796-88tsz zabbix-db
  • サービスに紐づいているエンドポイントの確認
    SeriveがどのIPと紐づいているか確認できます。
% kubectl get endpoints zabbix-service                                            
NAME             ENDPOINTS          AGE
zabbix-service   10.244.2.35:8080   4d4h
  • コンテナにログインする
    複数コンテナのあるpodに対して、特定のコンテナにログインするには、以下のようにします。
% kubectl exec -it pod/zabbix-deploy-86b9695796-88tsz -c zabbix-server -- /bin/bash
bash-5.0$ zabbix_server -V
zabbix_server (Zabbix) 5.2.5
Revision 1afd0de 22 February 2021, compilation time: Feb 22 2021 16:22:17

Copyright (C) 2021 Zabbix SIA
License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.

This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/).

Compiled with OpenSSL 1.1.1j  16 Feb 2021
Running with OpenSSL 1.1.1j  16 Feb 2021
  • リソースの詳細を確認する
    コンテナにログインしなくても以下のコマンドでIPなど詳細が確認できます。
% kubectl describe pod/zabbix-deploy-86b9695796-88tsz

ログイン画面が出なくて上記コマンドでいろいろ調べたけど、結局繋がらなかったのは、
webの待ち受けポートが80じゃなくて8080だったことが原因でした。
あるぇー?そうだっけ?

うまくいけば以下のようにログイン画面が表示されると思います。
Usename:Admin
Password:zabbix
でログインできるんですが、前から最初大文字だっけ?
あるぇー?

zabbix_k8s_01.png

動作テスト

なんとなく今回はWindows10からSNMP取ってみました。

説明は省略しますが、まずSNMPをインストールします。

zabbix_k8s_02.png

サービスの設定を確認します。

zabbix_k8s_03.png

ZabbixでHostsを追加します。
この辺りの手順はこちら を 参考にしてもらえればと思います。

zabbix_k8s_04.png

テンプレートはとりあえずのこちら。

zabbix_k8s_05.png

しばらくするとLatest dataでデータが取得できているか確認できると思います。

zabbix_k8s_06.png

ひとまずdocker-composeと同じことはできそうなので、なんとか使っていけそうです。
他にもオーケストレーションな部分をいろいろ試してみたいです。