使用 Helm 在 Kubernetes 上部署 PyCaret Control Planechart 结构、values 配置与依赖拓扑解析【免费下载链接】pycaretOpen-source, low-code AutoML platform for Python. PyCaret 4.0: sklearn-native engine React control plane.项目地址: https://gitcode.com/gh_mirrors/py/pycaret本文以仓库infra/helm/目录下的 PyCaret Helm chart状态标记为 stub面向 V2 企业级发行版为核心讲解如何把 PyCaret 4.0 的 Control Plane 全栈FastAPI 后端、React 前端、后台 worker、PostgreSQL/Redis/MinIO 依赖编排到 Kubernetes 集群中。读完本文你将掌握 chart 的目录结构与模板职责、values.yaml每个关键配置项的含义与默认值、内置依赖与自带/托管服务两种部署模式的选择以及从本地 Docker ComposeMVP平滑过渡到集群部署的路径。说明本文基于当前仓库中已落地的 chart 实现Chart.yaml、values.yaml 与 templates/ 下的模板文件编写。README 中规划但尚未实现的values-dev.yaml、values-prod.yaml、configmap.yaml、secret.yaml、pvc.yaml、job-migrate.yaml等文件属于目标结构文中会明确区分已实现与规划中。一、背景从单机 Compose 到集群编排PyCaret Control Plane 的部署基础设施位于仓库 infra/ 目录下分为三条线infra/docker/当前活跃的 MVP 方案用于本地与单服务器发行包含Dockerfile.apiFastAPI 后端镜像、Dockerfile.uiReact 前端镜像与 nginx 反向代理配置infra/helm/Kubernetes Helm chart标注为stub目标是 V2 企业级发行infra/terraform/AWS / GCP / Azure 的一键云模块同为 V2 占位。本地开发入口是仓库根目录的 compose.yml一条命令即可启动全部服务docker compose up --build # → http://localhost:3020其架构为api容器承载 FastAPI 后端 APScheduler 进程内 workerV1 阶段web容器内由 nginx 将/api与/ws反代到 api浏览器只感知单一来源。本地持久化使用 SQLite挂载卷pycaret-dataFernet 加密密钥在首次运行时生成并持久化到同一卷见 docker-entrypoint.sh 相关逻辑。Helm chart 正是要把这套架构搬到 Kubernetes把 SQLite 换成 PostgreSQL、把本地卷换成 MinIO/S3、把进程内 worker 拆成独立 Deployment并引入 Redis 作为 run 队列与事件总线。这正是 CONTROL_PLANE_SPEC.md 第 18.4 节 Enterprise Kubernetes — Helm chart manifests Terraform container images 描述的落地物。二、Chart 目录结构与目标形态infra/helm/README.md 给出了 chart 的目标目录结构infra/helm/pycaret/ ├── Chart.yaml ├── values.yaml # every knob an operator needs ├── values-dev.yaml # minimal smoke deploy ├── values-prod.yaml # opinionated prod ├── templates/ │ ├── api-deployment.yaml │ ├── api-service.yaml │ ├── web-deployment.yaml │ ├── web-service.yaml │ ├── worker-deployment.yaml │ ├── deployment-runtime.yaml # templated per user-deployment │ ├── ingress.yaml │ ├── configmap.yaml │ ├── secret.yaml │ ├── pvc.yaml │ └── job-migrate.yaml # alembic upgrade head on install └── README.md对照当前仓库实际文件已实现的部分包括Chart.yamlchart 元数据values.yaml全部可调参数与默认值templates/_helpers.tpl命名、标签、镜像与连接串的统一模板templates/api-deployment.yamlAPI Deployment Serviceapi-service 与部署模板合并在同一文件templates/web-deployment.yamlWeb Deployment Service同上合并templates/worker-deployment.yamlWorker Deploymenttemplates/ingress.yamlIngresstemplates/dependencies.yamlPostgreSQL / Redis / MinIO 内置依赖的 StatefulSet Service。规划中但尚未在仓库中出现的文件values-dev.yaml、values-prod.yaml、configmap.yaml、secret.yaml、pvc.yaml、job-migrate.yaml、deployment-runtime.yaml属于 README 声明的目标写作时以规划表述不当作已存在事实。三、Chart 元数据Chart.yamlChart.yaml 的关键字段apiVersion: v2 name: pycaret description: PyCaret Platform — self-hosted analytics ML platform type: application # Bumps once-per-release; sync with the API container tag. version: 0.1.0 appVersion: 4.0.0 keywords: - machine-learning ->api: replicaCount: 2 image: repository: ghcr.io/pycaret/pycaret-api tag: # falls back to global.imageTag resources: requests: { cpu: 250m, memory: 512Mi } limits: { cpu: 1000m, memory: 1Gi } env: PYCARET_ENVIRONMENT: prod PYCARET_RUNS_BACKEND: redis PYCARET_STORAGE_BACKEND: minio PYCARET_DEBUG: false service: { type: ClusterIP, port: 8020 } jwtSecretRef: { name: pycaret-jwt, key: secret } encryptionKeyRef: { name: pycaret-encryption, key: key }默认 2 副本Service 为 ClusterIP端口 8020api.env是自由扩展的 env map模板会通过range循环注入见下文模板解析适合追加PYCARET_LOG_LEVEL之类的自定义项两个 Secret 引用jwtSecretRefJWT 签名密钥与encryptionKeyRefFernet 加密密钥用于加密存储的凭据通过secretKeyRef挂入容器模板注释说明挂载到 /run/secrets 供 API 进程使用。与本地 Compose 中首次运行生成 Fernet 密钥的策略不同集群模式要求运维预先创建这两个 Secret。4.3 workerPhase 1 Phase 9 后台处理器worker: replicaCount: 2 image: repository: ghcr.io/pycaret/pycaret-api # 与 api 共用镜像 resources: requests: { cpu: 500m, memory: 1Gi } limits: { cpu: 2000m, memory: 4Gi } queues: default,cpu-heavyworker 与 api共用同一个镜像pycaret-api区别在于启动命令pycaret-server worker --queues ...queues支持逗号分隔多队列values 注释提示在 GPU 节点池上设置replicaCount 0且queuesgpu即可为 Phase 14 做工作负载分离worker 的 CPU/内存 limit2000m / 4Gi明显高于 api反映其承载模型训练类任务的定位。4.4 webReact 前端web: replicaCount: 2 image: repository: ghcr.io/pycaret/pycaret-web resources: requests: { cpu: 100m, memory: 128Mi } limits: { cpu: 200m, memory: 256Mi } service: { type: ClusterIP, port: 80 }web 组件资源占用最小256Mi limit它只是一个静态资源服务器通过环境变量PYCARET_API_BASE_URL指向 api 服务。4.5 postgres / externalPostgres元数据库Phase 3postgres: enabled: true # set false to bring your own (RDS, CloudSQL, …) image: { repository: postgres, tag: 16-alpine } persistence: { size: 20Gi, storageClass: } resources: requests: { cpu: 250m, memory: 512Mi } limits: { cpu: 1000m, memory: 2Gi } database: pycaret username: pycaret passwordSecretRef: { name: pycaret-postgres, key: password } externalPostgres: url: # postgresqlpsycopg://user:passhost:5432/db默认启用内置 PostgreSQL 16alpine20Gi 持久卷生产环境可设postgres.enabledfalse改用托管 RDS / CloudSQL并通过externalPostgres.url提供 SQLAlchemy 连接串postgresqlpsycopg://协议密码不写进 values而是从 Secretpycaret-postgreskey 为password读取。4.6 redis / externalRedisrun 队列与事件总线Phase 1 6redis: enabled: true image: { repository: redis, tag: 7-alpine } persistence: { size: 4Gi } resources: requests: { cpu: 100m, memory: 256Mi } limits: { cpu: 500m, memory: 1Gi } externalRedis: url: # redis://host:6379/0Redis 对应 Control Plane 的 run 队列worker 消费与事件流EventStream基础设施默认 4Gi 持久化同样支持enabledfalse时改用externalRedis.url如 ElastiCache。4.7 minio / externalS3对象存储Phase 2minio: enabled: true image: { repository: minio/minio, tag: latest } persistence: { size: 50Gi } rootUser: minioadmin rootPasswordSecretRef: { name: pycaret-minio, key: password } bucket: pycaret-artifacts externalS3: endpoint: bucket: region: us-east-1 credentialsSecretRef: { name: , keys: accessKey secretKey }内置 MinIO 用于存储训练工件50Giroot 用户默认minioadmin密码从 Secret 读取values 注释建议生产环境用 sealed-secret / external-secrets 覆盖externalS3支持对接真实 S3 或兼容存储凭据 Secret 需包含accessKey与secretKey两个 key。4.8 ingress 与 observabilityingress: enabled: true className: nginx annotations: cert-manager.io/cluster-issuer: letsencrypt-prod tls: { enabled: true, secretName: pycaret-tls } hostname: # defaults to global.domain observability: serviceMonitor: { enabled: false } podDisruptionBudget: { enabled: true, minAvailable: 1 }Ingress 默认使用 nginx 类 cert-manager 的letsencrypt-prodissuer 自动签发 TLS路由规则为domain/ → web、domain/api → api可观测性方面serviceMonitor默认关闭便于对接 Prometheus OperatorpodDisruptionBudget默认开启minAvailable: 1保证 api/worker 滚动时至少存活 1 副本。五、模板解析从 values 到 Kubernetes 资源5.1_helpers.tpl统一命名与连接串逻辑infra/helm/pycaret/templates/_helpers.tpl 是所有资源模板复用的工具层职责包括命名pycaret.fullname支持fullnameOverridetrunc 63 字符、pycaret.api.name/worker.name/web.name/postgres.name/redis.name/minio.name命名模式为release-chart-component标签pycaret.labels输出标准app.kubernetes.io/*标签集pycaret.selectorLabels供 Deployment/Service 的 selector 使用镜像pycaret.image实现组件 tag 未设置时回退到global.imageTag的逻辑default .Values.global.imageTag .image.tag连接串三件套pycaret.databaseUrl、pycaret.redisUrl、pycaret.s3Endpoint/pycaret.s3Bucket统一采用内置依赖启用则解析到集群内 Service否则取external*值的策略。例如 databaseUrl 内置时生成postgresqlpsycopg://pycaret:$(POSTGRES_PASSWORD)release-pycaret-postgres:5432/pycaret其中密码通过环境变量$(POSTGRES_PASSWORD)从 Secret 注入避免明文进连接串。5.2api-deployment.yaml启动命令、探针与密钥注入infra/helm/pycaret/templates/api-deployment.yaml 中值得注意的实现细节command: [pycaret-server, serve, --host, 0.0.0.0, --port, 8020]pycaret-serverCLI 是服务端入口定义在 services/api/pycaret_server/cli.py子命令包括init、serve、migrate、worker、doctor、version其中worker [--queues default,gpu] [--worker-id pyc-1]正是 worker 模板使用的命令。api 容器注入的核心环境变量环境变量来源PYCARET_DATABASE_URLpycaret.databaseUrlhelperPYCARET_REDIS_URLpycaret.redisUrlhelperPYCARET_STORAGE_ENDPOINT_URL/PYCARET_STORAGE_BUCKETS3 helperPYCARET_JWT_SECRETSecretpycaret-jwtkeysecretPYCARET_SECRETS_KEYSecretpycaret-encryptionkeykeyPOSTGRES_PASSWORD/PYCARET_STORAGE_ACCESS_KEY/PYCARET_STORAGE_SECRET_KEY仅当对应依赖启用时注入api.env自定义项values 中自由扩展探针配置livenessProbe访问/healthz初始延迟 15s、周期 30sreadinessProbe同样访问/healthz初始延迟 5s、周期 10s。/healthz是服务端统一健康检查端点与 compose.yml 中 api 的 healthcheck 口径一致http://127.0.0.1:8020/healthz。同文件后半段定义了 ClusterIP ServicetargetPort: http指向容器 8020 端口。5.3web-deployment.yaml单一环境变量web 模板非常简单容器只注入一个变量PYCARET_API_BASE_URL值为http://release-pycaret-api:api.port即通过集群内 DNS 直连 api 服务容器端口 8080Service 端口 80。5.4worker-deployment.yaml队列消费worker 以pycaret-server worker --queues values.worker.queues启动注入与 api 相同的数据库、Redis、存储连接串并硬编码PYCARET_RUNS_BACKENDredis、PYCARET_STORAGE_BACKENDminio与 values.yaml 中 api 的对应 env 保持一致。密钥注入与 api 同源复用api.encryptionKeyRef确保两组件能解密同一批加密凭据。5.5dependencies.yaml内置依赖的 StatefulSet 形态infra/helm/pycaret/templates/dependencies.yaml 用条件块把三个依赖都建模为单副本 StatefulSet Service各自带volumeClaimTemplates持久卷PostgreSQL注入POSTGRES_DB/POSTGRES_USER/POSTGRES_PASSWORD密码走secretKeyRef并设置PGDATA/var/lib/postgresql/data/pgdata避免子目录权限问题Redis启动命令为redis-server --save 60 1 --appendonly no每 60 秒且至少 1 次写时做 RDB 快照不启用 AOF兼顾开发场景的简单性与基本持久化MinIOargs: [server, /data, --console-address, :9001]Service 同时暴露 9000S3 API与 9001Web 控制台端口。三个依赖均支持通过enabledfalse整体关闭并回退到外部托管服务。README 中提到的 bitnami/postgresql、bitnami/redis、minio/minio 作为 chart 依赖子图是目标方案Dependencies on bitnami/postgresql bitnami/redis minio/minio charts so operators can bring their own or use bundled当前仓库中是以模板内嵌 StatefulSet 的方式实现的——两种形态并存安装时以实际发布的 chart 为准。六、安装方式与配置覆盖6.1 通过 chart 仓库安装README 目标形态helm repo add pycaret https://charts.pycaret.org helm install pycaret pycaret/pycaret --version 0.1.0 \ --set postgresql.enabledtrue \ --set redis.enabledtrue \ --set minio.enabledtrue注意示例中的依赖开关postgresql.enabled/redis.enabled/minio.enabled对应 README 规划的依赖子图形态而当前仓库 values 中实际使用的键是postgres.enabled/redis.enabled/minio.enabled。图表尚未发布到charts.pycaret.org因此现阶段更可行的路径是从源码目录直接安装helm install pycaret infra/helm/pycaret \ --set postgres.enabledtrue \ --set redis.enabledtrue \ --set minio.enabledtrue6.2 生产覆盖建议基于 values 注释设置global.domain为真实域名Ingress、JWT cookie、webhook URL 统一对齐预创建四个 Secretpycaret-jwtkeysecret、pycaret-encryptionkeykey、pycaret-postgreskeypassword、pycaret-miniokeypassword如需对接外部 S3再准备含accessKey/secretKey的凭据 Secret托管服务优先postgres.enabledfalseexternalPostgres.url、redis.enabledfalseexternalRedis.url、minio.enabledfalseexternalS3.*GPU 节点池worker 设replicaCount 0、queuesgpu大集群调整replicaCount与各组件resources。6.3 安装后的数据库迁移规划README 目标结构中包含job-migrate.yaml职责是helm install 时执行alembic upgrade head。该文件尚未实现但迁移能力在服务端已具备pycaret-server migrate [--url ...] [--revision head] [--reset-dev]见 cli.pyAlembic 迁移脚本位于 services/api/pycaret_server/migrations/versions/。在job-migrate.yaml落地前可手工执行pycaret-server migrate或等待 chart 后续版本补齐 init job。七、状态边界与演进路径最后需要明确当前仓库中 Helm 方案的成熟度边界已实现Chart 元数据、完整 values 参数体系、api/web/worker 三个 Deployment含 Service、探针、密钥注入、Ingress、三个内置依赖 StatefulSet以及全部命名/连接串 helper规划中README 声明、文件尚未出现values-dev.yaml、values-prod.yaml、configmap.yaml、secret.yaml、pvc.yaml、job-migrate.yaml、deployment-runtime.yaml按用户部署模板化的运行时资源目标参照CONTROL_PLANE_SPEC.md 第 18.4 节将 Enterprise KubernetesHelm chart manifests Terraform 容器镜像列为发行目标chart 版本0.1.0即对应这一阶段当前活跃方案仍是 Docker ComposeMVPdocker compose -f infra/docker/docker-compose.yml up --buildcompose.yml 注释明确生产化路径为SQLite 换成 Postgres、本地存储指向 S3与 Helm values 中的external*参数一一对应可作为向集群迁移时的配置映射参考。对于想要自托管 PyCaret Control Plane 的运维团队本文所解析的 chart 已覆盖单命名空间全栈部署的全部核心旋钮在job-migrate.yaml与依赖子图发布之前建议以源码目录安装 手工执行迁移的方式先行验证再随 chart 版本迭代切换到 chart 仓库发行模式。【免费下载链接】pycaretOpen-source, low-code AutoML platform for Python. PyCaret 4.0: sklearn-native engine React control plane.项目地址: https://gitcode.com/gh_mirrors/py/pycaret创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
