windows環境でのELK stack構築

トレーニング

本ドキュメントは、Windows環境において Rancher Desktop を活用し、Elastic Stack(Elasticsearch・Logstash・Kibana)を構築・動作確認する手順をまとめた技術資料です。Docker Desktop を使用せず、軽量な containerd ベースのランタイムである Rancher Desktop を使うことで、シンプルかつ効率的に ELK 環境を構築する方法を紹介します。

手順は以下のような流れで構成されています。

  • Rancher Desktop のインストールおよび設定
  • ELK 各コンポーネントの構成ファイル(docker-compose.yml, logstash.conf など)の作成
  • nerdctl を使ったコンテナの起動・停止
  • Kibana による動作確認
  • Logstash による JSON データの取り込み確認

これから ELK Stack を学習・検証したい開発者やインフラ担当者に向けて、実践的な構築・確認フローを提供します。

動作環境

以下の環境で作業しています。

端末OSWindows 10 Pro
TerminalVSCode 1.99.3
コンテナRancher Desktop 1.18.2
Elasticsearch8.15.5
Logstash8.15.5
Kibana8.15.5

ELK Stack構築手順

Rancher Desktop インストール

以下サイトからinstallerをダウンロードし、実行します。

 https://rancherdesktop.io

今回はWindows端末を使用する手順なので、”Download for Windows(x64)”を選択しています。

Installerを実行して表示されるウィザードに従ってInstallを完了させます。

下図はRancher Desktopの起動画面です。

home directory作成

任意のpathにフォルダを作成してください。この説明資料では、”C:\dxdoc\local_elk_0502”をhome directoryとして作成しています。また、Logstash用に、home directoryの下に”pipeline”というフォルダを作成し、その中に以下内容のテキストファイル”logstash.conf”を作成してください。

input {
  file {
    path => "/usr/share/logstash/test_data.json"
    start_position => "beginning"
    sincedb_path => "/dev/null"  # 再起動しても毎回読み込む
    codec => "json"
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "test-index"
    user => "elastic"
    password => "FiV8YQnjwJI6nYk_*hlZ"
  }
  stdout { codec => rubydebug }
}

次に、home directoryの下に、snapshot保管用のフォルダとして”repo”というフォルダを作成してください。

Composeファイルの配備

以下の内容で”docker-compose.yml”ファイルを作成し、home directory直下に配置します。

この docker-compose.yml は、Elastic Stack(Elasticsearch・Logstash・Kibana)を 単一ノード構成でローカル環境に立ち上げるための設定ファイルです。各サービスは以下のように構成されています。

# version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.5
    container_name: es01_0502
    environment:
      - node.name=es01
      - discovery.type=single-node
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=FiV8YQnjwJI6nYk_*hlZ
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - path.repo=/usr/share/elasticsearch/backup
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - /mnt/c/dxdoc/local_elk_0502/repo:/usr/share/elasticsearch/backup

    networks:
      - elk

  logstash:
    image: docker.elastic.co/logstash/logstash:8.15.5
    container_name: logstash_0502
    depends_on:
      - elasticsearch
    environment:
      LS_JAVA_OPTS: "-Xms512m -Xmx512m"
    volumes:
      - ./pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
      #- ./pipeline/test_data.json:/usr/share/logstash/test_data.json
    ports:
      - 5044:5044    # Beats (Filebeatなど) からのデータ受け取りに使用する例
      - 9600:9600    # LogstashのモニタリングAPI
    networks:
      - elk

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.5
    container_name: kibana_0502
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=mSG0YMSQI+3YvsWQ6l+X
    ports:
      - 5601:5601
    networks:
      - elk

volumes:
  es_data:

networks:
  elk:
    driver: bridge

構成内容の概要

elasticsearchバージョン 8.15.5 の Elasticsearch を起動し、パスワード付きのシングルノード構成。データ保存用ボリュームとスナップショット用ディレクトリをマウント。
logstashLogstash を起動し、logstash.conf に基づいてデータを処理。テスト用 JSON データもマウントされ、Filebeat などからの入力を受け取れるよう 5044 ポートが開放されている。
kibanaKibana を起動し、Elasticsearch に接続して可視化を提供。ポート 5601 でアクセス可能。Kibana System ユーザーを使って認証。
その他• すべてのサービスは共通ネットワーク “elk” 上で接続されており、相互通信が可能。
• “es_data” という名前の Docker ボリュームを使って、Elasticsearch の永続データを保持。

上記composeファイルで指定しているコンテナイメージファイルは、version 8.15.5を指定しています。他のバージョンは、以下サイトから確認出来ます。

https://hub.docker.com/_/elasticsearch/tags

Rancher Desktopの設定

Preferencesをクリック

Container Engineを開き、”containerd”を選択、Applyボタンをクリックし、設定する。

Kubernetesを開き、”Enable Kubernetes”のcheckを外し、Applyボタンをクリックし、設定する。

Terminalを開き、カレントディレクトリをHome Directoryへ移動

VSCodeを開き、Home Directoryを開きます。Terminalを開き(ctrl + @)、カレントディレクトリを作成したHome Directoryに移動してください。

コンテナを起動する

以下コマンドをTerminalで実行し、コンテナを構築、起動します。

nerdctl compose -f docker-compose.yml up -d

実行後に出力されるログ

コンテナ起動確認

以下コマンドをTerminalで実行し、3つのコンテナが起動していることを確認する。

nerdctl ps

Rancher Desktop

Rancher DesktopでContainersを開くと、以下のように3つのコンテナが”running”になっています。

Passwordの設定

以下の2つのpasswordを設定します。

  • elasticsearch用の”elastic”アカウント
  • kibana用(kibanaが内部でelasticsearchに接続する)”kibana_system”アカウント

elasticsearchの”elastic”アカウントのpasswordを設定する

以下コマンドをTerminalで実行し、elasticsearchのコンテナに入ります。

nerdctl exec -it es01_0502 /bin/bash

プロンプトが以下のように変わります。

以下コマンドを実行し、elasticアカウントのパスワードを発行します。

bin/elasticsearch-reset-password -u elastic -b

上図のように、New valueとして、新規にpasswordが発行されます。新たに発行されたpasswordを、composeファイルの”elasticsearch”サービス下の”ELASTICSEARCH_PASSWORD”に設定します。

passwordは実行された環境毎に異なりますので、自端末で出力された値を使用してください。

kibanaがelasticsearchに内部接続する際に使用する”kibana_system”アカウントのpasswordを設定する

elasticsearchのコンテナに入ったまま、続けて以下コマンドを実行します。

bin/elasticsearch-reset-password -u kibana_system -b

同様に、New valueとして、新規にkibana_systemアカウント用のpasswordが発行されます。新たに発行されたpasswordをcomposeファイルの”kibana”サービス下の”ELASTICSEARCH_PASSWORD”に設定します。

コンテナ再構築

以下コマンドで、コンテナを再起動し、Composeファイルに設定したパスワード反映させます。

停止コマンド

nerdctl compose -f docker-compose.yml down

起動コマンド

nerdctl compose -f docker-compose.yml up -d

Kibanaにアクセスし、動作確認

以下URLでkibanaにアクセスし、動作確認します。

http://localhost:5601

kibanaへのログイン画面が表示されます。

usernameに”elastic”、Passwordに設定したpasswordを入力し、Log inを押下します。

home画面が表示されれば成功です。

Logstash動作確認

動作確認用サンプルデータの配備

以下内容のtextファイルを用意し、”pipeline”フォルダ配下に”test_data.json”という名前で配置してください。

{"name": "Alice", "age": 30}
{"name": "Bob", "age": 25}
{"name": "Test", "age": 78}

Logstashが、この”test_data.json”ファイルを読み取り、elasticsearchにデータ送信する動作を確認します。

logstash.confファイルの修正

logstash.confファイルの中に、elasticアカウントのpasswordを指定しますので、それを新たに発行したpasswordに変更してください。

Composeファイルの修正

logstashのvolumesで、下図の赤枠箇所がコメントアウトされているので、コメントアウトを外します。

Logstashを再起動

コンテナを再作成し、comoseファイルの追加設定を反映させます。

停止コマンド

nerdctl compose -f docker-compose.yml down

起動コマンド

nerdctl compose -f docker-compose.yml up -d

データ取り込み確認

Kibanaにログインし、メニューからDevToolsを選択してください。

DevToolsのConsoleで以下コマンドを実行し、”test-index”という名称のindexが作成されていることを確認してください。

get _cat/indices?index=test*

コマンド実行後、画面右側に、test-indexという文字が記載されていればOKです。Logstashから、test-indexのデータが送信され、Elasticsearchがtest-indexという名称のインデックスを作成し、データを保管しています。

次に、以下コマンドを実行し、test-indexインデックスの中身を確認します。

get test-index/_search

”test_data.json”に記載されたJSON情報が取り込まれていることを確認出来ます。

Logstashにより、”test_data.json”の内容がelasticsearchに取り込まれたことを確認しました。

参考コマンド

# コンテナ作成、削除
nerdctl compose -f docker-compose.yml down
nerdctl compose -f docker-compose.yml up -d

# コンテナ稼働確認
nerdctl ps

# elasticsearchのコンテナに入る
nerdctl exec -it es01_0502 /bin/bash
nerdctl exec -it logstash_0502 /bin/bash

# アカウントのpasswordを再発行[elasticsearchコンテナに入った状態で実行]
bin/elasticsearch-reset-password -u elastic -b
bin/elasticsearch-reset-password -u kibana_system -b

# log確認
nerdctl compose logs -f logstash
nerdctl compose logs -f kibana
nerdctl compose logs -f elasticsearch
nerdctl compose logs --tail=100 logstash

# restart service
nerdctl compose restart logstash