컨테이너의 동적 배율 조정 - Tableau Server 백그라운더

소개

컨테이너의 백그라운더 동적 배율 조정을 통해 Tableau Server의 백그라운더 및 예약된 작업에 다양한 확장 전략을 적용할 수 있습니다. 이러한 맥락에서 자동 배율 조정을 수행하면 사람의 개입 또는 다른 서버 시스템의 가동 시간에 영향을 주지 않고 다양한 작업 부하를 처리하기 위해 서비스를 독립적으로 확장할 수 있습니다. Tableau Server 프로세스의 전체 노드를 포함하는 Tableau Server 컨테이너는 모놀리식 시스템으로 계속 실행됩니다. 대신, "백그라운더" 서비스 역할을 구성하는 더 작은 집합의 분리된 독립적 컨테이너 서비스는 동적 확장이 가능하며 일반적으로 Tableau Server 컨테이너에서 처리되는 컴퓨팅 로드를 처리할 수 있습니다. 백그라운더 서비스는 추출 새로 고침/생성, 구독 전송, 데이터 알림 확인 및 다양한 유지 관리 작업을 비롯한 시스템 작업을 처리합니다. 예를 들어 많은 수의 데이터 집합을 새로 고치거나 컴퓨팅 로드가 많이 소요되는 데이터 알림을 계산하는 것이 유리한 경우 이제 Kubernetes를 활용하여 컴퓨팅 성능을 확장하여 이러한 작업을 효율적으로 완료할 수 있습니다. 이 가이드는 Kubernetes에서 자동 배율 조정 백그라운더의 구성 및 배포 요구 사항을 다룹니다. 이 문서는 Tableau Server 컨테이너 설명서 내용을 보완합니다.

필수 요건

자동 배율 조정 백그라운더는 Kubernetes에서만 사용할 수 있으며 컨테이너의 Tableau Server를 기반으로 합니다. 자동 배율 조정 백그라운더 기능을 사용하려면 다음과 같은 특정 필수 요건을 충족해야 합니다.

제한 사항

  • 이 기능은 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와 네 개의 새 이미지가 만들어집니다. 이러한 추가 이미지에는 새로운 자동 배율 조정 백그라운더 포드를 구성하는 개별 서비스가 포함됩니다.

    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, 게이트웨이, 백그라운더 및 데이터 서버 이미지가 새로운 백그라운더 포드를 구성합니다. 사용자 지정 드라이버, 설치 스크립트 및 속성은 이러한 5개 이미지 모두에서 공유됩니다. 자세한 내용은 이미지 사용자 지정을 참조하십시오.

  2. 이러한 모든 이미지를 배포용 내부 이미지 리포지토리에 게시합니다.

배포 가이드

다음 정보는 Tableau Server 컨테이너를 배포하고 자동 배율 조정 백그라운더를 사용하는 방법에 대한 배경 지식을 알려드립니다. 이 정보는 셀프 컨테이너의 Tableau Server를 배포하는 방법을 이미 이해하고 알고 있다고 가정합니다. 자세한 내용은 Tableau Server 컨테이너를 참조하십시오. Kubernetes 구성 섹션에 있는 3개의 Kubernetes 구성 파일은 배포를 설정하는 데 사용할 수 있는 템플릿입니다. 이 가이드의 다른 섹션에서는 배포 요구 사항과 세부 정보를 다룹니다.

Tableau Server 및 자동 배율 조정 백그라운더의 배포는 가이드 하단에 채워진 Kubernetes 구성 파일을 배포하는 것처럼 간단해야 합니다.

kubectl apply -f <tableau-kubeconfig-dir>

백그라운더 작업

백그라운더 포드는 Tableau Server 컨테이너가 예약된 추가 워크로드를 병렬로 계산할 수 있도록 지원합니다. 백그라운더는 추출 새로 고침, 구독, 알림, 흐름 및 시스템 워크로드를 처리합니다. 백그라운더 포드 간에 작업을 분산한다는 것은 Tableau Server가 통합 문서 및 대시보드 렌더링과 같은 대화형 사용자 활동과 같은 다른 작업을 처리하는 데 사용할 수 있는 컴퓨팅 리소스가 더 많아진다는 것을 의미합니다. 흐름 작업은 백그라운더에서 실행되지 않는 유일한 백그라운더 작업 유형입니다. 백그라운더 작업에 대한 자세한 내용은 Tableau Server의 백그라운드 작업 관리를 참조하십시오.

백그라운더 포드는 기본 Tableau Server 컨테이너에서 실행되어야 하는 흐름 작업을 제외하고 모든 종류의 로드를 처리할 수 있으며, 이 흐름 작업은 계속해서 백그라운더 서비스를 실행합니다.

노드 역할 기능을 사용하면 특정 유형의 작업에 대해 유연하게 백그라운더 포드를 전용으로 지정할 수 있습니다. 이 기능은 Tableau Server의 노드 역할 기능을 확장한 것입니다. 다양한 노드 역할에 대한 자세한 설명은 여기에서 확인할 수 있습니다. 백그라운더 포드가 흐름 작업을 실행할 수 없기 때문에 백그라운더 포드에 대해서는 기본적으로 흐름 작업이 사용되지 않도록 설정됩니다(즉, 역할이 "no-flow"로 설정됨).

백그라운더에 대한 노드 역할을 설정하려면 백그라운더 서비스를 실행하는 컨테이너에 대한 kubeconfig의 일부로 NODE_ROLES 환경 변수를 설정해야 합니다. 예를 들어, 백그라운더를 extract-refresh 작업만 실행하도록 설정하려면 아래와 같이 extract-refresh에 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 포드의 토폴로지에는 하나 이상의 백그라운더 작업이 구성되며, 이는 백그라운더 작업을 실행할 수 있는 공간을 항상 확보하기 위해 필요합니다. 기본적으로 TSM에는 백그라운더 작업의 모든 역할을 처리할 수 있는 백그라운더가 있어야 합니다. 일부 시나리오에서는 백그라운더 포드에서 특정 유형의 모든 작업을 처리하도록 할 수 있습니다. 이렇게 하려면 서버 구성 키 topology.roles_handle_all_jobs_constraint_disabledtrue로 설정해야 합니다. 그러면 TSM 토폴로지에서 모든 작업 유형을 처리해야 하는 요구 사항이 사용되지 않도록 설정됩니다. 이 매개 변수를 설정하면 Tableau Server 백그라운더 인스턴스의 백그라운더 역할을 no-extract-refreshes로 설정하고 백그라운더 포드의 역할을 extract-refreshes로 설정할 수 있습니다. 이렇게 하면 모든 추출 새로 고침 작업이 백그라운더 포드에서만 실행됩니다.

참고: 이 제약 조건을 사용하지 않도록 설정하면 일부 작업 유형이 절대 예약되지 않도록 역할을 구성할 수 있습니다. TSM이 더 이상 모든 백그라운더 작업 유형을 예약할 수 있는지 확인하지 않으므로 TSM 백그라운더 작업과 백그라운더 작업의 역할 구성을 신중하게 설정해야 합니다.

Tableau Server 컨테이너 포드

Tableau Server가 자동 배율 조정 백그라운더 포드의 일부로 포함된 컨테이너는 기존 Tableau Server 컨테이너와 거의 동일한 방식으로 배포됩니다. 몇 가지 주요 요구 사항이 변경되었습니다.

  • Tableau Server 컨테이너와 백그라운더 포드 간에 구성을 전송하려면 네트워크 파일 공유가 필요합니다.
  • 외부 파일 저장소 기능을 사용하도록 설정하고 사용해야 합니다. 또한 전용 네트워크 파일 공유가 필요합니다.

백그라운더 포드

백그라운더 서비스 포드는 함께 작동하는 4가지 독립적인 서비스 컨테이너(게이트웨이, Hyper, 데이터 서버백그라운더)로 구성되어 있습니다. 이러한 포드는 일반적인 독립 Kubernetes 컨테이너 포드와 같은 방식으로 배포할 수 있습니다. 포드의 요구 사항은 다음과 같습니다.

  • 백그라운더 포드는 호스트 이름 DNS 확인을 사용하여 Tableau Server 노드에 연결할 수 있어야 합니다.
  • 외부 파일 저장소 및 클론 네트워크 파일 공유를 제공해야 합니다.

참고: 실행을 계속하기 전에 Tableau Server 컨테이너가 클론 구성 출력을 성공적으로 생성할 때까지 대기하도록 백그라운더 포드가 init-container로 구성됩니다.

로그

Tableau Server와 같은 백그라운더 포드 서비스는 여전히 디스크에 주로 로그를 씁니다. 백그라운더 포드는 크기를 확장 및 축소할 수 있으므로 일시적으로 유지되기 때문에 포드에 로그를 보관하는 것이 중요합니다. 기존 Kubernetes 환경을 사용하는 많은 고객은 이미 배포한 포드에서 로그를 수집하기 위해 일부 유형의 로그 집계 서비스를 사용하고 있습니다. 로그 집계 서비스의 예로는 Splunk 및 fluentd가 있습니다. 고객은 몇 가지 종류의 로그 집계 서비스를 사용하여 백그라운더 포드에서 로그를 수집하는 것이 좋습니다. 로그 관리를 쉽게 하기 위해 제공되는 kubbonfig는 공유 로그 볼륨에 쓰도록 포드의 각 서비스를 구성합니다. 각 서비스 컨테이너의 디렉터리 경로는 ROOT_LOG_DIR 환경 변수에 의해 지정됩니다.

지원 사례를 개설하고 로그를 제공해야 하는 경우 두 집합의 로그(기본 서버 컨테이너에서 수집한 ziplog와 백그라운더 포드의 로그)를 제공합니다. 백그라운더 포드의 로그는 로그 집계 서비스에서 검색되거나 아래의 수동 프로세스를 사용하여 검색됩니다.

로그 집계 서비스를 사용할 수 없는 고객의 경우 포드에서 수동으로 로그를 검색할 수 있습니다.

참고: 로그가 포함된 볼륨에 대해 영구 볼륨 클레임을 사용하지 않은 포드의 로그는 포드 크기가 축소되면 손실됩니다!

모든 관련 로그는 백그라운더 포드 내부의 /var/log/tableau 디렉터리(ROOT_LOG_DIR 환경 변수를 통해 구성 가능)에서 사용할 수 있습니다. 포드 중단 시 로그를 사용할 수 있도록 이 위치에 영구 볼륨 클레임을 마운트하는 것이 좋습니다.

백그라운더 포드가 실행 중일 때 로그 수집:

컨테이너 내부에 로그의 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
백그라운더 포드가 만료(또는 시작 실패)되었을 때 로그 수집

백그라운더 서비스 포드 배포 로그에 사용되는 영구 볼륨 클레임 마운트에 장기 실행 포드를 연결합니다. 구성 예:

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

라이브 구성 변경

tsm 명령줄 사용 등 Tableau Server 컨테이너에서 구성을 변경하고 이러한 구성 변경 사항을 백그라운더 포드에 표시하려면 tsm settings clone 명령을 실행하여 새 클론 구성 파일 집합("클론 페이로드")을 생성해야 합니다.

  1. TSM을 사용하여 Tableau Server 컨테이너 포드의 구성을 변경하고 서버에 구성 변경 사항을 적용합니다.
  2. Tableau Server 컨테이너 포드에서 다음 명령을 실행합니다.

    ## Run this command in the Tableau Server in a Container pod.
    tsm settings clone -d $CLONE_ARTIFACT_DIR

    이 명령은 새 구성 파일 집합을 생성하여 Clone NFS 드라이브 위치에 씁니다.

  3. 백그라운더 포드를 다시 배포합니다. 포드는 Clone NFS 드라이브를 사용하도록 구성해야 하며, 포드는 새 구성을 선택합니다.

확장 전략

Kubernetes에서는 다양한 기법과 전략을 사용하여 백그라운더 포드 크기를 조정할 수 있습니다. 시간 일정에 따라 백그라운더 포드 풀 크기를 변경하는 확장 전략의 예를 제공해 드립니다.

CPU 및 메모리 사용률은 백그라운더 포드를 확장하는 데 사용할 수 있는 적합한 메트릭이 아닙니다. 메모리 및 CPU 사용률은 클러스터의 전체 로드 수요를 정확하게 반영하지 못합니다. 예를 들어, 백그라운더 포드는 추출을 새로 고치기 위해 최대 사용률을 나타낼 수 있지만 백그라운더 작업 큐에서 대기 중인 추가 작업이 없습니다. 이 경우 자동 배율 조정을 통해 작업 처리량이 향상되지 않습니다.

예약된 확장

cron 작업을 사용하는 표준 Kubernetes 메커니즘을 통해 확장 솔루션을 예약할 수 있습니다.

이에 대한 Kubernetes 구성의 예는 아래의 Kubernetes 구성 섹션에 나와 있습니다.

Kubernetes 구성

새 환경 변수

표준 Tableau Server 컨테이너 환경 변수(초기 구성 옵션 참조) 외에도 Kubernetes 구성에서 설정해야 하는 몇 가지 새로운 필수 환경 변수가 있습니다.

환경 변수권장 값설명
FILESTORE_MOUNT_PATH/docker/dataengine외부 파일 저장소 디렉터리 마운트 위치입니다. 이 디렉터리는 배포된 각 Tableau 컨테이너 내부에 마운트된 Dataengine NFS 디렉터리를 가리켜야 합니다. 외부 파일 저장소에 대한 자세한 내용은 Tableau Server 외부 파일 저장소를 참조하십시오. 이 값은 Tableau Server 컨테이너 포드와 백그라운더 포드에 대해 동일해야 합니다.
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

또한 데이터 서버는 다시 구성할 수 없는 포트 8300을 사용합니다.

공유 네트워크 디렉터리

Tableau Server를 배포하려면 두 개의 네트워크 공유가 있어야 제대로 작동합니다. 참고로, 모든 Tableau Server 및 백그라운더 포드 Kubernetes 구성 템플릿에는 다음과 같은 네트워크 디렉터리가 있습니다.

  • 데이터 엔진 디렉터리(FILESTORE_MOUNT_PATH): 백그라운더 포드에는 외부 파일 저장소 기능이 필요합니다. 이 네트워크 공유에는 Tableau Server와 백그라운더 포드 간에 공유될 추출 및 기타 파일 기반 아티팩트가 포함되어 있습니다.
  • 클론 디렉터리(CLONE_ARTIFACT_DIR): Tableau Server는 정적 연결 및 구성 정보를 네트워크 공유에 씁니다. 백그라운더 포드는 이 정보를 사용하여 Tableau Server 클러스터의 멤버가 됩니다. 향후 시험판에서는 이 구성이 Kubernetes 구성의 표준 수명 주기에 통합될 예정입니다.

중요: 새 Tableau Server 컨테이너를 포함하여 클러스터를 완전히 다시 배포하려는 경우 Clone NFS 마운트의 내용을 제거해야 합니다. 그렇지 않으면 백그라운더 포드가 이전 서버에 연결을 시도합니다.

Kubernetes 구성 예

참고: 구성 예에는 준비 프로브 사용이 포함됩니다. Tableau Server 컨테이너 배포가 단일 노드 TSM 배포(배포에 여러 백그라운더 포드가 포함될 수 있음)인 경우 준비 프로브를 사용할 수 있습니다. 다중 노드 Tableau Server 컨테이너 배포에는 준비 프로브를 사용할 수 없습니다.

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 컨테이너에서 생성된 클론 구성을 지우려면 이와 같은 작업을 실행하여 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