当前位置: 首页 > news >正文

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 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 -d

Argo 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-app

Argo 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-secret

Argo 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:v2

Argo 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-group

Argo 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: 30s

Argo CD 最佳实践

配置管理

# 使用 Kustomize 管理配置 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - base/ patchesStrategicMerge: - overlays/prod/deployment.yaml - overlays/prod/service.yaml namespace: my-app

Secrets 管理

# 使用 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/
http://www.cnnetsun.cn/news/2481056.html

相关文章:

  • mNetAssist:免费高效的网络调试工具完整实战指南
  • 【技术底稿 39】自测阶段看不下去:一次缓存 + MyBatis-Plus 联合性能改造
  • 从‘盲猜’到‘先知’:深度解读神经RRT*如何让采样规划拥有‘大局观’
  • 别再傻傻用for循环了!英飞凌TC3X7的STM定时器,这样写延时函数才专业
  • 运筹优化入门:手把手教你用YALMIP+CPLEX在MATLAB里解第一个线性规划问题
  • 测试工程师的人生规划:如何平衡测试工作和生活
  • VAP特效动画实战指南:3步掌握跨平台高性能动画制作
  • Linux服务器CUDA Toolkit安装避坑指南:从驱动兼容性检查到环境变量永久生效
  • Linux内核reset子系统:统一硬件复位管理的核心框架与驱动实践
  • 机器人自主探索:基于边界点优化与多步路径规划的SLAM实践
  • 2026实测10款AI智能降重工具红黑榜!优缺点全透明,达标率直接对标行业天花板
  • 2023年CNCF五大新锐项目深度解析:Kwasm、KubeArmor、OpenCost、Headlamp与Dragonfly
  • Chromium内核全面拥抱HEVC:从Chrome硬解支持看浏览器视频生态变革
  • 保姆级教程:手把手教你将YOLOv8n模型导出为TensorRT/RKNN/Horizon可用的ONNX格式(附避坑点)
  • 用AT89C51和DS18B20复刻一个智能电饭煲:从原理图到Proteus仿真的保姆级教程
  • 如何用Obsidian Zettelkasten模板终结知识碎片化:完整指南
  • 使用 curl 命令直接测试 Taotoken 聊天补全接口的快速方法
  • 深入浅出DPCM与DAPM:图解高通音频架构如何实现动态功耗管理与低延迟播放
  • Office 365 官方部署工具保姆级教程:只装Word/Excel/PPT,彻底告别OneDrive和Outlook
  • 嵌入式开发回调注册机制:从函数指针到STM32实战应用
  • 告别盲调!用CCS调试器实时观察TMS320F28377D的SPI寄存器状态
  • 告别单线程!在STM32F4上基于FreeRTOS和LWIP搭建多客户端TCP服务器的完整流程
  • Simulink模型服务接口测试:从策略到实践的完整指南
  • 别再手动算CRC了!用UartAssist的校验计算器5分钟搞定Modbus调试
  • Figma界面汉化终极指南:3分钟实现全中文设计环境
  • VSCode里npm命令报错?别慌,这3种常见原因和解决方法(附环境变量配置)
  • 从“玄学”到科学:实测对比Buck电路环路补偿前后,动态响应到底差多少?(附示波器实测图)
  • 如何快速上手TransNet V2:智能视频镜头检测的完整指南
  • GD32做示波器,模拟前端电路怎么设计?聊聊信号调理与衰减的那些‘坑’
  • 从零连接电脑串口到成功通信:艾德克斯IT6831A电源SCPI控制避坑全记录