
云原生容器编排【免费下载链接】chartsBitnami Helm Charts项目地址https://gitcode.com/GitHub_Trending/charts30/charts点击查看免费下载DeepSpeed 是微软推出的深度学习训练套件专为 ChatGPT 类大语言模型的训练与推理场景设计支持稠密/稀疏模型推理、高吞吐与高压缩率。本指南围绕当前仓库中的 Bitnami DeepSpeed Helm Chartbitnami/deepspeed/README.md展开完整讲解如何借助该 Chart 在 Kubernetes 集群上搭建由 client 节点与 worker 节点组成的分布式训练环境包括三种加载训练代码的方式、hostfile/SSH 配置原理、参数体系、持久化与安全加固。读完本文你将掌握从一条命令安装到生产级参数调优、再到排障升级的完整实战能力。Chart 概览与架构Bitnami DeepSpeed Chart 将 DeepSpeed 训练环境抽象为两类工作负载二者通过 SSH 组网client 节点默认以 Deployment 形式部署client.enabledtrue它是任务的发起方——加载项目源码、维护 hostfile 与 SSH 客户端配置并最终执行 DeepSpeed 训练命令。也可以切换为 Kubernetes Job 运行一次性任务。worker 节点默认以 StatefulSet 形式部署worker.enabledtruereplicaCount3每个 worker 运行一个 sshd 服务默认端口2222充当分布式训练的计算资源池。两类 Pod 的完整编排定义分别位于 templates/client/client-dep-job.yaml 与 templates/worker/worker-statefulset.yaml。从模板可以看出client 与 worker 均挂载了source卷代码目录挂载到/app、hostfile/ssh 配置卷以及data数据卷默认路径/bitnami/deepspeed/data。Chart 元数据bitnami/deepspeed/Chart.yaml显示当前appVersion为0.17.5默认镜像为docker.io/bitnami/deepspeed:0.17.5-debian-12-r0并依赖bitnami/common2.x.x提供通用的标签、资源预设、亲和性等辅助模板。前置条件在安装前需确认环境满足以下要求Kubernetes 1.23Helm 3.8.0底层基础设施提供 PV provisioner 支持用于持久化数据卷安装与卸载一键安装使用 Helm 直接从 OCI 仓库安装 Chartrelease 名设为my-releasehelm install my-release oci://registry-1.docker.io/bitnamicharts/deepspeed如果使用的是其他 Chart 仓库需替换占位符REGISTRY_NAME与REPOSITORY_NAME例如 Bitnami 官方对应REGISTRY_NAMEregistry-1.docker.io、REPOSITORY_NAMEbitnamichartshelm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/deepspeed常用辅助命令helm list # 查看已安装的 release helm delete my-release # 卸载 releasehelm delete会移除该 Chart 关联的所有 Kubernetes 组件并删除 release。注意按 Helm 语义StatefulSet 对应的 PVC 是否保留取决于持久化配置删除前请确认数据策略。通过参数定制安装Chart 的所有参数都可通过--set覆盖例如将 worker 副本数调整为 4helm install my-release \ --set worker.replicaCount4 \ oci://REGISTRY_NAME/REPOSITORY_NAME/deepspeed上面的命令会创建 4 个 DeepSpeed worker Pod。更推荐的方式是编写 values 文件并整体传入helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/deepspeed默认的完整配置可参考仓库中的 bitnami/deepspeed/values.yaml其结构即各参数章节的权威来源。加载训练代码的三种方式Chart 支持三种向 client/worker 提供项目文件的方式按优先级依次为使用已存在的 ConfigMapsource.existingConfigMap在 values.yaml 中直接定义文件source.configMap克隆 Git 仓库source.typegit优先级规则意味着如果指定了source.existingConfigMap则不会再检查source.configMap与 Git 仓库。该逻辑在 _helpers.tpl 中的deepspeed.v0.source.configMapName与deepspeed.v0.source.createConfigMap两个模板定义里得到印证只有当client.enabled、source.typeconfigmap、source.configMap非空且未设置existingConfigMap时才自动生成源码 ConfigMap而 templates/client/source-configmap.yaml 会把这些文件渲染为一个fullname-sourceConfigMap。方式一使用现有 ConfigMapsource: existingConfigMap: my-config-map方式二在 values.yaml 内联定义文件source: type: configmap configMap: train.py: | #!/usr/bin/env python # 你的训练脚本内容 import deepspeed ... ds_config.json: | { train_batch_size: 32, ... }方式三克隆 Git 仓库helm install my-release \ --set source.typegit \ --set source.git.repositoryhttps://github.com/my-user/oci://REGISTRY_NAME/REPOSITORY_NAME \ --set source.git.revisionmaster \ oci://REGISTRY_NAME/REPOSITORY_NAME/deepspeed当source.typegit时Chart 会通过deespeed.git.cloneInitContainer模板见 templates/_helpers.tpl在 client 与 worker Pod 中注入git-clone-repositoryinit 容器其核心逻辑为清理/app/*后执行git clone repository --branch revision /app。若仓库需要 SSH 认证还可通过source.git.extraVolumeMounts挂载私钥目录例如mountPath: /.ssh/。无论采用哪种方式代码都会挂载到 client 与 worker 的/app目录保证分布式环境下各节点看到一致的源码。这也解释了 worker-statefulset.yaml 中source卷同时支持 ConfigMap 或 emptyDir 两种来源的原因。启动命令配置source.launchCommand用于指定要执行的 deepspeed 命令例如source: launchCommand: deepspeed --num_gpus1 train.py --deepspeed ds_config.json从 client-dep-job.yaml 的容器 args 模板可见其执行逻辑若存在/opt/bitnami/scripts/deepspeed/entrypoint.sh则先 source 它随后渲染launchCommand若以 Deployment 形式运行且未指定命令则以sleep infinity保持容器存活方便kubectl exec进入容器手动操作。注意模板内置了值校验deepspeed.v0.validateValues.job位于 templates/_helpers.tpl——若client.useJobtrue但既未设置source.launchCommand也未设置client.args渲染会直接失败并提示 no-job-command。以 Job 方式运行一次性训练任务默认情况下 client 容器以 Deployment 部署便于通过kubectl exec进入容器执行各类操作。如果希望把训练作为一次性任务运行只需设置client: useJob: true backoffLimit: 10 # Job 失败重试上限默认 10设置client.useJobtrue后client-dep-job.yaml 会通过ternary函数将资源类型由apps/v1/Deployment切换为batch/v1/Jobspec.backoffLimit取自client.backoffLimit。此时容器 args 中不再注入sleep infinity任务完成后 Job 即结束。client 与 worker 的 SSH 组网原理分布式训练依赖 client 通过 SSH 免密登录所有 worker。Chart 在后台自动处理了这套复杂的 SSH 编排密钥生成若未指定config.existingSSHKeySecrettemplates/ssh-keys-secret.yaml 会使用 Helm 内置的genPrivateKey rsa生成 RSA 私钥并以fullname-ssh-keySecret 保存同时支持通过config.sshPrivateKey显式提供私钥。client 端 init 容器deepspeed.v0.ssh.clientInitContainer复制/etc/ssh/ssh_config并兼容旧版 OpenSSH无ssh_config.d目录时追加 Include 指令见 templates/_helpers.tpl。worker 端 init 容器deepspeed.v0.ssh.serverInitContainer利用 client 私钥生成公钥并写入/home/deepspeed/.ssh/authorized_keys同时把容器内的PATH、LD_LIBRARY_PATH、C_INCLUDE_PATH等环境变量写入.ssh/environment配合 sshd 的PermitUserEnvironment yes确保 SSH 会话继承训练所需环境。等待 worker 就绪client 额外注入wait-for-workersinit 容器依次对每个 worker 执行ssh worker-host echo OK全部连通后才启动主容器对应模板deepspeed.v0.client.waitForWorkers。hostfile 生成templates/client/hostfile-configmap.yaml 渲染defaultHostFile内容按 worker 数量与 headless 服务名生成格式为worker-i.worker-headless slotsslotsPerNode。hostfile 与 SSH 配置参数参数说明默认值config.defaultHostFile默认生成的 hostfile仅在明确知晓后果时修改按worker.replicaCount、slotsPerNode自动渲染config.overrideHostFile用此值覆盖默认 hostfileconfig.existingHostFileConfigMap提供 hostfile 的 ConfigMap 名称config.defaultSSHClientclient 节点默认 SSH 客户端配置为每个 worker 生成 Host 条目、SSH 端口与私钥路径config.overrideSSHClient覆盖默认 SSH 客户端配置config.existingSSHClientConfigMap提供 SSH 客户端配置的 ConfigMapconfig.defaultSSHServerworker 节点默认 sshd 服务端配置Port ssh; PasswordAuthentication no; UsePAM no; PermitUserEnvironment yesconfig.overrideSSHServer覆盖默认 sshd 服务端配置config.existingSSHServerConfigMap提供 sshd 配置的 ConfigMapconfig.sshPrivateKeyclient 连接 worker 使用的私钥config.existingSSHKeySecret保存 SSH 私钥的 Secret 名称worker 主容器以exec $SSHD_PATH -D -h /bitnami/ssh/server-private-key/ssh_host_rsa_key -e前台运行 sshd见 worker-statefulset.yaml其 liveness 探针执行pgrep -f sshdreadiness 探针探测tcp-ssh端口2222连通性。由于 client 关闭了主机密钥校验StrictHostKeyChecking noworker 的主机密钥由 init 容器用ssh-keygen -A自动生成无需人工干预。分布式规模与流量暴露worker 副本与 slotsworker: replicaCount: 3 # worker 节点数量 slotsPerNode: 1 # 每个 worker 可提供的训练槽位数常对应 GPU 卡数slotsPerNode会直接体现到 hostfile 的slots字段中是 DeepSpeed 分配计算资源的依据。此外 worker StatefulSet 默认podManagementPolicy: Parallel——从 values.yaml 与 worker-statefulset.yaml 均可看到——以保证所有 worker 能同时启动、并行完成 SSH 组网。worker 外部访问worker.externalAccess可为每个 worker 节点单独创建 Service便于外部直接 SSH 到各 worker参数说明默认值worker.externalAccess.enabled是否为每个 worker 创建独立 Servicefalseworker.externalAccess.service.typeService 类型ClusterIPworker.externalAccess.service.ports.ssh对外暴露的 SSH 端口22worker.externalAccess.service.nodePortsNodePort 模式下每节点的 nodePort长度需与 replicaCount 一致[]worker.externalAccess.service.loadBalancerIPs各 worker 的 LoadBalancer IP长度需与 replicaCount 一致[]worker.externalAccess.service.externalIPsNodePort 模式下的外部 IP 列表[]worker.externalAccess.service.externalTrafficPolicy外部流量策略Clusterworker.externalAccess.service.sessionAffinity会话亲和策略ClientIP或NoneNoneworker.externalAccess.service.extraPorts额外暴露的端口[]资源请求、限制与预设生产环境必须为所有容器设置资源 requests/limits位于各组件client、worker的resources值下。为简化配置Chart 提供resourcesPreset预设允许值none、nano、micro、small、medium、large、xlarge、2xlarge预设定义在依赖的bitnami/commonChart 的common.resources.preset模板中。其优先级规则为resources一旦显式设置即生效resourcesPreset被忽略resourcesPresetnone时不设置资源。client: resources: requests: cpu: 2 memory: 512Mi limits: cpu: 3 memory: 1024Mi worker: resourcesPreset: large # 或直接使用 resources 精确定制注意resourcesPreset仅适合快速起步生产环境官方推荐使用resources按实际负载精确配置2.0.0 版本起默认预设由none调整为可运行测试的最小规格详见下文升级说明。持久化与数据目录权限镜像默认将数据写入/bitnami/deepspeed/dataChart 通过动态卷供应在该路径挂载 Persistent Volume。client 与 worker 均有独立的持久化配置参数说明默认值client.persistence.enabled是否使用 PVC 持久化 client 数据falseclient.persistence.mountPath数据卷挂载路径/bitnami/deepspeed/dataclient.persistence.storageClass持久卷存储类使用默认 provisionerclient.persistence.existingClaim复用已手动创建的 PVCclient.persistence.accessModes访问模式[ReadWriteOnce]client.persistence.size数据卷大小8Giclient.persistence.annotations/labels附加注解 / 标签{}worker.persistence.enabled是否使用 PVC 持久化 worker 数据falseworker.persistence.mountPathworker 数据卷挂载路径/bitnami/deepspeed/dataworker.persistence.sizeworker 数据卷大小8Gi从 worker-statefulset.yaml 可以看到 worker 持久化通过volumeClaimTemplates实现每个 worker Pod 都会获得独立的dataPVC支持accessModes、size、selector、storageClass未启用持久化时则退回emptyDir。client 的 PVC 定义在 templates/client/pvc.yaml。调整挂载点权限镜像默认以非 root 用户runAsUser1001运行因此需要确保容器能写入数据卷。Chart 默认依赖 Kubernetes Security ContextfsGroup1001自动修正卷属主但该机制并非在所有发行版都可用。备选方案是启用卷权限 init 容器volumePermissions: enabled: true启用后Chart 会注入volume-permissionsinit 容器模板定义于 templates/_helpers.tpl其逻辑为mkdir -p mountPath后执行chown runAsUser:fsGroup mountPath并对目录内非.snapshot、lostfound的内容递归 chown。该 init 容器以runAsUser: 0运行以获得写权限镜像默认使用bitnami/os-shell。探针、环境变量与 Sidecar探针配置client 与 worker 均支持 liveness、readiness、startup 三类探针的自定义含enabled、initialDelaySeconds、periodSeconds、timeoutSeconds、failureThreshold、successThreshold并可用customLivenessProbe/customReadinessProbe/customStartupProbe整体覆盖默认探针。默认探针行为client livenessbash -c source entrypoint.sh deepspeed --help验证 CLI 可用client readinesspython -c import deepspeed; print(deepspeed.__version__)验证 Python 环境就绪worker livenesspgrep -f sshdworker readinessTCP 探测tcp-ssh端口。探针细节均可在 client-dep-job.yaml 与 worker-statefulset.yaml 中直接核对。额外环境变量在client与worker子项下均可通过extraEnvVars注入自定义环境变量适合自定义 init 脚本等高级用法client: extraEnvVars: - name: LOG_LEVEL value: error worker: extraEnvVars: - name: LOG_LEVEL value: error也可以改用现成的 ConfigMap 或 Secret 批量注入extraEnvVarsCMconfigMapRef与extraEnvVarsSecretsecretRef。Sidecar 与 init 容器如需在同 Pod 内增加额外容器如指标/日志导出器使用sidecarssidecars: - name: your-image-name image: your-image imagePullPolicy: Always ports: - name: portname containerPort: 1234若 sidecar 需要额外暴露端口可通过service.extraPorts补充端口定义service: extraPorts: - name: extraPort port: 11311 targetPort: 11311需要初始化容器时使用initContainersinitContainers: - name: your-image-name image: your-image imagePullPolicy: Always ports: - name: portname containerPort: 1234注意Chart 自带的 SSH 配置、wait-for-workers、git clone、volume-permissions 等默认 init 容器由client.enableDefaultInitContainers/worker.enableDefaultInitContainers默认true控制initContainers仅用于追加自定义容器不会替换默认容器。Pod 调度与亲和性client与worker均支持完整调度控制自定义亲和性直接设置affinity详见 client-dep-job.yaml 的渲染逻辑——affinity一旦设置preset 全部忽略。预设亲和性使用podAffinityPresetsoft/hard、podAntiAffinityPreset默认soft与nodeAffinityPreset.type/key/values由bitnami/common提供模板实现。其他调度参数nodeSelector、tolerations、topologySpreadConstraints、priorityClassName、schedulerName、runtimeClassName、hostAliases等一应俱全。安全加固与镜像特性安全上下文默认值从 values.yaml 可以看到 client/worker 默认启用全套加固安全上下文runAsUser: 1001、runAsGroup: 1001、runAsNonRoot: truereadOnlyRootFilesystem: true根文件系统只读可写路径通过 emptyDir/卷提供allowPrivilegeEscalation: false、privileged: falsecapabilities.drop: [ALL]seccompProfile.type: RuntimeDefaultPod 级fsGroup: 1001、automountServiceAccountToken: false镜像验证与 OpenShift 兼容global.security.allowInsecureImages默认falseChart 2.3.0 起引入镜像验证机制关闭验证请显式设为true。global.compatibility.openshift.adaptSecurityContext默认auto适配 OpenShift restricted-v2 SCC移除runAsUser/runAsGroup/fsGroup让平台使用其默认 ID可选auto检测到 OpenShift 时应用、force始终应用、disabled不应用。相关渲染由bitnami/common的common.compatibility.renderSecurityContext完成。网络策略client 与 worker 默认创建 NetworkPolicy*.networkPolicy.enabledtrueallowExternalEgress默认true允许 Pod 访问任意目标与端口。worker.networkPolicy.allowExternal默认true为false时仅允许带有正确 client 标签的 Pod 访问 worker 端口。extraIngress/extraEgress附加自定义规则worker 还支持ingressNSMatchLabels/ingressNSPodMatchLabels跨命名空间放行。备份与恢复备份/恢复遵循 Kubernetes 通用方案使用 Velero 备份源部署的持久卷并挂载到新部署上。要点是确保持久化client.persistence.enabled/worker.persistence.enabled处于开启状态这样数据才落盘到可备份的 PVC。升级说明升级到 2.3.0该版本引入了镜像验证image verification安全特性。如需关闭设置global.security.allowInsecureImagestrue。升级到 2.0.0该大版本调整了安全默认值可能导致既有自定义/init 脚本受影响resourcesPreset由none改为测试套件可运行的最小规格注意该预设非生产用途生产请使用resourcesglobal.compatibility.openshift.adaptSecurityContext由disabled改为auto。若升级后出现兼容性问题可将上述两项恢复为升级前的值。排障指引Bitnami 为 Helm Chart 常见错误提供了通用排障指南可参照其方法论排查以下高频问题client 一直处于 Init 状态多为wait-for-workersinit 容器 SSH 连接失败检查 worker Pod 是否就绪、SSH 密钥 Secret 与 hostfile ConfigMap 是否已正确挂载。worker 探针失败pgrep -f sshd失败说明 sshd 未启动查看 init 容器日志确认authorized_keys/环境文件是否生成。镜像拉取失败检查私有镜像仓库的image.pullSecrets与global.imagePullSecrets。PVC 无法绑定确认集群存在可用的 StorageClass 与 PV provisioner。这些资源的模板如 hostfile-configmap.yaml、ssh-keys-secret.yaml、source-configmap.yaml都是排查时可直接对照的权威依据。参数速查总表Global 参数参数说明默认值global.imageRegistry全局镜像仓库global.imagePullSecrets全局镜像拉取 Secret 数组[]global.defaultStorageClass全局默认 StorageClassglobal.storageClass已废弃改用global.defaultStorageClassglobal.security.allowInsecureImages允许跳过镜像验证falseglobal.compatibility.openshift.adaptSecurityContextOpenShift SCC 兼容适配auto/force/disabledautoCommon 参数参数说明默认值kubeVersion覆盖 Kubernetes 版本nameOverride部分覆盖 fullnamefullnameOverride完全覆盖 fullnamecommonLabels/commonAnnotations附加到所有对象的标签/注解{}clusterDomain集群域名cluster.localextraDeploy随 release 附加部署的额外对象[]diagnosticMode.enabled诊断模式禁用全部探针并覆盖命令falsediagnosticMode.command/args诊断模式下的命令/参数[sleep]/[infinity]镜像与源码参数参数说明默认值image.registry/image.repositoryDeepSpeed 镜像仓库docker.io/bitnami/deepspeedimage.digest镜像 digest设置后覆盖 tagimage.pullPolicy拉取策略IfNotPresentimage.pullSecrets镜像拉取 Secret 数组[]source.type源码来源configmap/git/customconfigmapsource.launchCommand要执行的 deepspeed 命令source.configMap项目文件列表{}source.existingConfigMap存放项目文件的现成 ConfigMapsource.git.repository/source.git.revisionGit 仓库地址与检出分支source.git.extraVolumeMountsGit 容器额外挂载[]Client 关键参数参数说明默认值client.enabled启用 client 部署trueclient.useJob以 Job 方式部署falseclient.backoffLimitJob 失败重试上限10client.command/client.args覆盖容器命令/参数[]client.resourcesPreset资源预设mediumclient.resources精确资源请求/限制{}client.podSecurityContext.fsGroupPod fsGroup1001client.containerSecurityContext.runAsUser容器 UID1001client.livenessProbe.enabled/readinessProbe.enabled探针开关true/trueclient.networkPolicy.enabled创建 NetworkPolicytrueclient.serviceAccount.create创建 ServiceAccounttrueclient.pdb.create创建 PodDisruptionBudgettrueWorker 关键参数参数说明默认值worker.enabled启用 worker 部署trueworker.replicaCountworker 副本数3worker.slotsPerNode每节点训练槽位数1worker.containerPorts.sshSSH 端口2222worker.podManagementPolicyStatefulSet 管理策略Parallelworker.updateStrategy.type更新策略RollingUpdateworker.resourcesPreset资源预设mediumworker.pdb.create创建 PodDisruptionBudgettrue其他镜像参数参数说明默认值gitImage.registry/repositoryGit 克隆 init 容器镜像docker.io/bitnami/gitvolumePermissions.enabled启用卷权限 init 容器falsevolumePermissions.image.repository卷权限镜像bitnami/os-shellvolumePermissions.resourcesPreset卷权限容器资源预设nano完整可复用的安装示例综合以上内容下面给出一个面向多节点分布式训练、启用持久化与 Git 代码加载的生产化 values 片段global: security: allowInsecureImages: false source: type: git git: repository: https://github.com/my-user/deepspeed-examples revision: main launchCommand: deepspeed --num_gpus1 train.py --deepspeed ds_config.json client: useJob: true backoffLimit: 5 resources: requests: cpu: 4 memory: 8Gi limits: cpu: 8 memory: 16Gi persistence: enabled: true size: 20Gi worker: replicaCount: 4 slotsPerNode: 1 resources: requests: cpu: 8 memory: 32Gi limits: cpu: 16 memory: 64Gi persistence: enabled: true size: 50Gi volumePermissions: enabled: true将该文件保存为values.yaml后执行helm install my-release -f values.yaml oci://registry-1.docker.io/bitnamicharts/deepspeed训练完成后可用helm delete my-release清理。若需保留训练产出请依据持久化策略结合 Velero 等备份工具先行备份 PVC。总结Bitnami DeepSpeed Helm Chart 将复杂的分布式训练环境工程化client/worker 职责分离、SSH 免密组网与 hostfile 自动生成、三种代码加载方式、可插拔的资源/探针/亲和性配置以及默认开启的镜像加固与安全上下文让开发者能够把精力聚焦在训练本身而非基础设施细节。结合本文梳理的 values.yaml 参数体系与 templates 下的模板实现你可以在此基础上按需定制出符合自身 GPU 集群与业务负载的训练平台。赞分享云原生容器编排【免费下载链接】chartsBitnami Helm Charts项目地址https://gitcode.com/GitHub_Trending/charts30/charts点击查看免费下载相关推荐AG-UI × CrewAI 集成 0.3.1 版本深度解读状态保留、端点增强与并发治理AG UI × CrewAI 集成 0.3.1 版本深度解读状态保留、端点增强与并发治理 导读 本文以 ag ui crewai 0.3.1 的 CHANGE云原生容器编排Bitnami Jaeger Helm Chart 实战指南在 Kubernetes 上部署 Jaeger v2 分布式追踪平台Bitnami Jaeger Helm Chart 实战指南在 Kubernetes 上部署 Jaeger v2 分布式追踪平台 Jaeger 是面向微服务架云原生容器编排在 Kubernetes 上部署 Discourse 论坛Bitnami Helm Chart 完整实战指南在 Kubernetes 上部署 Discourse 论坛Bitnami Helm Chart 完整实战指南 Discourse 是一款自带版主与治理机制的开云原生容器编排上一篇PostgreSQL pgvector扩展Windows部署实战避开陷阱的终极指南下一篇用 Sentry MCP 系统化修复生产故障ClawHub 场景下的七阶段排查工作流创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考