从原生 K8s 到 Helm:理解 templates/ 与多环境 values 配置

发布时间:2026/7/24 20:25:12
从原生 K8s 到 Helm:理解 templates/ 与多环境 values 配置 当你刚学完k8s/文件夹里那一堆原生 YAML 文件以为自己懂了 Kubernetes 部署打开helm/文件夹时可能会一脸懵templates/里全是{{ .Values.xxx }}values.yaml、values-dev.yaml、values-prod.yaml长得还不一样。它们到底是什么关系这篇文章帮你把这两个核心问题彻底搞懂。一、templates/你的智能 YAML 工厂如果你把k8s/里的文件比作手写简历——内容固定改一个字就得重抄一份——那templates/就是简历模板。你写一次模板填入不同的信息就能生成无数份针对不同岗位的简历。Helm 的templates/干的就是这件事。1.1 每个文件是干什么的Table文件作用_helpers.tpl模板工具箱定义可复用的代码片段如统一标签生成不会直接产出 K8s 资源deployment.yaml定义 Pod 怎么跑镜像、副本数、环境变量、资源限制service.yaml定义集群内如何访问 Podingress.yaml定义外部流量怎么进来域名、路径、TLSconfigmap.yaml/secret.yaml配置和敏感数据注入容器pvc.yaml持久化存储hpa.yaml自动扩缩容resourcequota.yaml命名空间资源配额networkpolicy.yamlPod 间网络安全隔离serviceaccount.yamlRBAC 权限身份monitoring.yaml监控配置notes.txt安装完成后给用户的提示信息1.2 核心语法看一个例子就懂templates/deployment.yaml里可能是这样写的yamlspec: replicas: {{ .Values.replicaCount.backend }} template: spec: containers: - name: backend image: {{ .Values.image.repository }}:{{ .Values.image.tag }} resources: requests: memory: {{ .Values.backend.resources.requests.memory }}注意那些{{ }}——它们是占位符。Helm 在部署时会自动去values.yaml里找对应的值填进去。渲染后就变成你熟悉的原生 K8s YAMLyamlspec: replicas: 3 template: spec: containers: - name: backend image: ghcr.io/xxx/camp-backend:v1.0.0 resources: requests: memory: 512Mi一句话总结templates/存放的是带变量的 YAML 草稿Helm 负责把值填进去生成 kubectl 能执行的最终清单。二、values.yaml与values-*.yaml基准值 vs 覆盖值这是最容易让人困惑的地方。为什么有三个values文件它们怎么协作2.1 角色定位Table文件角色类比values.yaml默认值文件基准配置菜单上的默认套餐values-dev.yaml开发环境覆盖文件不要辣、少盐——只改需要改的地方values-prod.yaml生产环境覆盖文件加量、加辣、加芝士——强化配置Helm 的合并逻辑非常简单plain最终配置 values.yaml完整默认值 values-xxx.yaml只覆盖差异部分2.2 为什么values-dev.yaml那么短因为它只写和默认值不一样的地方。假设values.yaml里有完整的默认配置yamlreplicaCount: backend: 3 web: 2 auth: 2 image: repository: ghcr.io/xxx/camp-backend tag: v1.0.0 backend: resources: requests: memory: 1Gi cpu: 500m limits: memory: 2Gi cpu: 1000m ingress: enabled: true host: camp.example.comvalues-dev.yaml只需要覆盖差异部分yamlreplicaCount: backend: 1 # 开发环境只要1个副本省资源 web: 1 auth: 1 backend: resources: requests: memory: 256Mi # 低配就行 cpu: 100m limits: memory: 512Mi cpu: 200m ingress: host: camp-dev.local # 本地域名注意image.repository、ingress.enabled等字段在values-dev.yaml里没有出现——因为它们和默认值一样不需要改。执行命令时bashhelm install camp ./camp --values values-dev.yamlHelm 会自动合并最终生效的就是默认值 开发环境补丁。2.3values-prod.yaml又是什么它和values-dev.yaml本质一样——都是覆盖文件。但方向完全相反Table维度values-dev.yaml降级values-prod.yaml升级副本数1 个省资源3~5 个高可用资源限制CPU/内存给最低配requests 和 limits 都大幅提高HPA 自动扩容关闭开启CPU 70% 自动扩容安全策略宽松NetworkPolicy 收紧、RBAC 细化监控告警基础或关闭Prometheus/Grafana 全开域名本地/内网正式公网域名 TLS 证书日志级别DEBUG方便排错INFO/WARNING减少噪音values-prod.yaml可能长这样yamlreplicaCount: backend: 5 web: 3 backend: resources: requests: memory: 2Gi cpu: 1000m limits: memory: 4Gi cpu: 2000m hpa: enabled: true minReplicas: 3 maxReplicas: 10 targetCPUUtilizationPercentage: 70 ingress: host: camp.company.com tls: enabled: true secretName: camp-tls执行bashhelm install camp ./camp --values values-prod.yaml最终生成的是能扛住真实流量的生产级配置。三、这样设计到底有什么好处你可能想问为什么不直接写三份完整的 YAML非要搞什么默认值 覆盖这就是 Helm 的优雅之处Table好处说明DRY不重复自己通用配置只写一次在values.yaml不用复制 N 份维护简单升级镜像版本改values.yaml一处即可所有环境自动生效差异一目了然打开values-prod.yaml一眼看出生产环境和默认配置到底哪里不同减少人为错误不会因为漏复制某个字段导致 dev 和 prod 行为不一致灵活组合你可以随时创建values-staging.yaml、values-test.yaml零成本扩展新环境四、学习建议这样学最高效打开templates/deployment.yaml找到所有{{ .Values.xxx }}占位符去values.yaml里找到对应的值在脑子里手动渲染一遍最终 YAML对比k8s/backend-deployment.yaml你学过的原生版本体会模板化的优势逐行对比values.yaml、values-dev.yaml、values-prod.yaml列出三张表的差异清单动手试一次bashhelm template ./camp --values values-dev.yaml # 看看渲染结果 helm template ./camp --values values-prod.yaml # 对比差异结语从k8s/到helm/本质是从静态配置走向动态管理。templates/让你写一次到处用values.yaml给你统一的基准values-dev.yaml和values-prod.yaml让你只改差异环境隔离掌握这套机制你就从会写 Kubernetes YAML进阶到了会用 Helm 管理生产级多环境部署。下一步就是去挑战environments/多集群部署和 GitOps 了。记住这个公式模板 默认值 环境覆盖 生产级 Kubernetes 部署。