GitOps 与 Argo CD

GitOps 是一种基于 Git 的集群声明式管理和持续交付方法。Argo CD 是一个开源的 GitOps 工具,提供声明式、自动化、GitOps 驱动的 Kubernetes 应用程序部署和生命周期管理。

GitOps 与 Argo CD 架构
graph TB
    subgraph "Git 仓库"
        REPO[Git Repository]
        BRANCH[分支: main
分支: dev] end subgraph "Argo CD" ARGO[Argo CD Server] API[Argo CD API] RECONCILER[应用同步器] end subgraph "Kubernetes 集群" K8S[K8s 集群] DEPLOY[部署资源] SVC[服务资源] end REPO --> ARGO ARGO --> RECONCILER RECONCILER --> K8S K8S --> API API --> REPO BRANCH --> REPO DEPLOY --> K8S SVC --> K8S
GitOps 与传统 CI/CD 对比
对比项传统 CI/CDGitOps
部署触发 CI/CD 管道触发部署 Git 仓库状态变化触发同步
配置管理 配置可能散落在不同系统 所有配置存储在 Git 仓库
状态一致性 难以保证状态一致性 持续监控,自动同步至期望状态
审计追踪 分散在多个系统 Git 提供完整审计追踪
回滚机制 需要专门的回滚流程 Git commit 回退即回滚
Argo CD 安装与配置

Argo CD 由几个核心组件构成,包括 API 服务器、数据库、应用控制器和仓库服务器。

1. Argo CD 部署清单
# Argo CD 基础部署
apiVersion: v1
kind: Namespace
metadata:
  name: argocd
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argocd-server
  namespace: argocd
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: argocd-server
  template:
    metadata:
      labels:
        app.kubernetes.io/name: argocd-server
    spec:
      containers:
      - name: argocd-server
        image: quay.io/argoproj/argocd:v2.7.10
        command:
        - argocd-server
        - --staticassets
        - /shared/app
        - --insecure
      ports:
        - name: http
          protocol: TCP
          containerPort: 8080
        - name: https
          protocol: TCP
          containerPort: 8080
2. Argo CD Service 与 Ingress
# Argo CD 服务配置
apiVersion: v1
kind: Service
metadata:
  name: argocd-server
  namespace: argocd
spec:
  type: ClusterIP
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 8080
  - name: https
    protocol: TCP
    port: 443
    targetPort: 8080
  selector:
    app.kubernetes.io/name: argocd-server
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  namespace: argocd
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
  rules:
  - host: argocd.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: argocd-server
            port:
              number: 443
Argo CD Application 配置

Argo CD Application 定义了从 Git 仓库同步到 Kubernetes 集群的应用部署。

1. Application CRD 配置示例
# Argo CD Application 配置
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/username/myapp.git
    targetRevision: HEAD
    path: k8s/overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: myapp
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
    - ApplyOutOfSyncOnly=true
2. Argo CD Project 配置
# Argo CD Project 定义
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: default
  namespace: argocd
spec:
  description: Default Argo CD Project
  destinations:
  - namespace: '*'
    server: https://kubernetes.default.svc
  sourceRepos:
  - '*'
  clusterResourceWhitelist:
  - group: '*'
    kind: '*'
  namespaceResourceWhitelist:
  - group: '*'
    kind: '*'
GitOps 工作流程

GitOps 的核心是将系统声明状态存储在 Git 仓库中,Argo CD 持续监控集群状态并自动同步到期望状态。

sequenceDiagram
    participant Dev as 开发者
    participant Git as Git 仓库
    participant ArgoCD as Argo CD
    participant K8s as Kubernetes 集群
    
    Dev->>Git: 提交配置更改
    Git-->>ArgoCD: 变更通知
    ArgoCD->>Git: 拉取最新配置
    ArgoCD->>K8s: 部署/更新资源
    K8s-->>ArgoCD: 当前状态
    ArgoCD->>ArgoCD: 比较期望状态与实际状态
    Note over ArgoCD,K8s: 持续监控和同步
                                
Argo CD 同步策略

Argo CD 提供多种同步策略,以满足不同的部署需求。

自动同步 (Automated Sync)
  • 当 Git 仓库中的配置发生变化时自动同步
  • 需要配置 selfHeal 以自动修复偏移
  • 适合生产环境的声明式管理
手动同步 (Manual Sync)
  • 通过 UI 或 CLI 手动触发同步
  • 提供更精细的控制
  • 适合需要人工审批的场景
自动同步配置示例
# 自动同步配置
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-autosync
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/username/myapp.git
    targetRevision: HEAD
    path: k8s
  destination:
    server: https://kubernetes.default.svc
    namespace: myapp
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
    - CreateNamespace=true
    - ApplyOutOfSyncOnly=true
    - Validate=false
    - SkipDryRunOnMissingResource=true
Argo CD 与 Helm 集成

Argo CD 可以直接管理 Helm charts,提供对 Helm 应用的声明式管理和同步。

Helm Chart 作为 Argo CD 应用
# 使用 Helm Chart 的 Argo CD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-helm
  namespace: argocd
spec:
  source:
    repoURL: https://charts.helm.sh/stable
    chart: nginx-ingress
    targetRevision: 1.41.3
    helm:
      releaseName: my-nginx-ingress
      valueFiles:
      - values.yaml
      parameters:
      - name: controller.service.type
        value: LoadBalancer
      - name: controller.service.loadBalancerIP
        value: 10.10.10.10
  destination:
    server: https://kubernetes.default.svc
    namespace: nginx-ingress
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
Argo CD 与 Kustomize 集成

Argo CD 内置支持 Kustomize,可以直接使用 Kustomize 的基础和覆盖层功能。

Kustomize 作为 Argo CD 应用源
# 使用 Kustomize 的 Argo CD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-kustomize
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/username/myapp.git
    targetRevision: HEAD
    path: k8s/base
    kustomize:
      namePrefix: prod-
      nameSuffix: -v1
      images:
      - myapp:1.2.3
      replicas:
      - name: myapp
        count: 3
  destination:
    server: https://kubernetes.default.svc
    namespace: myapp
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
GitOps 最佳实践
安全最佳实践
  • 使用 RBAC 限制对 Argo CD 的访问
  • 通过项目 (Project) 限制可部署的资源类型
  • 使用安全的 Git 仓库访问方式
  • 启用审计日志记录所有操作
操作最佳实践
  • 使用自动同步与自愈功能
  • 定期备份 Argo CD 配置
  • 实施适当的健康检查
  • 配置通知和告警
GitOps 故障排除
常见问题可能原因解决方案
应用无法同步 Git 仓库访问问题 验证仓库 URL、认证凭据和网络连接
同步冲突 手动修改了集群资源 使用 'replace' 或 'force' 选项同步
健康检查失败 资源定义不正确 检查资源定义和健康检查配置
权限不足 RBAC 配置不当 配置正确的 RBAC 角色和绑定
性能问题 同步频率过高 调整同步间隔和资源限制
常用命令
# 安装 Argo CD CLI
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
# 登录 Argo CD 服务器
argocd login argocd-server.example.com --username admin --password $(kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2)
# 创建应用
argocd app create myapp --repo https://github.com/username/myapp.git --path k8s --dest-server https://kubernetes.default.svc --dest-namespace myapp
# 同步应用
argocd app sync myapp
# 查看应用状态
argocd app get myapp
# 启用自动同步
argocd app set myapp --sync-policy automated