在 Kubernetes 上安装
Superset 支持通过 Helmchart 在 Kubernetes 上部署。 它位于官方Superset Helm 仓库。
准备工作
- Kubernetes 集群
 - 已安装的 Helm
 
对于更简单、单主机的环境, 我们推荐使用minikube, 它在许多平台上都很容易设置,并且与这里引用的 Helm chart 配合得非常好。
运行
- 添加 Superset 的 Helm 仓库
 
helm repo add superset https://apache.github.io/superset
"superset" has been added to your repositories
- 查看仓库中的 charts
 
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...
- 配置你的 setting 覆盖
 
正如任何标准的 Helm chart 一样  ,你需要创建一个 values.yaml 文件,用于定义或覆盖默认 values.yaml中暴露的任何值,或者来自其依赖的任何子 charts 中的值。
下方提供了更多关于你可能需要的一些重要覆盖设置的详细信息。
- 安装并运行
 
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
具体的 Pod 列表将取决于你的特定配置覆盖,但通常你可以期待以下这些 Pod 的出现:
- N 个 
superset-xxxx-yyyy和superset-worker-xxxx-yyyyPod(具体数量取决于你的supersetNode.replicaCount和supersetWorker.replicaCount值) - 1 个 
superset-postgresql-0Pod,这取决于你的 postgres 设置 - 1 个 
superset-redis-master-0Pod,这取决于你的 redis 设置 - 1 个 
superset-celerybeat-xxxx-yyyyPod,如果你在值覆盖中设置了supersetCeleryBeat.enabled = true 
- 访问 Superset
 
Helm chart 会发布适当的服务,使 Superset UI 在你的 Kubernetes 集群内部可见。为了从外部访问它,你需要:
- 将 Service 配置为 
LoadBalancer或NodePort类型。 - 为它设置 
Ingress- 图表中包含了 Ingress 定义,但你需要根据自己的需求进行调整(如 hostname, tls, annotations 等)。 - 或者运行 
kubectl port-forward superset-xxxx-yyyy :8088直接将一个 pod 的端口转发到你的 localhost。 
根据你配置的外部访问方式不同,访问 URL 也会有所不同。一旦确定了正确的 URL,你可以使用以下凭据登录:
- user: 
admin - password: 
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 database driver 和 SQLAlchemy dialect。
有关更多信息,请参阅安装数据库驱动程序。
以下示例安装了 Big Query 和 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 中指定一个或多个 key/value 条目来完成,例如:
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] }} 将解析为你 Ingress 的外部域名。
整个 superset_config.py 将作为一个 secret 安装,因此直接传递敏感参数是安全的...然而,使用密钥环境变量可能更具可读性。
完整的 Python 文件可以通过运行 helm upgrade --install --values my-values.yaml --set-file configOverrides.oauth=set_oauth.py
环 境变量
这些环境变量可以作为 key/values 对通过 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 中提供 key/value 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: []
这些数据源定义也将作为 secrets 挂载,并且可以包含敏感参数。
配置示例
设置 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://accounts.google.com/o/oauth2/token",
                "authorize_url": "https://accounts.google.com/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 worker 中安装受支持的 webdriver
这可以通过使用预安装了 webdriver 的自定义镜像,或者在启动时通过覆  盖 command 来安装实现。以下是为chromedriver工作的一个示例:
supersetWorker:
  command:
    - /bin/sh
    - -c
    - |
      # Install chrome webdriver
      # See https://github.com/apache/superset/blob/4fa3b6c7185629b87c27fc2c0e5435d458f7b73d/src/pages/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 jobs 和 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文件并按照上述 运行 部分中的 配置你的 setting 覆盖 步骤进行部署来加载一些示例。
init:
  loadExamples: true