Docker のシステムログコレクターとしての Splunk Universal Forwarder

Docker のシステムログコレクターとしての Splunk Universal Forwarder

Splunk は、最も有名な商用ログ収集および分析製品の XNUMX つです。 ロシアでの販売が終了した現在でも、これはこの製品の説明書/使用方法を書かない理由にはなりません。

タスク: ホスト マシンの構成を変更せずに、Splunk の Docker ノードからシステム ログを収集します

まずは公式のアプローチから始めたいと思いますが、Docker を使用する場合は少し奇妙に見えます。
Dockerハブへのリンク
私たちが持っているもの:

1. プリム画像

$ docker pull splunk/universalforwarder:latest

2. 必要なパラメータを指定してコンテナを起動します

$ docker run -d  -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest

3. コンテナに入ります

docker exec -it <container-id> /bin/bash

次に、ドキュメントに記載されている既知の住所に移動するように求められます。

そして、コンテナーの起動後にコンテナーを構成します。


./splunk add forward-server <host name or ip address>:<listening port>
./splunk add monitor /var/log
./splunk restart

待って。 何?

しかし、驚きはそれだけではありません。 公式イメージから対話モードでコンテナーを実行すると、次のように表示されます。

少しがっかり


$ docker run -it -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=password' splunk/universalforwarder:latest

PLAY [Run default Splunk provisioning] *******************************************************************************************************************************************************************************************************
Tuesday 09 April 2019  13:40:38 +0000 (0:00:00.096)       0:00:00.096 *********

TASK [Gathering Facts] ***********************************************************************************************************************************************************************************************************************
ok: [localhost]
Tuesday 09 April 2019  13:40:39 +0000 (0:00:01.520)       0:00:01.616 *********

TASK [Get actual hostname] *******************************************************************************************************************************************************************************************************************
changed: [localhost]
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.599)       0:00:02.215 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.054)       0:00:02.270 *********

TASK [set_fact] ******************************************************************************************************************************************************************************************************************************
ok: [localhost]
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.075)       0:00:02.346 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.067)       0:00:02.413 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.060)       0:00:02.473 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.051)       0:00:02.525 *********
Tuesday 09 April 2019  13:40:40 +0000 (0:00:00.056)       0:00:02.582 *********
Tuesday 09 April 2019  13:40:41 +0000 (0:00:00.216)       0:00:02.798 *********
included: /opt/ansible/roles/splunk_common/tasks/change_splunk_directory_owner.yml for localhost
Tuesday 09 April 2019  13:40:41 +0000 (0:00:00.087)       0:00:02.886 *********

TASK [splunk_common : Update Splunk directory owner] *****************************************************************************************************************************************************************************************
ok: [localhost]
Tuesday 09 April 2019  13:40:41 +0000 (0:00:00.324)       0:00:03.210 *********
included: /opt/ansible/roles/splunk_common/tasks/get_facts.yml for localhost
Tuesday 09 April 2019  13:40:41 +0000 (0:00:00.094)       0:00:03.305 *********

ну и так далее...

素晴らしい。 画像にはアーティファクトも含まれていません。 つまり、起動するたびに、バイナリを含むアーカイブをダウンロードし、解凍して構成するのに時間がかかります。
docker-way などはどうなるのでしょうか?

結構です。 別の道を行きます。 これらすべての作業を組み立て段階で実行するとどうなるでしょうか? それでは行きましょう!

あまり遅れないよう、すぐに最終イメージをお見せします。

ドッカーファイル

# Тут у кого какие предпочтения
FROM centos:7

# Задаём переменные, чтобы каждый раз при старте не указывать их
ENV SPLUNK_HOME /splunkforwarder
ENV SPLUNK_ROLE splunk_heavy_forwarder
ENV SPLUNK_PASSWORD changeme
ENV SPLUNK_START_ARGS --accept-license

# Ставим пакеты
# wget - чтобы скачать артефакты
# expect - понадобится для первоначального запуска Splunk на этапе сборки
# jq - используется в скриптах, которые собирают статистику докера
RUN yum install -y epel-release 
    && yum install -y wget expect jq

# Качаем, распаковываем, удаляем
RUN wget -O splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz 'https://www.splunk.com/bin/splunk/DownloadActivityServlet?architecture=x86_64&platform=linux&version=7.2.4&product=universalforwarder&filename=splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz&wget=true' 
    && wget -O docker-18.09.3.tgz 'https://download.docker.com/linux/static/stable/x86_64/docker-18.09.3.tgz' 
    && tar -xvf splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz 
    && tar -xvf docker-18.09.3.tgz  
    && rm -f splunkforwarder-7.2.4-8a94541dcfac-Linux-x86_64.tgz 
    && rm -f docker-18.09.3.tgz

# С shell скриптами всё понятно, а вот inputs.conf, splunkclouduf.spl и first_start.sh нуждаются в пояснении. Об этом расскажу после source тэга.
COPY [ "inputs.conf", "docker-stats/props.conf", "/splunkforwarder/etc/system/local/" ]
COPY [ "docker-stats/docker_events.sh", "docker-stats/docker_inspect.sh", "docker-stats/docker_stats.sh", "docker-stats/docker_top.sh", "/splunkforwarder/bin/scripts/" ]
COPY splunkclouduf.spl /splunkclouduf.spl
COPY first_start.sh /splunkforwarder/bin/

#  Даём права на исполнение, добавляем пользователя и выполняем первоначальную настройку
RUN chmod +x /splunkforwarder/bin/scripts/*.sh 
    && groupadd -r splunk 
    && useradd -r -m -g splunk splunk 
    && echo "%sudo ALL=NOPASSWD:ALL" >> /etc/sudoers 
    && chown -R splunk:splunk $SPLUNK_HOME 
    && /splunkforwarder/bin/first_start.sh 
    && /splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme 
    && /splunkforwarder/bin/splunk restart

# Копируем инит скрипты
COPY [ "init/entrypoint.sh", "init/checkstate.sh", "/sbin/" ]

# По желанию. Кому нужно локально иметь конфиги/логи, кому нет.
VOLUME [ "/splunkforwarder/etc", "/splunkforwarder/var" ]

HEALTHCHECK --interval=30s --timeout=30s --start-period=3m --retries=5 CMD /sbin/checkstate.sh || exit 1

ENTRYPOINT [ "/sbin/entrypoint.sh" ]
CMD [ "start-service" ]

では、何が入っているのかというと、

first_start.sh

#!/usr/bin/expect -f
set timeout -1
spawn /splunkforwarder/bin/splunk start --accept-license
expect "Please enter an administrator username: "
send -- "adminr"
expect "Please enter a new password: "
send -- "changemer"
expect "Please confirm new password: "
send -- "changemer"
expect eof

最初の起動時に、Splunk はログイン/パスワードの入力を求めますが、このデータは使用されます。 のみ その特定のインストール、つまりコンテナ内で管理コマンドを実行します。 私たちの場合は、すべてが機能し、ログが川のように流れるようにコンテナを起動するだけです。 もちろん、これはハードコードですが、他の方法は見つかりませんでした。

さらにスクリプトに従って実行される

/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme

splunkclouduf.spl — これは Splunk Universal Forwarder の認証情報ファイルであり、Web インターフェイスからダウンロードできます。

ダウンロードするにはどこをクリックしますか(写真内)Docker のシステムログコレクターとしての Splunk Universal Forwarder

Docker のシステムログコレクターとしての Splunk Universal Forwarder
これは解凍できる通常のアーカイブです。 中には、SplunkCloud に接続するための証明書とパスワードが入っています。 出力.conf 入力インスタンスのリストも含まれます。 このファイルは、Splunk インストールを再インストールするか、インストールがオンプレミスの場合は入力ノードを追加するまで関連します。 したがって、コンテナ内に追加しても問題はありません。

そして最後は再起動です。 はい、変更を適用するには、再起動する必要があります。

私たちの中で input.conf Splunk に送信するログを追加します。 たとえば、puppet 経由で構成を配布する場合は、このファイルをイメージに追加する必要はありません。 唯一のことは、デーモンの起動時にフォワーダーが構成を参照することです。そうでない場合は、 ./splunk の再起動.

docker stats スクリプトはどのようなものですか? Github には古いソリューションがあります。 アウトコールドマン、スクリプトはそこから取得され、現在のバージョンの Docker (ce-17.*) および Splunk (7.*) で動作するように変更されました。

取得したデータを使用して、次のものを構築できます

ダッシュボード: (数枚の写真)Docker のシステムログコレクターとしての Splunk Universal Forwarder

Docker のシステムログコレクターとしての Splunk Universal Forwarder
ダッシュのソース コードは、記事の最後にあるリンクにあります。 2 つの選択フィールドがあることに注意してください: 1 - インデックスの選択 (マスクによって検索)、ホスト/コンテナの選択。 使用する名前によっては、インデックス マスクを更新する必要がある場合があります。

最後に、この機能に注目していただきたいと思います。 開始() в

エントリーポイント.sh

start() {
    trap teardown EXIT
	if [ -z $SPLUNK_INDEX ]; then
	echo "'SPLUNK_INDEX' env variable is empty or not defined. Should be 'dev' or 'prd'." >&2
	exit 1
	else
	sed -e "s/@index@/$SPLUNK_INDEX/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf
	fi
	sed -e "s/@hostname@/$(cat /etc/hostname)/" -i ${SPLUNK_HOME}/etc/system/local/inputs.conf
    sh -c "echo 'starting' > /tmp/splunk-container.state"
	${SPLUNK_HOME}/bin/splunk start
    watch_for_failure
}

私の場合、コンテナ内のアプリケーションであってもホスト マシンであっても、環境ごと、個々のエンティティごとに、別個のインデックスを使用します。 こうすることで、データが大量に蓄積された場合でも検索速度が低下することはありません。 インデックスに名前を付けるには、次のような単純なルールが使用されます。 _。 したがって、コンテナーをユニバーサルにするために、デーモン自体を起動する前に、 sed-th ワイルドカードを環境名に指定します。 環境名変数は環境変数を介して渡されます。 面白いですね。

何らかの理由で、Splunk は docker パラメーターの存在による影響を受けないことにも注意してください。 hostname。 彼は依然としてホストフィールドに自分のコンテナの ID を含むログを頑固に送信します。 解決策として、マウントできます / etc / hostname ホスト マシンから取得し、起動時にインデックス名と同様の置換を行います。

例 docker-compose.yml

version: '2'
services:
  splunk-forwarder:
    image: "${IMAGE_REPO}/docker-stats-splunk-forwarder:${IMAGE_VERSION}"
    environment:
      SPLUNK_INDEX: ${ENVIRONMENT}
    volumes:
    - /etc/hostname:/etc/hostname:ro
    - /var/log:/var/log
    - /var/run/docker.sock:/var/run/docker.sock:ro

合計

はい、おそらくこの解決策は理想的ではなく、多くの解決策があるため、すべての人にとって普遍的ではありません。 「ハードコード」。 ただし、Docker で Splunk Forwarder が必要な場合は、これに基づいて誰もが独自のイメージを構築し、プライベート アーティファクトリに配置できます。

リンク:

記事からの解決策
一部の機能を再利用するきっかけとなった outcoldman のソリューション
の。 Universal Forwarder のセットアップに関するドキュメント

出所: habr.com

コメントを追加します