把 overlay 上到真集群并晋级
目标
将 kustomize base 和 overlay 实际部署到集群,并使用 kubectl 检查 namePrefix、公共标签、configMapGenerator、副本数与镜像 patch 产生的结果。然后亲手复现只修改一行镜像标签即可完成 prod 晋升的流程。
为什么这很重要
GitOps 代理一半的工作是渲染。Argo CD 的 repo-server 看到 kustomization.yaml 时会运行 kustomize build,看到 Chart.yaml 时会运行 helm template,从而生成最终清单。也就是说,你在这里通过 kubectl kustomize 看到的输出,就是代理计算出的 desired state。如果不亲自生成它,就无法解释“Git 中没有 replicas,为什么集群里却是 3”这类情况。尤其是 configMapGenerator 的哈希后缀,在实际工作中非常重要——配置发生变化时,ConfigMap 名称会变化;名称变化后,Deployment spec 也会变化,从而自动触发滚动更新。如果将名称固定,那么仅配置变化时 Pod 不会重启,可能悄无声息地继续使用旧值。
步骤
- 在
/root/cgoa-envs/ns.yaml中声明 namespacecgoa-dev和cgoa-prod,并应用到集群。 - 在
/root/cgoa-envs/base/中编写 Deploymentweb(replicas 1,选择器与 Pod 标签为app: web,容器名称为web,镜像为nginx:1.27-alpine,通过envFrom引用 ConfigMapweb-config)以及 Serviceweb(port 80、targetPort 80)。在base/kustomization.yaml中加入这两个资源,为所有对象添加标签app.kubernetes.io/part-of: cgoa-shop,并通过configMapGenerator向名为web-config的 ConfigMap 中加入字面量GREETING=hello。暂时不要应用,只使用kubectl kustomize /root/cgoa-envs/base检查渲染结果。 - 在
/root/cgoa-envs/overlays/dev/kustomization.yaml中写入resources: [../../base]、namespace: cgoa-dev、namePrefix: dev-,然后使用kubectl apply -k应用到集群。 - 在应用结果中确认 Deployment
dev-web的envFrom所引用的 ConfigMap 名称,并确认同名 ConfigMap 确实存在于 namespacecgoa-dev中。(名称末尾应带有哈希后缀。) - 创建
/root/cgoa-envs/overlays/prod/kustomization.yaml——设置resources: [../../base]、namespace: cgoa-prod、namePrefix: prod-,通过replicas将web设为3,并通过images将nginx的newTag固定为1.27-alpine。然后使用kubectl apply -k应用。 - 执行晋升。只将 prod overlay 的镜像标签改为
1.28-alpine,然后重新应用。应用后,cgoa-prod中的prod-web应为nginx:1.28-alpine,而cgoa-dev中的dev-web仍应为nginx:1.27-alpine。 - 在
/root/cgoa-envs/diff-dev-prod.txt中保存 dev overlay 与 prod overlay 渲染结果的diff输出。
参考
kubectl apply -k <디렉터리>会原样应用kubectl kustomize的结果。- kustomization 的公共标签字段会因 kustomize 版本不同而使用
labels:或commonLabels:。任选能够工作的字段即可——评分会检查最终生成对象的标签。 diff a b > out.txt在存在差异时返回退出码 1。请附加|| true,以免 shell 中断。- 常见错误:在 base 中设置
namespace:,导致它与 overlay 的 namespace 冲突并造成混乱。namespace 只应在 overlay 中设置。
两个环境 namespace
在 /root/cgoa-envs/ns.yaml 中声明 namespace cgoa-dev 和 cgoa-prod,并应用到集群。
请养成以声明式方式创建 namespace 的习惯。可以在一个文件中放入两个文档并一次应用,也可以拆分成多个文件。
base 与 configMapGenerator
在 /root/cgoa-envs/base/ 中编写 Deployment web(replicas 1,选择器与 Pod 标签为 app: web,容器名称为 web,镜像为 nginx:1.27-alpine,通过 envFrom 引用 ConfigMap web-config)以及 Service web(port 80、targetPort 80)。在 base/kustomization.yaml 中加入这两个资源,为所有对象添加标签 app.kubernetes.io/part-of: cgoa-shop,并通过 configMapGenerator 向名为 web-config 的 ConfigMap 中加入字面量 GREETING=hello。暂时不要应用,只使用 kubectl kustomize /root/cgoa-envs/base 检查渲染结果。
configMapGenerator 会在名称末尾附加内容哈希。暂时不要部署到集群,只使用 kubectl kustomize 检查渲染结果。
将 dev overlay 应用到集群
在 /root/cgoa-envs/overlays/dev/kustomization.yaml 中写入 resources: [../../base]、namespace: cgoa-dev、namePrefix: dev-,然后使用 kubectl apply -k 应用到集群。
kubectl apply -k <디렉터리> 会一次完成渲染与应用。查询时必须使用带有 namePrefix 的名称才能看到对象。
确认哈希后缀已连接到工作负载
在应用结果中确认 Deployment dev-web 的 envFrom 所引用的 ConfigMap 名称,并确认同名 ConfigMap 确实存在于 namespace cgoa-dev 中。(名称末尾应带有哈希后缀。)
kustomize 会同时修改引用所生成 ConfigMap 名称的位置。查看 Deployment 的 envFrom 指向哪个名称,并确认该名称的 ConfigMap 确实存在。
应用 prod overlay
创建 /root/cgoa-envs/overlays/prod/kustomization.yaml——设置 resources: [../../base]、namespace: cgoa-prod、namePrefix: prod-,通过 replicas 将 web 设为 3,并通过 images 将 nginx 的 newTag 固定为 1.27-alpine。然后使用 kubectl apply -k 应用。
虽然使用同一个 base,但 replicas 和镜像标签必须不同。只修改 overlay 的 kustomization.yaml 来实现。
通过一行镜像标签完成晋升
执行晋升。只将 prod overlay 的镜像标签改为 1.28-alpine,然后重新应用。应用后,cgoa-prod 中的 prod-web 应为 nginx:1.28-alpine,而 cgoa-dev 中的 dev-web 仍应为 nginx:1.27-alpine。
晋升并不是一次全新的部署。只需在 prod overlay 中修改一个标签值并重新应用。不要改动 dev。
将两个环境的渲染差异保存到文件
在 /root/cgoa-envs/diff-dev-prod.txt 中保存 dev overlay 与 prod overlay 渲染结果的 diff 输出。
分别生成两份 kubectl kustomize 结果,再用 diff 进行比较。diff 发现差异时退出码不为 0,请注意不要让流水线将其视为失败。