この記事は Splunk Advent Calendar 2023 の記事です。
Splunk の検証環境について
Splunk は本番と同じパッケージで、60日間500MB取り込み可能なトライアル利用も可能なので、ちょっとした検証も簡単にできます。
基本的な検証ならそれで十分なのですが、インデクサークラスタの挙動とかの確認とかとなると
- VM 作成するのが手間(例:サーチヘッダ、クラスタマスター一台ずつ、インデクサー3台)
- 都度設定するのが手間
となり、ちょっと手間がかかります。
Splunk Docker イメージ
Splunk には、rpm や deb パッケージだけでなく、Docker イメージも提供されています。
- splunk/splunk – Docker Image | Docker Hub
- Deploy and run Splunk Enterprise inside a Docker container – Splunk Documentation
これをつかって、インデクサークラスタを作ってみます。
Docker 実行環境の整備
バージョン情報
- CentOS Stream 8
- Kernel 4.18.0-527.el8.x86_64
- Docker 24.0.7
- Splunk 9.1.2
本記事では、Docker 環境の構築については割愛します。
VM の設定
多数の Splunk インスタンスが動くのでそれなりにスペックが必要ですが、今回は下記のスペックにしました。
- CPU 6Core
- メモリ 8GB
コンテナ起動時の初期設定で CPU を多く使用するため、コア数が多い方がいいですが、
6コア12スレッドの CPU のためここまでにしておきます。
IP アドレスの付与
Docker の場合、それぞれのコンテナにポート番号を変えてアクセスすることになるのですが、
同一 IP アドレスで、違うポート番号でログインすると、別のポート番号の方がログアウトされてしまいます。
異なるブラウザセッション、具体的には
- Edge 通常利用
- Edge InPrivate モード
- Chrome 通常利用
- Chrome シークレットモード
- Firefox・・・
などでも対応できますが、同一ブラウザセッションの方が使いやすいため、IP アドレスも追加します。
今回は CentOS Stream 8 ですが、一時的な検証ということもありますので、NetworkManager を触らずに、コマンドで追加します。
手元の環境では、eth0 のような名称に固定していますが、実際に使われている NIC 名を使ってください。
192.168.2.0/24 でプライベートネットワークが設定されている場合、実際に使われていないか注意しつつ
ip addr add 192.168.2.10/24 dev eth0
ip addr add 192.168.2.11/24 dev eth0
・・・
等の方法でも設定できますし、IPv6 が利用可能なら、アドレスが使われていないかなどを気にせずにできるので便利です。
ip addr add fe80::de2:1/64 dev eth0
ip addr add fe80::de2:2/64 dev eth0
・・・
Docker compose の準備
実行環境が整備できたので、Docker compose ファイルの準備を進めます。
SPLUNK_ROLE の設定
この内容を素直に compose に書いても、コンテナが個数分だけ上がるだけなのですが、実はもっと便利なオプションもあります。
ロールの一覧については GitHub のリポジトリを見るしかないようです。
今回は下記のロールが必要になるかと思います。
- splunk_cluster_master
- splunk_indexer
そのほか、検証によっては、splunk_monitor、splunk_search_head、splunk_deployment_server も加えても良いかもしれません。
ホスト名の設定
通常コンテナを起動するとコンテナ内のホスト名はランダムな文字列になります。
クラスタ環境の場合、それだとどれがインデクサーなのかが分からなくなってしまうため、hostname も設定します。
index-01:
image: splunk/splunk:latest
hostname: index-01 ★
environment:
- SPLUNK_ROLE=splunk_indexer
インデクサークラスタ固有の設定
インデクサークラスタを設定時に画面で入力する内容は、下記のオプションを設定することで設定されます。
クラスタマスターは下記となります。
environment:
- SPLUNK_IDXC_SEARCH_FACTOR=2
- SPLUNK_IDXC_REPLICATION_FACTOR=3
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_IDXC_PASS4SYMMKEY={ランダムな文字列}
- SPLUNK_ROLE=splunk_cluster_master
ピアノードやサーチヘッドなどインデクサークラスタに接続するものは下記となります。
environment:
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_IDXC_PASS4SYMMKEY={クラスタマスターと同じ文字列}
- SPLUNK_ROLE=splunk_indexer や splunk_search_head など
完成形
そしてできあがった完成形は下記となります。
docker-compose.yml
---
services:
monitor:
image: splunk/splunk:latest
platform: linux/amd64
hostname: monitor
environment:
- TZ=Asia/Tokyo
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_PASSWORD=TestPass123#
- SPLUNK_DEPLOYMENT_SERVER=deploy
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_IDXC_PASS4SYMMKEY=SYMMKEY123#
- SPLUNK_ROLE=splunk_monitor
ports:
- 8000:8000 # Web
- 8089:8089 # REST API
cmaster:
image: splunk/splunk:latest
platform: linux/amd64
hostname: cmaster
environment:
- TZ=Asia/Tokyo
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_PASSWORD={ログインパスワード}
- SPLUNK_DEPLOYMENT_SERVER=deploy
- SPLUNK_IDXC_SEARCH_FACTOR=2
- SPLUNK_IDXC_REPLICATION_FACTOR=3
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_IDXC_PASS4SYMMKEY={PASS4SYMMKEY}
- SPLUNK_ROLE=splunk_cluster_master
ports:
- 18000:8000
- 18089:8089 # REST API
- 8088:8088 # HEC
- 514:514 # syslog
deploy:
image: splunk/splunk:latest
platform: linux/amd64
hostname: deploy
environment:
- TZ=Asia/Tokyo
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_PASSWORD={ログインパスワード}
- SPLUNK_ROLE=splunk_deployment_server
ports:
- 28000:8000
- 28089:8089 # API and Deployment
index-01:
image: splunk/splunk:latest
platform: linux/amd64
hostname: index-01
environment:
- TZ=Asia/Tokyo
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_PASSWORD={ログインパスワード}
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_ENABLE_LISTEN=9997
- SPLUNK_IDXC_PASS4SYMMKEY={PASS4SYMMKEY}
- SPLUNK_ROLE=splunk_indexer
ports:
- 38000:8000
- 19997:9997 # index
index-02:
image: splunk/splunk:latest
platform: linux/amd64
hostname: index-02
environment:
- TZ=Asia/Tokyo
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_PASSWORD={ログインパスワード}
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_ENABLE_LISTEN=9997
- SPLUNK_IDXC_PASS4SYMMKEY={PASS4SYMMKEY}
- SPLUNK_ROLE=splunk_indexer
ports:
- 48000:8000
- 29997:9997
index-03:
image: splunk/splunk:latest
platform: linux/amd64
hostname: index-03
environment:
- TZ=Asia/Tokyo
- SPLUNK_START_ARGS=--accept-license
- SPLUNK_PASSWORD={ログインパスワード}
- SPLUNK_CLUSTER_MASTER_URL=cmaster
- SPLUNK_ENABLE_LISTEN=9997
- SPLUNK_IDXC_PASS4SYMMKEY={PASS4SYMMKEY}
- SPLUNK_ROLE=splunk_indexer
ports:
- 58000:8000
- 39997:9997
8000 以外のポート変換も定義していますが実際は動作確認していません。
ひとまず動作確認できればいいという形ですので、HEC や syslog もクラスタマスターで受ける構成にしています。
サーチヘッドも単体では存在しないので、クラスタマスターやモニターコンソールでサーチする形に。
platform: linux/amd64
は、Apple Silicon の Mac で Rosetta 経由でコンテナが起動できるように記載していますが、エミュレーションの負荷もありますので、シングル構成ならならともかく、クラスタ構成はそれなりにスペックがないと起動できないのではないかと思います。
起動
docker-compose.yml が書き終わったら下記コマンドにて起動します。
docker compose up -d
docker compose ps -a で starting → healthy になれば起動完了です。
最初に記載した 6core 構成において、3分かかりますのでよりスペックを上げると高速化できると思います。
メモリは8GBとしていますが、起動直後では60%程度の利用でした
動作確認
コンテナが上がってきたら、
- http://(ホストの実際の IP アドレス):8000
- http://[fe80::de2:1]:18000
- http://[fe80::de2:2]:28000
のように、IP アドレスとポート番号を変えつつアクセスしてみます。
インデクサークラスタリングの画面も、コンテナ起動直後から正常に認識されていることを確認しました。
どのインスタンスにログインしているか分かるように、グローバルバナーを設定しています。これは現状 docker-compose からは設定できないので手作業で表示しています。
また、同一インスタンスなので iowait で警告が出ていますので、io を使うような検証の場合はやはり分けた方がいいかもしれません。
モニターコンソールでも正常に各インスタンスが認識できていることを確認しました。
コンテナなのでメモリはちゃんと見えてないですが、サーチなど通常に使用においては影響はないはずです。