はじめに
下記の記事にてdocker-compose
を使ってElasticsearchとKibanaを構成する方法を説明しました。
https://qiita.com/takeo-furukubo/items/c2f194679afadc06a4e9
今回は更に一歩進んでFleetを設定する方法を説明します。
これにより手元環境でElastic Solutionsを試すことができるようになります。
Fleetとは?
https://www.elastic.co/guide/en/fleet/current/fleet-server.html
Elastic Agentの管理プレーンです。その実体はElastic Agentです(ややこしい・・)
Elastic Agentの説明についてはこちらをご覧ください。
https://qiita.com/yukshimizu/items/abec12ac46749db46b40
Fleetを立ててそこにElastic Agentを登録するとKibanaの画面からバージョンアップや設定の変更を行うことが出来るようになります。
本手順を試した環境
- クラウド:GCP
- OS: Ubuntu 18.04.6 LTS
- スペック: e2-standard-2インスタンス (2 vCPU, 8GB mem)
- Docker version 23.0.5, build bc4487a
- docker-compose version 1.29.2, build 5becea4c
ドキュメント
基本はこちらですが、docker-compose.yaml
ファイルは記載されておりません。
https://www.elastic.co/guide/en/fleet/current/fleet-server.html
設定ファイル
Gitからクローンしてください。
https://github.com/legacyworld/elasticstack
singlenodeとmultinodeの2つのディレクトリができますが、今回はsinglenodeです。
docker-compose_with_fleet.yml
をdocker-compose.yml
にコピーして使います。
docker-compose.yml
docker-compose
ファイルがかなり長くなっています。
前回から変わっているところを中心に説明していきます。
version: "2.2"
services:
setup:
profiles:
- first
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
...(略)
if [ ! -f config/certs/certs.zip ]; then
echo "Creating certs";
echo -ne \
"instances:\n"\
" - name: es01\n"\
" dns:\n"\
" - es01\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
" - name: fleet\n"\
" dns:\n"\
" - fleet\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
...(略)
es01:
profiles:
- first
...(略)
kibana:
profiles:
- first
...(略)
fleet:
profiles:
- fleet
image: docker.elastic.co/beats/elastic-agent:${STACK_VERSION}
container_name: fleet
restart: always
user: root # note, synthetic browser monitors require this set to `elastic-agent`
ports:
- ${FLEET_PORT}:8220
environment:
- FLEET_ENROLL=0
- FLEET_INSECURE=1
- FLEET_URL=https://${HOST_IP}:${FLEET_PORT}
- FLEET_SERVER_ENABLE=true
- FLEET_SERVER_ELASTICSEARCH_HOST=https://${HOST_IP}:${ES_PORT}
- FLEET_SERVER_POLICY=fleet-server-policy
- FLEET_SERVER_SERVICE_TOKEN=${FLEET_SERVER_SERVICE_TOKEN}
- ELASTICSEARCH_CA=/usr/share/fleet/config/ca/ca.crt
- FLEET_CA=/usr/share/fleet/config/ca/ca.crt
- CERTIFICATE_AUTHORITIES=/usr/share/fleet/config/ca/ca.crt
- FLEET-SERVER-CERT=/usr/share/fleet/config/fleet/fleet.crt
- FLEET-SERVER-CERT-KEY=/usr/share/fleet/config/fleet/fleet.key
- FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT=${FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT}
volumes:
- certs:/usr/share/fleet/config/
elastic-agent:
profiles:
- agent
image: docker.elastic.co/beats/elastic-agent:${STACK_VERSION}
container_name: elastic-agent
restart: always
user: root
environment:
- FLEET_ENROLLMENT_TOKEN=${FLEET_ENROLLMENT_TOKEN}
- FLEET_ENROLL=1
- FLEET_INSECURE=1
- FLEET_URL=https://fleet:8220
以下の部分が変更になっています。
- profile
- これは
docker-compose
でコンテナを立ち上げるときに、どれを立ち上げるか選択するためのものです。 - Fleetを設定するためにはまずElasticsearchを立ち上げていくつか設定を変更する必要があります
- これは
- fleetの証明書作成
- fleetのEnvironment設定
.envファイル
STACK_VERSION = 8.7.0
ELASTIC_PASSWORD = elastic
KIBANA_PASSWORD = elastic
ES_PORT = 9200
CLUSTER_NAME = mac
LICENSE = trial
MEM_LIMIT = 2147483648
KIBANA_PORT = 5601
FLEET_PORT = 8220
HOST_IP = <ip address>
FLEET_SERVER_SERVICE_TOKEN = <Service Token>
FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT = <Finger Print>
FLEET_ENROLLMENT_TOKEN = <Enrollment Token>
- HOST_IP
- コンテナの外からElastic Agentを設定する際に必要になります
- FLEET_SERVER_SERVICE_TOKEN
- Fleetを登録する際に必要です
- Kibanaで取得します
- FLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT
- Elasticsearch Outputの設定に使用します
- Elasticsearchコンテナでコマンドを実行して取得します
- FLEET_ENROLLMENT_TOKEN
- Elastic AgentをFleetに登録する際のTokenです
手順
Elasticsearch / Kibana起動
.env
ファイルのKIBANA_PORT
より上の部分を正しく記載したら下記コマンドを実行します
docker-compose --profile first up -d
その後https://${HOST_IP}:${KIBANA_PORT}
へアクセスして起動を確認します。
うまくいかなくて一度停止したい場合は
docker-compose.yml
ファイルのある場所でdocker-compose down -v
volumeも一緒に消しておきます。
FingeprintとCAの取得
fleet.sh
ファイルを実行すると下記のようになります。
この実行結果をコピペして後ほど使います。
$ ./fleet.sh
SHA256 Fingerprint=14232D66E884346F573D82B1746D6697F171114EDA5640F7CE36BF94D7BE06D3
ssl:
certificate_authorities:
- |
-----BEGIN CERTIFICATE-----
MIIDSjCCAjKgAwIBAgIVAJH/WfHyUTMqXdBVV2itgbkWlz8JMA0GCSqGSIb3DQEB
...(略)
BX30eBuzhpQRnq/gI7t8ejdUbcsxlvuOadFMMvQU
-----END CERTIFICATE-----
fleet.sh
の2行目以降ではCAファイルを読み取って、YAML形式で出力するようになっています。
Outputの設定
Elastic Agentがどこにデータを送るかという設定です。
ElasticsearchとLogstashを設定できます。
左のメニューからManagement -> Fleetをクリックして、Settingsタブをクリックします。
Outputの右端のActionsの下にある鉛筆マークをクリックして編集モードに入ります。
- Hosts
-
https://${HOST_IP}:${ES_PORT}
を入力
-
- Elasticsearch CA trusted fingerprint (optional)
- 先程のfleet.shの実行結果の1行目の"="の右側
- Advanced YAML configuration
- 先程のfleet.shの実行結果の2行目以降をそのままコピペ
入力したら"Save andd apply settings"をクリックして保存
Fleetサーバ追加
- Name
- 自由に入力
- URL
- https://HOST_IP:FLEET_PORTを入力
上記を入力後、"Generate Fleet policy"をクリックして暫く待つと以下のような画面になります。
以下の2つの値を.env
に設定します。
-
--fleet-server-service-token=
の右側の文字列をコピーして、.env
ファイルのFLEET_SERVER_SERVICE_TOKEN
に貼り付けます。 -
--fleet-server-es-ca-trusted-fingerprint=
の右側の文字列をコピーして、.env
ファイルのFLEET-SERVER-ES-CA-TRUSTED-FINGERPRINT
に貼り付けます
Fleetサーバ起動
以下のコマンドを実行します
docker-compose --profile fleet up -d
データの確認
左側のメニューからAnalytics -> Discoverをクリックします。
左上のDataviewが"logs-*"となっているはずです。
ここで何も出てこない場合、何らか失敗している可能性があります。
左側のメニューからManagement -> Fleetをクリックすると登録されたFleetサーバが表示されます。
うまく行かない場合の確認
- コンテナの状態の確認
# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------------
es01 /bin/tini -- /usr/local/bi ... Up (healthy) 0.0.0.0:9200->9200/tcp,:::9200->9200/tcp, 9300/tcp
fleet /usr/bin/tini -- /usr/loca ... Up 0.0.0.0:8220->8220/tcp,:::8220->8220/tcp
kibana /bin/tini -- /usr/local/bi ... Up (healthy) 0.0.0.0:5601->5601/tcp,:::5601->5601/tcp
singlenode_setup_1 /bin/tini -- /usr/local/bi ... Exit 0
- コンテナログの確認
docker-compose logs fleet
でログを確認して、X509関係のエラーがないかどうか確認する
Elastic Agentの登録
Docker ContainerとしてElastic Agentを起動
Policyの作成
Management -> Fleetをクリックして、Agent Policiesタブを選んで"Create Agent policy"をクリック
Nameに"agent_in_docker"(識別できればなんでも良い)を入力して、右下の"Create Agent policy"をクリックして保存
今追加した"agent_in_docker"が表示されるのでそれをクリック
"--enroll"の右側の文字列をコピーして、.env
ファイルのFLEET_ENROLLMENT_TOKEN
に設定します。
Elastic Agent起動
docker-compose --profile agent up -d
Fleetに登録できれば以下のようになります。
うまく行かない場合はdocker-compose ps
やdocker-compose logs elastic-agent
で確認してみましょう。
ホスト上でElastic Agentを起動
policyの作成
コンテナとして起動したときと同様にPolicyを作成します。
名前はわかるようにしておきましょう(agent_on_vmなど)
Elastic Agent起動
先程と異なるのはホスト上でインストールすることです。まずは自動的に用意されたコマンドをコピーしましょう。
"Add Agent"のダイアログウィンドウでコマンドが表示されていて、右上のアイコンを押すとコピーされます。
上記でコピーしたコマンドをホストのターミナルに貼り付けるとAgentをダウンロード・解凍・ディレクトリ変更まで行われます。
最後のインストールはまだ実行しないでください(失敗します)
インストールコマンド変更
最後のコマンドの最後に--insecure
を追加してから実行します。
sudo ./elastic-agent install --url=https://10.146.0.53:8220 --enrollment-token=a0ZiazFZY0JCdW9qRkVJODFSRVE6b2RxdDlJMXdRWGVsTUh1ZkIyTUdnZw== --insecure
問題なければ以下のように登録されたAgentが3つになります。(takeo-docker-vm
がホストにインストールされたもの)
下記のエラーが表示される場合は一度アンインストールしてください。
{"log.level":"info","@timestamp":"2023-05-02T02:32:22.965Z","log.origin":{"file.name":"cmd/enroll_cmd.go","file.line":271},"message":"Elastic Agent might not be running; unable to trigger restart","ecs.version":"1.6.0"}{"log.level":"info","@timestamp":"2023-05-02T02:32:22.965Z","log.origin":{"file.name":"cmd/enroll_cmd.go","file.line":271},"message":"Elastic Agent might not be running; unable to trigger restart","ecs.version":"1.6.0"}
アンインストールは下記のコマンドです。
sudo /opt/Elastic/Agent/elastic-agent uninstall
Docker Integrationを入れる
ホストにAgentがあるのでDockerのデータも集めてみます。
Management -> Fleet -> Agent policiesで先程作成したpolicy(agent_on_vm)をクリックして、右上の"Add Integration"をクリック
Integrationの検索画面が表示されるので検索ボックスに"docker"と入力して、表示された"Docker"をクリック
Docker Integrationの説明が表示されるので、右上の"Add Docker"をクリック
いろいろ細かい設定が表示されるが、そのままにして右下の"Save and continue"をクリック
Elastic Agentの設定を変更することになるので、確認のダイアログが立ち上がったら"Save and deploy changes"をクリックする
これでDockerの情報を集め始めるので、しばらく待ってから左側のメニューからObservability -> Infrastructure -> Inventoryをクリックして、"Show"のドロップダウンメニューから”Docker Containers"を選ぶと、下図のようにコンテナが表示されます。
停止
docker-compose.yml
ファイルのある場所でdocker-compose down -v
Volumeも消します
削除
全てのコンテナイメージやボリュームなどまとめて消したい場合は停止後にdocker system prune -a
勿論Elasticsearch以外も消してしまいますのでご注意を。
最後に
本手順が完了すればオンプレでElastic Agentを試すことが出来るようになります。
今後以下のような内容で記載する予定です。
- Elasticsearchを複数立ち上げる
- Master Dedicatedを立ち上げる
Elastic Cloud 無料トライアル
こちらからElastic Cloudの14日間無料トライアルを是非お試しください
Elastic Cloud 無料トライアル
手順は下記リンクをご参照ください
Elastic Cloud について 〜実際にデプロイメントを作ってみよう〜