ArgoCD是目前Kubernetes生态里应用最广的GitOps工具。GitOps的核心思路是声明期望状态:应用要部署成什么样,全部写成清单放进Git仓库,集群里的实际状态向仓库对齐,任何漂移都会被检测并纠正。相比传统CI推镜像再手动apply,GitOps让回滚、审计、多人协作都变得可控。本文从安装到多环境管理,走一遍ArgoCD的完整落地路径。
GitOps工作原理与ArgoCD核心组件
ArgoCD运行在集群内,核心组件包括Application Controller、Repo Server、API Server和Redis。Repo Server负责从Git拉取仓库内容并生成目标清单,Application Controller持续对比目标状态与集群实际状态,不一致时根据sync策略执行同步。用户通过CLI、Web界面或API管理Application资源,RBAC权限也由ArgoCD自身控制。
工作流是:开发提交代码,CI构建镜像并把新的镜像tag写入Git仓库的部署清单(或者用Kustomize/Helm更新),ArgoCD检测到Git仓库变化后,把集群中的Deployment、Service等资源向目标状态收敛。相比Jenkins等传统CD,集群内部署行为完全由Git驱动,出问题直接回滚Git提交即可。
安装ArgoCD与初始化配置
# 创建命名空间并安装
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 获取初始admin密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
# 端口转发访问Web界面
kubectl port-forward svc/argocd-server -n argocd 8080:443
生产环境访问Web UI建议配置Ingress并挂TLS证书,不要直接暴露NodePort。安装后用argocd login在CLI登录,后续操作都走CLI或API。仓库权限用argocd-repo-creds的kustomize/Helm凭证管理,SSH私钥或HTTPS token存放在Secret里。
创建Application:仓库、路径与同步策略
Application资源把Git仓库的某个目录映射到集群的某个命名空间。最简示例:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: web-frontend
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/k8s-configs.git
targetRevision: main
path: apps/web-frontend
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
prune:true让ArgoCD删除集群中不在Git清单里的资源,配合selfHeal:true自动修复漂移。首次创建应用时,如果目录里没有清单会同步报错,检查path层级与仓库实际结构一致。multi-source可以同时挂Helm Chart仓库和values仓库,把上游Chart与自定义values分离管理。
Helm与Kustomize集成
ArgoCD原生支持Helm和Kustomize。Helm的values通过参数注入:
spec:
source:
repoURL: https://github.com/example/helm-charts.git
path: charts/web
targetRevision: main
helm:
valueFiles:
- values-prod.yaml
parameters:
- name: replicaCount
value: "5"
Kustomize则直接读取目录下的kustomization.yaml,环境差异靠overlays目录组织。选择标准:Helm适合有版本管理需求、跨环境变量多的场景;Kustomize更轻,适合纯YAML覆盖。两者都可以搭配avp(Ansible Vault)或External Secrets管理敏感数据,避免把密钥明文写进Git。
多环境与多集群管理
多环境(dev/staging/prod)的常见做法是每个环境一个Application,共用一个Git仓库但指向不同目录或分支。更细粒度的是用ApplicationSet批量生成Application,按环境参数注入:
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: env-apps
namespace: argocd
spec:
generators:
- list:
elements:
- env: dev
namespace: dev
cluster: https://kubernetes.default.svc
- env: prod
namespace: prod
cluster: https://prod-cluster.example.com
template:
metadata:
name: '{{env}}-app'
spec:
destination:
name: '{{cluster}}'
namespace: '{{namespace}}'
source:
repoURL: https://github.com/example/configs.git
path: 'apps/{{env}}'
syncPolicy:
automated: {}
多集群场景在Application destination里指定不同集群名,ArgoCD支持一个实例管理多个集群,集群凭证用argocd cluster add添加。这样可以在控制台统一查看所有环境的同步状态,出问题时通过Sync/Rollback按钮处理。
同步策略与回滚实战
同步策略分三类:auto自动同步(配合selfHeal)、manual手动同步(需点Sync按钮)、scheduled定时同步(通过cron)。生产环境推荐manual+autoPrune混合,或者用ApplicationSet配合gatekeep把自动同步放到低峰期。回滚操作就是切换Git分支tag:把清单改回上一个提交,ArgoCD自动或手动同步后集群状态回到上一版本。
# 查看应用状态
argocd app get web-frontend
# 手动同步
argocd app sync web-frontend
# 查看历史提交并回滚
argocd app history web-frontend
argocd app rollback web-frontend 2
注意回滚只能恢复到历史同步记录里的版本,如果清单变更未同步过(应用长时间manual),先看sync difference再操作。
故障排查与监控集成
常见的三个问题:权限不足(Sync failed:resource not found)、语法错误(Repo Server返回invalid YAML)、Helm渲染错误(values没解析)。排查顺序:先看argocd app get的同步状态,再查应用日志kubectl logs -n argocd -l app.kubernetes.io/name=argocd-repo-server,最后到仓库本地渲染验证。监控告警接入Prometheus:ArgoCD暴露了argocd_app_sync_status指标,配合Alertmanager对OutOfSync持续超过阈值的应用发告警。
GitOps落地后,配置变更全部经过代码评审流程,集群状态可审计、可回滚。把ArgoCD当成基础设施的一部分维护,版本升级、备份都在常规巡检里,CD链路才算真正稳定。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/argocd-chi-xu-bu-shu-shi-zhan-gitops-sheng-ming-shi-tong-bu/