在 Kubernetes 上安装

在官方 Superset helm 存储库 中找到的 Helm 图表支持在 Kubernetes 上运行 Superset。

先决条件

  • 一个 Kubernetes 集群
  • 安装 Helm

对于更简单的单主机环境,我们建议使用 minikube,它可以在许多平台上轻松设置,并且与此处引用的 Helm 图表配合得非常好。

运行

  1. 添加 Superset helm 仓库
  1. helm repo add superset https://apache.github.io/superset
  2. "superset" has been added to your repositories
  1. 查看存储库中的图表
  1. helm search repo superset
  2. NAME CHART VERSION APP VERSION DESCRIPTION
  3. superset/superset 0.1.1 1.0 Apache Superset is a modern, enterprise-ready b...
  1. 配置您的设置

就像任何典型的 Helm 图表一样,您需要制作一个 values.yaml 文件,该文件将定义/覆盖默认 values.yaml,或来自它所依赖的任何依赖图表:

下面是有关您可能需要的一些重要覆盖的更多信息。

  1. 安装并运行
  1. helm upgrade --install --values my-values.yaml superset superset/superset

您应该会看到弹出各种 pod,例如:

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

确切的列表将取决于您的一些特定配置覆盖,但您通常应该期望:

  • N superset-xxxx-yyyysuperset-worker-xxxx-yyyy pods (取决于您的 supersetNode.replicaCountsupersetWorker.replicaCount 值)
  • 1 superset-postgresql-0 取决于你的 postgres 设置
  • 1 superset-redis-master-0 取决于你的 redis设置
  • 1 superset-celerybeat-xxxx-yyyy pod 如果您的值覆盖中有 supersetCeleryBeat.enabled = true
  1. 访问它

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

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

根据您配置外部访问的方式,URL 会有所不同。一旦您确定了适当的 URL,您就可以使用以下方式登录:

  • 用户: admin
  • 密码: admin

重要设置

安全设定

包含默认安全设置和密码,但您必须更新它们才能运行 prod 实例,特别是:

  1. postgresql:
  2. postgresqlPassword: superset

确保为 SECRET_KEY 设置一个独特的、强大的复杂字母数字字符串,并使用工具来帮助您生成足够随机的序列。

  • 要生成一个好的密钥,您可以运行 openssl rand -base64 42
  1. configOverrides:
  2. secret: |
  3. SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'

如果您想更改以前的密钥,则应该轮换密钥。 kubernetes 部署的默认密钥是 thisISaSECRET_1234

  1. configOverrides:
  2. my_override: |
  3. PREVIOUS_SECRET_KEY = 'YOUR_PREVIOUS_SECRET_KEY'
  4. SECRET_KEY = 'YOUR_OWN_RANDOM_GENERATED_SECRET_KEY'
  5. init:
  6. command:
  7. - /bin/sh
  8. - -c
  9. - |
  10. . {{ .Values.configMountPath }}/superset_bootstrap.sh
  11. superset re-encrypt-secrets
  12. . {{ .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 方言。

有关详细信息,请参阅 安装数据库驱动程序

以下示例安装 Big Query 和 Elasticsearch 数据库驱动程序,以便您可以连接到 Superset 安装中的这些数据源:

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

superset_config.py

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

  1. configOverrides:
  2. my_override: |
  3. # This will make sure the redirect_uri is properly computed, even with SSL offloading
  4. ENABLE_PROXY_FIX = True
  5. FEATURE_FLAGS = {
  6. "DYNAMIC_PLUGINS": True
  7. }

这些将被评估为 Helm 模板,因此将能够引用其他 values.yaml 变量,例如 {{ .Values.ingress.hosts[0] }} 将解析为您的入口外部域。

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

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

环境变量

如果它们敏感,可以使用 extraEnvextraSecretEnv 作为键/值传递。然后可以使用例如从 superset_config.py 引用它们 os.environ.get("VAR")

  1. extraEnv:
  2. SMTP_HOST: smtp.gmail.com
  3. SMTP_USER: user@gmail.com
  4. SMTP_PORT: "587"
  5. SMTP_MAIL_FROM: user@gmail.com
  6. extraSecretEnv:
  7. SMTP_PASSWORD: xxxx
  8. configOverrides:
  9. smtp: |
  10. import ast
  11. SMTP_HOST = os.getenv("SMTP_HOST","localhost")
  12. SMTP_STARTTLS = ast.literal_eval(os.getenv("SMTP_STARTTLS", "True"))
  13. SMTP_SSL = ast.literal_eval(os.getenv("SMTP_SSL", "False"))
  14. SMTP_USER = os.getenv("SMTP_USER","superset")
  15. SMTP_PORT = os.getenv("SMTP_PORT",25)
  16. SMTP_PASSWORD = os.getenv("SMTP_PASSWORD","superset")

系统包

如果需要新的系统包,可以通过覆盖容器的 command 在应用程序启动之前安装它们,例如:

  1. supersetWorker:
  2. command:
  3. - /bin/sh
  4. - -c
  5. - |
  6. apt update
  7. apt install -y somepackage
  8. apt autoremove -yqq --purge
  9. apt clean
  10. # Run celery worker
  11. . {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker

数据源

可以通过在 extraConfigs 中提供键/值yaml定义来自动声明数据源定义:

  1. extraConfigs:
  2. import_datasources.yaml: |
  3. databases:
  4. - allow_file_upload: true
  5. allow_ctas: true
  6. allow_cvas: true
  7. database_name: example-db
  8. extra: "{\r\n \"metadata_params\": {},\r\n \"engine_params\": {},\r\n \"\
  9. metadata_cache_timeout\": {},\r\n \"schemas_allowed_for_file_upload\": []\r\n\
  10. }"
  11. sqlalchemy_uri: example://example-db.local
  12. tables: []

这些也将作为秘密安装,并且可以包含敏感参数。

配置举例

设置 OAuth

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

  1. extraEnv:
  2. AUTH_DOMAIN: example.com
  3. extraSecretEnv:
  4. GOOGLE_KEY: xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com
  5. GOOGLE_SECRET: xxxxxxxxxxxxxxxxxxxxxxxx
  6. configOverrides:
  7. enable_oauth: |
  8. # This will make sure the redirect_uri is properly computed, even with SSL offloading
  9. ENABLE_PROXY_FIX = True
  10. from flask_appbuilder.security.manager import AUTH_OAUTH
  11. AUTH_TYPE = AUTH_OAUTH
  12. OAUTH_PROVIDERS = [
  13. {
  14. "name": "google",
  15. "icon": "fa-google",
  16. "token_key": "access_token",
  17. "remote_app": {
  18. "client_id": os.getenv("GOOGLE_KEY"),
  19. "client_secret": os.getenv("GOOGLE_SECRET"),
  20. "api_base_url": "https://www.googleapis.com/oauth2/v2/",
  21. "client_kwargs": {"scope": "email profile"},
  22. "request_token_url": None,
  23. "access_token_url": "https://accounts.google.com/o/oauth2/token",
  24. "authorize_url": "https://accounts.google.com/o/oauth2/auth",
  25. "authorize_params": {"hd": os.getenv("AUTH_DOMAIN", "")}
  26. },
  27. }
  28. ]
  29. # Map Authlib roles to superset roles
  30. AUTH_ROLE_ADMIN = 'Admin'
  31. AUTH_ROLE_PUBLIC = 'Public'
  32. # Will allow user self registration, allowing to create Flask users from Authorized User
  33. AUTH_USER_REGISTRATION = True
  34. # The default user self registration role
  35. AUTH_USER_REGISTRATION_ROLE = "Admin"

启用警报和报告

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

在 Celery Worker 中安装受支持的网络驱动程序

这可以通过使用预安装了 Webdriver 的自定义映像来完成,也可以通过覆盖 command 在启动时进行安装来完成。这是 chromedriver 的一个工作示例:

  1. supersetWorker:
  2. command:
  3. - /bin/sh
  4. - -c
  5. - |
  6. # Install chrome webdriver
  7. # See https://github.com/apache/superset/blob/4fa3b6c7185629b87c27fc2c0e5435d458f7b73d/docs/src/pages/docs/installation/email_reports.mdx
  8. apt-get update
  9. apt-get install -y wget
  10. wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
  11. apt-get install -y --no-install-recommends ./google-chrome-stable_current_amd64.deb
  12. wget https://chromedriver.storage.googleapis.com/88.0.4324.96/chromedriver_linux64.zip
  13. apt-get install -y zip
  14. unzip chromedriver_linux64.zip
  15. chmod +x chromedriver
  16. mv chromedriver /usr/bin
  17. apt-get autoremove -yqq --purge
  18. apt-get clean
  19. rm -f google-chrome-stable_current_amd64.deb chromedriver_linux64.zip
  20. # Run
  21. . {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker
运行 Celery beat

此 Pod 将触发警报和报告 UI 部分中配置的计划任务:

  1. supersetCeleryBeat:
  2. enabled: true
配置适当的 Celery 作业和 SMTP/Slack 设置
  1. extraEnv:
  2. SMTP_HOST: smtp.gmail.com
  3. SMTP_USER: user@gmail.com
  4. SMTP_PORT: "587"
  5. SMTP_MAIL_FROM: user@gmail.com
  6. extraSecretEnv:
  7. SLACK_API_TOKEN: xoxb-xxxx-yyyy
  8. SMTP_PASSWORD: xxxx-yyyy
  9. configOverrides:
  10. feature_flags: |
  11. import ast
  12. FEATURE_FLAGS = {
  13. "ALERT_REPORTS": True
  14. }
  15. SMTP_HOST = os.getenv("SMTP_HOST","localhost")
  16. SMTP_STARTTLS = ast.literal_eval(os.getenv("SMTP_STARTTLS", "True"))
  17. SMTP_SSL = ast.literal_eval(os.getenv("SMTP_SSL", "False"))
  18. SMTP_USER = os.getenv("SMTP_USER","superset")
  19. SMTP_PORT = os.getenv("SMTP_PORT",25)
  20. SMTP_PASSWORD = os.getenv("SMTP_PASSWORD","superset")
  21. SMTP_MAIL_FROM = os.getenv("SMTP_MAIL_FROM","superset@superset.com")
  22. SLACK_API_TOKEN = os.getenv("SLACK_API_TOKEN",None)
  23. celery_conf: |
  24. from celery.schedules import crontab
  25. class CeleryConfig:
  26. broker_url = f"redis://{env('REDIS_HOST')}:{env('REDIS_PORT')}/0"
  27. imports = (
  28. "superset.sql_lab",
  29. "superset.tasks.cache",
  30. "superset.tasks.scheduler",
  31. )
  32. result_backend = f"redis://{env('REDIS_HOST')}:{env('REDIS_PORT')}/0"
  33. task_annotations = {
  34. "sql_lab.get_sql_results": {
  35. "rate_limit": "100/s",
  36. },
  37. }
  38. beat_schedule = {
  39. "reports.scheduler": {
  40. "task": "reports.scheduler",
  41. "schedule": crontab(minute="*", hour="*"),
  42. },
  43. "reports.prune_log": {
  44. "task": "reports.prune_log",
  45. 'schedule': crontab(minute=0, hour=0),
  46. },
  47. 'cache-warmup-hourly': {
  48. "task": "cache-warmup",
  49. "schedule": crontab(minute="*/30", hour="*"),
  50. "kwargs": {
  51. "strategy_name": "top_n_dashboards",
  52. "top_n": 10,
  53. "since": "7 days ago",
  54. },
  55. }
  56. }
  57. CELERY_CONFIG = CeleryConfig
  58. reports: |
  59. EMAIL_PAGE_RENDER_WAIT = 60
  60. WEBDRIVER_BASEURL = "http://{{ template "superset.fullname" . }}:{{ .Values.service.port }}/"
  61. WEBDRIVER_BASEURL_USER_FRIENDLY = "https://www.example.com/"
  62. WEBDRIVER_TYPE= "chrome"
  63. WEBDRIVER_OPTION_ARGS = [
  64. "--force-device-scale-factor=2.0",
  65. "--high-dpi-support=2.0",
  66. "--headless",
  67. "--disable-gpu",
  68. "--disable-dev-shm-usage",
  69. # This is required because our process runs as root (in order to install pip packages)
  70. "--no-sandbox",
  71. "--disable-setuid-sandbox",
  72. "--disable-extensions",
  73. ]

加载示例数据和仪表板

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

  1. init:
  2. loadExamples: true