
ZenML Helm Chart 完整部署指南在 Kubernetes 上部署 ZenML Server【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml导读ZenML 是一个开源 MLOps 框架用于构建健壮、可维护、生产就绪的机器学习流水线。本指南基于仓库中的 helm/README.md 及其配套的 values.yaml、模板文件系统讲解如何使用官方 Helm Chart 在 Kubernetes 上快速部署 ZenML Server。读完本文你将掌握从 OCI 仓库一键安装 Chart、通过 Helm values 深度定制认证方案与数据库、配置自定义 CA 证书与 HTTP 代理、开启 OpenTelemetry 观测能力以及理解server:/zenml:键的向后兼容机制等全套实操技能。一、ZenML Helm Chart 概述ZenML 官方 Helm Chart 的目的非常明确把 ZenML Server 以标准 Kubernetes 工作负载的方式部署到任意集群中。它不是一个普通的样板 Chart而是围绕 ZenML Server 的生产化需求做了大量工程化设计。结合 helm/Chart.yaml 可以看到Chart 名称为zenml当前版本为0.96.3描述为 ZenML: MLOps for Reliable AI: from Classical AI to Agents。从 helm/README.md 归纳该 Chart 的核心能力包括轻松在 Kubernetes 上部署 ZenML Server一条helm install命令即可拉起完整的服务端包含 Deployment、Service、Ingress、Secret、数据库迁移 Job 等资源。多种认证方案支持NO_AUTH、HTTP_BASIC、OAUTH2_PASSWORD_BEARER默认、EXTERNAL四种认证模式。高度可配置通过 Helm values 可覆盖镜像、副本数、资源、Ingress、Gateway API、数据库、Secrets Store、日志、OpenTelemetry 等几乎所有维度。多后端 Secrets Store支持 SQL默认、AWS Secrets Manager、GCP Secrets Manager、Azure Key Vault、HashiCorp Vault 以及自定义实现并且还支持配置一个备份 Secrets Store用于高可用与迁移场景。Chart 目录下每个模板文件职责清晰从源码结构可以看出完整的工作负载布局见 helm/templates模板文件职责server-deployment.yamlZenML Server 主 Deployment运行 uvicorn 进程server-secret.yamlJWT 密钥、Pro 注册密钥、Secrets Store 凭据等敏感配置server-db-job.yaml/server-db-pvc.yaml数据库迁移 Job 及其 PVCcert-secret.yaml可选的自签 TLS 证书生成Ingress TLSserver-ingress.yaml/server-httproute.yamlIngress 与 Gateway API HTTPRoute 两种流量入口worker-deployments.yaml额外的后台 Worker 微服务部署_helpers.tpl/_environment.tplvalues 合并逻辑与容器环境变量渲染二、快速安装从 OCI 仓库部署 ZenML官方 Chart 发布在 Amazon ECR 的 OCI 仓库中推荐使用helm install直接从 OCI 仓库安装。以版本0.96.3为例# 示例命令版本 0.96.3 helm install my-zenml oci://public.ecr.aws/zenml/zenml --version 0.96.3注意事项需要确保 Helm 客户端已启用 OCI 支持Helm 3.8 默认支持需要先完成 Amazon ECR 的认证aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws这类流程安装后可查看 values.yaml 了解全部可配置项更完整的说明可参考 ZenML 官方文档的 Deploy with Helm 章节见 helm/README.md。安装完成后Chart 会默认创建一个以 uvicorn 方式运行zenml.zen_server.zen_server_api:app的 Server Deployment见 server-deployment.yaml监听0.0.0.0:8080一个类型为ClusterIP、端口 80 的 Service见 values.yaml默认启用 nginx 类别的 Ingress见 values.yaml。2.1 镜像与版本策略镜像相关配置位于server.imageserver: image: repository: zenmldocker/zenml-server pullPolicy: Always tag: # 不设置时默认使用 Chart 版本作为镜像 tag从 server-deployment.yaml 可以看到镜像 tag 的默认值取.Chart.Version即 0.96.3保证 Chart 与镜像版本天然对齐。imagePullSecrets可配置私有仓库凭据见 values.yaml。三、Server 核心配置解析3.1 性能与并发调优server段下的线程池与超时配置直接影响服务在高并发下的表现默认值注释在 values.yaml 中server: replicaCount: 1 # 副本数配置了 database.url 且未启用 autoscaling 时才生效见 server-deployment.yaml # threadPoolSize: 40 # 每个 Pod 处理并发请求的工作线程数默认 40 # authThreadPoolSize: 5 # 并发处理认证请求的线程数默认 5 # requestTimeout: 20 # 请求超时秒超时返回 429默认 30 # requestDeduplication: true # POST 请求缓存去重保证幂等性默认 true # requestCacheTimeout: 300 # 缓存请求结果的过期时间秒默认 300调优要点源自 values.yaml 的注释threadPoolSize与authThreadPoolSize必须和数据库连接池协调poolSize maxOverflow threadPoolSize authThreadPoolSize否则工作线程会因拿不到数据库连接而阻塞requestTimeout应低于客户端 HTTP 超时客户端默认 30 秒避免客户端先超时、服务端后超时的错位requestDeduplication默认开启用于对重试的 POST 请求做幂等去重官方注释明确警告不要轻易关闭。3.2 认证Authentication认证是生产部署的关键。默认采用OAUTH2_PASSWORD_BEARER方案可通过server.auth.authType切换见 values.yamlserver: auth: authType: OAUTH2_PASSWORD_BEARER # NO_AUTH / HTTP_BASIC / OAUTH2_PASSWORD_BEARER / EXTERNAL jwtSecretKey: # JWT 签名密钥建议 32 字符随机串 jwtTokenAlgorithm: HS256 # HS256 / HS384 / HS512 jwtTokenIssuer: # 不设置时默认为 ZenML Server ID jwtTokenAudience: # 不设置时默认为 ZenML Server ID jwtTokenLeewaySeconds: 10 # JWT 过期校验的宽限秒数 jwtTokenExpireMinutes: # JWT 过期时间分钟不设置则永不过期 authCookieName: # Web 客户端 JWT Cookie 名默认由 Server ID 计算 authCookieDomain: # Cookie 域名默认取 Server 域名 corsAllowOrigins: [*] # 允许的跨域来源 maxFailedDeviceAuthAttempts: 3 # OAuth2 设备认证最大失败次数 deviceAuthTimeout: 300 # 设备授权请求过期时间秒 deviceAuthPollingInterval: 5 # 设备授权轮询间隔秒 deviceExpirationMinutes: # OAuth2 设备可用时长分钟 trustedDeviceExpirationMinutes: # 受信任设备可用时长分钟 externalLoginURL: # EXTERNAL 方案的外部登录 URL externalUserInfoURL: # EXTERNAL 方案的外部用户信息 URL externalServerID: # EXTERNAL 方案的 Server UUIDJWT 密钥的生成建议来自 values.yaml 注释openssl rand -hex 32或使用 Pythonfrom secrets import token_hex token_hex(32)重要的实现细节如果你不显式设置jwtSecretKeyChart 在安装时会自动生成随机密钥并在后续升级时复用见 server-secret.yaml。这意味着你无需在 values 里硬编码密钥也能保持多轮helm upgrade之间 token 有效。EXTERNAL认证方案需要同时配置externalLoginURL与externalUserInfoURL并可通过externalServerID指定独立的 Server UUID。此外rbacImplementationSource和featureGateImplementationSource允许注入实现 ZenML RBAC 接口与特性开关接口的类参考 values.yaml。3.3 安全加固Secure Headers 与 Uvicorn 代理头Chart 内置了一套 HTTP 安全响应头配置见 values.yaml每个头支持enabled/disabled/ 自定义值三种写法server: secure_headers: server: enabled # Server 头默认值为 ZenML Server ID hsts: enabled # Strict-Transport-Security: max-age63072000; includeSubDomains xfo: enabled # X-Frame-Options: SAMEORIGIN content: enabled # X-Content-Type-Options: nosniff csp: enabled # Content-Security-Policy严格策略不建议自定义以免 Dashboard 异常 referrer: enabled # Referrer-Policy: no-referrer-when-downgrade cache: enabled # Cache-Control: no-store, no-cache, must-revalidate permissions: enabled # Permissions-Policy 默认禁用了摄像头、麦克风等能力关于 Uvicorn 代理头Chart 默认关闭proxyHeaders见 values.yaml以避免盲目信任客户端伪造的X-Forwarded-*头绕过基于 IP 的登录限流。启用时需要满足两个安全前提之一将forwardedAllowIPs设置为可信代理 IP/CIDR 的严格列表确保 Ingress/Gateway 会在转发前清洗或覆盖X-Forwarded-*头。对应的 uvicorn 启动参数--proxy-headers/--no-proxy-headers/--forwarded-allow-ips由 server-deployment.yaml 渲染。3.4 访问入口URL、Ingress 与 Gateway APIserver: serverURL: # API 对外可达 URL未设置时客户端使用连接它的 URLZenML Pro 必填 dashboardURL: # Dashboard URL默认复用 serverURLWeb 登录流程会用到 rootUrlPath: # 反代路径前缀配合 ingress rewrite-target 使用 defaultProject: default # 默认项目名 ingress: enabled: true className: nginx annotations: {} # 例如 ssl-redirect、rewrite-target、cert-manager issuer 等 host: # 域名可使用 nip.io 泛域名如 zenml.192.168.0.1.nip.io path: / tls: enabled: false generateCerts: false # 开启后安装时自动生成自签证书 secretName: zenml-tls-certs gateway: # Gateway API 替代方案与 ingress 二选一 enabled: false gatewayRef: { name: , namespace: } sectionName: # 指向 Gateway 的 HTTPS listener 名称如 https host: path: /Ingress 部署提示源自 values.yaml可以使用nip.io这类服务为 Ingress IP 提供通配符 DNS例如 Ingress IP 是192.168.0.1则主机名可写为zenml.192.168.0.1.nip.io从而复用同一 Ingress 承载多个部署。Gateway API 说明见 values.yamlTLS 终止在 Gateway 资源上配置而非 HTTPRoute。Chart 只创建 HTTPRoute因此开启 HTTPS 需要先在 Gateway 上配置带certificateRef的 HTTPS listener再把sectionName设为该 listener 的名字。server-httproute.yaml模板即负责渲染此路由。rootUrlPath的典型用法是配合 Ingress 的rewrite-target注解server: rootUrlPath: /zenml ingress: enabled: true className: nginx annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 host: example.com path: /zenml/?(.*)四、数据库与数据持久化4.1 默认行为与 SQLite 持久化未配置database.url时ZenML Server 使用本地 SQLite 数据库。为了不让 Pod 重启丢失数据可以开启server.database.persistenceserver: database: persistence: enabled: true size: 10Gi # storageClassName: # 可选不指定则使用默认 StorageClass # podSecurityContext.fsGroup 默认设为 1000 # 这保证了容器可以写入持久卷关键前提fsGroup: 1000默认值不能丢。ZenML 容器以 UID 1000 运行如果覆盖podSecurityContext而没有设置fsGroup: 1000PVC 会以 root:root 属主挂载导致权限错误、容器无法写入持久卷而崩溃见 helm/README.md 与 values.yaml。默认值还包括fsGroupChangePolicy: OnRootMismatch仅在卷属主与 fsGroup 不匹配时才变更属主减少挂载开销。4.2 使用外部 MySQL配置外部数据库时URL 可以内嵌密码也可以通过 Secret 引用提供见 values.yamlserver: database: url: mysql://admin:passwordzenml-mysql:3306/database passwordSecretRef: name: mysql-credentials # 可选替代 URL 中的密码 key: password ssl: false # 开启任一 SSL 证书选项会自动置为 true sslCa: value: | # 或使用 secretRef 引用 -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- sslCert: {} # 客户端证书value 或 secretRef sslKey: {} # 客户端私钥value 或 secretRef sslVerifyServerCert: false # 是否校验服务端证书 # poolSize: 20 # MySQL 连接池需与线程池协调 # maxOverflow: 20注意MySQL SSL 证书文件若以 value 形式提供需要将其放入 Helm Chart 目录且路径相对于 Chart 根目录见 values.yaml。使用 Secret 引用时模板会通过 projected volume 挂载到/dbcerts见 server-deployment.yaml。4.3 数据库迁移前的备份与恢复策略ZenML 支持在数据库迁移前自动备份、迁移失败时自动恢复。可在server.database下配置backupStrategy见 values.yaml可选值策略说明in-memory将 schema 与数据存于内存最快但不跨 Pod 重启持久化默认策略大库需分配足够内存dump-file将数据库 dump 到本地文件可配合backupPVStorageSize/backupPVStorageClass配置持久卷未配置时存入 emptyDir不持久database在同一数据库服务器复制出备份库仅 MySQL 兼容库需设置backupDatabase且 URL 用户需有建库/删库/改库权限mydumper使用 mydumper/myloader 备份可用mydumperThreads、mydumperCompress、mydumperExtraArgs、myloaderThreads、myloaderExtraArgs调优custom自定义备份引擎需实现zenml.zen_stores.migrations.backup.base_backup_engine.BaseBackupEngine通过customBackupEngine与customBackupEngineConfig配置使用 dump-file 策略并配合持久卷时同样需要保证podSecurityContext.fsGroup设置正确否则容器无法写入备份卷。五、Secrets Store 与密钥管理5.1 主 Secrets Storeserver.secretsStore用于集中存储 ZenML secrets见 values.yaml支持sql、aws、gcp、azure、hashicorp、custom六种类型默认sqlserver: secretsStore: enabled: true type: sql sql: encryptionKey: # SQL secrets 加密密钥建议 32 字符随机串SQL 加密密钥警告源自 values.yaml配置加密后必须妥善保存该密钥——它是解密数据库中 secrets 的唯一凭证丢失将无法解密、只能重置 secrets且配置加密后不要随意更改该值。同样的要求适用于backupSecretsStore.sql.encryptionKey。云厂商 Secrets Store 均基于 ZenML Service Connector 认证AWStype: aws支持implicit、secret-key默认、iam-role、session-token、federation-token等认证方式authConfig中region必填secret-key等方式需要aws_access_key_id/aws_secret_access_keyiam-role需要role_arn。可通过zenml service-connector describe-type aws查询支持的方法。GCPtype: gcp支持implicit、user-account、service-account默认、impersonation、external-account备份 store 额外支持认证authConfig中project_id必填service-account/impersonation需要service_account_jsonimpersonation需target_principal。Azuretype: azure支持implicit、service-principal默认service-principal需要client_id/client_secret/tenant_id三者齐全且必须设置key_vault_name。HashiCorp Vaulttype: hashicorp支持token默认、app_role、aws认证authConfig中vault_addr必填vault_namespace仅 Vault Enterprise 需要app_role需要app_role_id/app_secret_idtoken需要vault_tokenmax_versions控制保留的 secret 版本数默认 1。customclass_path指向继承zenml.zen_stores.secrets_stores.base_secrets_store.BaseSecretsStore的实现类额外配置通过ZENML_SECRETS_STORE_OPTION_NAME环境变量约定注入见 values.yaml。5.2 备份 Secrets Storeserver.backupSecretsStore作为主 Secrets Store 的备份见 values.yaml新创建与更新的 secret 值也会同步写入备份 store并提供管理命令在主备之间单向或批量迁移。它适用于高可用、灾难恢复以及从一种 Secrets Store 向另一种迁移的临时过渡场景。配置结构与主 store 完全对称同样支持 sql/aws/gcp/azure/hashicorp/custom只是默认enabled: false。六、自定义 CA 证书Custom CA Certificates当 ZenML Server 需要通过 HTTPS 连接使用自定义 CA如自签名证书签发的服务时可以注入自定义 CA 证书。Chart 提供两种方式见 helm/README.md 与 values.yaml方式一直接在 values.yaml 中注入 PEM 证书server: certificates: customCAs: - name: my-custom-ca certificate: | -----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV ... -----END CERTIFICATE-----方式二引用集群中已有的 Kubernetes Secretserver: certificates: secretRefs: - name: my-secret key: ca.crt底层实现见 server-deployment.yaml当配置了customCAs或secretRefs时Chart 会注入一个update-ca-certificatesinitContainer复制系统 CA 包/etc/ssl/certs/ca-certificates.crt将/custom-certs目录下所有.crt文件来自 projected volume见 server-deployment.yaml逐个追加到系统 CA 包之后合并后的 CA 包挂载到主容器的/updated-certs目录。Worker Deployment 也共享同样的 initContainer 逻辑见 worker-deployments.yaml保证后台 Worker 与 Server 拥有相同的信任链。七、HTTP 代理配置在需要代理访问外部网络的环境中通过server.proxy配置见 helm/README.md 与 values.yamlserver: proxy: enabled: true httpProxy: http://proxy.example.com:8080 httpsProxy: http://proxy.example.com:8080 # 额外需要排除代理的主机名/域名/IP/CIDR additionalNoProxy: - internal.example.com - 10.0.0.0/8默认排除列表noProxy默认值见 values.yamllocalhost、127.0.0.1、::1IPv4/IPv6 本地回环fe80::/10IPv6 链路本地地址.svc与.svc.cluster.localKubernetes 服务 DNS 域若配置了server.serverURL其主机名也会被追加若配置了server.ingress.host或server.gateway.host对应主机名也会被追加组件间通信的内部服务名。上述默认排除项的追加逻辑在 _helpers.tpl 的zenml.noProxyList模板中实现它会解析serverURL、Ingress host、Gateway host并自动补充release-dashboard等服务名到 NO_PROXY 列表。NO_PROXY环境变量支持的语法来自 helm/README.md主机名如zenml.example.com带前导点的域名通配如.example.comIPv4 地址如10.0.0.1IPv4 CIDR如10.0.0.0/8IPv6 地址如::1IPv6 CIDR如fe80::/10八、日志与 OpenTelemetry 观测8.1 日志配置通过server.logging控制 Server 容器日志见 helm/README.md 与 values.yamlserver: logging: verbosity: info # debug, info, warning, error, critical format: console # console, json, 或自定义 %-style 格式串 colorsDisabled: false # 关闭控制台日志 ANSI 颜色verbosity设置 ZenML Server 日志级别。旧的server.debug选项仍兼容为true时强制日志级别为debug但新部署应改用logging.verbosityformat支持console、json或合法的 Python%-style 格式串如%(levelname)s:%(name)s:%(message)s。旧的ZENML_LOGGING_FORMAT环境变量仍可通过server.environment作为已弃用别名使用未来版本将移除底层渲染位于 _environment.tpldebug对应ZENML_LOGGING_VERBOSITY: DEBUG其余取值统一大写后写入ZENML_LOGGING_VERBOSITY默认INFO。8.2 OpenTelemetry 导出ZenML Server 原生支持通过 OTLP/HTTP 协议导出 traces、metrics、logs 三类遥测信号见 helm/README.md 与 values.yamlserver: openTelemetry: endpoint: http://otel-collector:4318 # 基础 OTLP/HTTP Collector 端点 serviceName: zenml-server # 遥测数据中的服务名 tracesEndpoint: # 可选单独的 traces 端点 metricsEndpoint: # 可选单独的 metrics 端点 logsEndpoint: # 可选单独的 logs 端点 tracesEnabled: true # 各信号默认开启 metricsEnabled: true logsEnabled: true导出行为规则源自 helm/README.md当配置了endpoint或任一 per-signal 端点时导出即被启用可通过tracesEndpoint/metricsEndpoint/logsEndpoint单独指定各信号端点若未配置基础endpoint则只有配置了 per-signal 端点的信号才会被导出若配置了基础endpoint未指定 per-signal 端点的信号会通过拼接/v1/traces、/v1/metrics、/v1/logs路径导出每个信号默认启用可用tracesEnabled/metricsEnabled/logsEnabled单独关闭也可以通过只设置某个信号的 per-signal 端点来仅启用该信号serviceName未设置时使用 Server 的默认服务名。进阶配置对于 Chart 未建模的标准 OpenTelemetry 变量如OTEL_EXPORTER_OTLP_HEADERS、OTEL_EXPORTER_OTLP_TIMEOUT、OTEL_EXPORTER_OTLP_COMPRESSION可通过server.environment传入。注意由于 Server 直接配置了 OTLP/HTTP 导出器OTLP/gRPC 协议相关变量不被支持。这些标准变量最终由 OpenTelemetry Python 导出器处理相关变量清单可查阅 OpenTelemetry 官方 SDK 配置文档。九、环境变量、Secret 注入与 Worker 部署9.1 环境变量注入三通道server段提供三种环境变量注入方式见 values.yamlserver: environment: {} # 普通环境变量明文写入 Deployment secretEnvironment: {} # 敏感环境变量存为 K8s Secret 再注入 environmentSecretKeyRefs: # 直接引用集群中已有的 Secret - name: MY_API_KEY secretName: my-existing-secret secretKey: api-key - name: DB_PASSWORD secretName: db-credentials secretKey: password其中secretEnvironment会进入 server-secret.yaml 渲染的 Secret 中通过zenml.storeSecretEnvVariables等模板合并并以valueFrom.secretKeyRef形式注入容器。Server 与 Worker Deployment 都会通过 checksum 注解如checksum/secret、checksum/worker-secret见 worker-deployments.yaml在 Secret 变更时自动滚动重启。9.2 ZenML Pro 模式server.pro用于部署 ZenML Pro Server见 values.yamlserver: pro: enabled: false apiURL: https://cloudapi.zenml.io # Pro API 地址 dashboardURL: https://cloud.zenml.io # Pro Dashboard 地址 extraCorsOrigins: # 额外的 CORS 允许来源 workspaceID: # Pro 工作区 ID workspaceName: # Pro 工作区名称 organizationID: # Pro 组织 ID organizationName: # Pro 组织名称 enrollmentKey: # 注册密钥不设置则自动生成 enrollmentKeySecretRef: # 引用已有 Secret 中的注册密钥 # name: # key:注意两个校验规则见 server-secret.yamlenrollmentKeySecretRef必须同时提供name与keyenrollmentKey与enrollmentKeySecretRef不能同时配置。启用 Pro 时Chart 会自动生成ZENML_SERVER_PRO_OAUTH2_CLIENT_SECRET64 位随机串并在升级时复用。同时serverURL对 Pro 模式是必填的。9.3 Worker DeploymentsChart 支持为后台任务如调度器循环、Job 轮询部署额外的自定义微服务见 values.yaml 与 worker-deployments.yaml。每个 Worker 是一个独立的 Kubernetes Deployment共享 Server 的环境变量、CA 证书与数据库访问配置但不暴露任何端点不创建 Service/IngressworkerDeployments: background-task: enabled: true image: repository: image-repository tag: image-tag replicaCount: 1 command: [python] args: [-m, task] strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 ports: - name: http containerPort: 8080 protocol: TCP resources: requests: cpu: 100m memory: 256Mi limits: cpu: 500m memory: 512Mi environment: {} secretEnvironment: {} livenessProbe: exec: command: [python, -c, import sys; sys.exit(0)] initialDelaySeconds: 30 periodSeconds: 60 readinessProbe: exec: command: [python, -c, import sys; sys.exit(0)] initialDelaySeconds: 10 periodSeconds: 30 autoscaling: enabled: false minReplicas: 1 maxReplicas: 5 targetCPUUtilizationPercentage: 80 targetMemoryUtilizationPercentage: 80 nodeSelector: {} tolerations: [] affinity: {}Worker 以map形式配置key 即 Worker 名称每个 Worker 支持独立的镜像、副本数、启动命令、更新策略、探针与自动扩缩容。其 CA 证书 initContainer 与 Server 完全一致见 worker-deployments.yaml。十、资源、伸缩与调度10.1 资源请求与安全上下文podSecurityContext: fsGroup: 1000 # 使用持久卷时必设默认值勿删 fsGroupChangePolicy: OnRootMismatch securityContext: runAsNonRoot: true # 以非 root 运行 runAsUser: 1000 resources: {} # 建议显式配置 limits/requests resourcesMigrationPod: {} # 数据库迁移 Pod 的独立资源不设置则回退到 resources10.2 水平自动扩缩容HPAautoscaling: enabled: false minReplicas: 1 maxReplicas: 100 targetCPUUtilizationPercentage: 80 # targetMemoryUtilizationPercentage: 80注意 server-deployment.yaml 中的细节当配置了database.url且未启用 autoscaling 时replicaCount生效未配置外部数据库SQLite时强制replicas: 1本地 SQLite 无法被多副本安全共享启用 autoscaling 时由 HPA 接管副本数。10.3 调度与亲和性nodeSelector: {} tolerations: [] affinity: {} imagePullSecrets: [] serviceAccount: create: true annotations: {} name: zenmlserver.instanceLabel可用于自定义app.kubernetes.io/instance标签默认取 Release 名见 _helpers.tpl在多部署共享同一 Release 名的集群中避免冲突并可配合亲和性规则使用。Service 默认ClusterIP类型、端口 80见 values.yaml。十一、向后兼容zenml:键到server:键的迁移顶层 values 键zenml:已重命名为server:见 helm/README.md。为了保证旧部署平滑升级Chart 对两个键做了深度合并使用zenml:的旧 values 文件继续有效Chart 会同时深度合并两个键官方建议只使用其中一个键若同时提供重叠键以zenml:为准旧键优先zenml:键已弃用将在未来版本中移除。底层合并逻辑位于 _helpers.tpl 的zenml.serverValues模板{{- define zenml.serverValues -}} {{- $server : deepCopy (.Values.server | default dict) -}} {{- $legacy : deepCopy (.Values.zenml | default dict) -}} {{- mustMergeOverwrite $server $legacy | toYaml -}} {{- end -}}模板选择mustMergeOverwrite而非普通merge的原因见 _helpers.tpl 注释Go 的mergo.Merge会把零值false、0、当作空而静默丢弃mustMergeOverwrite则能保留这些显式设置的零值。所有模板Deployment、Secret、Ingress、Worker 等都通过include zenml.serverValues . | fromYaml获取合并后的配置保证新老键在全 Chart 范围内行为一致。十二、遥测与隐私ZenML Server 会收集匿名的使用数据以帮助改进产品见 helm/README.md。可以通过以下配置退出遥测server: analyticsOptIn: falseserver.deploymentType如local、kubernetes、aws、gcp、azure也用于遥测目的可按实际部署环境设置。十三、常见问题与生产实践清单13.1 排查要点Pod 崩溃且使用持久卷优先检查podSecurityContext.fsGroup是否为1000。缺省会直接导致容器无法写 PVC见 helm/README.md。升级后 JWT 失效只要未显式配置jwtSecretKeyChart 会在升级时复用既有 Secret 中的密钥见 server-secret.yaml若手动覆盖了密钥则所有已签发 token 会失效。数据库连接被阻塞检查线程池与 MySQL 连接池是否满足poolSize maxOverflow threadPoolSize authThreadPoolSize见 values.yaml。请求返回 429requestTimeout低于客户端 HTTP 超时时会先于客户端超时返回 429这是预期的服务端保护行为。Ingress TLS 证书启用ingress.tls.generateCerts会在安装时生成自签证书且仅当 Ingress host 变化时才重新生成见 cert-secret.yaml 中基于zenml.certs/subject-name注解的幂等判断。13.2 生产部署建议务必配置外部 MySQL并开启database.persistenceSQLite 仅适合单副本测试环境设置强随机密钥auth.jwtSecretKey与secretsStore.sql.encryptionKey建议使用openssl rand -hex 32生成并妥善保管根据流量规划 HPAautoscaling.enabled配合 CPU/内存阈值显式配置资源 limits/requests避免无限制使用集群资源按需开启 OpenTelemetry并配合 Collector 接收 traces/metrics/logs评估备份 Secrets Store用于高可用与从旧 store 向新 store 迁移企业级合规如需自定义安全响应头、关闭遥测、注入自定义 CA分别对应secure_headers、analyticsOptIn、certificates配置项。结语ZenML Helm Chart 将 ZenML Server 的生产部署收敛为一条helm install命令 一份高度可读的 values 文件同时在认证、数据库、Secrets Store、CA 证书、代理、观测性等生产关键维度上提供了完整的配置入口。本文涉及的默认值与行为均以仓库当前版本Chart 0.96.3为准完整参数清单请以 values.yaml 为权威参考结合 helm/templates 下的模板源码可以进一步确认每一项配置在 Deployment、Secret、Ingress、Worker 等资源上的实际落地方式。【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考