改了 git,集群就跟上来
本实验在真正的 Argo CD 上运行
VM 中实际运行着 k3s + Argo CD + git 服务器。向 git 提交后, Argo CD 会读取它并真正完成部署;有人手动修改时,它也会真正将修改 还原。
CGOA 课程中其他实验使用的模拟集群没有 Argo CD。因此, 漂移和自愈都不可能发生——这意味着 GitOps 中最重要的学习内容 此前全部缺失。
首次启动需要 4~5 分钟。
已准备的内容
작업 사본 /srv/gitops 여기서 고치고 커밋·푸시합니다
원격 git://gitd.gitsrv.svc.cluster.local:9418/app.git
Argo CD argocd 네임스페이스
git 服务器是集群内的 Pod。它挂载了 /srv/bare hostPath,
因此从 VM push 后,Argo CD 会立即看到变更。
目标
亲自触发并确认 GitOps 的四种行为:部署、变更跟踪、 漂移检测和自愈。
为什么这很重要
GitOps 的核心主张只有一个:git 是唯一的事实来源,集群是 它的副本。
要使这一主张成立,需要满足两个条件。
- 修改 git 后,集群必须跟随变更(同步)
- 修改集群后,集群必须恢复原状(自愈)
第二点尤其重要。没有自愈,通过 kubectl 直接进行的修改
会一直保留,导致 git 与集群悄无声息地分叉。 此时 git 不再
是真实来源,差异会在下一次部署时集中爆发。
步骤
- 在
/srv/gitops中创建app/deploy.yaml(namespace 为shop,Deployment 为web,副本数为 2)并 push,然后将 git 服务器是否提供该文件的结果保存到/root/cgo/repo.txt。 - 创建
shopApplication(启用automated、prune、selfHeal),并将实际部署结果保存到/root/cgo/app.txt。 - 在 git 中将副本数改为 3 并 push,将集群随之更新的结果保存到
/root/cgo/gitchange.txt。不要使用kubectl直接修改。 - 关闭
selfHeal,用kubectl修改副本数,并将状态变为OutOfSync的结果保存到/root/cgo/drift.txt。 - 重新开启
selfHeal,并将恢复原状的结果保存到/root/cgo/selfheal.txt。 - 在 git 中添加 ConfigMap
extra并完成部署,然后从 git 中删除它,将prune也从集群中删除它的结果保存到/root/cgo/prune.txt。 - 检查部署历史并保存到
/root/cgo/history.txt,同时写明 GitOps 中的回滚是什么。 - 在
/root/cgo/report.md中写入selfheal=yes、prune=yes、replicas=三行及相关说明。
参考
- push 命令为
git -C /srv/gitops push origin main。远程仓库已配置完成。 - Argo 默认每 3 分钟重新读取一次 git。如不想等待,请使用
argocd app get shop --refresh或kubectl -n argocd patch app shop --type merge -p '{"metadata":{"annotations":{"argocd.argoproj.io/refresh":"hard"}}}'。 - 使用
kubectl -n argocd get app shop -o jsonpath='{.status.sync.status}'查看状态。 - 关闭和开启
selfHeal使用kubectl -n argocd patch app shop --type merge -p '{"spec":{"syncPolicy":{"automated":{"selfHeal":false}}}}'。 - 常见错误 1:第 4 步在
selfHeal仍开启时制造漂移。它会在几秒内恢复,因此无法看到OutOfSync。 - 常见错误 2:启用
prune时误删 git 中的文件。集群中的对象也会被删除——因此默认情况下它是关闭的。
让 git 成为事实来源
在 /srv/gitops 中创建 app/deploy.yaml(namespace 为 shop,Deployment 为 web,副本数为 2)并 push,然后将 git 服务器是否提供该文件的结果保存到 /root/cgo/repo.txt。
在 /srv/gitops 中修改并提交,然后 push。远程仓库是集群内的 git 服务器。
Argo 读取 git 并完成部署
创建 shop Application(启用 automated、prune、selfHeal),并将实际部署结果保存到 /root/cgo/app.txt。
为 Application 设置 syncPolicy.automated 后,无需人工点击 sync。
修改 git 后集群会跟随变化
在 git 中将副本数改为 3 并 push,将集群随之更新的结果保存到 /root/cgo/gitchange.txt。不要使用 kubectl 直接修改。
不要使用 kubectl。修改 git 并 push,然后等待 Argo 跟随变更。
手动修改会造成分叉
关闭 selfHeal,用 kubectl 修改副本数,并将状态变为 OutOfSync 的结果保存到 /root/cgo/drift.txt。
请关闭 selfHeal 后再制造漂移。如果保持开启,变更会在几秒内恢复,来不及观察。
重新开启后会恢复原状
重新开启 selfHeal,并将恢复原状的结果保存到 /root/cgo/selfheal.txt。
开启 selfHeal 后,Argo 会恢复为 git 中的值,通常只需几秒。
从 git 删除后也会从集群删除
在 git 中添加 ConfigMap extra 并完成部署,然后从 git 中删除它,将 prune 也从集群中删除它的结果保存到 /root/cgo/prune.txt。
先将 ConfigMap 加入 git 并部署,然后从 git 删除该文件并 push。
回滚就是回滚 git
检查部署历史并保存到 /root/cgo/history.txt,同时写明 GitOps 中的回滚是什么。
部署历史位于 .status.history 中,但 GitOps 的回滚方式另有其法。
总结所学内容
在 /root/cgo/report.md 中写入 selfheal=yes、prune=yes、replicas= 三行及相关说明。
除 selfheal=、prune=、replicas= 三行外,还要说明 git 为什么是事实来源。