Kubernetes GitOps 实践:使用 Argo CD 实现持续部署

发布时间:2026/5/20 21:41:22

Kubernetes GitOps 实践:使用 Argo CD 实现持续部署 Kubernetes GitOps 实践使用 Argo CD 实现持续部署引言GitOps 是一种将 Git 作为单一事实来源的运维方法通过声明式配置和自动化工具实现应用的持续部署。Argo CD 是 Kubernetes 生态中最流行的 GitOps 工具提供了强大的应用部署和管理能力。GitOps 基础概念什么是 GitOpsGitOps 是一种运维模式其核心原则包括声明式配置使用声明式语言定义期望状态版本控制所有配置存储在 Git 仓库中自动化同步自动将实际状态与期望状态同步审计追踪所有变更都有完整的审计日志GitOps 工作流程┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐ │ Git Repository │────▶│ Argo CD │────▶│ Kubernetes │ │ (期望状态) │ │ (状态同步) │ │ (实际状态) │ └──────────────────┘ └──────────────────┘ └──────────────────┘ │ │ │ ▼ │ ┌──────────────────┐ └─────────────────│ 反馈循环 │ │ (差异检测) │ └──────────────────┘Argo CD 架构Argo CD 组件组件说明Argo CD API ServerREST API 服务Argo CD Application Controller应用状态控制器Argo CD Repo Server仓库同步服务Argo CD UIWeb 界面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 应用管理创建 ApplicationapiVersion: 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: - CreateNamespacetrue - PruneLasttrue选择性同步# 同步特定资源 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 项目配置创建 ProjectapiVersion: 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/checkoutv2 - uses: argoproj/argo-cd-actionv1 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-literalpasswordsecret -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/nameargocd-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-cdGitOps Handbook: https://www.gitops.tech/

相关新闻