Helm 本地 chart 与 Kustomize overlay
目标
在没有互联网的情况下创建本地 Helm Chart,并完成渲染、安装和升级;同时使用 Kustomize 的 base/overlay 结构,按环境转换并应用同一套清单。
为什么重要
Helm 和 Kustomize 的方法截然相反。Helm 是模板:它用 Go 模板在字符串层面生成清单,因此可以自由使用条件和循环,但在渲染之前并不是有效的 YAML。Kustomize 是补丁:它以结构化方式合并已经有效的 YAML,因此结果始终有效,但可表达的转换范围更窄。
两者都具有修订版本的概念。Helm 将 Release 修订版本作为 Secret 累积在命名空间中,而 Kustomize 则由 Git 提交承担这一角色。因此 Helm 有 helm rollback,Kustomize 则在 git revert 后重新应用。
养成使用 helm template 的习惯非常重要。这是安装前确认将创建哪些资源的唯一方法,也是 CI 检查清单的环节。考试中也会出现“确认此 Chart 会生成什么内容”一类题目。
本实验环境无法访问互联网。 helm repo add 不会工作。实际工作中封闭网络环境也很常见,此时需要以 tgz 导入 Chart,或从本地路径安装。这里练习的正是这种方式。
步骤
- 使用
helm create /root/ckad-pkg/webapp创建 Chart。(如有需要,先创建/root/ckad-pkg目录。) - 修改
/root/ckad-pkg/webapp/values.yaml:replicaCount: 3、image.repository: nginx、image.tag: "1.27"、service.type: NodePort、service.port: 8080。 - 将
helm template webapp /root/ckad-pkg/webapp的结果保存到/root/ckad-pkg/rendered.yaml。 - 直接指定本地 Chart 路径,安装到命名空间
ckad-pkg,Release 名称为webapp。可以预先创建命名空间,也可以在安装时一并创建。 - 使用
helm upgrade,仅将replicaCount改为 5。Release 修订版本必须变为 2。 - 创建 Kustomize base。在
/root/ckad-pkg/kustomize/base/deployment.yaml中编写 Deploymentreport(副本数 1、标签app=report、镜像nginx:1.27),并在同一目录的kustomization.yaml中将该文件登记到resources。 - 创建 overlay
/root/ckad-pkg/kustomize/overlays/prod/kustomization.yaml。引用 base,在名称前添加prod-前缀,添加公共标签env=prod,并应用将副本数改为 4 的补丁。kubectl kustomize /root/ckad-pkg/kustomize/overlays/prod的结果中,prod-report必须显示副本数 4、标签env: prod。 - 将该 overlay 应用到命名空间
ckad-pkg(kubectl apply -k ... -n ckad-pkg)。Deploymentprod-report必须以副本数 4、标签env=prod、镜像nginx:1.27存在。
参考
- 使用
helm list -n ckad-pkg、helm history webapp -n ckad-pkg查看 Release 状态和修订版本。 kubectl kustomize <경로>只构建,kubectl apply -k <경로>则在构建后应用。- 副本数补丁最稳妥的方式是在
patches:中通过path:指向补丁文件,也可以使用专用的replicas:字段。 - 常见错误 1:尝试
helm repo add。这里无法访问互联网,因此必须只使用本地路径。 - 常见错误 2:在 overlay 的
resources中使用绝对路径。应使用../../base这类相对于 kustomization.yaml 的路径,更加可靠。 - 常见错误 3:把
image.tag写成类似数字的1.27。YAML 可能错误解析,使值不再是1.27,因此应使用引号包裹。
使用 helm create 创建 Chart 骨架
使用 helm create /root/ckad-pkg/webapp 创建 Chart。(如有需要,先创建 /root/ckad-pkg 目录。)
helm create <경로> 无需互联网即可在本地创建标准 Chart 结构。确认已经生成 Chart.yaml、values.yaml 和 templates/。
修改 values.yaml
修改 /root/ckad-pkg/webapp/values.yaml:replicaCount: 3、image.repository: nginx、image.tag: "1.27"、service.type: NodePort、service.port: 8080。
直接编辑 values.yaml。将镜像标签保留为字符串更安全(加引号)。Service 类型和端口位于 service 块下。
使用 helm template 检查渲染结果
将 helm template webapp /root/ckad-pkg/webapp 的结果保存到 /root/ckad-pkg/rendered.yaml。
helm template <릴리스이름> <차트경로> 不会在集群中创建任何资源,只输出最终清单。使用重定向将其保存到文件。
从本地路径执行 helm install
直接指定本地 Chart 路径,安装到命名空间 ckad-pkg,Release 名称为 webapp。可以预先创建命名空间,也可以在安装时一并创建。
直接传入 Chart 路径(helm install 이름 /경로)。如果命名空间不存在,请添加 --create-namespace。由于无法访问互联网,不能使用仓库名称。
使用 helm upgrade 累积修订版本
使用 helm upgrade,仅将 replicaCount 改为 5。Release 修订版本必须变为 2。
使用 --set 只覆盖一个值。升级后 Release 修订版本会增加,旧修订版本会以 superseded 状态保留。使用 helm history 检查。
创建 Kustomize base
创建 Kustomize base。在 /root/ckad-pkg/kustomize/base/deployment.yaml 中编写 Deployment report(副本数 1、标签 app=report、镜像 nginx:1.27),并在同一目录的 kustomization.yaml 中将该文件登记到 resources。
在 base 目录中放置清单文件和 kustomization.yaml。kustomization 的 resources 是以同一目录为基准的相对路径数组。使用 kubectl kustomize <경로> 查看构建结果。
使用 overlay 修改名称、标签和副本数
创建 overlay /root/ckad-pkg/kustomize/overlays/prod/kustomization.yaml。引用 base,在名称前添加 prod- 前缀,添加公共标签 env=prod,并应用将副本数改为 4 的补丁。kubectl kustomize /root/ckad-pkg/kustomize/overlays/prod 的结果中,prod-report 必须显示副本数 4、标签 env: prod。
overlay 的 resources 使用相对路径指向 base。名称前缀和公共标签各有专门字段,副本数则使用战略合并补丁文件覆盖。通过 kubectl kustomize 的输出检查结果。
综合:将 overlay 应用到集群
将该 overlay 应用到命名空间 ckad-pkg(kubectl apply -k ... -n ckad-pkg)。Deployment prod-report 必须以副本数 4、标签 env=prod、镜像 nginx:1.27 存在。
kubectl apply -k <오버레이경로> 会一次完成构建和应用。必须指定命名空间,资源才会进入目标位置。应用后确认名称是否连同前缀一起改变。