Splunk 是幾種最知名的商業日誌收集和分析產品之一。 即使現在,當俄羅斯不再銷售時,這也不是不為該產品編寫說明/操作方法的理由。
任務:在不改變主機配置的情況下,從Splunk中的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 之類的怎麼樣?
不,謝謝。 我們將採取不同的路線。 如果我們在組裝階段執行所有這些操作怎麼辦? 那我們走吧!
為了不耽誤太久,我馬上給大家看最終的效果圖:
Dockerfile
# Тут у кого какие предпочтения
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" ]
那麼裡麵包含了什麼
首先開始.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 介面下載。
哪裡可以點擊下載(如圖)
這是一個可以解壓縮的常規存檔。 裡面有用於連接到我們的 SplunkCloud 的憑證和密碼, 輸出.conf 以及我們的輸入實例的清單。 在您重新安裝 Splunk 安裝或新增輸入節點(如果安裝是本機安裝)之前,此檔案將一直相關。 因此,添加到容器內是沒有問題的。
最後一件事是重新啟動。 是的,要應用更改,您需要重新啟動它。
在我們的 輸入配置文件 我們新增要傳送到 Splunk 的日誌。 例如,如果您透過 puppet 分發配置,則無需將此檔案新增至映像中。 唯一的事情是轉發器在守護程序啟動時看到配置,否則它將需要 ./splunk重新啟動.
它們是什麼樣的 docker stats 腳本? Github 上有一個舊的解決方案
利用獲得的數據,您可以建立以下內容
儀表板:(幾張圖片)
破折號的源代碼位於文章末尾提供的連結中。 請注意,有 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
}
就我而言,對於每個環境和每個單獨的實體,無論是容器中的應用程式還是主機中的應用程序,我們都使用單獨的索引。 這樣,當數據大量累積時,搜尋速度就不會受到影響。 使用一個簡單的規則來命名索引: _。 因此,為了使容器具有通用性,在啟動守護程序本身之前,我們將 口渴-th 環境名稱通配符。 環境名稱變數透過環境變數傳遞。 聽起來很有趣。
另外值得注意的是,由於某種原因,Splunk 不受 docker 參數存在的影響 主機。 他仍然會固執地發送日誌,並在主機欄位中包含他的容器的ID。 作為解決方案,您可以安裝 在/ etc /主機名 從主機並在啟動時進行類似於索引名稱的替換。
範例 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。
引用:
來源: www.habr.com