ArgoCD与GitOps是什么关系
ArgoCD是CNCF孵化项目,实现了GitOps中”Git作为应用状态的唯一事实来源”这一原则:把Kubernetes清单、Helm Chart、Kustomize配置都放到Git仓库,ArgoCD在集群侧持续比较”Git里声明的期望状态”和”集群实际状态”,发现偏差就自动或手动同步。相比纯CI/CD流水线里由Jenkins/GitLab把YAML apply到集群,GitOps把权限反向——集群不主动拉Git,而是ArgoCD在集群内长轮询(或监听webhook)仓库,天然具备回滚与审计能力。
网站运维团队在跑Kubernetes容器编排时,最大的痛点是发布无人审批导致配置漂移。ArgoCD把审批、回滚、同步历史都沉淀到Git与集群里,DevOps实践落地时不再依赖某个人执行kubectl apply。
ArgoCD部署与核心组件结构
在已有K8s集群里装ArgoCD:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.13.1/manifests/install.yaml
# 默认admin密码是自动生成的,先改掉
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d
# 暴露服务(生产建议用Ingress/网关TLS,不用端口转发)
kubectl port-forward svc/argocd-server -n argocd 8080:443
ArgoCD核心组件:argocd-server(API+UI)、argocd-repo-server(拉取Git、渲染清单)、argocd-application-controller(比较状态、执行同步)、Redis与repo-server缓存。控制器默认每3分钟做一次”比较循环”,可调大/调小。
创建Application并配置自动同步策略
用Declarative(Git中声明Application)方式,而不是在UI点击创建,方便后续审计:
# app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: prod-payment
namespace: argocd
spec:
project: default
source:
repoURL: https://gitlab.example.com/ops/payment-k8s.git
targetRevision: main # 分支或tag,可用HEAD/commit
path: overlays/prod # 指向子目录
destination:
server: https://kubernetes.default.svc
namespace: payment-prod
syncPolicy:
automated:
prune: true # 自动删除Git中已删除的资源
selfHeal: true # 集群内手动改动会被自动还原
allowEmpty: false
syncOptions:
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
maxDuration: 3m
factor: 2
自动同步推荐打开prune和selfHeal:prune会把Git删掉的资源在集群里同步删除,避免残留;selfHeal会检测kubectl edit/临时打补丁等集群内漂移,并回滚。两者都开时需要谨慎:避免生产集群因自己手误改导致的震荡,建议progression用webhook,生产保留人工审批。
实现CI到CD的自动同步(镜像更新)
典型链路:CI构建镜像 → 更新Git仓库中image tag → ArgoCD检测到Git变化 → 自动同步应用。推荐用argocd-image-updater来自动发现新镜像:
# image-updater注解(写在Application或Deployment)
metadata:
annotations:
argocd-image-updater.argoproj.io/image-list: app=registry.example.com/payment
argocd-image-updater.argoproj.io/app.update-strategy: digest
argocd-image-updater.argoproj.io/app.update-strategy: latest
另一种常用方案是CI直接改Git提交:GitLab CI中把镜像tag变量写入yaml再git commit+push,ArgoCD同步窗口自动拉取并做滚动更新。注意:ArgoCD默认不会自动发现新镜像,必须用image-updater或修改Git清单才能触发。
同步顺序由Application内资源拓扑与依赖决定,若Deployment先更新而ConfigMap后更新,可能短暂不匹配。用syncWave(sync-waves)控制顺序:
metadata:
annotations:
argocd.argoproj.io/sync-wave: "10" # 数字小的先同步
先同步ConfigMap/Secret(wave 0),再Deployment(wave 10),再Service/Ingress(wave 20),可以避免滚动更新时挂载旧配置。
回滚、同步失败处理与多集群扩展
回滚到上一个版本:argocd app rollback prod-payment <previous-commit>,或UI上History选旧版本。同步失败常见原因与排查顺序:
- 集群未授权:destination.server错误,报
Failed to load target state: rpc error - Git凭证失效:argocd appset secret过期,去Secret重新登记
- 资源校验失败:清单字段写错(kubectl apply能过但校验不过),看Events
- Hook超时:SyncHook(PreSync/PostSync)执行卡住,用argocd app sync –force
生产规模多个集群:ArgoCD本身也可以联邦部署(多集群注册),ApplicationSet用于多环境批量生成应用。多集群部署建议每环境一个ArgoCD实例,避免单实例故障时所有环境全停。ArgoCD的RepoServer使用Git仓库时应按子目录维护prod/staging,配合Helm Values(Helm repo)或Kustomize overlay,实现”一套仓库多环境”。
ArgoCD实践总结
ArgoCD把K8s运维从”人肉kubectl”变成”Git提交即发布”,自动同步加回滚、审计、权限控制组合后,发布流程可重复。运维团队落地GitOps前先统一仓库规范(每个应用一个目录、version tags打标签),再分阶段放开自动化:先auto-sync=false手动审阅跑两周,再开prune+selfHeal,最后接入image-updater完成CI/CD闭环。Kubernetes容器编排场景里,这是目前社区接受度最高的方案。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/argocdgitops-shi-zhan-kubernetes-sheng-ming-shi-bu-shu-yu/