我在网上搜索了最好用的免费且易于使用的仪表板解决方案,找到了Apache Superset。这里有一个在Kubernetes上安装的教程。
如你所知,我为不同的公司担任软件架构师。其中一个客户正在使用Power BI来创建一些BI图表,并与公司内部的人员分享。
由于 Power BI 的复杂性和“共享”系统的某个问题,他让我寻找一个新的、几乎免费的仪表板解决方案,并将所有数据源连接到该解决方案上。
该解决方案应具备将仪表板分享给一组用户,并将其嵌入到现有产品中的功能,而无需处理所有用户管理。
客户给了我以下要求:
考虑到所有的这些需求,在我的搜索过程中遇到了 Superset,想试一试。
Superset 的插件系统和不同的数据连接器使其非常易于扩展。
在测试 Apache Superset 时,我发现查询一些数据非常容易,使用起来也非常直观。
可用的图表种类令人惊叹且非常灵活。
(版权来自 Superset 文档)
使用无代码界面,你可以轻松地从你创建的数据集中生成复杂的图表。
(版权来自 Superset 文档)
使用 Querybuilder 可以创建很多复杂的数据集,这些数据集之后可以用来生成图表。
版权所有来自Superset文档
GitHub 仓库还列出了使用 Superset 的公司。以下是一些例子:
为了安装 Superset,你只需要运行以下两个命令。第二个命令依赖于一个“superset.yaml”文件,这是你部署的主要配置文件。
helm repo add superset https://apache.github.io/superset helm upgrade --install --values superset.yaml superset superset/superset
请注意,您需要更改一些行,这些行将在代码块之后解释。
# 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