跳到主要內容
在 GitHub 上編輯此頁面

在 Kubernetes 上安裝



使用官方 Superset helm 儲存庫中提供的 Helm 圖表,支援在 Kubernetes 上執行 Superset。

先決條件

  • 一個 Kubernetes 叢集
  • 已安裝 Helm
注意

對於較簡單的單主機環境,我們建議使用 minikube,它在許多平台上都很容易設定,並且與此處引用的 Helm 圖表配合得非常好。

執行

  1. 新增 Superset helm 儲存庫
helm repo add superset https://apache.github.io/superset
"superset" has been added to your repositories
  1. 檢視儲存庫中的圖表
helm search repo superset
NAME CHART VERSION APP VERSION DESCRIPTION
superset/superset 0.1.1 1.0 Apache Superset is a modern, enterprise-ready b...
  1. 設定您的設定覆寫

就像任何典型的 Helm 圖表一樣,您需要建立一個 values.yaml 檔案,該檔案將定義/覆寫預設 values.yaml 中公開的任何值,或來自它所依賴的任何依賴圖表。

下方有更多關於您可能需要的一些重要覆寫的資訊。

  1. 安裝並執行
helm upgrade --install --values my-values.yaml superset superset/superset

您應該會看到各種 pod 出現,例如

kubectl get pods
NAME READY STATUS RESTARTS AGE
superset-celerybeat-7cdcc9575f-k6xmc 1/1 Running 0 119s
superset-f5c9c667-dw9lp 1/1 Running 0 4m7s
superset-f5c9c667-fk8bk 1/1 Running 0 4m11s
superset-init-db-zlm9z 0/1 Completed 0 111s
superset-postgresql-0 1/1 Running 0 6d20h
superset-redis-master-0 1/1 Running 0 6d20h
superset-worker-75b48bbcc-jmmjr 1/1 Running 0 4m8s
superset-worker-75b48bbcc-qrq49 1/1 Running 0 4m12s

確切的列表將取決於您的一些特定設定覆寫,但您通常應該預期

  • N 個 superset-xxxx-yyyysuperset-worker-xxxx-yyyy pod (取決於您的 supersetNode.replicaCountsupersetWorker.replicaCount 值)
  • 1 個 superset-postgresql-0 (取決於您的 postgres 設定)
  • 1 個 superset-redis-master-0 (取決於您的 redis 設定)
  • 如果您的值覆寫中 supersetCeleryBeat.enabled = true,則為 1 個 superset-celerybeat-xxxx-yyyy pod
  1. 存取它

圖表會發佈適當的服務,以在您的 k8s 叢集中內部公開 Superset UI。若要從外部存取它,您必須

  • 將服務設定為 LoadBalancerNodePort
  • 為它設定 Ingress - 圖表包含一個定義,但需要根據您的需求進行調整 (主機名稱、tls、註釋等...)
  • 執行 kubectl port-forward superset-xxxx-yyyy :8088 以將一個 pod 的連接埠直接通道到您的 localhost

URL 將因您如何設定外部存取而有所不同。一旦您識別出適當的 URL,您就可以使用以下資訊登入

  • 使用者:admin
  • 密碼:admin

重要設定

安全性設定

包含預設的安全性設定和密碼,但您必須更新它們才能執行 prod 執行個體,尤其是

postgresql:
postgresqlPassword: superset

確保您為 SECRET_KEY 設定唯一強大的複雜字母數字字串,並使用工具來協助您產生足夠隨機的序列。

  • 若要產生良好的金鑰,您可以執行 openssl rand -base64 42
configOverrides:
secret: |
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'

如果您想要變更先前的秘密金鑰,則應該輪換金鑰。Kubernetes 部署的預設秘密金鑰為 thisISaSECRET_1234

configOverrides:
my_override: |
PREVIOUS_SECRET_KEY = 'YOUR_PREVIOUS_SECRET_KEY'
SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
init:
command:
- /bin/sh
- -c
- |
. {{ .Values.configMountPath }}/superset_bootstrap.sh
superset re-encrypt-secrets
. {{ .Values.configMountPath }}/superset_init.sh
注意

Superset 使用 Scarf Gateway 來收集遙測資料。了解不同 Superset 版本的安裝次數,可以為專案關於修補程式和長期支援的決策提供資訊。Scarf 會清除個人識別資訊 (PII),並且僅提供匯總統計資料。

若要選擇不參與基於 Helm 安裝的此資料收集,請編輯 helm/superset/values.yaml 檔案中的 repository: 行,將 apachesuperset.docker.scarf.sh/apache/superset 替換為 apache/superset,以便直接從 Docker Hub 提取映像。

相依性

在啟動腳本中安裝其他套件並執行任何其他引導設定。對於生產叢集,建議在 CI 中完成此步驟來建立自己的映像。

注意

Superset 需要為您想要連線的每個資料儲存區安裝 Python DB-API 資料庫驅動程式和 SQLAlchemy 方言。

請參閱 安裝資料庫驅動程式 以取得更多資訊。

以下範例安裝 BigQuery 和 Elasticsearch 的驅動程式,讓您能夠在 Superset 設定中連線到這些資料來源

bootstrapScript: |
#!/bin/bash
pip install psycopg2==2.9.6 \
sqlalchemy-bigquery==1.6.1 \
elasticsearch-dbapi==0.2.5 &&\
if [ ! -f ~/bootstrap ]; then echo "Running Superset with uid {{ .Values.runAsUser }}" > ~/bootstrap; fi

superset_config.py

預設的 superset_config.py 非常簡潔,您很可能需要擴充它。這是透過在 configOverrides 中指定一個或多個鍵/值項目來完成,例如

configOverrides:
my_override: |
# This will make sure the redirect_uri is properly computed, even with SSL offloading
ENABLE_PROXY_FIX = True
FEATURE_FLAGS = {
"DYNAMIC_PLUGINS": True
}

這些項目將會以 Helm 範本評估,因此能夠參考其他 values.yaml 變數,例如 {{ .Values.ingress.hosts[0] }} 將會解析為您的輸入外部網域。

整個 superset_config.py 將會以秘密安裝,因此可以直接傳遞敏感參數是安全的... 然而,使用秘密環境變數可能會更易讀。

完整 Python 檔案可以透過執行 helm upgrade --install --values my-values.yaml --set-file configOverrides.oauth=set_oauth.py 來提供

環境變數

這些可以透過 extraEnvextraSecretEnv (如果它們是敏感的) 以鍵/值方式傳遞。然後可以使用 os.environ.get("VAR") 等方式從 superset_config.py 參考它們。

extraEnv:
SMTP_HOST: smtp.gmail.com
SMTP_USER: user@gmail.com
SMTP_PORT: "587"
SMTP_MAIL_FROM: user@gmail.com

extraSecretEnv:
SMTP_PASSWORD: xxxx

configOverrides:
smtp: |
import ast
SMTP_HOST = os.getenv("SMTP_HOST","localhost")
SMTP_STARTTLS = ast.literal_eval(os.getenv("SMTP_STARTTLS", "True"))
SMTP_SSL = ast.literal_eval(os.getenv("SMTP_SSL", "False"))
SMTP_USER = os.getenv("SMTP_USER","superset")
SMTP_PORT = os.getenv("SMTP_PORT",25)
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD","superset")

系統套件

如果需要新的系統套件,可以在應用程式啟動前透過覆寫容器的 command 來安裝,例如

supersetWorker:
command:
- /bin/sh
- -c
- |
apt update
apt install -y somepackage
apt autoremove -yqq --purge
apt clean

# Run celery worker
. {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker

資料來源

可以透過在 extraConfigs 中提供鍵/值 yaml 定義來自動宣告資料來源定義

extraConfigs:
import_datasources.yaml: |
databases:
- allow_file_upload: true
allow_ctas: true
allow_cvas: true
database_name: example-db
extra: "{\r\n \"metadata_params\": {},\r\n \"engine_params\": {},\r\n \"\
metadata_cache_timeout\": {},\r\n \"schemas_allowed_for_file_upload\": []\r\n\
}"
sqlalchemy_uri: example://example-db.local
tables: []

這些也會以秘密方式掛載,並且可以包含敏感參數。

設定範例

設定 OAuth

注意

OAuth 設定要求已安裝 authlib Python 程式庫。這可以使用 pip 透過更新 bootstrapScript 來完成。請參閱 相依性 章節以取得更多資訊。

extraEnv:
AUTH_DOMAIN: example.com

extraSecretEnv:
GOOGLE_KEY: xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
GOOGLE_SECRET: xxxxxxxxxxxxxxxxxxxxxxxx

configOverrides:
enable_oauth: |
# This will make sure the redirect_uri is properly computed, even with SSL offloading
ENABLE_PROXY_FIX = True

from flask_appbuilder.security.manager import AUTH_OAUTH
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [
{
"name": "google",
"icon": "fa-google",
"token_key": "access_token",
"remote_app": {
"client_id": os.getenv("GOOGLE_KEY"),
"client_secret": os.getenv("GOOGLE_SECRET"),
"api_base_url": "https://www.googleapis.com/oauth2/v2/",
"client_kwargs": {"scope": "email profile"},
"request_token_url": None,
"access_token_url": "https://127.0.0.1/o/oauth2/token",
"authorize_url": "https://127.0.0.1/o/oauth2/auth",
"authorize_params": {"hd": os.getenv("AUTH_DOMAIN", "")}
},
}
]

# Map Authlib roles to superset roles
AUTH_ROLE_ADMIN = 'Admin'
AUTH_ROLE_PUBLIC = 'Public'

# Will allow user self registration, allowing to create Flask users from Authorized User
AUTH_USER_REGISTRATION = True

# The default user self registration role
AUTH_USER_REGISTRATION_ROLE = "Admin"

啟用警示和報告

為此,根據 警示和報告文件,您將需要

在 Celery 工作器中安裝支援的 webdriver

這可以透過使用預先安裝 webdriver 的自訂映像,或在啟動時透過覆寫 command 來安裝來完成。以下是 chromedriver 的可用範例

supersetWorker:
command:
- /bin/sh
- -c
- |
# Install chrome webdriver
# See https://github.com/apache/superset/blob/4fa3b6c7185629b87c27fc2c0e5435d458f7b73d/docs/src/pages/docs/installation/email_reports.mdx
apt-get update
apt-get install -y wget
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb
wget https://chromedriver.storage.googleapis.com/88.0.4324.96/chromedriver_linux64.zip
apt-get install -y zip
unzip chromedriver_linux64.zip
chmod +x chromedriver
mv chromedriver /usr/bin
apt-get autoremove -yqq --purge
apt-get clean
rm -f google-chrome-stable_current_amd64.deb chromedriver_linux64.zip

# Run
. {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker

執行 Celery beat

此 pod 將觸發在警示和報告 UI 區段中設定的排程工作

supersetCeleryBeat:
enabled: true

設定適當的 Celery 工作和 SMTP/Slack 設定

extraEnv:
SMTP_HOST: smtp.gmail.com
SMTP_USER: user@gmail.com
SMTP_PORT: "587"
SMTP_MAIL_FROM: user@gmail.com

extraSecretEnv:
SLACK_API_TOKEN: xoxb-xxxx-yyyy
SMTP_PASSWORD: xxxx-yyyy

configOverrides:
feature_flags: |
import ast

FEATURE_FLAGS = {
"ALERT_REPORTS": True
}

SMTP_HOST = os.getenv("SMTP_HOST","localhost")
SMTP_STARTTLS = ast.literal_eval(os.getenv("SMTP_STARTTLS", "True"))
SMTP_SSL = ast.literal_eval(os.getenv("SMTP_SSL", "False"))
SMTP_USER = os.getenv("SMTP_USER","superset")
SMTP_PORT = os.getenv("SMTP_PORT",25)
SMTP_PASSWORD = os.getenv("SMTP_PASSWORD","superset")
SMTP_MAIL_FROM = os.getenv("SMTP_MAIL_FROM","superset@superset.com")

SLACK_API_TOKEN = os.getenv("SLACK_API_TOKEN",None)
celery_conf: |
from celery.schedules import crontab

class CeleryConfig:
broker_url = f"redis://{env('REDIS_HOST')}:{env('REDIS_PORT')}/0"
imports = (
"superset.sql_lab",
"superset.tasks.cache",
"superset.tasks.scheduler",
)
result_backend = f"redis://{env('REDIS_HOST')}:{env('REDIS_PORT')}/0"
task_annotations = {
"sql_lab.get_sql_results": {
"rate_limit": "100/s",
},
}
beat_schedule = {
"reports.scheduler": {
"task": "reports.scheduler",
"schedule": crontab(minute="*", hour="*"),
},
"reports.prune_log": {
"task": "reports.prune_log",
'schedule': crontab(minute=0, hour=0),
},
'cache-warmup-hourly': {
"task": "cache-warmup",
"schedule": crontab(minute="*/30", hour="*"),
"kwargs": {
"strategy_name": "top_n_dashboards",
"top_n": 10,
"since": "7 days ago",
},
}
}

CELERY_CONFIG = CeleryConfig
reports: |
EMAIL_PAGE_RENDER_WAIT = 60
WEBDRIVER_BASEURL = "http://{{ template "superset.fullname" . }}:{{ .Values.service.port }}/"
WEBDRIVER_BASEURL_USER_FRIENDLY = "https://www.example.com/"
WEBDRIVER_TYPE= "chrome"
WEBDRIVER_OPTION_ARGS = [
"--force-device-scale-factor=2.0",
"--high-dpi-support=2.0",
"--headless",
"--disable-gpu",
"--disable-dev-shm-usage",
# This is required because our process runs as root (in order to install pip packages)
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-extensions",
]

載入範例資料和儀表板

如果您正在嘗試 Superset,並且想要探索一些資料和儀表板,您可以透過建立 my_values.yaml 並依照上述「執行」章節的「設定您的設定覆寫」步驟中所述來部署它,從而載入一些範例。若要載入範例,請將以下內容新增至 my_values.yaml 檔案

init:
loadExamples: true