Solucionar problemas de Tableau Server en un contenedor

Introducción

Tableau Server en un contenedor es la primera oferta de servidor basada en contenedores de Tableau. Tableau Server en un contenedor es una instancia de Tableau Server todo en uno que se ejecuta dentro de un contenedor de Docker de Linux. En otras palabras, la imagen de Tableau Server en un contenedor es una imagen de Docker que ejecuta toda una aplicación de Tableau Server independiente. Tableau Server en un contenedor es el primero de pasos necesarios para admitir Tableau Server que se ejecuta en entornos basados en contenedores. La forma más fácil de entender el concepto de Tableau Server en un contenedor es imaginarlo como una máquina virtual con Tableau Server preinstalado. La imagen se basa en una imagen UBI 8 (imagen CentOS 7.x para las versiones 2022.1 y anteriores) y ejecuta supervisord (en lugar de systemd) del contenedor. Cuando el contenedor inicie supervisord, este intentará inmediatamente inicializar y ejecutar Tableau Server. Gran parte de esta documentación tiene como objetivo describir cómo configurar y aprovechar la automatización para que pueda ejecutar Tableau Server en entornos Docker.

La herramienta de configuración de imágenes en un contenedor de Tableau Server le ayuda a crear y personalizar las imágenes de contenedor para incluir paquetes y artefactos personalizados. Una de las funciones principales de la herramienta es crear la imagen del contenedor e instalar conectores de datos personalizados.

Para probar Tableau Server en una imagen de contenedor rápidamente en escenarios de prototipo, consulte Guía de inicio rápido: Tableau Server en un contenedor.

Limitaciones

  • Tableau Server en un contenedor solo admite la activación de licencias mediante Server ATR, que requiere que el contenedor tenga acceso a Internet. Por lo tanto, no es posible la activación sin conexión en un entorno aislado.
  • Actualmente, Tableau Server en un contenedor no es compatible con el agente de la Resource Monitoring Tool (RMT).
  • Kerberos no es compatible con Tableau Server en un contenedor.

Solución de problemas

Si tiene problemas al ejecutar Tableau Server, existen varias vías que puede seguir para encontrar una solución. Esta sección habla de consejos generales para la solución de problemas de Tableau Server, como dónde encontrar registros y qué significan. También incluye algunos escenarios conocidos específicos y rutas de mitigación.

Si está trabajando con el soporte de Tableau para depurar un problema, puede resultarle útil proporcionar lo siguiente:

  • Registros de Tableau Server (la recopilación de estos registros se explica a continuación).
  • Registros stdout de contenedor de Docker.
  • Dockerfile de Tableau Server (si se ha realizado alguna personalización).
  • Configuración de implementación que incluye:

    • Kubeconfig (o cualquier configuración de implementación equivalente).
    • Archivos de configuración estáticos que configuran el contenedor de Tableau Server.

Errores de instalación e inicialización

Si está inicializando Tableau Server por primera vez, o ha realizado una instalación nueva dentro de un contenedor, el servidor no se recuperará simplemente reiniciando el contenedor. Cada intento de instalación debe usar un directorio de datos limpio. Esto puede significar eliminar datos de volumen persistentes de ejecuciones de contenedores anteriores. Si hace esto, asegúrese de guardar los registros y la información que podría ser útil para la depuración.

Depuración de la instalación fallida

Los contenedores de Tableau Server están diseñados para salir cuando se produce un error en la instalación. Este patrón facilita la automatización e identificación cuando se ha producido un error en la instalación. Sin embargo, puede dificultar la depuración porque el contenedor se cerrará y no dejará ningún estado de tiempo de ejecución que se pueda examinar. Si desea realizar una sesión de depuración dentro de un contenedor en ejecución que falla durante la inicialización, siga estos pasos:

  1. Prepare una implementación nueva de Tableau Server en un contenedor.
  2. Configure el contenedor para que se ejecute con la variables de entorno TSM_ONLY=1. La variables de entorno TSM_ONLY=1 le dice a Tableau Server que solo inicialice TSM. Este es el equivalente a ejecutar el script initialize-tsm en una instalación estándar sin contenedor.
  3. Ejecute el contenedor de Tableau Server.
  4. Abra un shell dentro del contenedor.
  5. Ahora puede ejecutar comandos de TSM, aunque Tableau Server no se haya inicializado. Para reanudar la automatización que tiene lugar normalmente durante la inicialización, ejecute el script tsm-commands: "${DOCKER_CONFIG}"/config/tsm-commands

Soporte de Tableau y Kubernetes

Tableau Server en un contenedor se puede ejecutar con Kubernetes, pero no es un requisito para hacerlo. Nuestra expectativa es que la mayoría de los clientes usen Kubernetes o uno de sus entornos de nube administrados asociados (EKS, AKS o GKS) para ejecutar y administrar Tableau Server en un contenedor.

Kubernetes puede ser un entorno complejo de ejecutar y depurar y, a menudo, incluye dependencias de la infraestructura y configuración de empresas individuales. Debido a esto, el soporte de Tableau no puede ayudar a los clientes a resolver los problemas de Kubernetes (o implementación de infraestructura) asociados con la ejecución de Tableau Server en un contenedor. Sin embargo, Tableau admite la ejecución de Tableau Server en un contenedor de Docker. Por lo tanto, si tiene problemas para ejecutar Tableau Server en un contenedor con Kubernetes, el soporte de Tableau solo puede validar que el contenedor de Docker funcione correctamente por sí solo.

Para obtener más información sobre cómo ejecutar Tableau Server en un contenedor con Kubernetes, consulte este sitio de Github: https://github.com/tableau/tableau-server-in-kubernetes(El enlace se abre en una ventana nueva).

Registros

Los registros son un recurso esencial para encontrar, comprender y resolver problemas en Tableau Server. Son útiles para ayudar a nuestros equipos de soporte a encontrar la raíz de los problemas que encuentre. Los registros también pueden ser útiles para su propia depuración y resolución de problemas.

Extraer todos los registros

Si necesita extraer todos los registros para una mayor depuración o enviarlos a nuestros equipos de soporte, existen algunos métodos para recuperar esta información.

Ziplogs

TSM puede crear un archivo comprimido que contenga todos los registros del servidor relevantes. Puede activar esto ejecutando el comando tsm maintenance ziplogs. Cuando se complete el comando, informará la ruta de archivo del archivo de registro. Deberá copiar el archivo utilizando el método de transferencia de archivos que mejor se adapte a su situación. Para obtener más información sobre los ziplogs, consulte tsm maintenance ziplogs.

Comando de ejemplo ejecutado dentro del contenedor:

tsm maintenance ziplogs
Comando manual tar

Si no puede ejecutar el comando ziplogs, por ejemplo, si el servidor no logra alcanzar un estado consistente, aún puede recuperar los registros ejecutando un comando tar dentro del contenedor. Deberá copiar el archivo utilizando el método de transferencia de archivos que mejor se adapte a su situación.

Comando de ejemplo ejecutado dentro del contenedor (escribe el tar en un directorio temporal en el directorio de datos del contenedor):

tar -zcvf /var/opt/tableau/tableau_server/temp/<archive_name>.tar.gz \
/var/opt/tableau/tableau_server/data/tabsvc/logs/. \
/var/opt/tableau/tableau_server/supervisord/ \
/var/opt/tableau/tableau_server/data/tabsvc/config/ \
/docker/.metadata.conf \
--exclude='*keystores' --exclude='*.jks' --exclude='*.tks' \
--exclude='*asset_keys.yml' --exclude='*.ks' --exclude='*.ts' \
--exclude='*.crt' --exclude='*cacerts' --exclude='*.key'
Navegación por registros y sugerencias de depuración

Existen pasos comunes para diagnosticar la mayoría de los problemas en Tableau Server. Si está pensando en echar un vistazo a los registros de su servidor, puede ser útil desglosar qué información buscar dependiendo de en qué parte del ciclo de vida del servidor ocurrió el error.

Inicio del contenedor (inicial/instalación)

Si el contenedor falla inmediatamente o no se instala o inicializa, compruebe los siguientes recursos:

Contenedor stdout

Examine stdout para el contenedor de Docker. Por lo general, se puede acceder observando la salida del contenedor recopilada por su sistema de organización de contenedores (por ejemplo, Kubernetes). Debido a que Tableau Server es un sistema de varios procesos que se ejecuta dentro de un contenedor, stdout a menudo no es útil y no informa de la causa raíz del problema, a menos que haya errores catastróficos en el inicio. Se recomienda comprobar stdout del contenedor defectuoso antes de profundizar en los registros de Tableau Server.

Ejemplo:

docker logs <container-name>

Registro de inicio del contenedor de Tableau Server

El registro de inicio del contenedor de Tableau Server recopila la salida de la automatización que inicializa, configura e inicia Tableau Server. Si encuentra que su contenedor tiene problemas al arrancar o al ejecutarse por primera vez, este es el primer registro que debe comprobar:

/var/opt/tableau/tableau_server/supervisord/run-tableau-server.log

Compruebe la parte inferior del registro y vea si se informa de un error. A veces, se informará del error de una manera obvia en el registro. Si el error no se borra del registro, es posible que la causa raíz solo sea visible en un archivo de registro específico de la etapa o del servicio. Los registros que se enumeran a continuación cubren estas posibilidades.

Registro de instalación de Tableau Server

Si el registro de inicio indica que hubo un problema con la automatización que se encarga de la etapa de inicialización de TSM, consulte este registro:

/var/opt/tableau/tableau_server/logs/app-install.log

Registro del controlador de Tableau Server

Si el registro de inicio indica que hubo un problema con la inicialización y el inicio de la etapa del servidor (solo CLI), compruebe el registro del servicio tabadmincontroller:

/var/opt/tableau/tableau_server/data/tabsvc/logs/tabadmincontroller/tabadmincontroller_node1-0.log

Este archivo de registro es para un servicio específico llamado tabadmincontroller. Tabadmincontroller es responsable de organizar la funcionalidad de inicialización y arranque en Server. Este registro puede ser complejo y detallado. Es posible que los errores en este archivo de registro tampoco indiquen la causa raíz. A veces, los errores son causados por servicios en los que se basa tabadmincontroller para completar una determinada tarea. Consulte la sección Tiempo de ejecución del servidor a continuación para obtener más detalles.

Registros de servicio: tiempo de ejecución del servidor

Si Tableau Server encuentra problemas durante el tiempo de ejecución normal o problemas con los servicios que no completan las tareas o están inactivos, puede consultar los registros de servicio para obtener más información. Cada servicio que se ejecuta como parte de Tableau Server tiene un archivo de registro de servicio. Si sabe qué servicio le gustaría examinar, puede encontrar los registros de ese servicio en este directorio general:

/var/opt/tableau/tableau_server/data/tabsvc/logs/<service_name>

Proporcione el nombre del servicio en el archivo arg <service_name> de la ruta del archivo. Cualquier servicio puede escribir varios tipos de archivos de registro. Además, si tiene más de un servicio en ejecución (más de una instancia), todos los registros de servicios se escribirán en el mismo directorio de servicios.

Clasificaciones de archivos de registro específicos de servicios generales

Esta tabla indica los nombres, los tipos y las descripciones de archivos de registro de servicio más comunes para los servicios de Tableau Server. La columna "Tipos de errores" indica qué archivos de registro pueden resultar útiles en caso de errores determinados.

NombreFormato de nombre de archivoDescripciónTipos de erroresEjemplo
Aplicación de controlcontrol_<service_name>_<node_id>-<instance_id>.logContiene información del proceso de la aplicación de control que es responsable de instalar y configurar un servicio. Este suele ser el primer registro escrito relacionado con un servicio. Para ver los errores de instalación y configuración del servicio, haga su consulta aquí primero.Instalación, configuración, estadocontrol_backgrounder_node1-0.log
Registro de servicio<service_name>_<node_id>-<instance_id>.logRegistro principal para un servicio en ejecución. La mayoría de las veces, este registro contiene la salida de la capa de aplicación spring/java.Inicio, tiempo de ejecución, estadobackgrounder_node1-1.log
Registro de stdoutstdout_<service_name>_<instance_id>.logContiene la salida de stdout para el servicio. La mayoría de los servicios no generan mucho contenido en stdout y en su lugar se escribe en el registro principal. A veces, este registro puede contener información útil cuando se cierra un servicio.Iniciar, detenerstdout_backgrounder_0.log
Registro de NativeAPInativeapi_<service_name>_<instance_id>.txtAlgunos servicios ejecutan una capa de código nativo. Este registro captura esa parte del tiempo de ejecución de la aplicación.Licencia, inicio, tiempo de ejecución, estadonativeapi_backgrounder_1-1_2021_05_10_00_00_00.txt
Registro de Tomcattomcat_<service_name>_<node_id>-<instance_id>.logEsto es solo para los servicios que se ejecutan dentro de un contenedor Tomcat y contienen registros de Tomcat. Rara vez proporciona información sobre errores en el servicio. Puede resultar útil para depurar algunos problemas de red.Red, iniciotomcat_backgrounder_node1-0.2021-05-10.log
Contenedor detenido

Si el contenedor está detenido o es difícil ejecutar comandos en él, aún puede mirar los registros si el directorio de datos del servidor está externalizado a un volumen montado. De lo contrario, solo el stdout del contenedor se podrá examinar en el sistema de organización del contenedor, que a menudo no contendrá la causa raíz.

Error al establecer las propiedades de autenticación

Parece haber un problema con la configuración de las propiedades de autenticación en Tableau Server sin que el almacén de identidades se configure primero. Para solucionar este problema, configure el almacén de identidades en el vínculo de preinicialización.

  1. Cree un archivo llamado ./customer-files/pre_init_command en el directorio de archivos de cliente de la herramienta de creación de imágenes de Tableau Server y edítelo para que contenga:

    #!/bin/bash
    tsm configuration set -k wgserver.authenticate -v local --force-keys
  2. Configure el script para que sea ejecutable.

    chmod +x ./customer-files/pre_init_command
  3. Genere y ejecute la imagen.

Error durante el nuevo inicio (por ejemplo, ¿por qué no se inicia Tableau Server?)

  • Si tiene problemas con la inicialización o el inicio de Tableau Server, hay varias opciones de solución de problemas que pueden ayudar a descubrir el problema.
  • Si el contenedor no se puede iniciar en absoluto, puede comprobar el stdout del proceso PID 1 mediante el comando docker logs <container-name>.
  • Si el contenedor se está ejecutando pero Tableau Server no parece inicializarse o ejecutarse correctamente, el segundo lugar para comprobar si hay errores es este archivo:
${DATA_DIR}/supervisord/run-tableau-server.log

Ejemplo:

docker exec -it <container-name> bash -c 'cat $DATA_DIR/supervisord/run-tableau-server.log'

Este archivo de registro contiene todos los eventos orquestados por el servicio de inicialización del contenedor de Tableau que controla el inicio de Tableau Server, así como la ejecución de los scripts de instalación o la configuración personalizada que haya proporcionado en el contenedor. La mayoría de los errores de inicio informarán de los problemas aquí. A veces, si el error está relacionado con un proceso de TSM o Tableau Server, sugerirá otro archivo de registro para buscar información más detallada.

Error durante el reinicio o el inicio de un contenedor con datos existentes

Server no inicia PostGRES (u otros procesos)

Cuando los datos se conservan fuera del contenedor y se inicia otra instancia de imagen de Tableau Server en un contenedor con esos datos antiguos, es importante tener en cuenta que el nombre de host interno del nuevo contenedor debe coincidir con el nombre de host del contenedor que inicializó los datos persistentes. Tableau Server no gestiona bien los cambios dinámicos de nombres de host y la puesta en marcha de un nuevo contenedor con un nombre de host interno diferente está causando ese escenario.

El remedio consiste en asegurarse de que el nombre de host del contenedor está establecido en el mismo valor que el contenedor que se estaba ejecutando anteriormente con esos datos. Esto no debe confundirse con entornos multinodo, los trabajadores pueden (y deben) tener diferentes nombres de host entre sí. Lo que importa es cuando se reinicia un contenedor determinado o se elimina (mata) el contenedor posterior debe tener el mismo nombre de host que su predecesor.

Ejemplos de configuración de la implementación

Docker

Uso básico de Tableau Server en un contenedor
docker run \
-e LICENSE_KEY=<key>
-p 8080:8080
--hostname=<static (internal) name of host machine> \
-d <Tableau Server in a Container image ID or tag>
Uso básico de Tableau Server en un contenedor con usuario administrador inicial automatizado
docker run \
-e LICENSE_KEY=<key> \
-e TABLEAU_USERNAME=<myadmin> \
-e TABLEAU_PASSWORD_FILE=/etc/tableau-admin-secret \
-v <full-path-to-pw-file>:/etc/tableau-admin-secret \
--hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
Modo solo TSM
docker run \
-e TSM_ONLY=1 \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
Uso básico de varios nodos
Nodo inicial

Opción 1: use esto si la configuración del servidor (CONFIG_FILE ) especifica una topología de varios nodos:

docker run \
-v <network-shared-directory>:/docker/config/bootstrap \
-v <full-path-to-config-file>:/docker/config/config.json:ro \
-e LICENSE_KEY=<key> \
-p 8080:8080 -p 8800-9000:8800-9000 -p 27000-27010:27000-27010 \
--hostname=<name-of-host-machine> \
-d <Tableau Server in a Container image ID or tag>

Opción 2: utilice esta opción si desea una implementación de varios nodos incluso si la configuración del servidor no especifica la topología de varios nodos:

docker run \
-v <network-shared-directory>:/docker/config/bootstrap \
-e LICENSE_KEY=<key> -e ALWAYS_WRITE_BOOTSTRAP_FILE=1 \
-p 8080:8080 -p 8800-9000:8800-9000 -p 27000-27010:27000-27010 \
--hostname=<name-of-host-machine> \
-d <Tableau Server in a Container image ID or tag>
Nodo adicional
docker run \
-v <network-shared-directory>:/docker/config/bootstrap \
-e BOOTSTRAP_INSTALL=1 \
-p 8080:8080 -p 8800-9000:8800-9000 \
--hostname=<static (internal) name of host machine> \
-d <Tableau Server in a Container image ID or tag>
Externalizar el uso de datos
docker run \
-v <empty-data-dir>:/var/opt/tableau \
-e LICENSE_KEY=<key> \
---hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
Uso básico de Init-container

Init-container

docker run \
-v <empty-data-dir>:/var/opt/tableau \
-e LICENSE_KEY=<key> \
-e INIT_CONTAINER=1 \
--hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>

Ejecutar contenedor

docker run \
-v <empty-data-dir>:/var/opt/tableau \
--hostname=<static (internal) name of host machine> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
Restauración básica a partir de una copia de seguridad de nodo único
docker run \
-v <full-path-to-backup-file>:/docker/config/backup/backup-file.tsbak \
-v <full-path-to-config-only-file>:/docker/config/config.json:ro \
-e LICENSE_KEY=<key> \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>

Docker-compose

version: '3.2'
services:
    tableau-server:
         hostname: localhost
         volumes:
              - <your-tsm-command-file>:/docker/config/tsm-commands:ro
              - <your-config-file >:/docker/config/config.json:ro
         ports:
              - "8080:8080"
         image: ${IMAGE_NAME}
         environment:
              - LICENSE_KEY=<license-key>