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

概要

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

前提条件

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

制限事項

  • この機能は、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 つのイメージすべてで共有されます。詳細については、「イメージをカスタマイズする」を参照してください。

  2. これらのすべてのイメージを、デプロイ用の内部イメージ リポジトリにパブリッシュします。

展開ガイド

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

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

kubectl apply -f <tableau-kubeconfig-dir>

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

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

バックグラウンダー ポッドは、フロー ジョブ以外のあらゆる種類の負荷を処理できます。フロー ジョブは、バックグラウンダー サービスを実行し続ける、メインの 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_disabledtrue に設定する必要があります。これにより、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 つの独立したサービス コンテナ (gatewayhyperdataserverbackgrounder) で構成されます。これらのポッドは、典型的な独立した 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 コマンドを実行して、一連の新しいクローン構成ファイル (クローン ペイロード) を生成する必要があります。

  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 コンテナ環境変数 (初期構成のオプションを参照) に加えて、Kubernetes 構成で設定する必要がある新しい必須環境変数がいくつかあります。

環境変数推奨値説明
FILESTORE_MOUNT_PATH/docker/dataengine外部ファイルストア ディレクトリのマウント場所。このディレクトリは、デプロイされた各 Tableau コンテナ内にマウントされた、データエンジン NFS ディレクトリを指す必要があります。外部ファイルストアの詳細については、「Tableau Server 外部ファイル ストア」を参照してください。この値は、Tableau Server in a Container のポッドとバックグラウンダーのポッドで同じにする必要があります。
CLONE_ARTIFACT_DIR/docker/clone/clone-artifactsクローン構成ディレクトリのマウント場所。このディレクトリは、各 Tableau コンテナ内にマウントされた、NFS ディレクトリを指す必要があります。Tableau Server は、バックグラウンダー ポッドがクラスタのメンバーになるために使用する構成データを出力します。
ROOT_LOG_DIR/var/log/tableau(バックグラウンダー ポッドのみ)

バックグラウンダー ポッドで実行されているすべてのサービスの共通ログ ディレクトリの場所。

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

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

ポート環境変数既定
BACKGROUNDER_PORT8600
DATASERVER_PORT8400
HYPER_PORT8200
GATEWAY_PORT8080

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