Tableau Server in un contenitore - Risoluzione dei problemi

Introduzione

Tableau Server in un contenitore è la prima offerta server basata su contenitori di Tableau. Tableau Server in un contenitore è un’istanza completa di Tableau Server in esecuzione all’interno di un contenitore Docker di Linux. In altre parole, è un’immagine Docker che esegue un’intera applicazione Tableau Server autonoma. Tableau Server in un contenitore è il primo di molti passaggi per supportare Tableau Server in esecuzione negli ambienti basati su contenitori. Il modo più semplice per comprendere il concetto di Tableau Server in un contenitore consiste nel considerarlo come una macchina virtuale con Tableau Server preinstallato. L’immagine è basata su uun’immagine UBI 8 (CentOS 7.x per la versione 2022.1 e precedenti) ed esegue supervisord (anziché systemd) all’interno del contenitore. All’avvio del contenitore, supervisord tenterà immediatamente di inizializzare e avviare Tableau Server. Gran parte della documentazione seguente ha lo scopo di descrivere come fornire la configurazione e sfruttare l’automazione in modo da eseguire Tableau Server negli ambienti Docker.

Lo strumento di configurazione dell’immagine per Tableau Server in un contenitore consente di personalizzare le immagini del contenitore in modo da includere pacchetti e artefatti personalizzati. Una delle funzionalità principali dello strumento è creare l’immagine del contenitore e installare connettori dati personalizzati.

Per testare rapidamente l’immagine di Tableau Server in un contenitore in scenari proof-of-concept, consulta Tableau Server in un contenitore - Avvio rapido.

Limitazioni

  • Tableau Server in un contenitore supporta solo l’attivazione della licenza tramite l’ATR del server, che richiede che il contenitore abbia accesso a Internet. Pertanto, l’attivazione offline in un ambiente air gapped non è possibile.
  • Tableau Server in un contenitore attualmente non supporta l’agente di Resource Monitoring Tool (RMT).
  • Kerberos non è supportato in Tableau Server in un contenitore

Risoluzione dei problemi

Se riscontri problemi durante l’esecuzione di Tableau Server, puoi seguire diverse strade per trovare una soluzione. In questa sezione vengono fornite indicazioni generali sulla risoluzione dei problemi di Tableau Server, ad esempio dove trovare i log e cosa significano. Sono anche illustrati alcuni scenari noti specifici e i percorsi di mitigazione.

Se stai collaborando con l’assistenza di Tableau per eseguire il debug di un problema, può essere utile fornire quanto segue:

  • Log di Tableau Server (la raccolta di questi log è illustrata di seguito).
  • Log del contenitore Docker stdout .
  • Dockerfile di Tableau Server (se sono state effettuate personalizzazioni).
  • Configurazione della distribuzione, inclusi:

    • Kubeconfig (o qualsiasi configurazione della distribuzione equivalente).
    • File di configurazione statici che configurano il contenitore di Tableau Server.

Errori di installazione e inizializzazione

Se stai inizializzando Tableau Server per la prima volta o hai eseguito una nuova installazione all’interno di un contenitore, il server non verrà ripristinato semplicemente riavviando il contenitore. Per ogni tentativo di installazione dovrebbe essere utilizzata una directory dei dati pulita. Ciò potrebbe comportare l’eliminazione dei dati dei volumi persistenti dalle precedenti esecuzioni del contenitore. Se esegui questa operazione, assicurati di salvare i log e le informazioni che potrebbero essere utili per il debug.

Debug di un’installazione non riuscita

I contenitori di Tableau Server sono progettati per essere chiusi quando si verifica un errore di installazione. Questo modello semplifica l’automazione e l’identificazione del momento in cui si è verificato un errore di installazione. Tuttavia, può rendere difficile il debug perché il contenitore verrà chiuso e non lascerà alcuno stato di runtime esaminabile. Se desideri eseguire una sessione di debug all’interno di un contenitore in esecuzione in cui si verifica un errore durante l’inizializzazione, procedi come segue:

  1. Prepara un nuovo Tableau Server in una distribuzione con contenitore.
  2. Configura il contenitore per l’esecuzione con la variabile di ambiente TSM_ONLY=1. La variabile di ambiente TSM_ONLY=1 indica a Tableau Server di inizializzare solo TSM. È l’equivalente di eseguire semplicemente lo script initialize-tsm in un’installazione standard, senza contenitori.
  3. Esegui il contenitore Tableau Server.
  4. Apri una shell all’interno del contenitore.
  5. Ora puoi eseguire i comandi TSM, anche se Tableau Server non è stato inizializzato. Per riprendere l’automazione che avviene normalmente durante l’inizializzazione, esegui lo script tsm-commands: "${DOCKER_CONFIG}"/config/tsm-commands

Assistenza di Tableau e Kubernetes

Tableau Server in un contenitore può essere eseguito tramite Kubernetes, ma non è obbligatorio farlo. Secondo le nostre previsioni, la maggior parte dei clienti utilizzerà Kubernetes o uno degli ambienti cloud gestiti associati (EKS, AKS o GKS) per eseguire e gestire Tableau Server in un contenitore.

Kubernetes può essere un ambiente complesso da eseguire e sottoporre a debug e spesso include dipendenze dall’infrastruttura e dalla configurazione delle singole aziende. Per questo motivo, l’assistenza di Tableau non può aiutare i clienti a risolvere i problemi di Kubernetes (o di distribuzione dell’infrastruttura) associati all’esecuzione di Tableau Server in un contenitore. Tableau, comunque, supporta l’esecuzione di Tableau Server in un contenitore Docker. Pertanto, in caso di problemi con l’esecuzione di Tableau Server in un contenitore tramite Kubernetes, l’assistenza di Tableau può solo verificare il corretto funzionamento del contenitore Docker di per sé.

Per maggiori informazioni su come eseguire Tableau Server in un contenitore tramite Kubernetes, visita questo sito Github: https://github.com/tableau/tableau-server-in-kubernetes(Il collegamento viene aperto in una nuova finestra).

Log

I log sono una risorsa essenziale per rilevare, comprendere e risolvere i problemi in Tableau Server. Sono utili per aiutare i nostri team di assistenza a trovare la causa principale dei problemi che si verificano. I log possono essere utili anche per il debug e la risoluzione dei problemi.

Estrazione di tutti i log

Se hai bisogno di estrarre tutti i log per ulteriori attività di debug o per inviarli ai nostri team di assistenza, sono disponibili due metodi per recuperare queste informazioni.

Ziplog

TSM può creare un archivio compresso contenente tutti i log del server rilevanti. Puoi attivarlo eseguendo il comando tsm maintenance ziplogs. Al termine del comando, verrà indicato il percorso del file dell’archivio di log. Dovrai copiare l’archivio utilizzando il metodo di trasferimento dei file più adatto per la tua situazione. Per informazioni dettagliate sui file ziplog, consulta tsm maintenance ziplogs.

Comando di esempio eseguito all’interno del contenitore:

tsm maintenance ziplogs
Comando Tar manuale

Se non è possibile eseguire il comando ziplogs, ad esempio, se il server non riesce a raggiungere uno stato coerente, puoi comunque recuperare i log eseguendo un comando tar all’interno del contenitore. Dovrai copiare l’archivio utilizzando il metodo di trasferimento dei file più adatto per la tua situazione.

Comando di esempio eseguito all’interno del contenitore (scrive il file tar in una directory temporanea nella directory dei dati del contenitore):

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'
Navigazione nei log e suggerimenti per il debug

Esistono procedure comuni per diagnosticare la maggior parte dei problemi in Tableau Server. Se stai pensando di controllare i log del server, può essere utile suddividere le informazioni da cercare a seconda di dove si è verificato l’errore nel ciclo di vita del server.

Avvio del contenitore (iniziale/installazione)

Se il contenitore si arresta immediatamente in modo anomalo o si verifica un errore durante l’installazione o l’inizializzazione, controlla le seguenti risorse:

Stdout del contenitore

Esamina stdout per il contenitore Docker. In genere, è accessibile esaminando l’output del contenitore raccolto dal sistema di orchestrazione del contenitore (ad esempio, Kubernetes). Poiché Tableau Server è un sistema multiprocesso in esecuzione all’interno di un contenitore, stdout spesso non è utile e non segnalerà la causa principale del problema, a meno che non si verifichino errori catastrofici all’avvio. È consigliabile controllare stdout del contenitore in cui si verifica l’errore prima di approfondire ulteriormente i log di Tableau Server.

Esempio:

docker logs <container-name>

Log di avvio del contenitore Tableau Server

Il log di avvio del contenitore Tableau Server acquisisce l’output dall’automazione che sta inizializzando, configurando e avviando Tableau Server. Se riscontri problemi nel contenitore durante l’avvio o la prima esecuzione, questo è il primo log da controllare:

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

Esamina la parte inferiore del log e controlla se è stato segnalato un errore. A volte l’errore verrà segnalato e sarà immediatamente evidente dal log. Se l’errore non è chiaro dal log, la causa principale potrebbe essere visibile solo in un file di log specifico di una fase o di un servizio. I log elencati di seguito coprono queste possibilità.

Log del programma di installazione di Tableau Server

Se il log di avvio indica che si è verificato un problema con l’automazione che gestisce la fase di inizializzazione di TSM, controlla questo log:

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

Log del controller di Tableau Server

Se il log di avvio indica che si è verificato un problema con la fase di inizializzazione e avvio del server (solo CLI), controlla il log del servizio tabadmincontroller:

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

Questo file di log è relativo a un servizio specifico denominato tabadmincontroller. Tabadmincontroller è responsabile dell’orchestrazione delle funzionalità di inizializzazione e avvio nel server. Questo log può essere complesso e dettagliato. Gli errori in questo file di log potrebbero ancora non consentire di identificare la causa principale. A volte gli errori sono causati da servizi utilizzati da tabadmincontroller per completare una determinata attività. Per maggiori dettagli, consulta la sezione Runtime del server di seguito.

Log dei servizi - Runtime del server

Se Tableau Server riscontra problemi durante la normale esecuzione o problemi con servizi che non riescono a completare le attività o sono inattivi, puoi controllare i log dei servizi per ulteriori informazioni. Ogni servizio in esecuzione come parte di Tableau Server dispone di un file di log del servizio. Se sai quale servizio vuoi esaminare, puoi trovare i log del servizio in questa directory generale:

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

Fornisci il nome del servizio nell’argomento <service_name> del percorso del file. Qualsiasi servizio può scrivere più tipi di file di log. Inoltre, se è in esecuzione più di un’istanza dello stesso servizio, tutti i log del servizio verranno scritti nella stessa directory del servizio.

Classificazioni generali dei file di log specifici del servizio

In questa tabella sono riportati i nomi, i tipi e le descrizioni dei file di log dei servizi più comuni per i servizi di Tableau Server. La colonna "Tipi di errore" indica quali file di log possono essere utili in un determinato scenario di errore.

NomeFormato nome fileDescrizioneTipi di erroreEsempio
Control-Appcontrol_<service_name>_<node_id>-<instance_id>.logContiene informazioni sul processo control-app responsabile dell’installazione e della configurazione di un servizio. È spesso il primo log relativo a un servizio a essere scritto. Per gli errori di installazione e configurazione del servizio, controlla prima qui.Installazione, configurazione, statocontrol_backgrounder_node1-0.log
Log del servizio<service_name>_<node_id>-<instance_id>.logLog principale per un servizio in esecuzione. Molto spesso questo log contiene l’output dal livello dell’applicazione spring/java.Avvio, runtime, statobackgrounder_node1-1.log
Log stdoutstdout_<service_name>_<instance_id>.logContiene l’output di stdout per il servizio. La maggior parte dei servizi non invia in output molti contenuti astdout ed esegue invece la scrittura nel log primario. A volte questo log può contenere informazioni utili alla chiusura di un servizio.Avvio, arrestostdout_backgrounder_0.log
Log di NativeAPInativeapi_<service_name>_<instance_id>.txtAlcuni servizi eseguono un livello di codice nativo. Questo log acquisisce tale parte del runtime dell’applicazione.Gestione licenze, avvio, runtime, statonativeapi_backgrounder_1-1_2021_05_10_00_00_00.txt
Log di Tomcattomcat_<service_name>_<node_id>-<instance_id>.logQuesto è solo per i servizi che vengono eseguiti all’interno di un contenitore Tomcat e contiene i log Tomcat. Raramente fornisce informazioni sull’errore del servizio. Può essere utile per eseguire il debug di alcuni problemi di rete.Rete, avviotomcat_backgrounder_node1-0.2021-05-10.log
Contenitore arrestato

Se il contenitore è arrestato o risulta altrimenti difficile eseguire i comandi, puoi comunque esaminare i log se la directory dei dati del server è esternalizzata in un volume montato. In caso contrario, solo stdout del contenitore sarà esaminabile nel sistema di orchestrazione del contenitore, che spesso non conterrà la causa principale.

Impossibile impostare le proprietà di autenticazione

Sembra esserci un problema con l’impostazione delle proprietà di autenticazione in Tableau Server, senza che l’archivio identità venga impostato prima. Per aggirare questo problema, è sufficiente impostare l’archivio identità nell’hook di pre-inizializzazione.

  1. Crea un file denominato ./customer-files/pre_init_command nella directory customer-files dello strumento di compilazione dell’immagine di Tableau Server e modificalo in modo che contenga:

    #!/bin/bash
    tsm configuration set -k wgserver.authenticate -v local --force-keys
  2. Imposta lo script come eseguibile.

    chmod +x ./customer-files/pre_init_command
  3. Compila ed esegui l’immagine.

Errore durante l’avvio (perché Tableau Server non viene avviato?)

  • Se si verificano problemi durante l’inizializzazione o l’avvio di Tableau Server, sono disponibili numerose opzioni di risoluzione dei problemi che possono essere utili per individuare il problema.
  • Se è impossibile avviare il contenitore, è consigliabile controllare stdout dal processo PID 1 utilizzando il comando docker logs <container-name>.
  • Se il contenitore è in esecuzione ma Tableau Server non può essere inizializzato o eseguito correttamente, la seconda posizione in cui verificare la presenza di errori è questo file:
${DATA_DIR}/supervisord/run-tableau-server.log

Esempio:

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

Questo file di log contiene tutti gli eventi orchestrati dal servizio di inizializzazione del contenitore Tableau che gestisce l’avvio di Tableau Server, nonché l’esecuzione di eventuali script di configurazione o configurazioni personalizzate che potresti avere fornito nel contenitore. Per la maggior parte dei problemi di avvio verranno riportati errori in questa posizione. Talvolta, se l’errore è correlato a un processo di TSM o Tableau Server, verrà suggerito un altro file di log da esaminare per informazioni più dettagliate.

Errore durante il riavvio o l’avvio di un contenitore con dati esistenti

Il server non avvia PostGRES (o altri processi)

Quando i dati vengono resi persistenti all’esterno del contenitore e stai avviando un’altra istanza dell’immagine di Tableau Server in un contenitore utilizzando i dati precedenti, è importante tenere presente che il nome host interno del nuovo contenitore deve corrispondere al nome host del contenitore che ha inizializzato i dati persistenti. Tableau Server non gestisce bene le modifiche dinamiche del nome host e l’avvio di un nuovo contenitore con un nome host interno diverso causa effettivamente tale scenario.

La soluzione consiste semplicemente nell’assicurarsi che il nome host del contenitore sia impostato sullo stesso valore del contenitore precedentemente in esecuzione con i dati. Questo non deve essere confuso con la configurazione multi-nodo: i Worker possono (e in genere devono) avere nomi host diversi l’uno dall’altro. Ciò che conta è che, quando un determinato contenitore viene riavviato o arrestato, il contenitore successivo abbia lo stesso nome host del relativo predecessore.

Esempi di configurazione della distribuzione

Docker

Utilizzo di base di Tableau Server in un contenitore
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>
Utilizzo di base di Tableau Server in un contenitore con l’utente amministratore iniziale automatizzato
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>
Modalità solo TSM
docker run \
-e TSM_ONLY=1 \
-p 8080:8080 -d <Tableau Server in a Container image ID or tag>
Utilizzo di base multi-nodo
Nodo iniziale

Opzione 1: utilizza questa opzione se la configurazione del server (CONFIG_FILE) specifica una topologia multi-nodo:

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>

Opzione 2: utilizza questa opzione se desideri una distribuzione multi-nodo anche se la configurazione del server non specifica la topologia multi-nodo:

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 aggiuntivo
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>
Esternalizzare l’utilizzo dei dati
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>
Utilizzo di base dell’inizializzazione del contenitore

Inizializzazione del contenitore

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>

Esecuzione del contenitore

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>
Ripristino di base da backup con nodo singolo
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>