LabHub
学习 学习路径 课程

CGOA — GitOps 认证助理

把 overlay 上到真集群并晋级

在 LabHub 中继续学习

目标

将 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 不会重启,可能悄无声息地继续使用旧值。

步骤

  1. /root/cgoa-envs/ns.yaml 中声明 namespace cgoa-devcgoa-prod,并应用到集群。
  2. /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 检查渲染结果。
  3. /root/cgoa-envs/overlays/dev/kustomization.yaml 中写入 resources: [../../base]namespace: cgoa-devnamePrefix: dev-,然后使用 kubectl apply -k 应用到集群。
  4. 在应用结果中确认 Deployment dev-webenvFrom 所引用的 ConfigMap 名称,并确认同名 ConfigMap 确实存在于 namespace cgoa-dev 中。(名称末尾应带有哈希后缀。)
  5. 创建 /root/cgoa-envs/overlays/prod/kustomization.yaml——设置 resources: [../../base]namespace: cgoa-prodnamePrefix: prod-,通过 replicasweb 设为 3,并通过 imagesnginxnewTag 固定为 1.27-alpine。然后使用 kubectl apply -k 应用。
  6. 执行晋升。只将 prod overlay 的镜像标签改为 1.28-alpine,然后重新应用。应用后,cgoa-prod 中的 prod-web 应为 nginx:1.28-alpine,而 cgoa-dev 中的 dev-web 仍应为 nginx:1.27-alpine
  7. /root/cgoa-envs/diff-dev-prod.txt 中保存 dev overlay 与 prod overlay 渲染结果的 diff 输出。

参考

两个环境 namespace

/root/cgoa-envs/ns.yaml 中声明 namespace cgoa-devcgoa-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-devnamePrefix: dev-,然后使用 kubectl apply -k 应用到集群。

kubectl apply -k <디렉터리> 会一次完成渲染与应用。查询时必须使用带有 namePrefix 的名称才能看到对象。

确认哈希后缀已连接到工作负载

在应用结果中确认 Deployment dev-webenvFrom 所引用的 ConfigMap 名称,并确认同名 ConfigMap 确实存在于 namespace cgoa-dev 中。(名称末尾应带有哈希后缀。)

kustomize 会同时修改引用所生成 ConfigMap 名称的位置。查看 Deployment 的 envFrom 指向哪个名称,并确认该名称的 ConfigMap 确实存在。

应用 prod overlay

创建 /root/cgoa-envs/overlays/prod/kustomization.yaml——设置 resources: [../../base]namespace: cgoa-prodnamePrefix: prod-,通过 replicasweb 设为 3,并通过 imagesnginxnewTag 固定为 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,请注意不要让流水线将其视为失败。