jetson nano (aarch64) にdockerでzabbixを入れる
tl;dr
成果物はこちらです。試していないのですが、Rock64 等、arm64 なものであれば動くと思います。
- https://github.com/yakumo-saki/docker-zabbix-server-arm64/tree/master
- https://hub.docker.com/r/yakumosaki/zabbix-server-mysql
- https://hub.docker.com/r/yakumosaki/zabbix-web-nginx-mysql
本記事について
成果物は上記の通りなので、失敗談等を書いていきます。
はじめに
Jetson nano、すごくよさそうだったので買ったのですがなかなか触れずに埃を被っていました。
なにせケースもありませんし。ということで、ちょうどメモリも 4GB あるので zabbix のホストを仮にやってもらうことにしました。
困った点 1
zabbix は公式に dockerfile を配布しています。 さらに、dockerhub にもコンテナを公開してくれています。
と言うことは、それを pull すれば楽勝…だと思っていました。
甘かったです。 普通に jetson から docker pull zabbix/zabbix-server-mysql
を pull すると、x86_64 のコンテナが落ちてきます。
当然動かないです。仕方ないので公開されている dockerfile からコンテナをビルドすることにしました。
…とはいえ、Dockerfile があるのでそれほど苦労はしないはずです。ビルド時間がかかるかもと思ったのですが、
数分でビルドが完了しました。
困った点 2 DB まわり
公式では、mysql-server:5.7 のイメージを使うようになっていますが、aarch64 版のコンテナはありません。
と言うことで、8.0 の mysql 公式コンテナを使用していますが、mysql8.0 は色々と変更が入っているので、
動かすのに苦労しました。具体的には command: --default-authentication-plugin=mysql_native_password
を
docker-compose.yml に加えただけなんですが。
さらに困った点
zabbix 公式の、docker-entrypoint.sh なんですが、DB が起動するのを待つために以下のコマンドを実行します。
mysqladmin ping -h db -P 3306 -u root --password="password" --silent --connect_timeout=10
しかし、mysql コンテナの初期構築の root は、他ホストからの接続に対応していません。
そのため、いつまでまっても、 "MySQL is not ready... " となってしまいます。
なので、docker-compose up する前に、DB に接続して、外から接続できる root を作成するように README に記述しました。
ついでに、私の dockerhub にアップロードしているイメージは、ping に使用するユーザーを zabbix に変更しています。
さらに、docker-entrypoint.sh で root 権限を使って zabbix の初期 DB を流し込もうとするのですが、
これが失敗するのも上記の対応で上手く行くようになりました。
zabbix-agent
server が動いているホスト以外の zabbix-agent は何も不思議なことはないのですが、
server が動いているホストだけは問題があります。それは、docker コンテナの IP アドレスから zabbix-agent を叩いてしまうので、
zabbix-agent.conf にかかれた Server と一致せず、要求を拒否されてしまいます。
これは正直参りました。docker コンテナの IP アドレスを固定するように書くのが良いのでしょうが、
そうそう変わるものでもないのでとりあえず直接記述してしまっています。
なお、Server, ServerActive は複数の IP アドレスを並べることができるので、それっぽいのを並べてしまえば OK です。
テストには、zabbix_get -s ホスト IP -k agent.version を使うと便利です。
拒否した場合は、拒否した agent 側の /var/log/zabbix/zabbix-agent.log にログが出力されます。
Discussion