TT Lab
开始
学习 学习路径 课程

GitOps 与 Argo CD

加了选项却不生效——在上线前读回配置

在 TT Lab 中继续学习

目标

逐项增加 argocd-cm 的内容,用 argocd admin settings validate 确认 Argo CD 读取到的值,并看一看拼写错误的键是如何悄无声息地消失的。仓库 Secret 和所有权标记方式要直接部署到 kwok 集群。

为什么重要

以声明方式管理 Argo CD 时,一份 argocd-cm 就决定了整个平台的行为。但这个文件是普通的 ConfigMap,所以没有 schema——键名写错也不会被拒绝,只会变成没有那项配置。正是这种悄无声息,让问题存活得很久。argocd admin settings validate 不是检查文件的工具,而是按节回显工具从该文件中读取到了什么的工具。所以用法很重要——不是“显示了 ✅ 就没问题”,而是要看我填入的值有没有原样回来。只要养成在配置变更中附上这份输出前后 diff 的习惯,“为什么这个选项没生效”这个问题就会消失。

步骤

  1. 把 /root/ga-settings/argocd-cm.yaml 创建为 data: {} 的 argocd-cm ConfigMap,并把 argocd admin settings validate --argocd-cm-path /root/ga-settings/argocd-cm.yaml 的输出保存到 /root/ga-settings/baseline.txt。五个节(accounts、general、kustomize、repositories、resource-overrides)必须全部显示出来。
  2. 在 /root/ga-settings/argocd-cm-accounts.yaml 中声明两个账号——accounts.ci 为 apiKey, login,accounts.readonly 为 apiKey。把只检查 --group accounts 的输出保存到 /root/ga-settings/accounts.txt。看一看账号数量显示为多少。
  3. /root/ga-settings/argocd-cm-kustomize.yaml 在第 2 步账号的基础上,把 kustomize.buildOptions 设为 --enable-helm。把 --group kustomize 的输出保存到 /root/ga-settings/kustomize.txt。
  4. 创建 /root/ga-settings/argocd-cm-typo.yaml,内容与第 3 步的文件完全相同,只是把键名写成 kustomize.buildOption(去掉末尾 s 的单数)。把 --group kustomize 的输出保存到 /root/ga-settings/typo.txt,并与第 3 步的输出比较。
  5. /root/ga-settings/argocd-cm-scope.yaml 在第 3 步内容的基础上增加 resource.exclusions。放两个条目——一个是 apiGroups 为 cilium.io 的 CiliumIdentity,另一个是核心组(空字符串)的 Event,两者的 clusters 都是 "*"。把同时检查 --group kustomize 和 --group resource-overrides 的输出保存到 /root/ga-settings/scope.txt。
  6. /root/ga-settings/argocd-cm-track.yaml 在第 5 步内容的基础上增加 application.resourceTrackingMethod: annotation 和 application.instanceLabelKey: labhub.io/instance。然后在 kwok 集群中部署命名空间 ga-settings 和 /root/ga-settings/deploy.yaml(Deployment web,镜像 nginx:1.25),并试着把一个很长的名称 gitops-argocd-platform-team-a-production-cluster-seoul-web-frontend-app 作为标签值贴上去——把失败命令的输出连同标准错误一起保存到 /root/ga-settings/label-limit.txt。同样的值可以作为注解 argocd.argoproj.io/tracking-id 贴上去。请这样做。
  7. /root/ga-settings/argocd-cm-repo.yaml 在第 6 步内容的基础上增加 repositories 列表(url 为 https://example.com/ga-manifests.git,name 为 ga-manifests,type 为 git)。把 --group repositories 的输出保存到 /root/ga-settings/repo.txt。然后用目前推荐的方式,把同一个仓库写成 Secret ga-settings-repo(命名空间 argocd)保存到 /root/ga-settings/repo-secret.yaml,并应用到 kwok 集群——必须带有标签 argocd.argoproj.io/secret-type: repository,并在 stringData 中放入 type、name、url。
  8. /root/ga-settings/argocd-cm-final.yaml 在第 7 步内容的基础上增加 url(https://argocd.example.com)和 dex.config(一个 github 连接器)。把检查全部节的输出保存到 /root/ga-settings/final.txt,并把 diff /root/ga-settings/baseline.txt /root/ga-settings/final.txt 的输出保存到 /root/ga-settings/settings-diff.txt。diff 的退出码不是 0,所以在参考答案脚本里要小心,别让它中断。

参考

先看空配置会回显什么

把 /root/ga-settings/argocd-cm.yaml 创建为 data: {} 的 argocd-cm ConfigMap,并把 argocd admin settings validate --argocd-cm-path /root/ga-settings/argocd-cm.yaml 的输出保存到 /root/ga-settings/baseline.txt。五个节(accounts、general、kustomize、repositories、resource-overrides)必须全部显示出来。

这条命令按节回显的不是“文件有没有问题”,而是“从这个文件中读取到了什么”。想一想,明明是空的,为什么还显示一个账号——管理员账号即使没有配置也是存在的。

通过声明增加账号

在 /root/ga-settings/argocd-cm-accounts.yaml 中声明两个账号——accounts.ci 为 apiKey, login,accounts.readonly 为 apiKey。把只检查 --group accounts 的输出保存到 /root/ga-settings/accounts.txt。看一看账号数量显示为多少。

账号键的值是该账号能做的事情的列表——apiKey 是签发令牌,login 是界面登录。对于 CI 这类非人类的主体,最好不要给 login。也请把默认的 admin 账号已经有一个这件事算进去。

原样回显读取到的值的节

/root/ga-settings/argocd-cm-kustomize.yaml 在第 2 步账号的基础上,把 kustomize.buildOptions 设为 --enable-helm。把 --group kustomize 的输出保存到 /root/ga-settings/kustomize.txt。

这一节返回的不是数字,而是读取到的值本身。因此,它是为数不多的、可以用眼睛比较“我写的内容”和“工具读到的内容”的地方——下一步会用到这个特性。

键名写错,没有人会告诉你

创建 /root/ga-settings/argocd-cm-typo.yaml,内容与第 3 步的文件完全相同,只是把键名写成 kustomize.buildOption(去掉末尾 s 的单数)。把 --group kustomize 的输出保存到 /root/ga-settings/typo.txt,并与第 3 步的输出比较。

ConfigMap 什么键都会接受——因为它没有 schema。所以拼写错误不会变成错误,而是变成“没有配置”。养成查看这条命令回显的值的习惯,是发现这类错误的唯一办法。

决定哪些东西干脆不看

/root/ga-settings/argocd-cm-scope.yaml 在第 3 步内容的基础上增加 resource.exclusions。放两个条目——一个是 apiGroups 为 cilium.io 的 CiliumIdentity,另一个是核心组(空字符串)的 Event,两者的 clusters 都是 "*"。把同时检查 --group kustomize 和 --group resource-overrides 的输出保存到 /root/ga-settings/scope.txt。

排除列表决定 Argo CD 完全不在集群中监视哪些类型。如果排除掉每秒产生数千个的 Event,或者 CNI 创建的身份对象,控制器的负载会大幅下降。但这项设置不会出现在 validate 输出的任何一节中——这一点也请确认一下。

把所有权标记从标签迁移到注解的原因

/root/ga-settings/argocd-cm-track.yaml 在第 5 步内容的基础上增加 application.resourceTrackingMethod: annotation 和 application.instanceLabelKey: labhub.io/instance。然后在 kwok 集群中部署命名空间 ga-settings 和 /root/ga-settings/deploy.yaml(Deployment web,镜像 nginx:1.25),并试着把一个很长的名称 gitops-argocd-platform-team-a-production-cluster-seoul-web-frontend-app 作为标签值贴上去——把失败命令的输出连同标准错误一起保存到 /root/ga-settings/label-limit.txt。同样的值可以作为注解 argocd.argoproj.io/tracking-id 贴上去。请这样做。

标签值不能超过 63 个字符。在应用名称会变长的大型组织里,标签方式会碰到这个上限,被截断的名称会让不同的应用拥有相同的所有权标记。注解没有这个上限。

仓库要声明为 Secret,而不是 ConfigMap

/root/ga-settings/argocd-cm-repo.yaml 在第 6 步内容的基础上增加 repositories 列表(url 为 https://example.com/ga-manifests.git,name 为 ga-manifests,type 为 git)。把 --group repositories 的输出保存到 /root/ga-settings/repo.txt。然后用目前推荐的方式,把同一个仓库写成 Secret ga-settings-repo(命名空间 argocd)保存到 /root/ga-settings/repo-secret.yaml,并应用到 kwok 集群——必须带有标签 argocd.argoproj.io/secret-type: repository,并在 stringData 中放入 type、name、url。

ConfigMap 的 repositories 列表是旧方式,无法同时存放密码或密钥。现在是一个 Secret 对应一个仓库,Argo CD 通过那个标签来查找仓库用的 Secret。没有标签就什么也不会发生——也不会报错。

把修改前和修改后并排放在一起

/root/ga-settings/argocd-cm-final.yaml 在第 7 步内容的基础上增加 url(https://argocd.example.com)和 dex.config(一个 github 连接器)。把检查全部节的输出保存到 /root/ga-settings/final.txt,并把 diff /root/ga-settings/baseline.txt /root/ga-settings/final.txt 的输出保存到 /root/ga-settings/settings-diff.txt。diff 的退出码不是 0,所以在参考答案脚本里要小心,别让它中断。

对于修改配置的变更,需要养成把“会有什么变化”留存成文件的习惯。这样评审者看到的就不是 ConfigMap 的行,而是工具读取到的值。请确认 general 节是如何变化的。