
Splunk es uno de los productos comerciales más reconocidos para recopilar y analizar registros. Incluso ahora, cuando las ventas en Rusia ya no se realizan, esta no es una razón para no escribir instrucciones / procedimientos en este producto.
Tarea : recopilar registros del sistema desde los nodos de Docker en Splunk sin cambiar la configuración del host
Me gustaría comenzar con un enfoque oficial, que se ve extraño al usar Docker.
Enlace al centro DockerQue tenemos
1. imagen Pullim
$ docker pull splunk/universalforwarder:latest
2. Comenzamos el contenedor con los parámetros necesarios.
$ docker run -d -p 9997:9997 -e 'SPLUNK_START_ARGS=--accept-license' -e 'SPLUNK_PASSWORD=<password>' splunk/universalforwarder:latest
3. Entramos en el contenedor
docker exec -it <container-id> /bin/bash
A continuación, se nos pide que vayamos
a la dirección conocida en la documentación.
Y configure el contenedor después de que comience:
./splunk add forward-server <host name or ip address>:<listening port> ./splunk add monitor /var/log ./splunk restart
Espera un momento Que?
Pero las sorpresas no terminan ahí. Si ejecuta el contenedor desde la imagen oficial en modo interactivo, verá lo siguiente:
Un poco de decepción $ 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 ********* ...
Genial La imagen ni siquiera tiene un artefacto. Es decir, cada vez que inicie, llevará tiempo descargar el archivo con binarios, descomprimirlo y configurarlo.
¿Pero qué hay de Docker Way y todo eso?
No gracias Nosotros iremos por el otro lado. ¿Qué pasa si realizamos todas estas operaciones en la etapa de ensamblaje? Entonces vamos!
Para no tirar por mucho tiempo, inmediatamente mostraré la imagen final:
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" ]
Y entonces, lo que está contenido en
En el primer inicio, Splunk solicita un nombre de usuario / contraseña, PERO estos datos se usan
solo para ejecutar comandos administrativos de esta instalación en particular, es decir, dentro del contenedor. En nuestro caso, solo queremos lanzar el contenedor para que todo funcione y los registros fluyan como el agua. Por supuesto, este es un código duro, pero no he encontrado otras formas.
Más adelante se ejecuta el script
/splunkforwarder/bin/splunk install app /splunkclouduf.spl -auth admin:changeme
splunkclouduf.spl : este es un archivo de créditos para Splunk Universal Forwarder, que se puede descargar desde la interfaz web.
Dónde hacer clic para descargar (en imágenes) Este es un archivo regular que puedes descomprimir. Inside: certificados y contraseña para conectarse a nuestro SplunkCloud y
outputs.conf con una lista de nuestras instancias de entrada. Este archivo será relevante hasta que reinstale su instalación de Splunk o agregue un nodo de entrada si la instalación es en las instalaciones. Por lo tanto, está bien agregarlo dentro del contenedor.
Y el último es reiniciar. Sí, para aplicar los cambios, debe reiniciarlo.
En nuestros
inputs.conf agregamos los registros que queremos enviar a Splunk. No es necesario agregar este archivo a la imagen si, por ejemplo, dispersa las configuraciones a través de la marioneta. Lo principal
es que Forwarder ve las configuraciones cuando se inicia el demonio, de lo
contrario será necesario
reiniciar ./splunk .
¿Qué scripts de estadísticas de Docker? El github tiene una solución antigua de
outcoldman , los scripts se toman de allí y se finalizan para funcionar con las versiones actuales de Docker (ce-17. *) Y Splunk (7. *).
Con los datos obtenidos, puede construir tales
tableros: (un par de fotos) El código fuente de los platos se encuentra en el nabo indicado al final del artículo. Tenga en cuenta que hay 2 campos de selección: 1 - seleccione el índice (buscado por máscara), seleccione el host / contenedor. Probablemente tenga que actualizar la máscara de índice, dependiendo de los nombres que use.
En conclusión, quiero prestar atención a la función
start () en
entrypoint.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 }
En mi caso, para cada entorno y cada entidad individual, ya sea una aplicación en un contenedor o una máquina host, utilizamos un índice separado. Por lo tanto, la velocidad de búsqueda no sufrirá con una acumulación significativa de datos. Se usa una regla simple para nombrar índices:
<environment_name> _ <service / application / etc> . Por lo tanto, para hacer que el contenedor sea universal, antes de iniciar el demonio directamente, reemplazamos el comodín
sed con el nombre del entorno. Una variable con un nombre de entorno se pasa a través de variables de entorno. Eso suena gracioso
También vale la pena señalar que, por alguna razón, Splunk no se ve afectado por el parámetro de
nombre de host de Docker. De todos modos, enviará persistentemente registros desde la identificación de su contenedor al campo host. Como solución, puede montar
/ etc / hostname desde la máquina host y, al inicio, hacer un reemplazo similar a los nombres de índice.
Docker-compose.yml ejemplo 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
ResumenSí, tal vez la solución no sea perfecta y, desde luego, no sea universal para todos, ya que existe una gran cantidad de
"hardcode" . Pero sobre la base de esto, todos pueden recopilar su imagen y ponerla en su propio artefacto privado, si, como sucedió, necesita Splunk Forwarder en el acoplador.
Referencias
Solución del artículo.La solución de Outcoldman se inspiró para reutilizar parte de la funcionalidadDe Documentación de configuración de Universal Forwarder