我在网上搜索了最好用的免费且易于使用的仪表板解决方案,找到了Apache Superset。这里有一个在Kubernetes上安装的教程。
如你所知,我为不同的公司担任软件架构师。其中一个客户正在使用Power BI来创建一些BI图表,并与公司内部的人员分享。
由于 Power BI 的复杂性和“共享”系统的某个问题,他让我寻找一个新的、几乎免费的仪表板解决方案,并将所有数据源连接到该解决方案上。
该解决方案应具备将仪表板分享给一组用户,并将其嵌入到现有产品中的功能,而无需处理所有用户管理。
我在搜索软件时偶然发现了 Superset,它在 GitHub 上有超过 59k 的星标客户给了我以下要求:
- 开源软件
- 为自定义服务添加新的自定义连接器
- 支持连接查询的 SQL
- 为不同用户组共享和嵌入仪表板
- 为不同的使用场景参数化仪表板
- 多种不同的图表类型列表
考虑到所有的这些需求,在我的搜索过程中遇到了 Superset,想试一试。
GitHub - apache/superset: Apache Superset 是一个数据可视化和数据探索平台Apache Superset 是一个数据可视化和数据探索平台 - apache/supersetgithub.comSuperset 的插件系统和不同的数据连接器使其非常易于扩展。
在测试 Apache Superset 时,我发现查询一些数据非常容易,使用起来也非常直观。
你可以轻松创建复杂的仪表板。可用的图表种类令人惊叹且非常灵活。
(版权来自 Superset 文档)
使用无代码界面,你可以轻松地从你创建的数据集中生成复杂的图表。
(版权来自 Superset 文档)
查询构建器非常强大使用 Querybuilder 可以创建很多复杂的数据集,这些数据集之后可以用来生成图表。
版权所有来自Superset文档
很多大公司都使用 Superset 来满足他们的需求GitHub 仓库还列出了使用 Superset 的公司。以下是一些例子:
这里是你关于“如何在Kubernetes中安装Superset”的教程。为了安装 Superset,你只需要运行以下两个命令。第二个命令依赖于一个“superset.yaml”文件,这是你部署的主要配置文件。
helm repo add superset https://apache.github.io/superset
helm upgrade --install --values superset.yaml superset superset/superset
您可以使用以下“superset.yaml”文件并将其保存到您硬盘上的一个文件中。
请注意,您需要更改一些行,这些行将在代码块之后解释。
# superset 的默认值。
# 这是一个 YAML 格式的文件。
# 用于传递给模板的变量。
# 使用 helm-docs 自动生成一个 README(参见 https://github.com/norwoodj/helm-docs)
# 若要更新它,请安装 helm-docs 并从此图表的根目录运行 helm-docs
# -- 提供一个名称以覆盖图表的名称
nameOverride: ~
# -- 提供一个名称以覆盖资源的完整名称
fullnameOverride: ~
# -- 用户 ID 指令。此用户必须有足够的权限来运行引导脚本
# 在生产环境中,不建议以 root 用户运行容器。将其更改为另一个 UID - 例如 1000 以提高安全性
runAsUser: 0
# -- 指定要使用的服务帐户名称
serviceAccountName: ~
serviceAccount:
# -- 为 Superset 创建自定义服务帐户。如果 create 为 true 并且未提供 serviceAccountName,则将使用 `superset.fullname`
create: false
annotations: {}
# -- 在此脚本中安装额外的包并进行其他引导配置
# 对于生产集群,建议在 CI 中构建自己的镜像以完成此步骤
# @default -- 请参阅 `values.yaml`
bootstrapScript: |
#!/bin/bash
pip3 install chipmunkdb-python-client
if [ ! -f ~/bootstrap ]; then echo "正在使用 uid {{ .Values.runAsUser }} 运行 Superset" > ~/bootstrap; fi
# -- 用于生成 superset_config.py 文件的密钥名称
# 注意:此密钥必须包含 superset_config.py,并可以包含其他文件
configFromSecret: '{{ template "superset.fullname" . }}-config'
# -- 用于填充部署 pod 中环境变量的密钥名称
# 这对于密钥等很有用
envFromSecret: '{{ template "superset.fullname" . }}-env'
# -- 这可以是一个模板字符串列表
envFromSecrets: []
# -- 传递给 pod 的额外环境变量
extraEnv: {}
# 不同的 gunicorn 设置,参见 gunicorn 文档
# https://docs.gunicorn.org/en/stable/settings.html#
# 这些变量在 gunicorn 启动时用作标志
# https://github.com/apache/superset/blob/master/docker/run-server.sh#L22
# 延长超时时间以允许长时间运行的查询。
# GUNICORN_TIMEOUT: 300
# 增加 gunicorn 工作进程数量,可以显著提高性能
# 参见:https://docs.gunicorn.org/en/stable/design.html#how-many-workers
# SERVER_WORKER_AMOUNT: 4
# WORKER_MAX_REQUESTS: 0
# WORKER_MAX_REQUESTS_JITTER: 0
# SERVER_THREADS_AMOUNT: 20
# GUNICORN_KEEPALIVE: 2
# SERVER_LIMIT_REQUEST_LINE: 0
# SERVER_LIMIT_REQUEST_FIELD_SIZE: 0
# OAUTH_HOME_DOMAIN: ..
# # 如果未设置白名单,则可以使用您的 OAuth2 端点的任何地址都可以登录。
# # 这包括任何随机的 Gmail 地址,如果您的 OAuth2 Web App 设置为外部。
# OAUTH_WHITELIST_REGEX: ...
# -- 以原始格式传递给 pod 的额外环境变量
extraEnvRaw: []
# 从其他密钥加载数据库密码(例如用于 zalando 操作器)
# - name: DB_PASS
# valueFrom:
# secretKeyRef:
# name: superset.superset-postgres.credentials.postgresql.acid.zalan.do
# key: password
# -- 以密钥形式传递的额外环境变量
extraSecretEnv: {}
# MAPBOX_API_KEY: ...
# # Google API Keys: https://console.cloud.google.com/apis/credentials
# GOOGLE_KEY: ...
# GOOGLE_SECRET: ...
# # 生成自己的加密密钥。使用 openssl rand -base64 42 生成一个良好的密钥
# SUPERSET_SECRET_KEY: 'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'
# -- 要在 `/app/pythonpath` 上挂载的额外文件
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: []
# -- 要作为密钥在 `/app/pythonpath` 上挂载的额外文件
extraSecrets: {}
extraVolumes: []
# - name: customConfig
# configMap:
# name: '{{ template "superset.fullname" . }}-custom-config'
# - name: additionalSecret
# secret:
# secretName: my-secret
# defaultMode: 0600
extraVolumeMounts: []
# - name: customConfig
# mountPath: /mnt/config
# readOnly: true
# - name: additionalSecret:
# mountPath: /mnt/secret
# -- 一个字典,用于在 superset_config.py 的末尾追加覆盖 - 名称无关紧要
# 警告:顺序无法保证
# 文件可以通过 helm --set-file configOverrides.my-override=my-file.py 传递
configOverrides:
secret: |
SECRET_KEY = 'YOUR_SECRET'
# extend_timeout: |
# # Extend timeout to allow long running queries.
# SUPERSET_WEBSERVER_TIMEOUT = ...
# enable_oauth: |
# from flask_appbuilder.security.manager import (AUTH_DB, AUTH_OAUTH)
# AUTH_TYPE = AUTH_OAUTH
# OAUTH_PROVIDERS = [
# {
# "name": "google",
# "whitelist": [ os.getenv("OAUTH_WHITELIST_REGEX", "") ],
# "icon": "fa-google",
# "token_key": "access_token",
# "remote_app": {
# "client_id": os.environ.get("GOOGLE_KEY"),
# "client_secret": os.environ.get("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("OAUTH_HOME_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"
# secret: |
# # Generate your own secret key for encryption. Use `openssl rand -base64 42` to generate a good key
# SECRET_KEY = 'CHANGE_ME_TO_A_COMPLEX_RANDOM_SECRET'
# -- 与上述相同,但值是文件
configOverridesFiles: {}
# extend_timeout: extend_timeout.py
# enable_oauth: enable_oauth.py
configMountPath: "/app/pythonpath"
extraConfigMountPath: "/app/configs"
image:
repository: apachesuperset.docker.scarf.sh/apache/superset
tag: ~
pullPolicy: IfNotPresent
imagePullSecrets: []
initImage:
repository: apache/superset
tag: dockerize
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 8088
annotations: {}
# cloud.google.com/load-balancer-type: "Internal"
loadBalancerIP: ~
nodePort:
# -- (int)
http: nil
ingress:
enabled: false
ingressClassName: ~
annotations: {}
# kubernetes.io/tls-acme: "true"
## Extend timeout to allow long running queries.
# nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
# nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
# nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
path: /
pathType: ImplementationSpecific
hosts:
- chart-example.local
tls: []
extraHostsRaw: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# 我们通常建议不要指定默认资源,并让用户自己选择。这也有助于图表在资源较少的环境中运行,例如 Minikube。如果您确实要指定资源,取消注释以下行,根据需要进行调整,并删除 'resources:' 后的花括号。
# 下面的限制将应用于所有 Superset 组件。要设置单独的资源限制,请参考下面的 pod 特定值。
# pod 特定值将覆盖这里设置的任何内容。
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
# -- 自定义主机别名,用于所有 superset pod
## https://kubernetes.io/docs/tasks/network/customize-hosts-file-for-pods/
hostAliases: []
# - hostnames:
# - nodns.my.lan
# ip: 18.27.36.45
# Superset 节点配置
supersetNode:
replicaCount: 1
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
# -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetNode pod 使用
podDisruptionBudget:
# -- 是否创建 pod 破坏预算
enabled: false
# -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
minAvailable: 1
# -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
maxUnavailable: 1
# -- 启动命令
# @default -- 请参阅 `values.yaml`
command:
- "/bin/sh"
- "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; /usr/bin/run-server.sh"
connections:
# -- 如果使用自己的 redis,请更改此配置并设置 redis.enabled: false
redis_host: '{{ .Release.Name }}-redis-headless'
redis_port: "6379"
redis_user: ""
# redis_password: superset
redis_cache_db: "1"
redis_celery_db: "0"
# 或 SSL 端口通常是 6380
# 更新以下配置以使用 Redis SSL
redis_ssl:
enabled: false
ssl_cert_reqs: CERT_NONE
# 如果带自己的 PostgreSQL 实例,请更改以下配置并设置 postgresql.enabled: false
db_host: '{{ .Release.Name }}-postgresql'
db_port: "5432"
db_user: superset
db_pass: superset
db_name: superset
env: {}
# -- 如果为 true,则在每次升级时强制部署重新加载
forceReload: false
# -- 初始化容器
# @default -- 一个等待 postgres 的容器
initContainers:
- name: wait-for-postgres
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
envFrom:
- secretRef:
name: "{{ tpl .Values.envFromSecret . }}"
command:
- /bin/sh
- -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s
# -- 将其他容器启动到 supersetNode pod 中
extraContainers: []
# -- 要添加到 supersetNode 部署的注释
deploymentAnnotations: {}
# -- 要添加到 supersetNode 部署的标签
deploymentLabels: {}
# -- 要添加到 supersetNode 部署的亲和性
affinity: {}
# -- 要添加到 supersetNode 部署的拓扑传播约束
topologySpreadConstraints: []
# -- 要添加到 supersetNode pod 的注释
podAnnotations: {}
# -- 要添加到 supersetNode pod 的标签
podLabels: {}
startupProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 15
timeoutSeconds: 1
failureThreshold: 60
periodSeconds: 5
successThreshold: 1
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 15
timeoutSeconds: 1
failureThreshold: 3
periodSeconds: 15
successThreshold: 1
readinessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 15
timeoutSeconds: 1
failureThreshold: 3
periodSeconds: 15
successThreshold: 1
# -- 为 supersetNode pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。
resources: {}
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
podSecurityContext: {}
containerSecurityContext: {}
strategy: {}
# type: RollingUpdate
# rollingUpdate:
# maxSurge: 25%
# maxUnavailable: 25%
# Superset Celery 工作程序配置
supersetWorker:
replicaCount: 1
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
# -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetWorker pod 使用
podDisruptionBudget:
# -- 是否创建 pod 破坏预算
enabled: false
# -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
minAvailable: 1
# -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
maxUnavailable: 1
# -- 工作程序启动命令
# @default -- 一个 `celery worker` 命令
command:
- "/bin/sh"
- "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app worker"
# -- 如果为 true,则在每次升级时强制部署重新加载
forceReload: false
# -- 初始化容器
# @default -- 一个等待 postgres 和 redis 的容器
initContainers:
- name: wait-for-postgres-redis
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
envFrom:
- secretRef:
name: "{{ tpl .Values.envFromSecret . }}"
command:
- /bin/sh
- -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s
# -- 将其他容器启动到 supersetWorker pod 中
extraContainers: []
# -- 要添加到 supersetWorker 部署的注释
deploymentAnnotations: {}
# -- 要添加到 supersetWorker 部署的标签
deploymentLabels: {}
# -- 要添加到 supersetWorker 部署的亲和性
affinity: {}
# -- 要添加到 supersetWorker 部署的拓扑传播约束
topologySpreadConstraints: []
# -- 要添加到 supersetWorker pod 的注释
podAnnotations: {}
# -- 要添加到 supersetWorker pod 的标签
podLabels: {}
# -- 为 supersetWorker pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。
resources: {}
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
podSecurityContext: {}
containerSecurityContext: {}
strategy: {}
# type: RollingUpdate
# rollingUpdate:
# maxSurge: 25%
# maxUnavailable: 25%
livenessProbe:
exec:
# -- 活动探测命令
# @default -- 一个 `celery inspect ping` 命令
command:
- sh
- -c
- celery -A superset.tasks.celery_app:app inspect ping -d celery@$HOSTNAME
initialDelaySeconds: 120
timeoutSeconds: 60
failureThreshold: 3
periodSeconds: 60
successThreshold: 1
# -- 默认情况下没有启动/就绪探测器,因为我们并不真正关心它的启动时间(它不提供流量)
startupProbe: {}
# -- 默认情况下没有启动/就绪探测器,因为我们并不真正关心它的启动时间(它不提供流量)
readinessProbe: {}
# Superset beat 配置(用于触发如报告等计划任务)
supersetCeleryBeat:
# -- 如果您打算使用警报和报告,则需要启用此配置
enabled: false
# -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetCeleryBeat pod 使用
podDisruptionBudget:
# -- 是否创建 pod 破坏预算
enabled: false
# -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
minAvailable: 1
# -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
maxUnavailable: 1
# -- 命令
# @default -- 一个 `celery beat` 命令
command:
- "/bin/sh"
- "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; celery --app=superset.tasks.celery_app:app beat --pidfile /tmp/celerybeat.pid --schedule /tmp/celerybeat-schedule"
# -- 如果为 true,则在每次升级时强制部署重新加载
forceReload: false
# -- 列出初始化容器
# @default -- 一个等待 postgres 的容器
initContainers:
- name: wait-for-postgres-redis
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
envFrom:
- secretRef:
name: "{{ tpl .Values.envFromSecret . }}"
command:
- /bin/sh
- -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s
# -- 将其他容器启动到 supersetCeleryBeat pod 中
extraContainers: []
# -- 要添加到 supersetCeleryBeat 部署的注释
deploymentAnnotations: {}
# -- 要添加到 supersetCeleryBeat 部署的亲和性
affinity: {}
# -- 要添加到 supersetCeleryBeat 部署的拓扑传播约束
topologySpreadConstraints: []
# -- 要添加到 supersetCeleryBeat pod 的注释
podAnnotations: {}
# -- 要添加到 supersetCeleryBeat pod 的标签
podLabels: {}
# -- 为 CeleryBeat pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。
resources: {}
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
podSecurityContext: {}
containerSecurityContext: {}
supersetCeleryFlower:
# -- 启用 Celery flower 部署(用于监控 celery 任务的管理 UI)
# 警告:在 superset 1.x 中,这需要一个安装了 `flower<1.0.0` 的 Superset 镜像(默认镜像中没有安装)
# flower>=1.0.0 需要 Celery 5+,而 Superset 1.5 不支持
enabled: false
replicaCount: 1
# -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetCeleryFlower pod 使用
podDisruptionBudget:
# -- 是否创建 pod 破坏预算
enabled: false
# -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
minAvailable: 1
# -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
maxUnavailable: 1
# -- 命令
# @default -- 一个 `celery flower` 命令
command:
- "/bin/sh"
- "-c"
- "celery --app=superset.tasks.celery_app:app flower"
service:
type: ClusterIP
annotations: {}
loadBalancerIP: ~
port: 5555
nodePort:
# -- (int)
http: nil
startupProbe:
httpGet:
path: /api/workers
port: flower
initialDelaySeconds: 5
timeoutSeconds: 1
failureThreshold: 60
periodSeconds: 5
successThreshold: 1
livenessProbe:
httpGet:
path: /api/workers
port: flower
initialDelaySeconds: 5
timeoutSeconds: 1
failureThreshold: 3
periodSeconds: 5
successThreshold: 1
readinessProbe:
httpGet:
path: /api/workers
port: flower
initialDelaySeconds: 5
timeoutSeconds: 1
failureThreshold: 3
periodSeconds: 5
successThreshold: 1
# -- 列出初始化容器
# @default -- 一个等待 postgres 和 redis 的容器
initContainers:
- name: wait-for-postgres-redis
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
envFrom:
- secretRef:
name: "{{ tpl .Values.envFromSecret . }}"
command:
- /bin/sh
- -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -wait "tcp://$REDIS_HOST:$REDIS_PORT" -timeout 120s
# -- 将其他容器启动到 supersetCeleryFlower pod 中
extraContainers: []
# -- 要添加到 supersetCeleryFlower 部署的注释
deploymentAnnotations: {}
# -- 要添加到 supersetCeleryFlower 部署的亲和性
affinity: {}
# -- 要添加到 supersetCeleryFlower 部署的拓扑传播约束
topologySpreadConstraints: []
# -- 要添加到 supersetCeleryFlower pod 的注释
podAnnotations: {}
# -- 要添加到 supersetCeleryFlower pod 的标签
podLabels: {}
# -- 为 CeleryBeat pod 设置的资源 - 这些设置会覆盖上面定义的全局资源对象中的现有值。
resources: {}
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
podSecurityContext: {}
containerSecurityContext: {}
supersetWebsockets:
# -- 如果您打算使用 `GLOBAL_ASYNC_QUERIES` 在 `ws` 模式下,则需要启用此配置
# 参见 https://github.com/apache/superset/blob/master/CONTRIBUTING.md#async-chart-queries
enabled: false
replicaCount: 1
# -- 设置 [pod 破坏预算](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) 以供 supersetWebsockets pod 使用
podDisruptionBudget:
# -- 是否创建 pod 破坏预算
enabled: false
# -- 如果设置,maxUnavailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
minAvailable: 1
# -- 如果设置,minAvailable 必须未设置 - 请参阅 https://kubernetes.io/docs/tasks/run-application/configure-pdb/#specifying-a-poddisruptionbudget
maxUnavailable: 1
ingress:
path: /ws
pathType: Prefix
image:
# -- 目前没有官方镜像(尚未提供),此镜像是社区支持的
repository: oneacrefund/superset-websocket
tag: latest
pullPolicy: IfNotPresent
# -- 传递给服务器的 config.json,参见 https://github.com/apache/superset/tree/master/superset-websocket
# 注意,配置也可以从环境变量读取(环境变量优先),参见 https://github.com/apache/superset/blob/master/superset-websocket/src/config.ts 支持的变量列表
# @default -- 请参阅 `values.yaml`
config:
{
"port": 8080,
"logLevel": "debug",
"logToFile": false,
"logFilename": "app.log",
"statsd": { "host": "127.0.0.1", "port": 8125, "globalTags": [] },
"redis":
{
"port": 6379,
"host": "127.0.0.1",
"password": "",
"db": 0,
"ssl": false,
},
"redisStreamPrefix": "async-events-",
"jwtSecret": "CHANGE-ME",
"jwtCookieName": "async-token",
}
service:
type: ClusterIP
annotations: {}
loadBalancerIP: ~
port: 8080
nodePort:
# -- (int)
http: nil
command: []
resources: {}
# -- 将其他容器启动到 supersetWebsockets pod 中
extraContainers: []
deploymentAnnotations: {}
# -- 要添加到 supersetWebsockets 部署的亲和性
affinity: {}
# -- 要添加到 supersetWebsockets 部署的拓扑传播约束
topologySpreadConstraints: []
podAnnotations: {}
podLabels: {}
strategy: {}
podSecurityContext: {}
containerSecurityContext: {}
startupProbe:
httpGet:
path: /health
port: ws
initialDelaySeconds: 5
timeoutSeconds: 1
failureThreshold: 60
periodSeconds: 5
successThreshold: 1
livenessProbe:
httpGet:
path: /health
port: ws
initialDelaySeconds: 5
timeoutSeconds: 1
failureThreshold: 3
periodSeconds: 5
successThreshold: 1
readinessProbe:
httpGet:
path: /health
port: ws
initialDelaySeconds: 5
timeoutSeconds: 1
failureThreshold: 3
periodSeconds: 5
successThreshold: 1
init:
# 配置资源
# 警告:fab 命令消耗大量内存,可能会
# 导致进程因 OOM 而被杀死。请确保您为管理员用户创建提供了强密码(或者在设置后更改密码)
# 同时请更改管理员邮箱为您的自定义邮箱。
resources: {}
# limits:
# cpu:
# memory:
# requests:
# cpu:
# memory:
# -- 命令
# @default -- 一个 `superset_init.sh` 命令
command:
- "/bin/sh"
- "-c"
- ". {{ .Values.configMountPath }}/superset_bootstrap.sh; . {{ .Values.configMountPath }}/superset_init.sh"
enabled: true
jobAnnotations:
"helm.sh/hook": post-install,post-upgrade
"helm.sh/hook-delete-policy": "before-hook-creation"
loadExamples: false
createAdmin: true
adminUser:
username: admin
firstname: Superset
lastname: Admin
email: admin@superset.com
password: admin
# -- 列出初始化容器
# @default -- 一个等待 postgres 的容器
initContainers:
- name: wait-for-postgres
image: "{{ .Values.initImage.repository }}:{{ .Values.initImage.tag }}"
imagePullPolicy: "{{ .Values.initImage.pullPolicy }}"
envFrom:
- secretRef:
name: "{{ tpl .Values.envFromSecret . }}"
command:
- /bin/sh
- -c
- dockerize -wait "tcp://$DB_HOST:$DB_PORT" -timeout 120s
# -- 一个 Superset 初始化脚本
# @default -- 一个创建管理员用户和初始化角色的脚本
initscript: |-
#!/bin/sh
set -eu
echo "升级数据库模式..."
superset db upgrade
echo "初始化角色..."
superset init
{{ if .Values.init.createAdmin }}
echo "创建管理员用户..."
superset fab create-admin \
--username {{ .Values.init.adminUser.username }} \
--firstname {{ .Values.init.adminUser.firstname }} \
--lastname {{ .Values.init.adminUser.lastname }} \
--email {{ .Values.init.adminUser.email }} \
--password {{ .Values.init.adminUser.password }} \
|| true
{{- end }}
{{ if .Values.init.loadExamples }}
echo "加载示例..."
superset load_examples
{{- end }}
if [ -f "{{ .Values.extraConfigMountPath }}/import_datasources.yaml" ]; then
echo "导入数据库连接.... "
superset import_datasources -p {{ .Values.extraConfigMountPath }}/import_datasources.yaml
fi
# -- 将其他容器启动到初始化作业 pod 中
extraContainers: []
## 初始化作业 pod 上要添加的注释
podAnnotations: {}
podSecurityContext: {}
containerSecurityContext: {}
## 初始化作业 pod 上要添加的容忍度
tolerations: []
## 初始化作业 pod 上要添加的亲和性
affinity: {}
# -- 要添加到初始化作业的拓扑传播约束
topologySpreadConstraints: []
# -- PostgreSQL 依赖项的配置值。
# 参见:https://github.com/bitnami/charts/tree/main/bitnami/postgresql
# @default -- 请参阅 `values.yaml`
postgresql:
##
## 使用 PostgreSQL 图表依赖项。
## 如果使用自己的 PostgreSQL,请设置为 false。
enabled: true
## 认证参数
auth:
## 包含 postgres 密码的现有密钥的名称。
existingSecret:
## 要创建的自定义用户的 PostgreSQL 名称。
username: superset
## 要创建的自定义用户的 PostgreSQL 密码。如果提供了 `auth.existingSecret` 和 `password` 则忽略此设置
password: superset
## 要创建的自定义数据库的 PostgreSQL 名称。
database: superset
image:
tag: "14.6.0-debian-11-r13"
## PostgreSQL 主参数
primary:
##
## 持久卷存储配置。
## 参见:https://kubernetes.io/docs/user-guide/persistent-volumes
persistence:
##
## 启用 PostgreSQL 持久化,使用持久卷声明。
enabled: true
##
## 持久类
# storageClass: classname
##
## 访问模式:
accessModes:
- ReadWriteOnce
## PostgreSQL 端口
service:
ports:
postgresql: "5432"
# -- Redis 依赖项的配置值。
# 参见:https://github.com/bitnami/charts/blob/master/bitnami/redis
# 更多文档可以在 https://artifacthub.io/packages/helm/bitnami/redis 查阅
# @default -- 请参阅 `values.yaml`
redis:
##
## 使用 redis 图表依赖项。
##
## 如果您使用自己的 redis,请在 supersetNode.connections.redis_host 中设置主机
##
## 如果使用自己的 redis,请设置为 false。
enabled: true
##
## 设置架构为 standalone/replication
architecture: standalone
##
## 认证配置:
##
auth:
## 启用密码认证
enabled: false
## 包含 redis 密码的现有密钥的名称。
existingSecret: ""
## 密钥名称。
existingSecretKey: ""
## Redis 密码
password: superset
##
## 主配置
##
master:
##
## 镜像配置
# image:
##
## docker 注册表密钥名称(列表)
# pullSecrets: nil
##
## 配置持久化
persistence:
##
## 使用 PVC 持久化数据。
enabled: false
##
## 持久类
# storageClass: classname
##
## 访问模式:
accessModes:
- ReadWriteOnce
nodeSelector: {}
tolerations: []
affinity: {}
# -- 要添加到所有部署的拓扑传播约束
topologySpreadConstraints: []
## 更新你的密钥
在“configOverrides”这一行中,你需要定义一个 **SECRET_KEY**。你可以使用以下命令来创建一个。
> openssl rand -base64 42
然后将输出复制并替换到 yaml 文件中,如下所示。
configOverrides:
secret: |
SECRET_KEY = 'YOUR_SECRET'
# 通过运行:openssl rand -base64 42
# 生成 YOUR_SECRET 并替换 YOUR_SECRET
## (可选)安装更多独立的数据库连接器
根据你拥有的数据源,你可能需要在 Superset 中安装更多的数据库连接器。在我的例子中,我需要 **chipmunkdb** 并将其添加到 yaml 文件的 **bootstrapScript** 部分。
这里是一个例子:
bootstrapScript: |
#!/bin/bash
pip3 install chipmunkdb-python-client
# 可以添加更多你需要的库作为数据库连接器
if [ ! -f ~/bootstrap ]; then echo "使用 uid {{ .Values.runAsUser }} 运行 Superset" > ~/bootstrap; fi
如果你不知道什么是chipmunkdb,可以在这里阅读我写的另一篇文章了解更多。
## [使用支持SQL的Pandas Dataframe作为网络数据库 — 感谢DuckDB如果你是一位需要创建或修改大型数据集的数据科学家,然后将它们作为SQL准备好的数据共享,可以使用Pandas Dataframe和DuckDB来实现……medium.com](https://medium.com/@thoren.lederer/use-pandas-dataframe-with-sql-support-as-a-network-database-thanks-to-duckdb-2a46e1f88b66?source=post_page-----6f1607405380--------------------------------)
在审查完你的 superset.yaml 文件后,运行以下命令来安装 Superset。
helm repo add superset https://apache.github.io/superset
helm upgrade --install --values superset.yaml superset superset/superset
安装完成后,输出会显示如何访问您的 Superset 用户界面。默认的登录凭证为:
**用户名: admin**
**密码: admin**
输入凭证后,你应该看到以下仪表板界面。
![](https://imgapi.imooc.com/66f221bc0991ed0814000165.jpg)
## 祝贺!你已经安装了 Apache Superset!
# 你的看法是什么?你试过 Superset 吗?告诉我一下。
请让我知道您使用 Superset 的经历。您是否有其他推荐的免费仪表板解决方案?
如果你喜欢这篇文章,请给我点赞或关注我以获取更多内容。
谢谢,
Thoren