加了选项却不生效——在上线前读回配置
目标
逐项增加 argocd-cm 的内容,用 argocd admin settings validate 确认 Argo CD 读取到的值,并看一看拼写错误的键是如何悄无声息地消失的。仓库 Secret 和所有权标记方式要直接部署到 kwok 集群。
为什么重要
以声明方式管理 Argo CD 时,一份 argocd-cm 就决定了整个平台的行为。但这个文件是普通的 ConfigMap,所以没有 schema——键名写错也不会被拒绝,只会变成没有那项配置。正是这种悄无声息,让问题存活得很久。argocd admin settings validate 不是检查文件的工具,而是按节回显工具从该文件中读取到了什么的工具。所以用法很重要——不是“显示了 ✅ 就没问题”,而是要看我填入的值有没有原样回来。只要养成在配置变更中附上这份输出前后 diff 的习惯,“为什么这个选项没生效”这个问题就会消失。
步骤
- 把
/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。看一看账号数量显示为多少。 /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 步的输出比较。 /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。/root/ga-settings/argocd-cm-track.yaml在第 5 步内容的基础上增加application.resourceTrackingMethod: annotation和application.instanceLabelKey: labhub.io/instance。然后在 kwok 集群中部署命名空间ga-settings和/root/ga-settings/deploy.yaml(Deploymentweb,镜像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贴上去。请这样做。/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。然后用目前推荐的方式,把同一个仓库写成 Secretga-settings-repo(命名空间argocd)保存到/root/ga-settings/repo-secret.yaml,并应用到 kwok 集群——必须带有标签argocd.argoproj.io/secret-type: repository,并在stringData中放入type、name、url。/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,所以在参考答案脚本里要小心,别让它中断。
参考
- 可以用
--group选择节:accounts、general、kustomize、repositories、resource-overrides。 - 这条命令需要 kubeconfig。实验 Pod 中已经配置好了。
- 有些配置,比如 resource.exclusions,不会出现在任何一节中——这类配置必须通过文件来确认。
- 常见错误:像
kustomize.buildOption这样把键名写错。不会报错,而是变成默认值。 - 常见错误:仓库 Secret 漏掉
argocd.argoproj.io/secret-type标签。同样不会报错。 - 参考:https://argo-cd.readthedocs.io/en/stable/operator-manual/argocd-cm-yaml/
先看空配置会回显什么
把 /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 节是如何变化的。