Kubernetes GitOps 实践:使用 Argo CD 实现持续部署
Kubernetes GitOps 实践:使用 Argo CD 实现持续部署
引言
GitOps 是一种将 Git 作为单一事实来源的运维方法,通过声明式配置和自动化工具实现应用的持续部署。Argo CD 是 Kubernetes 生态中最流行的 GitOps 工具,提供了强大的应用部署和管理能力。
GitOps 基础概念
什么是 GitOps
GitOps 是一种运维模式,其核心原则包括:
- 声明式配置:使用声明式语言定义期望状态
- 版本控制:所有配置存储在 Git 仓库中
- 自动化同步:自动将实际状态与期望状态同步
- 审计追踪:所有变更都有完整的审计日志
GitOps 工作流程
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ Git Repository │────▶│ Argo CD │────▶│ Kubernetes │ │ (期望状态) │ │ (状态同步) │ │ (实际状态) │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ │ ▼ │ ┌──────────────────┐ └─────────────────│ 反馈循环 │ │ (差异检测) │ └──────────────────┘Argo CD 架构
Argo CD 组件
| 组件 | 说明 |
|---|---|
| Argo CD API Server | REST API 服务 |
| Argo CD Application Controller | 应用状态控制器 |
| Argo CD Repo Server | 仓库同步服务 |
| Argo CD UI | Web 界面 |
Argo CD 核心概念
| 概念 | 说明 |
|---|---|
| Application | 定义一个应用的部署配置 |
| Project | 应用的逻辑分组 |
| Sync Policy | 同步策略配置 |
| Health Check | 健康检查配置 |
Argo CD 安装与配置
使用 Helm 安装
# 添加 Argo CD Helm 仓库 helm repo add argo https://argoproj.github.io/argo-helm helm repo update # 创建命名空间 kubectl create namespace argocd # 安装 Argo CD helm install argocd argo/argo-cd -n argocd验证安装
# 检查 Pod 状态 kubectl get pods -n argocd # 检查服务状态 kubectl get svc -n argocd访问 Argo CD UI
# 端口转发 kubectl port-forward svc/argocd-server -n argocd 8080:443 # 获取初始密码 kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -dArgo CD 应用管理
创建 Application
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app namespace: argocd spec: project: default source: repoURL: https://github.com/my-org/my-app.git targetRevision: HEAD path: k8s destination: server: https://kubernetes.default.svc namespace: my-app syncPolicy: automated: prune: true selfHeal: true应用同步
# 同步应用 argocd app sync my-app # 查看应用状态 argocd app get my-app # 查看应用历史 argocd app history my-appArgo CD 同步策略
自动同步配置
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-app-auto spec: project: default source: repoURL: https://github.com/my-org/my-app.git targetRevision: HEAD path: k8s destination: server: https://kubernetes.default.svc namespace: my-app syncPolicy: automated: prune: true selfHeal: true allowEmpty: false syncOptions: - CreateNamespace=true - PruneLast=true选择性同步
# 同步特定资源 argocd app sync my-app --resource kubernetes.io/Deployment/my-app # 跳过特定资源 argocd app sync my-app --skip-resource kubernetes.io/Secret/my-secretArgo CD Rollout 与回滚
应用回滚
# 查看应用历史 argocd app history my-app # 回滚到特定版本 argocd app rollback my-app --revision abc123 # 回滚到上一个版本 argocd app rollback my-app渐进式部署
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-app-rollout spec: replicas: 5 strategy: canary: steps: - setWeight: 20 - pause: {} - setWeight: 40 - pause: {duration: 10m} - setWeight: 60 - pause: {duration: 10m} - setWeight: 80 - pause: {duration: 10m} selector: matchLabels: app: my-app template: spec: containers: - name: my-app image: my-app:v2Argo CD 项目配置
创建 Project
apiVersion: argoproj.io/v1alpha1 kind: AppProject metadata: name: my-project namespace: argocd spec: description: My project sourceRepos: - https://github.com/my-org/* destinations: - server: https://kubernetes.default.svc namespace: my-app clusterResourceWhitelist: - group: '*' kind: '*' roles: - name: developer description: Developer role policies: - p, proj:my-project:developer, applications, *, my-project/*, allow groups: - my-developer-groupArgo CD 集成与扩展
与 CI 系统集成
# GitHub Actions 示例 name: Deploy to Argo CD on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: argoproj/argo-cd-action@v1 with: command: app sync my-app serverAddress: argocd.example.com token: ${{ secrets.ARGOCD_TOKEN }}与 Prometheus 集成
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: argocd-monitor namespace: argocd spec: selector: matchLabels: app.kubernetes.io/name: argocd-server endpoints: - port: metrics interval: 30sArgo CD 最佳实践
配置管理
# 使用 Kustomize 管理配置 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - base/ patchesStrategicMerge: - overlays/prod/deployment.yaml - overlays/prod/service.yaml namespace: my-appSecrets 管理
# 使用 Sealed Secrets kubectl create secret generic my-secret --from-literal=password=secret -o yaml | kubeseal > sealed-secret.yaml访问控制
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: argo-cd-reader namespace: argocd rules: - apiGroups: ["argoproj.io"] resources: ["applications"] verbs: ["get", "list", "watch"]常见问题与解决方案
问题 1:应用同步失败
排查步骤:
# 查看应用状态 argocd app get my-app # 查看同步日志 argocd app logs my-app # 检查资源状态 kubectl get pods -n my-app解决方案:
- 检查 Git 仓库权限
- 验证配置语法
- 检查目标命名空间是否存在
问题 2:回滚失败
排查步骤:
# 查看回滚历史 argocd app history my-app # 检查资源状态 kubectl describe deployment my-app # 查看事件 kubectl get events -n my-app解决方案:
- 确保目标版本存在
- 检查资源依赖关系
- 验证 RBAC 权限
问题 3:性能问题
排查步骤:
# 检查 Argo CD 组件状态 kubectl top pods -n argocd # 检查 API Server 日志 kubectl logs -n argocd argocd-server-0 # 检查 Repo Server 状态 kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-repo-server解决方案:
- 增加组件副本数
- 优化同步策略
- 配置资源限制
总结
Argo CD 是 GitOps 实践的核心工具,通过声明式配置和自动化同步,实现了应用部署的标准化和自动化。在实际应用中,需要结合 Kustomize、Sealed Secrets 和 CI/CD 系统,构建完整的 GitOps 工作流。
参考文献:
- Argo CD Documentation: https://argo-cd.readthedocs.io/
- Argo CD GitHub: https://github.com/argoproj/argo-cd
- GitOps Handbook: https://www.gitops.tech/
