Kubernetesへのインストール
 
Kubernetes上でのSupersetの実行は、公式のSuperset Helmリポジトリにある提供されているHelmチャートでサポートされています。
前提条件
- Kubernetesクラスタ
- Helmがインストールされていること
よりシンプルな単一ホスト環境の場合は、多くのプラットフォームで簡単にセットアップでき、ここで参照されているHelmチャートと非常にうまく連携するminikubeの使用をお勧めします。
実行
- Superset Helmリポジトリを追加する
helm repo add superset https://apache.github.io/superset
"superset" has been added to your repositories
- リポジトリ内のチャートを表示する
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...
- 設定のオーバーライドを設定する
典型的なHelmチャートと同様に、デフォルトのvalues.yaml、または依存するチャートの値を定義/オーバーライドする`values.yaml`ファイルを作成する必要があります。
必要な重要なオーバーライドについては、以下で詳しく説明します。
- インストールと実行
helm upgrade --install --values my-values.yaml superset superset/superset
次のような様々なポッドが表示されます。
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-yyyy`および`superset-worker-xxxx-yyyy`ポッド(`supersetNode.replicaCount`および`supersetWorker.replicaCount`の値によって異なります)
- Postgresの設定によっては1つの`superset-postgresql-0`
- Redisの設定によっては1つの`superset-redis-master-0`
- 値のオーバーライドで`supersetCeleryBeat.enabled = true`が設定されている場合は、1つの`superset-celerybeat-xxxx-yyyy`ポッド
- アクセスする
チャートは、k8sクラスタ内でSuperset UIを内部的に公開するための適切なサービスを公開します。外部からアクセスするには、次のいずれかを行う必要があります。
- サービスを`LoadBalancer`または`NodePort`として設定する
- `Ingress`を設定する - チャートには定義が含まれていますが、ニーズに合わせて調整する必要があります(ホスト名、tls、アノテーションなど)
- `kubectl port-forward superset-xxxx-yyyy :8088`を実行して、1つのポッドのポートをローカルホストに直接トンネリングする
外部アクセスの設定方法によって、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`に1つ以上のキー/値エントリを指定することで行われます。例:
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`を実行することで提供できます.
環境変数
これらは、`extraEnv`または機密性の高い場合は`extraSecretEnv`を使用して、キー/値として渡すことができます。その後、`superset_config.py`から`os.environ.get("VAR")`などを使用して参照できます。
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の設定
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://#/o/oauth2/token",
                "authorize_url": "https://#/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ワーカーにサポートされているWebドライバをインストールする
これは、Webドライバがプリインストールされているカスタムイメージを使用するか、`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を実行する
このポッドは、アラートとレポートの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