ArgoCD:Kubernetes GitOps 实战指南

本文深入探讨ArgoCD作为Kubernetes的GitOps持续交付工具,涵盖其架构、工作原理、企业案例及最佳实践,并通过实战演示展示其自动化部署和状态同步能力。

ArgoCD:Kubernetes GitOps 实战指南

关键要点

  • ArgoCD(Kubernetes 的事实标准 CD 工具)通过使用 Git 作为单一事实来源,使部署发布变得顺畅。您可以在 Git 中定义应用程序的状态,ArgoCD 将保持集群处于所需状态。
  • 与传统的基于推送的方法不同,ArgoCD 在集群内部运行并从 Git 拉取更改,这确保了 API 密钥和机密不会暴露,使其成为大型企业更安全可靠的选择。
  • LoveHolidays 和 CVTE 等大型企业采用 ArgoCD 处理大规模部署。例如,LoveHolidays 每月处理数万亿请求和 1500 多次部署,这都归功于 ArgoCD。
  • ArgoCD 解决了持续交付的核心挑战,如配置漂移、自动化部署工作流和多集群应用程序一致性。它确保环境间的一致性,并允许您一键回滚到先前版本,减少错误和压力。
  • 本博客包含一个动手演示,展示如何在 minikube 集群上轻松设置 ArgoCD 并实时观察其同步更改。

介绍

Kubernetes 已经存在十多年,其应用自那时起一直在增长。Kubernetes(K8s)由 Google 于 2014 年启动,是一个开源的容器编排系统,可自动化软件部署、扩展和管理。

最初由 Google 开发,后转移到云原生计算基金会(CNCF),由超过 8 万名贡献者的社区维护和开发。它为我们提供了无缝部署,但为了确保从开发到生产的新代码版本的一致性和自动化交付,无需手动干预,我们需要在 Kubernetes 中进行持续交付(CD)。

市场上有许多 Kubernetes CD 工具,但流行的包括 ArgoCD、FluxCD、JenkinsX 和 GitHub Actions。其中,ArgoCD 因其声明式和版本控制系统而成为大型企业的热门选择。根据官方文档:

ArgoCD 是一个声明式的 GitOps 持续交付工具,用于 Kubernetes。

应用程序定义、配置和环境是声明式的,应用程序部署和生命周期管理是自动化的且易于理解,这使得使用 ArgoCD 成为许多公司的理想选择。

ArgoCD 如何工作?

ArgoCD 遵循 GitOps 模式。它使用 Git 仓库作为定义所需应用程序状态的单一事实来源。它为我们提供了多种选项来描述 Kubernetes 清单:

  • Kustomize 应用程序
  • Helm 图表
  • Jsonnet 文件
  • 纯直接的 YAML/JSON 清单
  • 任何配置为配置管理插件的自定义配置管理工具

它自动化应用程序在指定目标环境中的所需状态。您可以通过分支和标签跟踪应用程序的部署,或固定在 Git 提交的特定清单版本。

ArgoCD 实现为 Kubernetes 控制器,持续监控运行的应用程序,并将当前状态与所需状态(在 Git 仓库中指定)进行比较。Git 仓库中的配置是单一事实来源。

当所需状态与当前状态不同时,应用程序处于 OutOfSync 状态。对此,ArgoCD 报告并可视化差异,同时提供自动或手动将实时状态同步回所需目标状态的设施。Git 仓库中的任何修改都将更改应用程序的所需状态。

基于推送与拉取的 CI/CD

早期的 CI/CD 实现依赖于推送驱动行为,它将集群连接到 CI/CD 平台,并在管道中使用 Kubectl 和 HELM 等工具应用 Kubernetes 更改。

ArgoCD 是一个基于拉取的 CI/CD 系统。它在您的 Kubernetes 集群内部运行,并从您的仓库拉取源。Argo 然后为您应用更改,无需手动配置管道。

此模型比基于推送的工作流更安全。您不必暴露集群的 API 服务器或将 Kubernetes 凭据存储在 CI/CD 平台中。泄露源仓库仅使攻击者能够访问您的代码,而不是代码和通往实时部署的路径。

架构

来源:ArgoCD 官方文档

组件:

ArgoCD 有三个组件:API 服务器、仓库服务器和应用程序控制器。每个都扮演关键角色;如果任何一个失败,应用程序将失败。让我们深入了解它们:

  • API 服务器:API 服务器是一个 gRPC/REST 服务器,暴露由 Web UI、CLI 和 CI/CD 系统使用的 API。它具有以下职责:

    • 应用程序管理和状态报告
    • 涉及应用程序操作(例如,同步、回滚)
    • 仓库和集群管理
    • 身份验证及其外部身份提供者
    • RBAC 强制执行
    • Git Webhook 的监听器
  • 仓库服务器:一个内部服务器,维护持有应用程序清单的 git 仓库的本地缓存。主要职责包括在提供以下输入时生成和返回 Kubernetes 清单:

    • 仓库 URL
    • 修订(提交、标签、分支)
    • 应用程序路径
    • 模板特定设置:参数、helm values.yaml
  • 应用程序控制器:一个 Kubernetes 控制器,持续监控运行的应用程序,并将当前状态与所需状态(在 git 仓库中指定)进行比较。它检测 OutOfSync 应用程序状态,并可选择采取纠正措施。它主要负责调用用户定义的钩子以处理生命周期事件,包括预同步、同步和后同步。

持续交付的挑战

Argo CD 通过为部署实施 GitOps 方法来应对若干持续交付挑战。它通过管理持续漂移、简化操作并确保更一致可靠的发布来自动化部署。以下是 Argo CD 解决的一些关键挑战:

  • 配置漂移:Argo CD 确保部署反映在 Git 中定义的应用程序所需状态(单一事实来源),并防止集群内的错误配置。
  • 自动化和可靠性:它通过消除手动步骤和减少错误来自动化部署。
  • 一致性和可靠性:使用 Git 作为源代码,它确保跨环境的一致部署,提高可靠性。
  • 多集群管理:它通过简化分布式环境中多个 Kubernetes 集群的部署来支持多集群管理。
  • 简化操作:它通过提供用户友好的界面简化操作,并自动化诸如一键回滚等任务。

ArgoCD 特性

  • 自动化部署应用程序到指定目标环境
  • 支持多种配置管理/模板工具(Kustomize、Helm、Jsonnet、纯 YAML)
  • 能够管理和部署到各种集群
  • 多租户和 RBAC 策略以进行授权
  • 回滚/随处滚动到 Git 仓库中提交的任何应用程序配置
  • 自动或手动同步应用程序到其所需状态
  • 提供应用程序活动实时视图的 Web UI
  • 用于自动化和 CI 集成的 CLI,Webhook 集成(GitHub、BitBucket、GitLab)
  • 用于自动化的访问令牌
  • 应用程序事件和 API 调用的审计跟踪
  • 用于覆盖 Git 中 helm 参数的 Prometheus 指标参数覆盖

案例研究:LoveHolidays、CVTE 和 BabyLon 等大型企业如何利用 ArgoCD 提高生产力?

ArgoCD 于 2020 年 3 月 26 日被 CNCF 接受为孵化成熟度级别,然后于 2022 年 12 月 6 日移至毕业成熟度级别。它已帮助许多公司,如 Love Holidays 和 CVTE,运行工作流、管理集群并正确执行 GitOps。

LoveHolidays 是英国和爱尔兰增长最快的在线旅行社之一。它于 2023 年扩展到德国市场,以无与伦比的轻松和不可错过的价值为客户提供无限选择,提供完美的假期体验。由于用户群增加,他们发现难以提高整体可观察性和事件检测。

为了解决这个问题,LoveHolidays 采用 LinkerD 作为其 Kubernetes 服务网格,以及 ARGOCD 用于 GitOps 和 Argo Rollouts 用于支持金丝雀部署。就数字而言,LoveHolidays 每天处理数万亿的酒店和航班组合,每月部署超过 1500 次生产部署,并在生产中运行约 5000 个 pod,约有 300 个部署/有状态集。

最近,他们从 Flux 迁移到 Argo CD,通过 Gitops 驱动的部署,他们在一个月内向生产部署了超过 1500 次。

CVTE 总部位于中国,是一家拥抱云原生技术的电子公司,多年来一直在 Kubernetes 上运行服务。他们的大多数应用程序在私有环境中的裸金属和边缘集群上运行,使得在集群外部访问这些应用程序具有挑战性。

为了解决这个问题,他们使用 OpenELB,通过第 2 层模式暴露裸金属上的负载均衡器服务。他们使用 ArgoCD 构建自动化管道,并使用 Nginx Ingress 处理第 7 层请求。在他们的域中,当他们访问其 ArogCD 服务器时,系统将请求转发到广播其请求的路由器。

通过使用 ARGOCD 和 openELB,公司降低了其基础设施的复杂性,增强了其自愈能力,并改善了其监控能力。

BabyLon 是一家英国初创公司,于 2013 年推出,帮助彻底改变医疗服务,并将医生预约的等待时间从几周或两周减少到仅几分钟或几小时。他们的产品利用机器学习和人工智能,内部运行服务的电力不足。

为了解决这个问题,他们于 2018 年使用 Kubeflow 将其面向用户的应用程序迁移到 Kubernetes 平台,这一变化令人难以置信!团队可以立即访问,而不是等待数小时或数天来计算。临床验证过去需要 10 小时,现在在 20 分钟内完成。使用 ArgoCD 进行 GitOps,团队可以大规模扩展流程。

使用 Argo CD 的最佳实践

以下是在使用 Argo CD 时需牢记的一些最佳实践:

  • 使用 ApplicationSets 进行动态应用程序管理——利用 ApplicationSets 从模板自动化部署类似应用程序(例如,每个租户或集群),减少样板和手动干预。
  • 固定 Argo CD 版本和 CRD——避免自动升级 Argo CD 或其自定义资源定义;显式固定版本以避免破坏性更改或应用程序中的意外行为。
  • 应用资源排除和忽略差异——配置资源排除或差异设置(例如,忽略状态字段)以防止误报漂移检测。
  • 为自动化和审计标记和标签应用程序——在您的 ArgoCD 应用程序上使用一致的元数据,以启用自动过滤、报告或生命周期管理。
  • 在专用命名空间或集群中运行 ArgoCD——将 Argo CD 隔离到特定命名空间或集群,以简化访问控制,避免冲突,并提高操作清晰度。

实战演示

在了解 Argo CD 及其应用之后,让我们进行一个动手演示,看看它是如何工作的。我们将在 minikube 集群中安装 Argo CD 并观察其魔力。请按照以下步骤操作:

  1. 如果您没有安装 minikube,请从其官方网站安装并运行以下命令:

    1
    
    minikube start
    
  2. 使用以下命令安装 ArgoCD:

    1
    2
    
    kubectl create namespace argocd
    kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
    
  3. 使用以下命令获取初始密码:

    1
    
    kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d
    

    复制输出并保存以供下一步使用。

  4. 使用端口转发暴露 ArgoCD API 服务器:

    1
    
    kubectl port-forward svc/argocd-server -n argocd 8081:443
    
  5. 现在转到您的 localhost:8081,您将收到警告,接受风险并继续。

  6. 在用户名中输入“admin”;密码是上一步保存的输出。

  7. 提供凭据后,您将看到 ArgoCD 仪表板。单击“创建应用程序”并提供以下配置:

    • 应用程序名称:argo-cd-demo
    • 项目名称:default
    • 同步策略:自动

    在源下,提供以下配置:

    • 仓库 URL:https://github.com/sitepoint-editors/argocd-demo
    • 修订:Head
    • 路径:manifests

    在目标下,提供以下配置:

    • 集群 URL:https://kubernetes.default.svc
    • 命名空间:default

    并点击“创建”。等待 2-3 分钟,以便 pod 健康运行。

  8. 现在在终端中,运行以下命令更改 nginx-deployment 的副本数量:

    1
    
    kubectl scale --replicas=2 deployment/nginx-deployment
    

    您将注意到 pod 数量将增加到 2,并且应用程序状态将为 OutOfSync。但是,一旦您单击“同步”,它将自动恢复到先前版本,就像在我们的 git 仓库中,我们指定了三个副本。您可以启用自愈以自动执行此任务。

  9. 由于我们的同步策略设置为自动,让我们在 git 仓库中进行一些更改,看看它们是否反映在应用程序中。在 deploy.yml 中,将副本数改为 8 而不是 3,并提交更改。几秒钟后,您将看到 ArgoCD 将拉取并反映我们应用程序中的更改。

  10. 完成后,只需运行以下命令清理资源:

    1
    
    minikube delete
    

参考文献

  • ArgoCD 官方文档
  • Kubernetes 官方文档
  • CNCF 案例研究
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计