测验:模板与 values
关于 Helm 模板引擎处理 YAML 的方式,以下哪项正确?
- 它会为每个值生成单独的 JSON 补丁,并依次应用到 API 服务器
- 它会参考 Kubernetes API 模式,自动调整代码块的缩进
- 它会先解析 YAML 生成树,再直接修改节点的值
- 它先生成字符串,然后再把完成的字符串解析为 YAML
为什么对 toYaml 的结果不用 indent 而使用 nindent?
- 因为 nindent 会读取前一个键的缩进深度,即使不传参数也能自动计算空格数
- 因为 indent 只能缩进映射,不能用于 toYaml 生成的列表
- 因为 indent 要等渲染全部结束后才应用,无法放入管道中间
- 因为 nindent 会在开头加入换行符,使代码块第一行不会粘在前一个键后面
template 与 include 的实际区别是什么?
- include 会推迟渲染,等其他模板全部完成后再执行,因此最终清单的输出顺序不同
- 只有 include 能按名称调用其他 Chart(包括子 Chart)中定义的具名模板
- template 不能接收上下文参数,无法传入一个点,只能读取全局值
- include 将结果作为字符串返回,可通过管道继续处理;template 则直接在当前位置输出结果
区分使用 default 和 required 的最佳标准是什么?
- 缺少时仍能合理运行的值使用 default;缺少时绝不能部署的值使用 required
- required 仅在子 Chart 模板中生效,因此父 Chart 中应改用 default 检查
- default 会在值为空时让渲染失败,而 required 只会发出警告并继续使用空值
- 可能为空的字符串使用 default;难以与 0 区分的数字和布尔值使用 required
使用 -f a.yaml -f b.yaml --set key=v 渲染时,值的优先级如何?
- a.yaml 和 b.yaml 的优先级低于 Chart 的 values.yaml,因此无法覆盖 Chart 中已有的键
- 值文件不按传入顺序,而是按键名的字母顺序合并,--set 也遵循相同规则
- Chart 的 values.yaml 优先级最低,随后依次是 a.yaml、b.yaml,而 --set 优先级最高
- --set 优先级最低,Chart 的 values.yaml 最高,两个值文件位于两者之间
在 Pod 模板注解中加入 checksum/config 这一惯例的目的是什么?
- 让 kubelet 在挂载前核对哈希,以验证 ConfigMap 内容未被损坏
- 解决 ConfigMap 内容变化而 Pod 规格不变,因而不会触发滚动更新的问题
- 让 Helm 阻止其他 Release 抢先挂载同名 ConfigMap
- 向 Helm 提供提示,使其在 three-way merge 时只应用已变化的资源