测验:chart 的结构
关于 Chart.yaml 中 version 与 appVersion 的关系,以下哪项正确?
- 两者表示同一对象,helm lint 会在它们不同时发出警告,因此应始终保持一致
- version 表示 Chart 本身的版本,appVersion 表示所部署应用的版本,两者独立变化
- appVersion 是应用版本,因此每次修改 Chart 时都必须始终大于或等于 version
- 即使未在 Chart.yaml 中填写 appVersion,Helm 也会读取镜像标签并自动补全
像 templates/_helpers.tpl 这样以下划线开头的文件有什么特点?
- 它属于只在 install 时应用、在 upgrade 和 uninstall 时不会触碰的特殊区域
- helm package 会自动排除它,因此打包后的 Chart 中不包含该文件
- Helm 不会解析它,所以可以自由写入备忘或草稿
- 它不会被渲染为清单,适合存放具名模板定义
为什么要特意分别定义通用标签和选择器标签?
- 因为 Service 的 spec.selector 无法解释 app.kubernetes.io/version 等版本标签,流量会无法到达 Pod
- 因为选择器中的标签越少,API 服务器查询标签索引就越快,在大型集群中能显著改善响应时间
- 因为 Deployment 的 spec.selector 是不可变字段,而通用标签中包含版本;提升 Chart 版本会改变它,从而导致升级被拒绝
- 因为 Helm 在模板渲染时计算通用标签,却在应用前才计算选择器标签,所以两处的值可能不一致
名称辅助模板中为什么要同时使用 trunc 63 和 trimSuffix?
- 为了截断名称以避免超过 Kubernetes 的长度限制,并防止截断后末尾留下连字符而导致名称无效
- 因为标签值超过 63 个字符时 etcd 会拒绝存储,所以资源名称也必须适配与标签相同的长度
- 因为 Release 名称短于 63 个字符时 Helm 会用连字符填充,需要再去掉这些填充
- 因为 Helm 模板引擎内部字符串缓冲区只有 63 字节,超出后渲染结果会被截断
关于 crds/ 目录中文件的特殊处理,以下哪项正确?
- 它们只在 install 时应用,upgrade 和 uninstall 都不会修改,也不会进行模板渲染
- 它们会作为模板渲染,因此可以引用 values,并在每次升级时重新应用 Chart 中的最新模式
- 可以通过 values 中的条件值启用或禁用,从而让每个 Release 决定是否安装 CRD
- uninstall 时会优先于其他资源删除,因此用该 CRD 创建的自定义资源也会一并清理
为什么为 values.yaml 添加注释很重要?
- 因为 Chart 用户真正阅读的不是模板而是 values.yaml,所以该文件实际上就是 API 文档
- 因为 Helm 必须像读取模式一样读取注释中的键说明,才能正确计算值的优先级与合并顺序
- 因为没有任何注释的 values.yaml 会被 helm lint 判为 ERROR,导致 Chart 无法打包和上传仓库
- 因为注释会原样保留在渲染后的清单中,可用于审计谁修改了哪些值