Akemi

Helm渲染顺序bug

2025/06/13

helm版本3.14
父子chart结构
本地依赖项

bug现象

在子chart中添加新服务后,通过helm template进行渲染测试,发现新服务有时可以被渲染出来,有时不行,其结果不稳定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
先通过-f指定变量文件
helm template ./ -f values-prod.yaml | grep kafka
helm template ./ -f values-prod.yaml | grep kafka
# Source: charts/data-platform/templates/kafka-monitor-deploy.yaml
name: kafka-monitor
app.kubernetes.io/func-role: kafka-monitor
app.kubernetes.io/func-role: kafka-monitor
app.kubernetes.io/func-role: kafka-monitor
- echo "start...";cd /kafka_raw_data/; touch /tmp/kafkalog.txt;./start.sh 2>&1 | tee
-a /tmp/kafkalog.txt
helm template ./ -f values-prod.yaml | grep kafka
# Source: charts/data-platform/templates/kafka-monitor-deploy.yaml
name: kafka-monitor
app.kubernetes.io/func-role: kafka-monitor
app.kubernetes.io/func-role: kafka-monitor
app.kubernetes.io/func-role: kafka-monitor
- echo "start...";cd /kafka_raw_data/; touch /tmp/kafkalog.txt;./start.sh 2>&1 | tee
-a /tmp/kafkalog.txt

通过-s选项进行指定模板进行渲染
helm template ./ -f values-prod.yaml -s charts/data-platform/templates/kafka-monitor-deploy.yaml

发现有时候会报错找不到子chart中的模板文件:
Error: could not find template charts/qa-data-platform/templates/kafka-monitor-deploy.yaml in chart

helm对依赖项的渲染流程

1.初始化渲染上下文
2.解析父Chart.yaml
3.读取依赖
4.遍历依赖项

读取依赖时
对于file://类型的本地依赖:

1
2
3
4
5
6
graph TD
D --> E{检查charts/目录}
E -->|存在依赖名目录| F[使用目录内容]
E -->|不存在目录| G{检查同名.tgz文件}
G -->|存在.tgz| H[解压到内存]
G -->|不存在| I[报错]

对于远程依赖,使用helm dependency update 进行远程依赖的更新,重新下载并覆盖.tgz文件

而.tgz位置就是位于父目录的charts/下

异常原因

如果使用了本地依赖项,并且存在依赖项同名.tgz,helm理应使用本地目录内容,而忽略.tgz,但bug导致helm有时会使用tgz进行渲染,有时会使用本地目录渲染。

最终使得每次helm template的内容都不一样

解决方法

方法1:

删除charts/下与本地依赖项同名的所有.tgz文件,这样helm就只会读取本地目录中的内容,而非tgz

方法2:

使用helm dependency update 命令进行更新,将最新的依赖项元数据更新到.tgz中,这样无论helm读取哪个,最后渲染出来的结果也都是稳定的

CATALOG
  1. 1. bug现象
  2. 2. helm对依赖项的渲染流程
  3. 3. 异常原因
  4. 4. 解决方法