深入解析ArgoCD:Kubernetes GitOps实战指南

本文全面介绍ArgoCD作为Kubernetes声明式GitOps持续交付工具的工作原理、架构特性及企业级实践。通过实际案例展示LoveHolidays、CVTE等企业如何利用ArgoCD实现大规模自动化部署,并包含minikube环境实战演示。

Key-Takeaways

ArgoCD(Kubernetes事实上的CD工具)通过使用GIT作为单一事实来源,使部署发布变得顺畅。您可以在Git中定义应用程序状态,ArgoCD将保持集群处于期望状态。

与传统基于推送的方法不同,ArgoCD在集群内部运行并从Git拉取变更,这确保API密钥和密钥不被暴露,使其成为大型企业更安全可靠的选择。

LoveHolidays和CVTE等大型企业采用ArgoCD处理大规模部署。例如LoviHoliday每月处理数万亿请求和1500多次部署,这都归功于ArgoCD。

ArgoCD解决了持续交付的核心挑战,如配置漂移、自动化部署工作流和多集群应用一致性。它确保跨环境的一致性,并让您只需一键即可回滚到先前版本,减少错误和压力。

本博客包含一个动手演示,展示在minikube集群上设置ArgoCD并实时观察同步变更的简易性。

Introduction

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

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

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

ArgoCD是Kubernetes的声明式GitOps持续交付工具。

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

How does ArgoCD work?

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

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

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

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

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

Push V/S Pull Based CI/CD

早期CI/CD实现依赖推送驱动行为,将集群连接到CI/CD平台,并在流水线中使用Kubectl和HELM等工具应用Kubernetes变更。

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

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

Architecture

来源: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应用状态,并可选择采取纠正措施。它主要负责调用用户定义的钩子处理生命周期事件,包括Pre-Sync、Sync和Post-Sync。

Challenges with Continuous Delivery

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

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

ArgoCD Features

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

Case Studies: How do big enterprises like LoveHolidays, CVTE, and BabyLon leverage ArgoCD to enhance productivity?

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个部署/StatefulSets。

最近,他们从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,团队可以大规模扩展流程。

Best Practices for Using Argo CD

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

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

A Practical Demonstration

了解Argo CD及其应用后,让我们进行动手演示,看看它是如何工作的。我们将在minikube集群中安装Argo CD并见证奇迹。请遵循以下步骤:

如果未安装minikube,请从其官方网站安装并运行以下命令:

1
minikube start

使用以下命令安装ArgoCD:

1
2
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

使用以下命令获取初始密码:

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

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

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

1
kubectl port-forward svc/argocd-server -n argocd 8081:443

现在访问localhost:8081,您将收到警告,接受风险并继续。

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

提供凭据后,您将看到ArgoCD仪表板。单击Create Application并提供以下配置:

  • 应用名称:argo-cd-demo
  • 项目名称:default
  • 同步策略:Automatic

在源下,提供以下配置:

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

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

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

并点击Create。等待2-3分钟,以便pod健康运行。

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

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

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

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

完成后,运行以下命令清理资源:

1
minikube delete

References

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