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
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
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读取哪个,最后渲染出来的结果也都是稳定的