---
schema_version: "1"
id: 3bc462e91ee4b8c37b1aa9a6f6717cce86d29c39e5ffb1878c0f43090849748b
title: コンテナでの動的スケーリング - Tableau Server バックグラウンダー
collection: tableau
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/tableau/current/ja-jp/server-linux/server-backgrounder-autoscaling.md
canonical_url: https://help.tableau.com/current/server-linux/ja-jp/server-backgrounder-autoscaling.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 96ac9c0e628fe14bedb698761d085967c0068594d03442c356e6541e46cd0295
description: Configure dynamic scaling of Backgrounders for Tableau Server in a container.
---
[メイン コンテンツに進む](#main-content)

# コンテナでの動的スケーリング - Tableau Server バックグラウンダー

## 概要

コンテナでのバックグラウンダーの動的スケーリングにより、Tableau Server のバックグラウンダー ジョブとスケジュールされたジョブにさまざまなスケーリング戦略を適用できます。ここで言う自動スケーリングとは、人手を介さず、また他のサーバー システムの稼働時間に影響を与えることなく、タスクの負荷が変動しても処理できるように、サービスを独立してスケーリングできることを意味します。Tableau Server プロセスのノードが全部そろった Tableau Server コンテナは、引き続き一体的なシステムとして実行されます。その代わりに、切り離されて独立した、一連の小さなコンテナ サービスが「バックグラウンダー」サービス ロールを構成します。これは、動的に拡張することができ、通常は Tableau Server コンテナが処理する計算負荷を処理します。バックグラウンダー サービスは、抽出の更新や作成、サブスクリプションの送信、データ アラートの確認、および多くのメンテナンス ジョブを含むシステム タスクの処理を担当します。たとえば、多数のデータセットを更新したり、計算コストの高い一連のデータ アラートを計算したりすることが有利な場合は、Kubernetes を活用して計算能力をスケールアップし、これらのタスクを効率的に完了することができます。このガイドでは、Kubernetes での自動スケーリング バックグラウンダーの構成とデプロイの要件について説明します。このドキュメントは、「[Tableau Server in a Container](https://help.tableau.com/current/server-linux/ja-jp/server-in-container.htm)」ドキュメントの補足です。

## 前提条件

自動スケーリング バックグラウンダーは Kubernetes でのみ使用でき、Tableau Server in a Container に基づいています。自動スケーリング バックグラウンダー機能を使用するには、特定の前提条件を満たす必要があります。

- Tableau Server で Advanced Management 機能が有効になっている必要があります。詳細については、「[Tableau Server 上の Tableau Advanced Management について](https://help.tableau.com/current/server-linux/ja-jp/itm_intro.htm)」を参照してください。
- ロールベース ライセンスを使用している必要があります。コア ライセンスはサポートされていません。ライセンスの詳細については、「[ライセンス モデルとプロダクト キーを理解する](https://help.tableau.com/current/server-linux/ja-jp/license_product_keys.htm)」を参照してください。
- 次の Advanced Management 機能を有効にする必要があります。
    - [Tableau Server 外部ファイル ストア](https://help.tableau.com/current/server-linux/ja-jp/server_external_filestore_storage.htm)
    - [Tableau Server 外部リポジトリ](https://help.tableau.com/current/server-linux/ja-jp/server_external_repo.htm)
- バージョン 1.20 以降の Kubernetes クラスタがあり、その使用方法と管理方法を理解している必要があります。

## 制限事項

- この機能は、Linux ベースの展開の一部としてのみ機能します。
- フロー ジョブは、自動スケーリング バックグラウンダーではサポートされていません。フロー ジョブは、Tableau Server コンテナで引き続き実行されるバックグラウンダー サービスによって処理されます。

## Tableau Server およびバックグラウンダー ポッドのイメージの作成

コンテナで自動スケーリング バックグラウンダーを使用するための最初のステップは、Tableau Server のインストールを構成するサービス イメージを作成することです。これらのイメージには、Tableau Server のイメージと、個別のバックグラウンダーおよびサポート サービスのイメージが含まれます。使用するビルド ツールは、包括的なオールインワンの Tableau Server コンテナ イメージを作成するために使用するものと同じですが、ツールはバージョン 2022.3.0 以降であること、Advanced Management ライセンスがあること、イメージをビルドするときに特別なフラグを使用することなどが必要です。

1. サービス イメージを作成するには、次のコマンドを実行します。
    
    build-image --accepteula -i <installer> --backgrounder-images
    
    これにより、Tableau Server と 4 つの新しいイメージが作成されます。これらの追加のイメージには、自動スケーリング バックグラウンダーの新しいポッドを構成する、個々のサービスが含まれています。
    
    `docker images` コマンドを使用すると、ローカルの docker リポジトリに作成されたイメージを一覧表示できます。
    
    hyper                          20214.21.1117.1006             52fd9843c178   10 seconds ago
    gateway                        20214.21.1117.1006             2308e602a2a3   11 seconds ago
    backgrounder                   20214.21.1117.1006             4540e459cf23   12 seconds ago
    dataserver                     20214.21.1117.1006             c5345ed47f51   12 seconds ago
    tableau\_server\_image           20214.21.1117.1006             b27817047dd1   7 minutes ago
    
    新しいバックグラウンダー ポッドを構成するイメージは、hyper、gateway、backgrounder、および dataserver です。カスタム ドライバー、インストール スクリプト、およびプロパティは、これら 5 つのイメージすべてで共有されます。詳細については、「[イメージをカスタマイズする](https://help.tableau.com/current/server-linux/ja-jp/server-in-container_setup-tool.htm#CustomizingImage)」を参照してください。
2. これらのすべてのイメージを、デプロイ用の内部イメージ リポジトリにパブリッシュします。

## 展開ガイド

以下の情報は、Tableau Server を自動スケーリング バックグラウンダーとともにコンテナにデプロイする方法を説明するものです。この情報では、self-container コンテナに Tableau Server を展開する方法を既に理解していることを前提としています。詳細については、[Tableau Server in a Container](https://help.tableau.com/current/server-linux/ja-jp/server-in-container.htm)を参照してください。「Kubernetes 構成」セクションの 3 つの Kubernetes 構成ファイルは、デプロイメントのセットアップに使用できるテンプレートです。展開の要件と詳細については、このガイドの他のセクションで説明しています。

Tableau Server と自動スケーリング バックグラウンダーのデプロイは、ガイドの下部にある入力済みの Kubernetes 構成ファイルをデプロイするのと同様に簡単です。

kubectl apply -f <tableau-kubeconfig-dir>

### バックグラウンダー ジョブ

バックグラウンダー ポッドは、スケジュールされた追加のワークロードを Tableau Server in a Conainer が並行して処理するのを援助します。バックグラウンダーは、抽出更新、サブスクリプション、アラート、フロー、およびシステム ワークロードを処理します。バックグラウンダー ポッド間でジョブを分散するということは、Tableau Server が他のタスクの処理に使用できるコンピューティング リソースが増えることを意味します。Tableau Server が処理するタスクには、ワークブックやダッシュボードのレンダリングなど、インタラクティブなユーザー アクティビティなどがあります。フロー ジョブは、このバックグラウンダーで実行されない唯一のタイプのバックグラウンダー ジョブです。バックグラウンダー ジョブの詳細については、「[Tableau Server でのバックグラウンド ジョブの管理](https://help.tableau.com/current/server-linux/ja-jp/server_backgrounder_job_management.htm)」を参照してください。

バックグラウンダー ポッドは、フロー ジョブ以外のあらゆる種類の負荷を処理できます。フロー ジョブは、バックグラウンダー サービスを実行し続ける、メインの Tableau Server コンテナで実行する必要があります。

ノード ロール機能を使用すると、特定の種類のジョブ用にバックグラウンダー ポッドを柔軟に割り当てることができます。この機能は、Tableau サーバーのノード ロール機能の拡張です。さまざまなノード ロールに関する詳細については、こちらを参照してください。バックグラウンダー ポッドはフロー ジョブを実行できないため、デフォルトでは、バックグラウンダー ポッドでフロー ジョブが無効になっていることに注意してください (つまり、ロールは「フローなし」に設定されています)。

バックグラウンダーのノード ロールを設定するには、バックグラウンダー サービスを実行するコンテナの kubeconfig の一部として、環境変数 `NODE_ROLES` を設定する必要があります。例えば、backgrounder を設定して抽出更新のジョブのみを実行するには、以下に示すように `NODE_ROLES` 環境変数を抽出更新に設定します。

#### NODE\_ROLE\_CONFIG

containers:  
      - name: backgrounder  
        image: <backgrounder\_image> # Backgrounder Image  
        ports:  
        - containerPort: 8600  
        volumeMounts:  
        - name: logmount  
          mountPath: /var/log/tableau  
        - name: clone-volume  
          mountPath: /docker/clone  
        - name: dataengine-volume  
          mountPath: /docker/dataengine  
        - name: temp  
          mountPath: /var/opt/tableau/tableau\_server/data/tabsvc/temp  
        env:  
          - name: ROOT\_LOG\_DIR  
            value: /var/log/tableau  
          - name: CLONE\_ARTIFACT\_DIR  
            value: /docker/clone/clone-artifacts  
          - name: FILESTORE\_MOUNT\_PATH  
            value: /docker/dataengine  
          - name: NODE\_ROLES  
            value: extract-refreshes

Tableau Server ポッドには、バックグラウンダー ジョブを実行する場所が常に存在することを保証するために、トポロジーで構成されたバックグラウンダーが少なくとも 1 つあります。デフォルトでは、バックグラウンド ジョブのすべてのロールを処理できるバックグラウンダーが TSM で必要とされています。シナリオによっては、バックグラウンダー ポッドに特定のタイプのジョブをすべて処理させたい場合があります。これを行うには、サーバー構成キー `topology.roles_handle_all_jobs_constraint_disabled` を `true` に設定する必要があります。これにより、TSM トポロジーがすべてのジョブ タイプを処理するという要求を無効にできます。このパラメーターを設定すると、Tableau Server バックグラウンダー インスタンスのバックグラウンダー ロールが `no-extract-refreshes` に設定され、バックグラウンダー ポッドのロールが `extract-refreshes` に設定されます。これにより、すべての抽出更新ジョブがバックグラウンダー ポッドでのみ実行されるように設定できます。

**注:** この制約を無効にすると、ある種のジョブが決してスケジュールされないようにロールを設定することもできます。TSM バックグラウンダーとバックグラウンダー ジョブのロール構成は慎重に設定する必要があります。これは、すべての種類のバックグラウンダー ジョブをスケジュールできることを、もはや TSM は検証しなくなるためです。

### Tableau Server in a Container のポッド

自動スケーリング バックグラウンダー ポッドの一部として Tableau Server を含むコンテナは、既存の Tableau Server in a Container とほぼ同じ方法でデプロイされます。重要な要件の変更がいくつかあります。

- Tableau Server コンテナとバックグラウンダー ポッドの間で構成を転送するには、ネットワーク ファイル共有が_必要_です。
- 外部ファイルストア機能を有効にして使用する必要があります。これには、専用のネットワーク ファイル共有も必要です。

### バックグラウンダー ポッド

バックグラウンダー ポッドは、連携して動作する 4 つの独立したサービス コンテナ (**gateway**、**hyper**、**dataserver**、**backgrounder**) で構成されます。これらのポッドは、典型的な独立した Kubernetes コンテナ ポッドのようにデプロイできます。ポッドには次の要件があります。

- バックグラウンダー ポッドは、ホスト名の DNS 解決を使用して Tableau Server ノードに到達できる必要があります。
- 外部ファイルストアとクローン ネットワーク ファイル共有が提供される必要があります。

**注:** バックグラウンダー ポッドは、init-container で構成され、Tableau Server コンテナがクローン構成の出力を正常に生成するまで待機してから実行されます。

#### ログ

バックグラウンダー ポッド サービス (Tableau Server など) は、依然として主にディスクにログを書き込みます。バックグラウンダー ポッドは、スケール インとスケール アウトが可能であり、一時的な存在です。そのため、ポッドからログを取り出して保存することが重要です。既存の K8s 環境を使用している多くのお客様は、デプロイしたポッドからログを収集するために、すでに何らかの種類のログ集約サービスを使用しているでしょう。ログ集約サービスの例としては、Splunk や fluentd などがあります。何らかのログ集約サービスを使用して、バックグラウンダー ポッドからログを収集することを強くお勧めします。ログ管理を容易にするために、Tableau が提供する kubeconfig は、共有ログ ボリュームに書き込むようにポッド内の各サービスを構成します。各サービス コンテナ内のディレクトリのパスは、`ROOT_LOG_DIR` 環境変数によって指定されます。

サポート ケースを開いてログを提供する必要がある場合は、メイン サーバー コンテナから収集された ziplog と、バックグラウンダー ポッドからのログ (ログ集約サービスから取得するか、以下の手動プロセスを使用) の 2 セットのログを提供してください。

ログ集約サービスを使用できないお客様は、ポッドから手動でログを取得できます。

**注:** ログを含むボリュームに対して「永続ボリューム要求」を使用していない場合、ポッドからのログは、ポッドがスケールダウンされると失われてしまいます。

関連するすべてのログは、バックグラウンダー ポッド内の `/var/log/tableau` ディレクトリ (`ROOT_LOG_DIR` 環境変数で構成可能) にあります。この場所に PersistantVolumeClaim をマウントして、ポッドが停止してもログを利用できるようにすることを強くお勧めします。

##### バックグラウンダー ポッドの実行中にログを収集する

コンテナ内のログの tar ファイルを作成します。

kubectl exec -it <backgrounder-pod-name> -- bash -c "tar -czf /docker/user/backgrounder-pod-logs.tar.gz /var/log/tableau"

tar ファイルをコンテナの外部にコピーします。

kubectl cp <backgrounder-pod-name>:docker/user/backgrounder-pod-logs.tar.gz ./backgrounder-pod-logs.tar.gz

##### バックグラウンダー ポッドが終了した (または開始に失敗した) ときにログを収集する

バックグラウンダー ポッドのデプロイ ログに使用される PersistantVolumeClaim マウントを使用して、実行時間の長いポッドをアタッチします。以下は構成例です。

apiVersion: v1  
kind: Pod  
metadata:  
  name: <name>  
  namespace: <namespace>  
spec:  
  containers:  
  - name: get-logs-pod  
    image: busybox:1.28  
    securityContext:  
      runAsUser: 0  
      allowPrivilegeEscalation: true  
    command: \['sh', '-c', "while :; do sleep 5; done"\]  
    volumeMounts:  
    - name: logmount  
      mountPath: /var/log/tableau
restartPolicy: Never  
volumes:  
  - name: logmount  
    persistentVolumeClaim:  
      claimName: logvolume

コンテナ内のログの tar ファイルを作成します。

kubectl exec -it <backgrounder-pod-name> -- bash -c "tar -czf /backgrounder-pod-logs.tar.gz /var/log/tableau"

tar ファイルをコンテナの外部にコピーします。

kubectl cp <backgrounder-pod-name>:/backgrounder-pod-logs.tar.gz ./backgrounder-pod-logs.tar.gz

#### ライブ構成変更

Tableau Server in a Container の構成を変更し (例えば、tsm コマンド ラインを使用)、それらの構成変更をバックグラウンダー ポッドで反映させたい場合は、`[tsm settings clone](https://help.tableau.com/current/server-linux/ja-jp/cli_settings_tsm.htm#TSMSettingsClone)` コマンドを実行して、一連の新しいクローン構成ファイル (クローン ペイロード) を生成する必要があります。

1. TSM を使用して、Tableau Server in a Container ポッドの構成を変更し、構成の変更をサーバーに適用します。
2. Tableau Server in a Container ポッドで次のコマンドを実行します。
    
    \## Run this command in the Tableau Server in a Container pod.
    tsm settings clone -d $CLONE\_ARTIFACT\_DIR
    
    このコマンドは、一連の新しい構成ファイルを生成し、クローン NFS ドライブの場所に書き込みます。
3. バックグラウンダー ポッドを再デプロイします。ポッドは、クローン NFS ドライブを使用するように構成する必要があり、新しい構成を取得します。

### スケーリング戦略

バックグラウンダー ポッドは、さまざまな手法と戦略を使用して Kubernetes でスケーリングできます。タイム スケジュールに基づいてバックグラウンダー ポッドのプール サイズを変更するスケーリング戦略の例を示します。

CPU とメモリの使用率は、バックグラウンダー ポッドをスケーリングするための適切な指標**ではない**いことに注意してください。CPU とメモリの使用率は、クラスタの全体的な負荷需要を正確に表していません。たとえば、抽出を更新するためにバックグラウンダー ポッドの使用率が最大になったとしても、バックグラウンダー ジョブのキューで待機している他のジョブはありません。この場合、自動スケーリングによってジョブのスループットが向上することはありません。

#### スケジュールされたスケーリング

cron ジョブを使用した標準の Kubernetes メカニズムにより、スケーリング機能をスケジュールできます。

この Kubernetes 構成の例は、以下の「Kubernetes の構成」セクションに記載されています。

## Kubernetes の構成

### 新しい環境変数

標準の Tableau Server コンテナ環境変数 ([初期構成のオプション](https://help.tableau.com/current/server-linux/ja-jp/server-in-container_image.htm#InitialConfigOptions-container)を参照) に加えて、Kubernetes 構成で設定する必要がある新しい必須環境変数がいくつかあります。

<table style="width: 100%;mc-table-style: url('Resources/TableStyles/Basic-Border-Light.css');" class="TableStyle-Basic-Border" cellspacing="0">
                    <colgroup><col class="TableStyle-Basic-Border-Column-Column1" style="width: 25%;">
                    <col class="TableStyle-Basic-Border-Column-Column1" style="width: 25%;">
                    <col class="TableStyle-Basic-Border-Column-Column1" style="width: 50%;">
                    </colgroup><thead>
                        <tr class="TableStyle-Basic-Border-Head-Header1">
                            <th class="TableStyle-Basic-Border-HeadE-Column1-Header1">環境変数</th>
                            <th class="TableStyle-Basic-Border-HeadE-Column1-Header1">推奨値</th>
                            <th class="TableStyle-Basic-Border-HeadD-Column1-Header1">説明</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr class="TableStyle-Basic-Border-Body-Body1">
                            <td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><code>FILESTORE_MOUNT_PATH</code>
                            </td>
                            <td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><code>/docker/dataengine</code>
                            </td>
                            <td class="TableStyle-Basic-Border-BodyD-Column1-Body1">外部ファイルストア ディレクトリのマウント場所。このディレクトリは、デプロイされた各 Tableau コンテナ内にマウントされた、データエンジン NFS ディレクトリを指す必要があります。外部ファイルストアの詳細については、「<a href="https://help.tableau.com/current/server-linux/ja-jp/server_external_filestore_storage.htm" class="xref">Tableau Server 外部ファイル ストア</a>」を参照してください。この値は、Tableau Server in a Container のポッドとバックグラウンダーのポッドで同じにする必要があります。</td>
                        </tr>
                        <tr class="TableStyle-Basic-Border-Body-Body1">
                            <td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><code>CLONE_ARTIFACT_DIR</code>
                            </td>
                            <td class="TableStyle-Basic-Border-BodyE-Column1-Body1"><code>/docker/clone/clone-artifacts</code>
                            </td>
                            <td class="TableStyle-Basic-Border-BodyD-Column1-Body1">クローン構成ディレクトリのマウント場所。このディレクトリは、各 Tableau コンテナ内にマウントされた、NFS ディレクトリを指す必要があります。Tableau Server は、バックグラウンダー ポッドがクラスタのメンバーになるために使用する構成データを出力します。</td>
                        </tr>
                        <tr class="TableStyle-Basic-Border-Body-Body1">
                            <td class="TableStyle-Basic-Border-BodyB-Column1-Body1"><code>ROOT_LOG_DIR</code>
                            </td>
                            <td class="TableStyle-Basic-Border-BodyB-Column1-Body1"><code>/var/log/tableau</code>
                            </td>
                            <td class="TableStyle-Basic-Border-BodyA-Column1-Body1">(バックグラウンダー ポッドのみ)<p>バックグラウンダー ポッドで実行されているすべてのサービスの共通ログ ディレクトリの場所。</p></td>
                        </tr>
                    </tbody>
                </table>

### バックグラウンダー ポッドのポート

バックグラウンダー ポッドは 4 つのサービスで構成され、デフォルトではそれぞれが指定されたポートで実行されるように設定されています。コンテナ内でサービスが接続するポートを変更する場合は、サービスのポート割り当てに対応するキーを指定する必要があります。このような構成は、サイドカー コンテナやその他のコンポーネントがポッドに追加され、サービスのポートが競合するようなことがない限り、ほとんどの場合必要ありません。

 
| ポート環境変数 | 既定 |
| --- | --- |
| `BACKGROUNDER_PORT` | `8600` |
| `DATASERVER_PORT` | `8400` |
| `HYPER_PORT` | `8200` |
| `GATEWAY_PORT` | `8080` |

Dataserver もポート 8300 を使用しますが、これは再構成できません。

### 共有ネットワーク ディレクトリ

この Tableau Server の展開では、適切に機能するために 2 つのネットワーク共有が必要です。すべての Tableau Server と、バックグラウンダー や Kubernetes の構成テンプレートでは、これらのネットワーク ディレクトリが存在することに注意してください。

- **Dataengine ディレクトリ** (`FILESTORE_MOUNT_PATH`): バックグラウンダー ポッドには、外部ファイルストア機能が必要です。このネットワーク共有には、Tableau Server とバックグラウンダー ポッドの間で共有される、抽出とその他のファイルベースのアーティファクトが含まれています。
- **Clone ディレクトリ** (`CLONE_ARTIFACT_DIR`): Tableau Server は静的な接続と構成の情報をネットワーク共有に書き込みます。バックグラウンダー ポッドは、この情報を使用して Tableau Server クラスタのメンバーになります。将来のプレリリースでは、この構成は Kubernetes 構成の標準ライフ サイクルに組み込まれます。

**重要:** クラスタ全体 (新しい Tableau Server コンテナを含む) を再デプロイする場合は、クローン NFS マウントの内容を消去する必要があります (そうしなければ、バックグラウンダー ポッドが古いサーバーに接続しようとします)。

### Kubernetes の構成例

**注:** 構成例には、レディネス プローブの使用が含まれています。Tableau Server コンテナーの展開が単一ノードの TSM 展開である場合 (展開には複数のバックグラウンダー ポッドを含めることができます)、レディネス プローブを使用できます。マルチノードの Tableau Server in a Container 展開では、レディネス プローブを使用することはできません。

#### Tableau Server コンテナの構成

\---  
apiVersion: v1  
kind: Service  
metadata:  
  name: <service\_name>  
  namespace: <namespace>  
spec:  
  selector:  
    app: <service\_name>  
  ports:  
    - protocol: TCP  
      port: 8080  
      nodePort: <nodeport-number>  
      name: http  
    - protocol: TCP  
      port: 8443  
      nodePort: <nodeport-number>  
      name: https  
  type: NodePort  
\---  
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: configfile  
  namespace: <namespace>  
data:  
  config.json: |-  
    {  
      "configEntities": {  
      "identityStore": {  
        "\_type": "identityStoreType",  
        "type": "local"  
      }  
    },  
    "configKeys" : {  
      "tabadmincontroller.init.smart\_defaults.enable" : "false",  
      "wgserver.domain.ldap.starttls.enabled" : "false"  
    },  
    "daysLeftForMaintenanceExpiring" : 0  
  }  
\---  
apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: extrepojsonfile  
  namespace: <namespace>  
data:  
  config.json: |-  
    {  
      "flavor":"generic",  
      "masterUsername":"<admin-name>",  
      "masterPassword":"<password>",  
      "host":"<hostname>",  
      "port":5432,  
      "prerequisiteCheckEnabled":false,  
      "requireSsl":false  
    }  
\---  
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: datadir1  
  namespace: <namespace>  
spec:  
  accessModes:  
  - ReadWriteOnce  
  resources:  
    requests:  
    storage: 50Gi  
\---  
\# This is required for multi-node tableau server in container  
apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: bootstrapnfs  
  namespace: <namespace>  
spec:  
  accessModes:  
    - ReadWriteMany  
  capacity:  
    storage: 1Gi  
  nfs:  
    server: <nfs-ip>  
    path: <mount-path>  
\---  
\# This is required for multi-node tableau server in container  
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: bootstrapnfs  
  namespace: <namespace>  
spec:  
  accessModes:  
    - ReadWriteMany  
  storageClassName: ""  
  resources:  
    requests:  
      storage: 1Mi  
\---  
apiVersion: v1  
kind: PersistentVolumn  
metadata:  
  name: clonenfs  
  namespace: <namespace>  
spec:  
  accessModes:  
    - ReadWriteMany  
capacity:  
  storage: 1Gi  
nfs:  
  server: <nfs-ip>  
  path: <mount-path>  
\---  
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: clonenfs  
  namespace: <namespace>  
spec:  
  accessModes:  
    - ReadWriteMany  
  storageClassName: ""  
  resources:  
    requests:  
      storage: 1Mi  
\---  
apiVersion: v1  
kind: PersistentVolume  
metadata:  
    name: dataenginenfs  
    namespace: <namespace>  
spec:  
  accessModes:  
    - ReadWriteMany  
  capacity:  
    storage: 1Gi  
  nfs:  
    server: <nfs-ip>  
    path: <namespace>  
\---  
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: dataenginenfs  
  namespace: <namespace>  
spec:  
  accessModes:  
    - ReadWriteMany  
  storageClassName: ""  
  resources:  
    requests:  
      storage: 1Mi  
\---  
apiVersion: v1  
kind: Secret  
type: Opaque  
metadata:
  name: tableau-server-in-a-container-secrets  
  namespace: <namespace>  
stringData:  
  license\_key: <license\_key> # Tableau License Key String  
  tableau\_username: <tableau\_username> # Initial admin username in Tableau Server  
  tableau\_password: <tableau\_password> # Initial admin password  
\---  
apiVersion: apps/v1  
kind: StatefulSet  
metadata:  
  name: tableau-server  
  namespace: <namespace>  
  labels:  
    app: <service\_name>  
spec:  
  selector:  
    matchLabels:  
      app: <service\_name>  
  replicas: 1  
  serviceName: <service\_name>  
  template:  
    metadata:  
      labels:  
        app: <service\_name>  
    spec:  
      securityContext:  
        runAsUser: 999  
        fsGroup: 998  
        fsGroupChangePolicy: "OnRootMismatch"  
      terminationGracePeriodSeconds: 120  
      dnsPolicy: "None"  
      dnsConfig:  
        nameservers:  
          - <dns\_ip> # DNS IP for resolving container hostnames  
        searches:  
          - <service\_name>.<namespace>.svc.<cluster\_domain>.<example> # SRV Record  
          - <namespace>.svc.<cluster\_domain>.<example> # SRV Record  
          - svc.<cluster\_domain>.<example> # SRV Record  
          - <cluster\_domain>.<example> # SRV Record  
        options:  
          - name: ndots  
            value: "5"  
      initContainers: # init containers are optional, to clear directory content if already exists  
        - name: clean-bootstrap-dir  
          image: busybox:1.28  
          securityContext:  
            runAsUser: 0  
            allowPrivilegeEscalation: true  
          volumeMounts:  
          - name: bootstrap  
            mountPath: /docker/config/bootstrap  
          command: \['sh', '-c', 'rm -rf /docker/config/bootstrap/\* || true'\]  
        - name: clean-clone-artifacts-dir  
          image: busybox:1.28  
          securityContext:  
            runAsUser: 0  
            allowPrivilegeEscalation: true  
          volumeMounts:  
          - name: clone  
            mountPath: /docker/clone  
          command: \['sh', '-c', 'rm -rf /docker/clone/clone-artifacts || true'\]  
      containers:  
      - name: <container\_name> # Name of container  
        image: <tableau\_server\_image> # Tableau Server in Container Image  
        env:  
        - name: LICENSE\_KEY  
          valueFrom:  
            secretKeyRef:  
              name: tableau-server-in-a-container-secrets  
              key: license\_key  
        - name: FILESTORE\_MOUNT\_PATH  
          value: /docker/dataengine  
        - name: CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS  
          value: /docker/clone/clone-artifacts  
        - name: SERVER\_FOR\_INDEPENDENT\_SERVICE\_CONTAINERS  
          value: "1"  
        - name: EXT\_REP\_JSON\_FILE  
          value: /docker/external-repository/config.json  
        - name: TABLEAU\_USERNAME  
          valueFrom:  
            secretKeyRef:  
              name: tableau-server-in-a-container-secrets  
              key: tableau\_username  
        - name: TABLEAU\_PASSWORD  
          valueFrom:  
            secretKeyRef:  
              name: tableau-server-in-a-container-secrets  
              key: tableau\_password  
        resources:  
          requests:  
            memory: 40Gi  
            cpu: 15  
          limits:  
            memory: 40Gi  
            cpu: 15  
        ports:  
        - containerPort: 8080  
        volumeMounts:  
        - name: configmount  
          mountPath: /docker/config/config.json  
          subPath: config.json  
        - name: externalrepomount  
          mountPath: /docker/external-repository  
        - name: datadir1  
          mountPath: /var/opt/tableau  
        - name: bootstrap  
          mountPath: /docker/config/bootstrap  
        - name: clone  
          mountPath: /docker/clone  
        - name: dataengine  
          mountPath: /docker/dataengine  
        imagePullPolicy: IfNotPresent  
        startupProbe:  
          exec:  
            command:  
            - /bin/sh  
            - -c  
            - /docker/server-ready-check  
          initialDelaySeconds: 300  
          periodSeconds: 15  
          timeoutSeconds: 30  
          failureThreshold: 200  
        readinessProbe:  
          exec:  
            command:  
            - /bin/sh  
            - -c  
            - /docker/server-ready-check  
          periodSeconds: 30  
          timeoutSeconds: 60  
        livenessProbe:  
          exec:  
            command:  
            - /bin/sh  
            - -c  
            - /docker/alive-check  
          initialDelaySeconds: 600  
          periodSeconds: 60  
          timeoutSeconds: 60  
      volumes:  
      - name: configmount  
        configMap:  
          name: configfile  
      - name: externalrepomount  
        configMap:  
          name: extrepojsonfile  
      - name: datadir1  
        persistentVolumeClaim:  
          claimName: datadir1  
      - name: bootstrap  
        persistentVolumeClaim:  
          claimName: bootstrapnfs  
      - name: clone  
        persistentVolumeClaim:  
          claimName: clonenfs  
      - name: dataengine  
        persistentVolumeClaim:  
          claimName: dataenginenfs

#### バックグラウンダー ポッドの構成

\---  
apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: logvolume  
  namespace: <namespace>  
spec:  
  accessModes:  
  - ReadWriteOnce  
  resources:  
    requests:  
      storage: 20Gi  
\---  
apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: backgrounder  
  labels:  
    app: backgrounder  
  namespace: <namespace>   
spec:  
  replicas: 2  
  selector:  
    matchLabels:  
      app: backgrounder  
  template:  
    metadata:  
      labels:  
        app: backgrounder  
    spec:  
      securityContext:  
        runAsUser: 999  
        runAsGroup: 998  
        fsGroup: 998
        fsGroupChangePolicy: "OnRootMismatch"  
      hostname: backgrounder  
      dnsPolicy: "None"  
      dnsConfig:  
        nameservers:  
          - <dns\_ip> # DNS IP for resolving container hostnames  
        searches:  
          - <service\_name>.<namespace>.svc.<cluster\_domain>.<example> # SRV Record  
          - <namespace>.svc.<cluster\_domain>.<example> # SRV Record  
          - svc.<cluster\_domain>.<example> # SRV Record  
          - <cluster\_domain>.<example> # SRV Record  
        options:  
          - name: ndots  
            value: "5"
      initContainers:  
        - name: init-myservice  
          image: busybox # This init-container is optional (as long as there is a mechanism to set the log volume directory permissions and the pod waits for clone artifacts)  
          securityContext:  
            runAsUser: 0  
            allowPrivilegeEscalation: true  
          env:  
            - name: CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS  
            value: /docker/clone/clone-artifacts  
          volumeMounts:  
          - name: logmount  
            mountPath: /var/log/tableau  
          - name: clone-volume  
            mountPath: /docker/clone  
          command: \['sh', '-c', "chmod 777 /var/log/tableau && while \[ ! -d ${CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS} \]; do sleep 5; done"\]  
      containers:  
      - name: backgrounder  
        image: <backgrounder\_image> # Backgrounder Image  
        ports:  
        - containerPort: 8600
        imagePullPolicy: IfNotPresent
        readinessProbe:  
          exec:  
            command:  
              - /bin/sh  
              - -c  
              - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
          periodSeconds: 30  
          timeoutSeconds: 60  
        livenessProbe:  
          exec:  
            command:  
              - /bin/sh  
              - -c  
              - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
          initialDelaySeconds: 600  
          periodSeconds: 60  
          timeoutSeconds: 60
        volumeMounts:  
        - name: logmount  
          mountPath: /var/log/tableau  
        - name: clone-volume  
          mountPath: /docker/clone  
        - name: dataengine-volume  
          mountPath: /docker/dataengine  
        - name: temp  
          mountPath: /var/opt/tableau/tableau\_server/data/tabsvc/temp  
        env:  
          - name: ROOT\_LOG\_DIR  
            value: /var/log/tableau  
          - name: CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS  
            value: /docker/clone/clone-artifacts  
          - name: FILESTORE\_MOUNT\_PATH  
            value: /docker/dataengine  
      - name: dataserver  
        image: <dataserver\_image> # Dataserver Image  
        ports:  
        - containerPort: 8400
        imagePullPolicy: IfNotPresent
        readinessProbe:  
          exec:  
            command:  
              - /bin/sh  
              - -c  
              - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
          periodSeconds: 30  
          timeoutSeconds: 60  
        livenessProbe:  
          exec:  
            command:  
              - /bin/sh  
              - -c  
              - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
          initialDelaySeconds: 600  
          periodSeconds: 60  
          timeoutSeconds: 60  
        volumeMounts:  
        - name: logmount  
          mountPath: /var/log/tableau  
        - name: clone-volume  
          mountPath: /docker/clone  
        - name: dataengine-volume  
          mountPath: /docker/dataengine  
        - name: temp  
          mountPath: /var/opt/tableau/tableau\_server/data/tabsvc/temp  
        env:  
          - name: ROOT\_LOG\_DIR  
            value: /var/log/tableau  
          - name: CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS  
            value: /docker/clone/clone-artifacts  
          - name: FILESTORE\_MOUNT\_PATH  
            value: /docker/dataengine  
      - name: gateway  
        image: <gateway\_image> # Gateway Image  
        ports:  
        - containerPort: 8080
        imagePullPolicy: IfNotPresent
        readinessProbe:  
          exec:  
            command:  
              - /bin/sh  
              - -c  
              - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
          periodSeconds: 30  
          timeoutSeconds: 60  
        livenessProbe:  
          exec:  
            command:  
              - /bin/sh  
              - -c  
              - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
          initialDelaySeconds: 600  
          periodSeconds: 60  
          timeoutSeconds: 60
        volumeMounts:  
        - name: logmount  
          mountPath: /var/log/tableau  
        - name: clone-volume  
          mountPath: /docker/clone  
        - name: dataengine-volume  
          mountPath: /docker/dataengine  
        - name: temp  
          mountPath: /var/opt/tableau/tableau\_server/data/tabsvc/temp  
        env:  
          - name: ROOT\_LOG\_DIR  
            value: /var/log/tableau  
          - name: CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS  
            value: /docker/clone/clone-artifacts  
          - name: FILESTORE\_MOUNT\_PATH  
            value: /docker/dataengine  
    - name: hyper  
      image: <hyper\_image> # Hyper Image  
      ports:
      - containerPort: 8200
      imagePullPolicy: IfNotPresent
      readinessProbe:  
        exec:  
          command:  
            - /bin/sh  
            - -c  
            - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
        periodSeconds: 30  
        timeoutSeconds: 60  
      livenessProbe:  
        exec:  
          command:  
          - /bin/sh  
          - -c
          - /tsm\_docker\_utils/status\_check.sh | grep -E 'ACTIVE|BUSY'  
        initialDelaySeconds: 600  
        periodSeconds: 60  
        timeoutSeconds: 60
      volumeMounts:  
        - name: logmount  
          mountPath: /var/log/tableau  
        - name: clone-volume  
          mountPath: /docker/clone  
        - name: dataengine-volume  
          mountPath: /docker/dataengine  
        - name: temp  
          mountPath: /var/opt/tableau/tableau\_server/data/tabsvc/temp  
      env:  
        - name: ROOT\_LOG\_DIR  
          value: /var/log/tableau  
        - name: CLONE\_ARTIFACT\_DIR\_FOR\_INDEPENDENT\_CONTAINERS  
          value: /docker/clone/clone-artifacts  
        - name: FILESTORE\_MOUNT\_PATH  
          value: /docker/dataengine  
    volumes:  
      - name: clone-volume  
        nfs:  
          server: <nfs\_ip>   
          path: <mount\_path>  
      - name: dataengine-volume  
        nfs:  
          server: <nfs\_ip>   
          path: /dataengine  
      - name: logmount  
        persistentVolumeClaim:  
          claimName: logvolume  
      - name: temp  
        emptyDir: {}

#### スケジュールされたスケーリングの構成

apiVersion: v1  
kind: ServiceAccount  
metadata:  
name: backgrounder-scaler-service-account  
namespace: <namespace> # Namespace  
\---  
apiVersion: rbac.authorization.k8s.io/v1  
kind: RoleBinding  
metadata:  
name: scale-backgrounder-pods  
namespace: <namespace> # Namespace  
subjects:  
\- kind: ServiceAccount  
name: backgrounder-scaler-service-account  
roleRef:  
kind: ClusterRole  
name: cluster-admin  
apiGroup: rbac.authorization.k8s.io  
\---  
apiVersion: batch/v1beta1  
kind: CronJob  
metadata:  
name: scale-up-job  
namespace: <namespace> # Namespace  
spec:  
schedule: "0 7 \* \* \*" # Cron Job timing to scale up deployment replicas  
jobTemplate:  
spec:  
template:  
spec:  
serviceAccountName: backgrounder-scaler-service-account  
restartPolicy: OnFailure  
containers:  
\- name: scale  
image: bitnami/kubectl:1.21  
imagePullPolicy: IfNotPresent  
args:  
\- scale  
\- --replicas=4  
\- deployment/backgrounder  
\---  
apiVersion: batch/v1beta1  
kind: CronJob  
metadata:  
name: scale-down-job  
namespace: <namespace>  
spec:  
schedule: "0 9 \* \* \*" # Cron Job timing to scale down deployment replicas  
jobTemplate:  
spec:  
template:  
spec:  
serviceAccountName: backgrounder-scaler-service-account  
restartPolicy: OnFailure  
containers:  
\- name: scale  
image: bitnami/kubectl:1.21  
imagePullPolicy: IfNotPresent  
args:  
\- scale  
\- --replicas=2  
\- deployment/backgrounder

#### クローン構成を消去する Kubernetes ジョブ (オプション)

これは、テスト時に使用できる便利な Kubernetes ジョブです。個別のデプロイを実行時に Tableau Server in a Container が生成したクローン構成をクリアしたい場合は、次のようなジョブを実行して NFS をクリーンアップできます。

apiVersion: batch/v1  
kind: Job  
metadata:  
name: delete-clone-artifacts-job  
namespace: manatee-cluster  
spec:  
template:  
spec:  
containers:  
\- name: delete-clone-artifacts  
image: busybox:1.28  
command: \['sh', '-c', "rm -rf ${CLONE\_ARTIFACT\_DIR}"\]  
env:  
\- name: CLONE\_ARTIFACT\_DIR  
value: /docker/clone/clone-artifacts  
securityContext:  
runAsUser: 0  
allowPrivilegeEscalation: true  
volumeMounts:  
\- name: clone-volume  
mountPath: /docker/clone  
restartPolicy: Never  
volumes:  
\- name: clone-volume  
nfs:  
server: <nfs\_ip> # IP for shared NFS directory for clone output  
path: /clone