Con la reciente publicación de Operador autónomo de Couchbase (CAO) 2.2hemos proporcionado recientemente procesamiento y reenvío de registros para los despliegues de Kubernetes utilizando la herramienta OSS Fluent Bit. Esto también es OSS y disponible en GitHub o como contenedor.
Bits fluidos comenzó como una solución nativa de reenvío de registros para objetivos integrados, de modo que pueda reutilizar nuestra solución Kubernetes para implantaciones in situ o incluso los que utilizan Kubernetes sin la CAO también.
Esta entrada del blog le explicará cómo hacerlo, junto con un poco de información sobre los diversos componentes implicados. Si sólo desea los detalles saltar a la Reenvío de registros sección. También hay un ejemplo que funciona perfectamente disponible en este repositorio de GitHub.
¿Qué es Fluent Bit?
Fluent Bit es una solución OSS ampliamente utilizada y de alto rendimiento para el procesamiento y transporte de sus registros. Si aún no dispone de una solución de registro centralizada, este artículo le mostrará cómo puede proporcionarla fácilmente. Un ejemplo concreto es el reenvío de registros de auditoría a cualquiera de los objetivos compatibles proporcionados por Fluent Bit (por ejemplo, S3).
Fluent Bit es esencialmente un pipeline configurable que puede consumir múltiples tipos de entradaanalizarlos, filtrarlos o transformarlos y, a continuación, enviarlos a múltiples destinos de salida incluyendo cosas como S3, Splunk, Loki y Elasticsearch con un esfuerzo mínimo. Hay mucha documentación disponible que explica en detalle cómo funciona todo.
Se utiliza ampliamente en los despliegues de Kubernetes (por ejemplo, GKE y AWS lo despliegan por defecto) como un daemonset que sólo significa una aplicación (la demonio) que se ejecuta en todos los nodos Kubernetes que componen el clúster. Fluent Bit normalmente guarda los registros de los distintos contenedores (la mejor práctica para los contenedores es registrarlos en stdout y el tiempo de ejecución del contenedor empuja esto a un archivo rotado localmente) y soporta reenviarlos desde el nodo local a alguna herramienta centralizada de gestión de logs. En lugar de tener que desplegar nuevos binarios, todo se gestiona únicamente mediante cambios en la configuración.
Fluent Bit convierte los troncos en datos estructurados en un formato interno común (Paquete de mensajesun formato JSON binario optimizado) para que varios plugins puedan trabajar con él (por ejemplo, para filtrar o transformar algo con un plugin genérico es necesario que esté en un formato común) o enviarlo a una salida concreta en el formato apropiado para ese punto final. Para ello, Fluent Bit utiliza analizadores. Sin embargo, admite la lectura de toda la línea de un archivo como un único par clave-valor para simplificar la conversión y como recurso en caso de que falle el análisis sintáctico.
Solución de registro de Couchbase con Fluent Bit
Hemos tomado la solución OSS Fluent Bit y la hemos ampliado para satisfacer algunas necesidades específicas de Couchbasecomo:
-
- Soportar cambios dinámicos de configuración sin reiniciar Couchbase Server y activar un rebalanceo. Esto es importante para el caso de uso de CAO, pero probablemente no tanto en las instalaciones.
- Apoyo a la redacción en vuelo y preprocesamiento de informes de reequilibrio.
- Procesamiento de los distintos archivos de registro con un enfoque común.
De todos ellos, el más importante para las implantaciones locales es la gestión de los distintos archivos de registro.
Los archivos de registro producidos por Servidor Couchbase están en varios formatos distintos y algunas de las sentencias de registro abarcan varias líneas, por lo que confiar en el envío línea por línea no es lo ideal. La mayoría de las herramientas pueden hacerlo (por ejemplo, PromTail también puede analizar sentencias multilínea), pero requerirían una configuración específica, mientras que nuestra solución ya resuelve todo esto.
Se ha elaborado un conjunto básico de analizadores sintácticos para gestionar los distintos registros y también se ha contribuido al proyecto OSS Fluent Bit: A partir de la versión 1.7.6, los analizadores sintácticos son disponible en la imagen oficial y la instalación binaria. Esto significa que todo lo presentado aquí es completamente OSS y puede ser utilizado sin ningún despliegue específico de Couchbase.
Uso de Grafana, Prometheus y Loki
Grafana es una plataforma de observabilidad de código abierto que puede manejar varias fuentes de datos para mostrarle lo que está haciendo su plataforma en tiempo real, así como activar alertas cuando se cumplen determinadas condiciones. La misma pila podría incluir Prometeo para la supervisión de métricas y Loki para el almacenamiento y consulta de registros.
Para esta entrada de blog, estoy utilizando estas tecnologías como un marcador de posición para una plataforma de observabilidad centralizada equivalente a la que Fluent Bit puede dirigirse. Es fácil de ejecutar localmente como una pila de prueba para fines de demostración aquí. Por otro lado, Couchbase ya proporciona un Opción de supervisión de métricas de Prometheus que también podría integrarse aquí de la misma manera.
Las alternativas a esta pila podrían ser Splunk, Elasticsearch con Kibana o soluciones gestionadas como Amazon Cloudwatch o Azure Log Analytics.
Cómo ejecutar todas estas herramientas in situ
Esta sección proporcionará detalles de tipo tutorial sobre la ejecución de una solución de reenvío de logs utilizando Fluent Bit en un despliegue local.
Tenga en cuenta que la ejecución de una solución de reenvío de registros con Fluent Bit para Couchbase Server en una implementación local no está soportada oficialmente.
La recomendación es utilizar el Contenedor Couchbase Fluent Bit (o la oficial de Fluent Bit). Sin embargo, Fluent Bit también se puede instalar directamente y la configuración proporcionada por la imagen Fluent Bit de Couchbase se puede reutilizar para lograr la mayoría de los mismos efectos, aunque no todos.
Cada plataforma compatible con Couchbase Server 6.6.2+ pueden ejecutar contenedores. Consulte la documentación para instalar el tiempo de ejecución del contenedor aquí. Asegúrese de activar la compatibilidad con contenedores Linux en una plataforma Windows.
Para los propósitos de esta entrada de blog, voy a utilizar las versiones en contenedor de Couchbase Server sólo para ejecutar un clúster local y mostrar cómo conectar el contenedor Couchbase Fluent Bit a sus registros. También se puede utilizar directamente un binario de servidor nativo.
El contenedor Couchbase Server se ejecuta únicamente como ejemplo para generar los registros. Si ya tiene un servidor en funcionamiento, utilice el directorio que tiene para sus registros en el directorio Sección de reenvío de registros. Del mismo modo, si desea utilizar el binario nativo para Couchbase Server, puede hacerlo.
Paso 1: Despliegue de Couchbase Server
Ignora esta sección si ya tienes una instancia desplegada. Si se trata de una versión en contenedor, asegúrese de que el directorio de registro está expuesto a través de una etiqueta volumen o bind mount en el host (como hacemos en el tutorial a continuación).
Siga las instrucciones para desplegar un conjunto de uno o varios contenedores como un cluster Couchbase pero con un volumen para los logs:
|
1 2 3 |
mkdir -p /tmp/couchbase-Registros docker ejecute --rm -d --nombre db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 \ -v /tmp/couchbase-Registros/:/op/couchbase/var/lib/couchbase/Registros/ couchbase:6.6.2 |
Lo principal aquí es asegurarnos de que exponemos los logs producidos por Couchbase Server para que otro contenedor pueda recogerlos, de lo contrario estarían todos aislados dentro del contenedor. Para un despliegue binario nativo de Couchbase Server, simplemente se escribiría en un directorio en el host, así que esto no es necesario.
El servidor Couchbase la documentación detalla la ubicación del directorio de registro.
Tenga en cuenta que esto utiliza un contenedor llamado db así que asegúrese de que no existe ya, de lo contrario se generará un error debido al conflicto con docker rm db. Nuestro comando anterior limpia automáticamente el contenedor al salir.
Ahora, podemos comprobar que los registros se están creando en nuestro directorio:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ls -l /tmp/couchbase-Registros total 1344 -rw-r----- 1 patrickstephens rueda 23330 4 Jun 11:11 niñera.registro -rw-r----- 1 patrickstephens rueda 152 4 Jun 11:11 couchdb.registro -rw-r----- 1 patrickstephens rueda 330926 4 Jun 11:11 depurar.registro -rw-r----- 1 patrickstephens rueda 0 4 Jun 11:11 error.registro -rw-r----- 1 patrickstephens rueda 6926 4 Jun 11:11 goxdcr.registro -rw-r----- 1 patrickstephens rueda 0 4 Jun 11:11 acceso_http.registro -rw-r----- 1 patrickstephens rueda 2073 4 Jun 11:11 http_acceso_interno.registro -rw-r----- 1 patrickstephens rueda 73345 4 Jun 11:11 información.registro -rw-r----- 1 patrickstephens rueda 1928 4 Jun 11:11 json_rpc.registro -rw-r----- 1 patrickstephens rueda 0 4 Jun 11:11 mapreduce_errors.registro -rw-r----- 1 patrickstephens rueda 5303 4 Jun 11:11 memcached.registro.000000.txt -rw-r----- 1 patrickstephens rueda 1389 4 Jun 11:11 metakv.registro -rw-r----- 1 patrickstephens rueda 67103 4 Jun 11:11 ns_couchdb.registro drwxr-x--- 2 patrickstephens rueda 64 4 Jun 11:11 reequilibrar -rw-r----- 1 patrickstephens rueda 144264 4 Jun 11:11 informa.registro -rw-r----- 1 patrickstephens rueda 4803 4 Jun 11:11 Estadísticas.registro -rw-r----- 1 patrickstephens rueda 0 4 Jun 11:11 vistas.registro -rw-r----- 1 patrickstephens rueda 0 4 Jun 11:11 xdcr_target.registro |
Para los propósitos de este despliegue no necesitamos realmente configurar el clúster, pero es útil hacerlo para obtener registros y datos adecuados. Siga las instrucciones de la documentación oficial para configurar el clúster a través de la interfaz de usuario e importar también algunos datos de muestra si lo desea.
Si desea ejecutar varios contenedores en el mismo nodo para simular un clúster de múltiples nodos de Couchbase Server, asegúrese de utilizar un directorio de registro independiente (o volumen) para cada contenedor. A continuación, ejecute una imagen de Couchbase Fluent Bit por contenedor Couchbase Server montando cada directorio según la siguiente sección sobre Log Forwarding.
Paso 2: Reenvío de registros
El meollo de la entrada del blog está en esta sección: ¿Cómo configuro los logs de Couchbase Server para que sean procesados y reenviados por Couchbase Fluent Bit?
Una vez que hemos configurado el cluster y opcionalmente añadido algunos buckets, datos de muestra, etc. podemos ejecutar el contenedor Fluent Bit. Esto es bastante simple cuando se utiliza la imagen Couchbase Fluent Bit:
|
1 2 |
docker ejecute --rm -d --nombre registrador -v /tmp/couchbase-Registros/:/op/couchbase/var/lib/couchbase/Registros/:ro \ -e COUCHBASE_LOGS=/op/couchbase/var/lib/couchbase/Registros/ couchbase/fluido-bit:1.0.1 |
Como puedes ver aquí montamos nuestro directorio local y lo especificamos como una variable de entorno (por lo que puedes montarlo en otra ubicación en el contenedor y simplemente apuntar a eso). Así es como se usa con un Couchbase Server desplegado nativamente: Montar el directorio local para los logs en el contenedor en lugar del directorio temporal usado en este ejemplo.
Consulte la documentación oficial de los detalles específicos de donde Couchbase Server almacena sus registros. Este directorio base es el que necesitaría montarse en la imagen de Couchbase Fluent Bit como se indica arriba. Tenga en cuenta los problemas de permisos también.
En La documentación del repositorio Couchbase Fluent Bit especifica las distintas opciones de configuración y sus valores por defecto. Ten en cuenta que la ubicación por defecto de los logs a procesar en la versión de la imagen Couchbase Fluent Bit 1.0.1 es ligeramente diferente de la utilizada por Couchbase Server 6.6.2, por lo que la anulamos arriba para utilizar la misma ubicación en ambas. (Versiones posteriores de la imagen de Couchbase Fluent Bit se alinean con la ubicación de Couchbase Server pero introducen otras características fuera del alcance de este post).
El contenedor debería estar ahora ejecutándose y procesando los registros del directorio que tenemos localmente para luego enviarlos a su flujo de salida estándar por defecto. Con Fluent Bit, podemos ver esto mediante una llamada a docker logs logger que debería mostrar la salida de registros a medida que se actualizan:
|
1 2 3 |
[0] couchbase.registro.xdcr: [1622801916.603000000, {"nombre de archivo"=>"/opt/couchbase/var/lib/couchbase/logs//goxdcr.log", "timestamp"=>"2021-06-04T10:18:36.603Z", "nivel"=>"INFO", "mensaje"=>" GOXDCR.ResourceMgr: Administrador de recursos Estado = overallTP: 0 highTP: 0 highExist: false lowExist: false backlogExist: false maxTP: 0 highTPNeed: 0 highTokens: 0 maxTokens: 0 lowTPLimit: 0 calibration: Ninguno dcpAction: Reset processCpu: 1 idleCpu: 95", "vaina"=>"c901775dec2b", "logshipper"=>"couchbase.sidecar.fluentbit"}] [0] couchbase.registro.depurar: [1622801986.855000000, {"nombre de archivo"=>"/opt/couchbase/var/lib/couchbase/logs//debug.log", "logger"=>"ns_server", "nivel"=>"depurar", "timestamp"=>"2021-06-04T10:19:46.855Z", "mensaje"=>"ns_1@cb.local:compaction_daemon:compaction_daemon:process_scheduler_message:1306]No hay cubos para compactar para compact_views. Reprogramando compactación"., "vaina"=>"c901775dec2b", "logshipper"=>"couchbase.sidecar.fluentbit"}] [0] couchbase.registro.http_acceso_interno: [1622801986.000000000, {"nombre de archivo"=>"/opt/couchbase/var/lib/couchbase/logs//http_access_internal.log", "anfitrión"=>"127.0.0.1", "usuario"=>"@goxdcr-cbauth", "timestamp"=>"04/Jun/2021:10:19:46 +0000", "método"=>"GET", "camino"=>"/pools/nodos", "código"=>"404", "tamaño"=>"14", "cliente"=>"couchbase-goxdcr/6.6.2", "vaina"=>"c901775dec2b", "logshipper"=>"couchbase.sidecar.fluentbit"}] |
Esto es sólo un ejemplo de la salida que puede tener.
Tenga en cuenta que cada archivo de registro tiene su propio flujo utilizando una etiqueta Fluent Bit en el formato: couchbase.log.. Esto le permite realizar diferentes procesamientos o enrutamientos de registros individuales. Por ejemplo, es posible que los registros de auditoría deban dirigirse a un punto final específico distinto del resto o que desee filtrar líneas de un registro concreto. Incluso puede hacer coincidir varias entradas o la misma entrada con diferentes salidas.
La ejecución del contenedor puede realizarse como parte de un script de inicio con systemd o similar como sería Couchbase Server. El tiempo de ejecución del contenedor también puede iniciar automáticamente los contenedores especificados cada vez.
Paso 3: Visualización de registros en directo en Grafana
La configuración por defecto proporcionada por el contenedor es enviar todos los registros a una salida estándar. Sin embargo, usted puede proporcionar su propio archivo de configuración para utilizarlo para hacer cosas diferentes sin ningún otro cambio. Ser capaz de modificar el procesamiento y reenvío de registros es sólo un simple cambio de configuración, que es uno de los beneficios clave de Fluent Bit.
Para ello, vamos a ejecutar una versión local de la aplicación Pila Lokique es Grafana más Loki para la captura de logs (y Prometheus para la captura de métricas). A continuación, configuraremos nuestro contenedor para enviar registros a Loki para que podamos visualizarlos gráficamente en Grafana. La documentación de Loki y Grafana tiene formas alternativas de desplegar la pila Loki, así que consulta la documentación enlazada arriba para más detalles.
A ejemplo de trabajo completo de la sección de abajo se proporciona en el Couchbase Fluent Bit repo en GitHub utilizando Docker Compose para poner en marcha los contenedores todos configurados correctamente.
Asegúrate de detener nuestro contenedor de reenvío de logs previamente configurado. También puede ejecutar otro; sólo asegúrese de darle un nombre diferente, como docker stop logger.
Ahora, ejecute Loki y Grafana, asegurándose de exponer los puertos necesarios para cada uno (3100 y 3000 respectivamente):
|
1 2 |
docker ejecute --rm -d --nombre loki -p 3100:3100 grafana/loki:2.0.0 -config.archivo=/etc/loki/local-config.yaml docker ejecute --rm -d --nombre grafana -p 3000:3000 -e GF_SECURITY_ADMIN_PASSWORD=contraseña grafana/grafana:7.5.2 |
Puede comprobar que ambos se han iniciado correctamente con una llamada a docker ps y ver los registros de Fluent Bit con una llamada a docker logs.
Para soportar el reenvío a Loki, vamos a obtener la dirección IP del contenedor local que lo está ejecutando. Normalmente se desplegaría a un host o nombre de servicio resoluble, pero para la demo estamos ejecutando todo como contenedores locales.
Si ejecuta docker inspect loki mostrará un montón de información sobre el contenedor, con una sección para redes:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
"Redes: { "puente": { "IPAMConfig": null, "Enlaces: null, "Alias": null, "NetworkID": "eb681161db08003e6401b745b0a51c1e1183bee13462fae74ea68ab9736baf34", "EndpointID": "28df33de36007bff0a00c14aa4617d235dadd882e5109feaf536fd1b9b980afd", "Pasarela": "172.17.0.1", "IPAddress": "172.17.0.4", "IPPrefixLen": 16, "Pasarela IPv6": "", "DirecciónIPv6Global": "", "GlobalIPv6PrefixLen": 0, "MacDirección": "02:42:ac:11:00:04", "DriverOpts": null } } |
Para obtener sólo la dirección IP podemos formatear la consulta según la documentación oficial:
|
1 2 |
docker inspeccionar --formato='{{range .NetworkSettings.Networks}}{{.IPAddress}}}{{end}}' loki 172.17.0.4 |
Para mi despliegue, la dirección IP es 172.17.0.4, pero la tuya puede ser diferente, así que sustitúyela después.
El ejemplo proporcionado en el repositorio automáticamente aprovisiona Grafana también para usar Loki, pero necesitamos hacerlo manualmente aquí. Si te conectas a http://localhost:3000/login puede iniciar sesión en Grafana como el usuario admin usuario con el contraseña en la variable de entorno anterior en el comando de ejecución del contenedor Grafana.
Ahora tenemos que añadir Loki como fuente de datos en: http://localhost:3000/datasources
Configure la fuente de datos utilizando la dirección IP del contenedor Loki y el puerto 3100 tal y como se envió cuando ejecutamos el contenedor por primera vez:
Paso 4: Configuración personalizada
Ahora que tenemos Loki y Grafana configurados correctamente, vamos a crear una nueva configuración para nuestro log forwarder para enviarle los logs.
Como parte de nuestro despliegue de Couchbase Fluent Bit, hemos dividido varias secciones de la configuración en archivos reutilizables para incluir, por lo que podríamos simplemente utilizar un archivo de dos líneas para esto, como este de abajo:
|
1 2 |
@incluir /fluido-bit/etc/fluido-bit.conf @incluir /fluido-bit/etc/couchbase/fuera-loki.conf |
Este archivo ahora incluye nuestra configuración por defecto existente más un salida para Loki que no se utiliza por defecto pero se incluye:
|
1 2 3 4 5 6 |
[SALIDA] nombre loki match * host loki etiquetas empleo=couchbase-fluentbit etiqueta_llaves $nombre de archivo,$nivel |
Como se puede ver, esta salida coincide con todas las entradas y las envía a un host llamado loki. Para esta demostración, vamos a utilizar la dirección IP específica del contenedor que ejecuta Loki en el archivo de configuración:
|
1 2 3 4 5 6 7 8 9 10 11 |
cat < /tmp/fluido-bit.conf >> NO._ @incluir /fluido-bit/etc/fluido-bit.conf [SALIDA] nombre loki match * host 172.17.0.4 etiquetas empleo=couchbase-fluentbit etiqueta_llaves $nombre de archivo,$nivel __EOF__ |
Ahora podemos ejecutar de nuevo el reenvío de logs pero utilizando esta configuración personalizada. Asegúrese de cambiarle el nombre o detener la anterior:
|
1 |
docker ejecute --rm -d --nombre registrador -v /tmp/couchbase-Registros/:/op/couchbase/var/lib/couchbase/Registros/:ro -e COUCHBASE_LOGS=/op/couchbase/var/lib/couchbase/Registros/ -v /tmp/fluido-bit.conf:/fluido-bit/config/fluido-bit.conf:ro couchbase/fluido-bit:1.0.1 |
Tenga en cuenta que también ejecutamos todo como un sistema de archivos montado de sólo lectura para que no podamos modificar nada en el contenedor - los registros en bruto no se tocan.
Paso 5: Ver nuestros registros en directo
Ahora los logs deberían empezar a ser enviados a Loki y Grafana. A continuación, puede verlos en: http://localhost:3000/explore?orgId=1&left=%5B%22now-1h%22,%22now%22,%22Loki%22,%7B%22expr%22:%22%7Bjob%3D%5C%22couchbase-fluentbit%5C%22%7D%22%7D%5D
Ahora puede crear cuadros de mando y ver los registros directamente en directo en Grafana.
Problemas conocidos
Entrada fuera de orden
Es posible que vea errores en el registro de Fluent Bit como este al enviar a Loki:
|
1 2 |
[2021/06/04 11:03:50] [error] [salida:loki:loki.1] 172.17.0.4:3100, HTTP estado=400 entrada con marca de tiempo 2021-06-04 11:03:43.507 +0000 UTC ignorado, motivo: entrada fuera de servicio para flujo: {empleo="couchbase-fluentbit"} |
Se trata de un conocido tema con Loki. Se basa en la recepción de cada flujo en orden, pero cuando se trata de multiplexar múltiples flujos, y con la fluctuación de la red, a veces esto no es posible. Normalmente es mejor elegir flujos específicos para enviar con plugins de salida Loki separados y aplicar hilos de trabajo para cada plugin. Como esta entrada de blog sólo utiliza Loki para demostrar la salida de registro, este tema no está cubierto aquí.
Nuevas versiones de Couchbase Fluent Bit
Esta entrada de blog cubre la versión 1.0.1 de la imagen Couchbase Fluent Bit que es la versión oficialmente soportada con CAO 2.2. Couchbase Autonomous Operator puede usar cualquier versión como sidecar, incluyendo imágenes completamente diferentes, pero estas no estarían soportadas para cualquier problema que surja.
Las versiones 1.0.2 y 1.0.3 de la imagen incluyen algunas mejoras e integraciones adicionales con Kubernetes, especialmente en la integración con Loki. Consulte las notas de la versión para más detalles.
Desafortunadamente, algunos de estos cambios significan que deben especificarse variables de entorno adicionales al ejecutar el contenedor (lo que se hace automáticamente como parte de la CAO). Sin ellas, no se ejecutará, indicando que faltan. Se pueden especificar en la línea de comandos utilizando el comando -e clave=valor mostrada anteriormente. Esto se resolverá en la próxima versión de la imagen Couchbase Fluent Bit bajo cambio K8S-2171.
Conclusión
Esperemos que esto te de una buena muestra de cómo puedes utilizar el reenvío de logs con Couchbase Server y Fluent Bit.
Ya existen opciones de monitorización de Prometheus disponibles para Couchbase Server utilizando el módulo Exportador Prometheus de Couchbase que puede integrarse con esta misma pila de Grafana en un único panel de vidrio de observabilidad. Los SDK de Couchbase proporcionan soporte de rastreo con Jaeger que también podría ser integrado en Grafana. Estos temas son objeto de otras entradas en el blog, así que manténgase atento.





