GitOps将Git仓库作为基础设施和应用配置的唯一事实来源,通过声明式方式管理Kubernetes集群状态。ArgoCD作为CNCF毕业级的GitOps工具,持续监控Git仓库与集群实际状态的差异并自动同步。多环境(dev/staging/prod)配置管理、应用版本回滚、配置漂移检测等功能使发布流程可审计、可追溯。本文从ArgoCD安装配置到多环境同步策略,拆解GitOps持续交付的工程实现。
ArgoCD架构与核心组件
ArgoCD由三个核心组件构成:API Server提供gRPC/REST接口,Repository Server负责Git仓库的克隆和缓存,Application Controller持续对比Git中声明的期望状态与集群中的实际状态。当检测到差异时,Controller触发同步操作将集群状态收敛到Git中定义的目标状态。
# 安装ArgoCD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# 获取初始密码
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
# 端口转发访问Web UI
kubectl port-forward svc/argocd-server -n argocd 8080:443
# 安装ArgoCD CLI
curl -sSL -o /usr/local/bin/argocd https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
chmod +x /usr/local/bin/argocd
# 登录
argocd account update-password
argocd login localhost:8080 --username admin --password NEW_PASSWORD
Application资源定义与Git仓库接入
ArgoCD通过Custom Resource Definition(CRD)定义Application资源,声明Git仓库地址、目标集群命名空间和同步策略。
# guestbook-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yunthe/gitops-manifests.git
targetRevision: HEAD
path: manifests/guestbook
destination:
server: https://kubernetes.default.svc
namespace: guestbook
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
automated.prune启用后,Git中删除的资源会在集群中同步删除。selfHeal参数确保手动修改集群状态后自动恢复到Git声明的状态,防止配置漂移。对于生产环境,通常关闭selfHeal以避免意外同步,改为手动触发同步操作。
# 部署Application
kubectl apply -f guestbook-app.yaml
# 查看同步状态
argocd app get guestbook
# 手动触发同步
argocd app sync guestbook
# 查看同步历史
argocd app history guestbook
# 回滚到指定版本
argocd app rollback guestbook 3
多环境配置管理:Kustomize Overlay方案
GitOps多环境管理的常见模式是使用Kustomize的base+overlay结构。base目录存放所有环境共享的基础配置,每个环境目录通过overlay覆盖差异参数。
gitops-manifests/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── kustomization.yaml
├── overlays/
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ ├── replicas-patch.yaml
│ │ └── configmap-patch.yaml
│ ├── staging/
│ │ ├── kustomization.yaml
│ │ ├── replicas-patch.yaml
│ │ └── configmap-patch.yaml
│ └── prod/
│ ├── kustomization.yaml
│ ├── replicas-patch.yaml
│ └── configmap-patch.yaml
base目录的kustomization.yaml定义共享资源:
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
- configmap.yaml
commonLabels:
app: guestbook
managed-by: argocd
各环境overlay通过patch覆盖差异配置:
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: guestbook-prod
resources:
- ../../base
patches:
- replicas-patch.yaml
- configmap-patch.yaml
images:
- name: guestbook
newName: registry.yunthe.com/guestbook
newTag: v2.1.0
# overlays/prod/replicas-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: guestbook
spec:
replicas: 5
template:
spec:
containers:
- name: guestbook
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
ApplicationSet实现多环境批量部署
ApplicationSet是ArgoCD的扩展组件,可以根据模板自动生成多个Application资源,适合多环境、多集群的批量部署场景。
# applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: guestbook-multi-env
namespace: argocd
spec:
generators:
- list:
elements:
- env: dev
cluster: https://kubernetes.default.svc
namespace: guestbook-dev
branch: develop
- env: staging
cluster: https://staging-cluster.yunthe.com
namespace: guestbook-staging
branch: release
- env: prod
cluster: https://prod-cluster.yunthe.com
namespace: guestbook-prod
branch: main
template:
metadata:
name: 'guestbook-{{env}}'
spec:
project: default
source:
repoURL: https://github.com/yunthe/gitops-manifests.git
targetRevision: '{{branch}}'
path: overlays/{{env}}
destination:
server: '{{cluster}}'
namespace: '{{namespace}}'
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
配置漂移检测与健康检查
ArgoCD内置配置漂移检测机制,当集群中的实际状态与Git仓库声明的状态不一致时,Application状态会标记为OutOfSync。漂移检测依赖Kubernetes Server Side Apply和Three-Way Merge算法对比 live state、desired state 和 last-applied state。
# 查看漂移详情
argocd app diff guestbook-prod --local=./overlays/prod
# 强制同步修正漂移
argocd app sync guestbook-prod --force
# 禁用特定资源的自动同步(防止手动调整被覆盖)
argocd app set guestbook-prod --sync-option RespectDifferences=true
# 资源健康检查自定义 Lua 脚本
# argocd-cm ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: argocd-cm
namespace: argocd
data:
resource.customizations.health.cert-manager.io_Certificate: |
hs = {}
if obj.status ~= nil and obj.status.conditions ~= nil then
for _, condition in ipairs(obj.status.conditions) do
if condition.type == "Ready" and condition.status == "True" then
hs.status = "Healthy"
hs.message = condition.message
return hs
end
end
end
hs.status = "Progressing"
hs.message = "Waiting for certificate to be ready"
return hs
GitOps模式将基础设施配置版本化管理,每次变更都有Git commit记录,支持代码审查和审计追踪。ArgoCD的多环境同步能力配合Kustomize overlay实现配置的差异化继承,ApplicationSet简化批量部署的模板化生成。配置漂移检测确保集群状态始终与Git仓库声明一致,回滚操作通过Git revert即可完成,将发布风险控制在可回溯、可审计的范围内。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/gitops-chi-xu-jiao-fu-shi-zhan-argocd-duo-huan-jing-pei-zhi/