首页
/ Helm模板中循环生成多个Deployment资源的正确实践

Helm模板中循环生成多个Deployment资源的正确实践

2025-05-06 04:39:44作者:何举烈Damon

在Helm模板开发过程中,开发者经常需要根据配置值动态生成多个Kubernetes资源。本文通过一个典型案例,深入分析如何正确使用Helm的range循环功能来生成多个Deployment资源。

问题现象

开发者尝试通过Helm模板创建多个Nginx Deployment实例,模板中使用range循环和replicaCount值来控制生成数量。虽然模板调试(helm template)显示正确生成了4个Deployment定义(app01-app04),但实际部署(helm install/upgrade)时却只创建了最后一个Deployment(app04)。

根本原因分析

这种现象源于YAML文档分隔符的处理方式。在Helm模板中,当使用range循环生成多个Kubernetes资源时:

  1. 每个Kubernetes资源定义必须是独立的YAML文档
  2. YAML文档之间需要使用---分隔符明确分隔
  3. 原始模板中循环结束标记-}}会去除空白字符,导致生成的YAML文档连接在一起

解决方案

正确的模板写法应包含两个关键修改:

  1. 在range循环内部每个资源定义前添加YAML文档分隔符---
  2. 移除循环结束标记中的-字符,保留空白分隔

修正后的模板示例:

{{- $replicaCount := .Values.replicaCount | int }}
{{ range $i, $e := until $replicaCount }}
{{- $name := printf "app%02d" (add $e 1) }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ $name }}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ $name }}
  template:
    metadata:
      labels:
        app: {{ $name }}
    spec:
      containers:
        - name: {{ $name }}
          image: nginx
{{ end }}

技术原理详解

  1. YAML文档分隔:Kubernetes资源清单文件可以包含多个资源定义,但必须用---明确分隔。Helm不会自动添加这些分隔符。

  2. 空白控制:Helm模板中的{{--}}语法用于控制模板渲染后的空白字符。过度使用会导致YAML文档连接在一起,破坏文件结构。

  3. range循环:在Helm中,range是生成多个相似资源的有力工具,但需要特别注意YAML文档结构的完整性。

最佳实践建议

  1. 始终在循环内每个资源定义前添加---分隔符
  2. 谨慎使用空白控制符,特别是在循环结构中
  3. 使用helm template命令验证生成的YAML结构
  4. 考虑使用命名模板(define)来封装重复的资源结构
  5. 对于复杂场景,可以将循环资源拆分到单独的文件中

验证方法

部署前可通过以下命令验证模板渲染结果:

helm template . --debug

正确的输出应该显示多个被---分隔的完整Deployment定义。

通过遵循这些实践,开发者可以可靠地使用Helm模板生成多个Kubernetes资源,满足各种编排需求。

热门项目推荐
相关项目推荐

项目优选

收起
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
49
13
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
403
301
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
81
144
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
266
362
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
36
100
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
80
188
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TSX
272
25
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
601
66
HarmonyOS-ExamplesHarmonyOS-Examples
本仓将收集和展示仓颉鸿蒙应用示例代码,欢迎大家投稿,在仓颉鸿蒙社区展现你的妙趣设计!
Cangjie
339
183
carboncarbon
轻量级、语义化、对开发者友好的 golang 时间处理库
Go
7
1