开源的现代数据探索和可视化平台:Apache Superset 在 Kubernetes 上安装

发布于:2025-08-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

Apache Superset
Apache Superset™ 是一个开源的现代数据探索和可视化平台。对于许多团队来说,Superset 可以取代或增强专有的商业智能工具。Superset 可以与各种数据源很好地集成。

在 Kubernetes 上安装

在 Kubernetes 上运行 Superset 已获支持,可使用官方 Superset helm 仓库 中提供的 Helm chart。

前置条件

  • 一个 Kubernetes 集群
  • 已安装 Helm

对于更简单的单机环境,我们推荐使用 minikube,它在多种平台上都易于设置,并且与这里引用的 Helm chart 配合得非常好。

运行

  1. 添加 Superset helm 仓库
helm repo add superset https://apache.github.io/superset
"superset" has been added to your repositories
  1. 查看仓库中的 chart
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 chart 一样,您需要编写一个 values.yaml 文件,该文件将定义/覆盖默认 values.yaml 中公开的任何值,或其依赖 chart 中的值:

下文将提供有关您可能需要的一些重要覆盖的更多信息。

  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 设置)
  • 1 个 superset-celerybeat-xxxx-yyyy pod(如果您在值覆盖中设置了 supersetCeleryBeat.enabled = true
  1. 访问它

该 chart 将发布适当的服务以在您的 k8s 集群内部公开 Superset UI。要在外部访问它,您必须:

  • 将 Service 配置为 LoadBalancerNodePort
  • 为其设置一个 Ingress - chart 包含一个定义,但需要根据您的需求进行调整(主机名、tls、注释等…)
  • 运行 kubectl port-forward superset-xxxx-yyyy :8088 以直接将一个 pod 的端口隧道到您的本地主机

根据您配置外部访问的方式,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 方言。

有关更多信息,请参阅安装数据库驱动程序
建议您参考 pyproject.toml 中列出的版本,而不是在引导脚本中硬编码它们,如下所示。

以下示例安装 BigQuery 和 Elasticsearch 的驱动程序,允许您在 Superset 设置中连接到这些数据源:

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

superset_config.py

默认的 superset_config.py 非常简洁,您很可能需要扩展它。这可以通过在 configOverrides 中指定一个或多个键/值条目来完成,例如:

configOverrides:
  my_override: |
    # 这将确保即使使用 SSL 卸载也能正确计算 redirect_uri
    ENABLE_PROXY_FIX = True
    FEATURE_FLAGS = {
        "DYNAMIC_PLUGINS": True
    }

这些将作为 Helm 模板进行求值,因此将能够引用其他 values.yaml 变量,例如 {{ .Values.ingress.hosts[0] }} 将解析为您的 ingress 外部域。

整个 superset_config.py 将作为密钥安装,因此直接传递敏感参数是安全的…但是使用密钥环境变量可能更具可读性。

可以通过运行 helm upgrade --install --values my-values.yaml --set-file configOverrides.oauth=set_oauth.py 来提供完整的 python 文件。

环境变量

这些可以作为键/值通过 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

      # 运行 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

:::note

OAuth 设置需要安装 authlib Python 库。这可以通过更新 bootstrapScript 使用 pip 来完成。有关更多信息,请参阅依赖项部分。

:::

extraEnv:
  AUTH_DOMAIN: example.com

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

configOverrides:
  enable_oauth: |
    # 这将确保即使使用 SSL 卸载也能正确计算 redirect_uri
    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", "")}
            },
        }
    ]

    # 将 Authlib 角色映射到 superset 角色
    AUTH_ROLE_ADMIN = 'Admin'
    AUTH_ROLE_PUBLIC = 'Public'

    # 将允许用户自我注册,允许从授权用户创建 Flask 用户
    AUTH_USER_REGISTRATION = True

    # 默认的用户自我注册角色
    AUTH_USER_REGISTRATION_ROLE = "Admin"

启用警报和报告

为此,根据警报和报告文档,您将需要:

在 Celery worker 中安装支持的 webdriver

这可以通过使用预安装了 webdriver 的自定义镜像来完成,或通过覆盖 command 在启动时安装。以下是 chromedriver 的工作示例:

supersetWorker:
  command:
    - /bin/sh
    - -c
    - |
      # 安装 chrome webdriver
      # 请参阅 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

      # 运行
      . {{ .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",
        # 这是必需的,因为我们的进程以 root 身份运行(为了安装 pip 包)
        "--no-sandbox",
        "--disable-setuid-sandbox",
        "--disable-extensions",
    ]

加载示例数据和仪表板

如果您正在试用 Superset 并希望有一些数据和仪表板可供探索,您可以通过创建 my_values.yaml 并将其部署到上述运行部分的配置您的设置覆盖步骤中所述来加载一些示例。
要加载示例,请将以下内容添加到 my_values.yaml 文件中:

init:
  loadExamples: true

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。


网站公告

今日签到

点亮在社区的每一天
去签到