跳转到内容

使用Kubernetes进行部署 APP v3.4.0 ​

如需要从Docker版本迁移至Kubernetes版本,请参考此文档。
Kubernetes版本支持的SwanLab Python SDK版本为 >= 0.7.4

如果你想要使用 Kubernetes 进行 SwanLab 私有化部署,请按照下面的流程进行安装。

swanlab kubernetes logo


资源和概念:

  • SwanHubX/charts - 私有化服务发布地址:SwanLab的Kubernetes Helm Chart仓库
  • swanlab-self-hosted: 在集群中部署的 SwanLab 私有化服务的默认 RELEASE 名称
  • <your_namespace>: 在集群中部署的 SwanLab 私有化服务的命名空间,请替换为部署使用的命名空间

🧱 先决条件 ​

使用 Kubernetes 部署 SwanLab 私有化版本,请确保您的 Kubernetes 和相关基础设施满足如下要求:

软件/基础设施版本/配置要求必要性说明
kubernetesv1.24 及以上官方测试验证覆盖了 v1.24+ 版本。为确保 API 兼容性与系统稳定性,不建议在低于此版本的集群中部署。
helmversion>=3.9SwanLab Chart 包依赖于 Helm v3.9+ 的新特性,与早期版本不兼容,也不兼容 Helm v2(Tiller 模式)。
RBAC 权限Namespace Admin账户需具备部署 SwanLab私有化服务对应命名空间下的写权限。核心资源包括:Deployment, StatefulSet, Service, PVC, Secret, ConfigMap等。
网络访问 (Egress)*.swanlab.cn集群节点需具备访问公网的能力(或配置 NAT 网关),建议公网出口带宽 ≥ 100Mbps
1. repo.swanlab.cn:用于拉取应用镜像。
2. api.swanlab.cn:用于 License 在线激活与校验。
对象存储兼容 AWS S3 协议SwanLab 上报的媒体资源等文件默认保存在对象存储中,为节约存储成本,推荐外部集成对象存储,确保兼容 S3 API

🧾 资源清单 ​

应用服务镜像 ​

⚠️ 注意: value.yaml 应用镜像的 tag 默认设置为空字符串,可以从 template 中自动同步最新的版本号作为镜像标签,一般无需修改。特殊热更新补丁版本镜像需要手动填充 tag。

组件镜像地址values.yaml 配置路径说明
swanlab-serverrepo.swanlab.cn/self-hosted/swanlab-server:<APP_VERSION>service.server.image后端核心服务
swanlab-authrepo.swanlab.cn/self-hosted/swanlab-auth:<APP_VERSION>service.auth.image认证与鉴权服务
swanlab-houserepo.swanlab.cn/self-hosted/swanlab-house:<APP_VERSION>service.house.image后端实验指标OLAP服务
swanlab-cloudrepo.swanlab.cn/self-hosted/swanlab-cloud:<APP_VERSION>service.cloud.image前端实验图表渲染组件
swanlab-nextrepo.swanlab.cn/self-hosted/swanlab-next:<APP_VERSION>service.next.image前端UI

基础设施镜像 ​

⚠️注意:当某一项存储组件 选择自定义基础服务资源时,以下对应镜像可忽略(使用自建的外部服务)。

WARNING

  • 受不同 Kubernetes 集群权限模型的限制,SwanLab 的 K8s 版本暂未使用 Operator 部署,基础数据库服务使用单实例部署
  • 如需接入自建或云厂商的高可用数据库,可参考 自定义 value 配置 进行修改
  • 外接数据库前,建议参考 FAQ 测试集群与数据库实例之间的 RTT
组件镜像地址values.yaml 配置路径说明
Traefikrepo.swanlab.cn/public/traefik:3.6service.gateway.反向代理 / 网关入口
Identifyrepo.swanlab.cn/public/swanlab-helper/identify:v1.2service.gateway.identifyImage网关鉴权辅助镜像
Busyboxrepo.swanlab.cn/public/busybox:1.37.0helper.image部署辅助初始化容器
Vectorrepo.swanlab.cn/public/vector:0.51.1-debianvector.image指标聚合转发
PostgreSQLrepo.swanlab.cn/self-hosted/postgres:16.1dependencies.postgres.imagePostgreSQL关系型数据库(用户、项目、实验元数据)
Redisrepo.swanlab.cn/self-hosted/redis-stack:7.4.0-v8dependencies.redis.image缓存与会话存储
ClickHouserepo.swanlab.cn/self-hosted/clickhouse-server:24.3dependencies.clickhouse.image实验指标与日志列数据库
MinIOrepo.swanlab.cn/self-hosted/minio/minio:RELEASE.2025-09-07T16-13-09Zdependencies.s3.imageS3 兼容对象存储(实验媒体资源与导出日志文件)
MinIO MCrepo.swanlab.cn/self-hosted/minio/mc:RELEASE.2025-08-13T08-35-41Zdependencies.s3.mcImageMinIO 客户端工具(初始化 bucket 等)

🪜 安装指引 ​

INFO

本指引使用 【外部集成 S3 对象存储】 + 【集群数据库通过 PVC 挂载云硬盘】 的部署方案。

1. 创建 Secret ​

推荐使用已有的在线对象存储服务(必须兼容AWS S3协议),请确保您已创建好具有可写权限的 AK/SK,参考下列 yaml:

swanlab-self-hosted-secret.yaml 模板
yaml
apiVersion: v1
kind: Secret
metadata:
  name: swanlab-self-hosted-secret-s3
  namespace: <your_namespace> # 请替换为实际使用的命名空间
type: Opaque
stringData:
  accessKey: xxxx
  secretKey: xxxx
bash
# 在集群中创建 secret
kubectl apply -f swanlab-self-hosted-secret.yaml

# 查看 secret
kubectl get secret swanlab-self-hosted-secret-s3 -n <your_namespace>

2. 创建 PVC ​

SwanLab 私有化服务中,主要依赖以下基础服务的存储资源:

基础资源PVC 命名存储大小推荐
Redisswanlab-redis-pvc≥ 50G
PostgreSQLswanlab-postgres-pvc≥ 100G
ClickHouseswanlab-clickhouse-pvc≥ 1000G
Vectordata-swanlab-self-hosted-vector-0 / data-swanlab-self-hosted-vector-1每个副本各自 ≥ 60G, 两块独立存储
「可选」MinIOswanlab-minio-pvc≥ 1000G,建议优先使用在线对象存储

WARNING

  • storageClassName 应以您集群中挂载的云硬盘类型为准(例如:腾讯云默认的云硬盘 cbs),要求支持动态扩容与快照策略
  • Vector 部署为 StatefulSet,PVC名称默认不可修改
  • 建议确保 vector/postgres/redis/clickhouse 相关的 PVC 均已处于 Bound 状态后再执行后续安装步骤(如果 storageClass 的磁盘绑定策略为 waitForFirstConsumer 则无需等待 Bound)
swanlab-self-hosted-pvc.yaml 模板
yaml
# ----------------------------
# PersistentVolumeClaim for Redis
# ----------------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: swanlab-redis-pvc
  namespace: <your_namespace> # 替换为实际命名空间
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: "" # 替换为您集群中实际的 storageClass
  volumeMode: Filesystem
---
# ----------------------------
# PersistentVolumeClaim for PostgreSQL
# ----------------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: swanlab-postgres-pvc
  namespace: <your_namespace> # 替换为实际命名空间
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi
  storageClassName: "" # 替换为您集群中实际的 storageClass
  volumeMode: Filesystem
---
# ----------------------------
# PersistentVolumeClaim for ClickHouse
# ----------------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: swanlab-clickhouse-pvc
  namespace: <your_namespace> # 替换为实际命名空间
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1000Gi
  storageClassName: "" # 替换为您集群中实际的 storageClass
  volumeMode: Filesystem
---
# ----------------------------
# PersistentVolumeClaim for Vector-0
# ----------------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-swanlab-self-hosted-vector-0
  namespace: <your_namespace> # 替换为实际命名空间
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 60Gi
  storageClassName: "" # 替换为您集群中实际的 storageClass
  volumeMode: Filesystem
---
# ----------------------------
# PersistentVolumeClaim for Vector-1
# ----------------------------
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-swanlab-self-hosted-vector-1
  namespace: <your_namespace> # 替换为实际命名空间
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 60Gi
  storageClassName: "" # 替换为您集群中实际的 storageClass
  volumeMode: Filesystem
bash
# 创建 PVC
kubectl apply -f swanlab-self-hosted-pvc.yaml

# 验证 PVC 状态
kubectl get pvc -n <your_namespace>

3. value 填写 ​

完整的 value.yaml 配置项可参考 自定义 Value 配置说明 文档。

您可以在 values.yaml 模板 查看 swanlab-self-hosted 使用的原始 value 模板,也可以通过下列指令查看:

bash
helm show values swanlab/self-hosted

我们 强烈建议您保存好部署使用的 values.yaml,以便后续正常升级,以下是相关的 value.yaml 修改说明:

3.1 PVC 绑定 ​

dependencies 字段下各组件的 existingClaim 需与第 2 步已创建的 PVC 名称对齐:

组件values.yaml 路径对应 PVC 名称
PostgreSQLdependencies.postgres.persistence.existingClaimswanlab-postgres-pvc
Redisdependencies.redis.persistence.existingClaimswanlab-redis-pvc
ClickHousedependencies.clickhouse.persistence.existingClaimswanlab-clickhouse-pvc

修改示例:

dependencies PVC 修改示例
yaml
dependencies:
  postgres: # PostgreSQL 数据库配置
    fullnameOverride: ""

    image: # 镜像配置
      # 完整镜像仓库路径(例如 ghcr.io/cloudnative-pg/postgresql)
      repository: repo.swanlab.cn/self-hosted/postgres
      # 镜像标签/版本。建议 SwanLab 使用 16.x 及以上版本
      tag: "16.1"
      # Kubernetes 镜像拉取策略(Always、IfNotPresent、Never)
      pullPolicy: "IfNotPresent"

    username: ""
    password: ""

    persistence: # 持久化存储配置
      # 用于动态供应的 Kubernetes StorageClass
      storageClass: "disk-cloud-auto"
      # 数据库存储卷大小
      storageSize: "10Gi"

      # 使用已有的 PVC(留空则自动创建新的 pvc)
      existingClaim: "swanlab-postgres-pvc" # ⚠️: 通常仅修改这一个名称,对齐创建的 postgres PVC 名称

    customLabels: {}
    customAnnotations: {}
    customPodLabels: {}
    customPodAnnotations: {}
    customTolerations: []
    customNodeSelector: {}
    resources: {}
yaml
redis: # Redis 配置
  fullnameOverride: ""

  image: # 镜像配置
    # 完整镜像仓库路径(例如 redis/redis-stack)
    repository: repo.swanlab.cn/self-hosted/redis-stack
    # 镜像标签/版本
    tag: "7.4.0-v8"
    # Kubernetes 镜像拉取策略(Always、IfNotPresent、Never)
    pullPolicy: "IfNotPresent"

  persistence: # 持久化存储配置
    storageClass: "disk-cloud-auto"
    storageSize: "10Gi"

    # 使用已有的 PVC(留空则自动创建新的 pvc)
    existingClaim: "swanlab-redis-pvc" # ⚠️: 通常仅修改这一个名称,对齐创建的 redis PVC 名称

  customLabels: {}
  customAnnotations: {}
  customPodLabels: {}
  customPodAnnotations: {}
  customTolerations: []
  customNodeSelector: {}
  resources: {}
yaml
clickhouse: # ClickHouse 配置
  fullnameOverride: ""

  image: # 镜像配置
    # 完整镜像仓库路径(例如 clickhouse/clickhouse-server)
    repository: repo.swanlab.cn/self-hosted/clickhouse-server
    # 镜像标签/版本
    tag: "24.3"
    pullPolicy: "IfNotPresent"

  # 认证凭据
  # 如果使用 existingSecret 则留空
  username: ""
  password: ""

  persistence: # 持久化存储配置
    storageClass: "disk-cloud-auto"
    storageSize: "20Gi"

    # 使用已有的 PVC(留空则自动创建新的 pvc)
    existingClaim: "swanlab-clickhouse-pvc" # ⚠️: 通常仅修改这一个名称,对齐创建的 clickhouse PVC 名称

  customLabels: {}
  customAnnotations: {}
  customPodLabels: {}
  customPodAnnotations: {}
  customTolerations: []
  customNodeSelector: {}
  resources: {}

3.2 应用镜像标签 ​

service 下的五个应用镜像(server / auth / house / cloud / next)的 tag 应设置为空字符串,Chart 会在渲染时自动注入正确的版本号。

3.3 Vector 存储 ​

vector.persistence.storageClass 和 vector.persistence.storageSize,与创建 vector PVC 时的大小保持一致,默认size 需修改为 60Gi。

3.4 外部 S3 集成配置 ​

integrations.s3 字段需要根据您使用的对象存储服务手动填写,推荐 public 桶和 private 桶分离。如您的云厂商对 S3 协议的 endpoint 访问做了区分,请特别注意应填写 S3 endpoint。详细的字段说明与配置示例,请参阅 外部 S3 集成 章节。

4. 添加 helm 仓库 ​

您可以通过helm安装SwanLab私有化服务K8S版。

首先建立本地仓库映射:

bash
helm repo add swanlab https://helm.swanlab.cn
# 更新仓库
helm repo update
# 列出所有 chart 版本
helm search repo swanlab/self-hosted --versions

5. 执行安装 ​

您可以根据集群网络环境选择以下两种安装方式之一。

选项一:Helm 仓库安装 ​

如果您的集群节点可以直接访问 Helm 仓库(即集群节点可以直接访问 github.com),可以参考如下命令执行安装:

⚠️ 注意:https://helm.swanlab.cn 的 chart 包在 GitHub Release做版本 tag 索引 , 请提前确认网络连通性!

bash
# 建议先使用 --dry-run 验证模板兼容性
helm install swanlab-self-hosted swanlab/self-hosted \
  -f <your_own_values.yaml> \
  --namespace <your_namespace> \
  --dry-run
  • 确认无报错后,去掉 --dry-run 选项执行安装

选项二:本地 Chart 包安装 ​

如果您的集群节点无法直接访问 Helm 仓库(即集群节点无法直接访问 github.com),可以通过 OCI 方式拉取 chart 包到本地后执行安装:

如遇到 401 认证失败问题,可以通过 helm registry logout xxx.com 的形式清除本机此前存在的 helm 登录态。

bash
# 拉取 chart 包到本地
helm pull oci://swanlab-registry.cn-hangzhou.cr.aliyuncs.com/chart/self-hosted --version <latest_chart_version>
# 解压 chart 包,预期只有一个 self-hosted/ 文件夹
tar -zxvf self-hosted-<latest_chart_version>.tgz

然后使用本地 chart 包更新验证:

bash
# 建议先使用 --dry-run 验证模板兼容性
helm install swanlab-self-hosted ./self-hosted/ \
  -f <your_own_values.yaml> \
  --namespace <your_namespace> \
  --dry-run
  • 确认无报错后,去掉 --dry-run 选项执行安装

通过安装 swanlab/self-hosted,即可在k8s上安装SwanLab私有化部署版应用,安装结果会在终端打印类似如下信息:

bash
Release "swanlab-self-hosted" has been upgraded. Happy Helming!
NAME: swanlab-self-hosted
LAST DEPLOYED: Sat Dec 13 17:52:05 2025
NAMESPACE: self-hosted
STATUS: deployed
REVISION: 6
TEST SUITE: None
NOTES:
Thank you for installing self-hosted!

Get the application URL by running these commands:

1. Access via kube-proxy:
   Run the following command to forward your local port 8080 to the service:
     kubectl port-forward --namespace self-hosted svc/swanlab-self-hosted 8080:80

   Then, you can access the service via:
     http://127.0.0.1:8080

2. Expose Service Externally:
   SwanLab self-hosted is not exposed to the public internet.
   If you wish to expose this service, you need to configure a LoadBalancer manually or use an Ingress Controller.

   Please refer to the official documentation for configuration details:
   https://docs.swanlab.cn/self_host/kubernetes/deploy.html

如上所示,swanlab-self-hosted 私有化服务默认无法直接通过外部网络访问,您可以通过port-forward功能在本地访问此服务。 如果您希望开启外部访问(通过IP或域名),请参考 配置应用访问入口。

下面是一个在本机访问的例子,打开终端并执行:

bash
kubectl port-forward --namespace self-hosted svc/swanlab-self-hosted 8080:80

然后你可以在浏览器中访问:http://127.0.0.1:8080,即可看到SwanLab的页面:

📖 License 激活 ​

个人版激活 ​

现在,你需要激活你的主账号。激活需要1个License,个人使用可以免费在SwanLab官网申请一个,位置在 「设置」-「账户与许可证」。

拿到License后,回到激活页面,填写用户名、密码、确认密码和License,点击激活即可完成创建。

企业版激活 ​

如您需要测试企业版能力,请联系 contact@swanlab.cn,我们会将测试 License 发送到该email中。

⚙️ 验证测试 ​

部署完成后,可通过下面 Python 代码用于验证标量与媒体的指标上报

指标上报测试
python
import swanlab
import random
import numpy as np  # 添加 NumPy 导入

swanlab.login(
    api_key="xxxxx",
    host="https://xxxxx"
)

# 创建一个SwanLab项目
swanlab.init(
    # 设置项目名
    project="my-first-project",
    experiment_name="my-first-experiment",
    # 设置超参数
    config={
        "learning_rate": 0.02,
        "architecture": "CNN",
        "dataset": "CIFAR-100",
        "epochs": 10
    }
)

# 模拟一次训练
epochs = 10
offset = random.random() / 5
for epoch in range(2, epochs):
    acc = 1 - 2 ** -epoch - random.random() / epoch - offset
    loss = 2 ** -epoch + random.random() / epoch + offset
    swanlab.log({
        "step_time": acc,
        "speed": loss
    })

# 生成随机噪声图像(64x64 RGB,随机像素值)
random_noise = np.random.randint(0, 255, (64, 64, 3), dtype=np.uint8)
img = swanlab.Image(random_noise, caption="Random Noise")
swanlab.log({
    "image": img
})

# [可选] 完成训练,这在notebook环境中是必要的
swanlab.finish()

预期效果如下图所示⬇️:

可以检查如下功能:

  • ⬜ 查看指标是否能够正常上报
  • ⬜ 查看图像是否正常上传并显示
  • ⬜ 查看 metric 的 csv 下载是否都顺利
  • ⬜ 查看用户头像是否能够正常显示

❓ 常见问题 ​

Value 字段配置 ​

您可以在此处查看 swanlab-self-hosted 的所有可配置项。

详细的字段说明与配置实践,请参阅 自定义 Value 配置说明 文档,其中涵盖:

  • 全局配置:Pod 反亲和性、登录域名等
  • 应用服务:副本数量、资源限制、标签与注解等
  • 网关配置:应用访问入口、端口等
  • 内置基础服务:PostgreSQL / Redis / ClickHouse / MinIO 的存储资源配置
  • 外部服务集成:接入外部 PostgreSQL、Redis、ClickHouse、S3 对象存储

【副本数】推荐服务副本数如何设置? ​

以下是根据线上运维经验给出的推荐副本配置最佳实践,在 values.yaml 中通过修改对应服务的 replicas 字段即可调整:

服务名副本数量说明
clickhouse1【不可修改】列数据库,负责实验指标存储
postgres1【不可修改】关系型数据库,负责元数据和关系记录
redis1【不可修改】内存数据库,缓存会话数据
vector2【不可修改】指标聚合转发
traefik2【按需修改】主网关,分发服务流量
swanlab-server≥ 3【按需修改】SwanLab 核心服务,根据服务负载动态调整
swanlab-auth2【按需修改】SwanLab 认证与鉴权服务,根据服务负载动态调整
swanlab-house≥ 3【按需修改】SwanLab 指标分析服务,根据服务负载动态调整
swanlab-next2【按需修改】SwanLab 前端框架
swanlab-cloud1【按需修改】SwanLab 前端图表页面

【资源限制】各服务的 CPU/内存 资源 limit 推荐如何限制? ​

待添加

更新与回滚 ​

如需更新 SwanLab 版本或在更新失败后进行回滚,请参考更新与回滚文档。

Prometheus 可观测接入指引 ​

参考 可观测配置 文档进行配置。