学习

Argo CD:它是什么以及为什么应该成为您的 Redis CI-CD 的一部分

什么是 Argo CD?

Argo CD 是“Argo”和“CD”这两个术语的组合,Argo 是一个用于 Kubernetes 的开源容器原生工作流引擎。它是一个 CNCF 托管项目提供了一种简单的方法来结合服务、工作流和事件驱动这三种计算模式,所有这些模式对于在 Kubernetes 上创建作业和应用都非常有用。它是一个引擎,可以轻松地指定、调度和协调 Kubernetes 上复杂工作流和应用的运行。名称中的 CD 是指持续交付(continuous delivery),它是持续集成(CI)的扩展,因为它会在构建阶段后自动将所有代码更改部署到测试和/或生产环境。 


Argo CD 遵循 GitOps 方法论GitOps 是一种持续交付方法论,围绕使用 Git 作为声明性基础设施和应用代码的单一事实来源展开。它会监视远程 Git 仓库中的新增或更新的 manifest 文件,并将这些更改与集群同步。通过在 Git 中管理 manifest 文件并将其与集群同步,您可以获得基于 Git 工作流的所有优势(版本控制、拉取请求评审、透明协作等),并在 Git 仓库中的内容与集群中部署的内容之间建立一对一的映射。

 Argo CD 使组织能够使用 GitOps 以声明方式构建和运行 Kubernetes 上的云原生应用和工作流。

Argo CD 是一个基于 pull 的、声明式的 GitOps 持续交付工具,专为 Kubernetes 设计,提供功能齐全的 UI。该工具从您的 Git 仓库读取环境配置,并将其应用到您的 Kubernetes 命名空间。应用定义、环境和配置应采用声明式并进行版本控制。应用部署和生命周期管理应自动化、可审计且易于理解。


Argo CD 专为简化和提高向 Kubernetes 集群的持续部署过程效率而构建,解决了多种挑战,例如:需要设置和安装 Jenkins 之外的其他工具才能完成到 Kubernetes 的 CI/CD 过程;需要配置 Kubernetes 的进出访问控制(包括云平台);在新应用推送到 Kubernetes 集群后需要了解部署状态等。


Argo CD 不仅部署在 Kubernetes 内部,更应该被视为 Kubernetes 的扩展,因为它使用现有的 Kubernetes 资源和功能(如 etcd 和控制器)来存储数据和监控应用状态的实时更新。

Argo CD 如何工作?

它通过更紧密地集成到 Kubernetes 集群中来解决上述持续交付过程中的问题。Argo CD 不会将更改推送到 Kubernetes 集群,而是拉取 Kubernetes manifest 更改并将其应用到集群。一旦在 Kubernetes 集群中设置了 Argo CD,您就可以配置 Argo CD 连接并跟踪 Git 仓库的更改。

如果检测到任何更改,Argo CD 会自动将这些更改应用到集群。现在,开发者可以提交代码(例如,通过 Jenkins),这会自动构建新的镜像,将其推送到 Docker 仓库,然后最终更新 Kubernetes manifest 文件,Argo CD 将自动拉取该文件,从而节省了手动工作,减少了初始设置配置,并消除了安全风险。但是,DevOps 团队对应用配置的其他更改怎么办?与 Git 仓库连接的任何 manifest 文件都将被 Argo CD 跟踪和同步,并拉取到 Kubernetes 集群中,为开发者和 DevOps 提供一个灵活的单一部署工具。

Argo CD 也会监控集群中的更改,这在有人手动更新集群时变得很重要。Argo CD 会检测到集群状态与 Git 仓库状态之间的差异。Argo CD 会比较 Git 仓库中期望的配置与 Kubernetes 集群中的实际状态,并将 Git 仓库中定义的内容同步到集群,覆盖任何手动进行的更新——确保 Git 仓库保持单一事实来源。当然,Argo CD 也足够灵活,可以配置为不自动覆盖手动更新,以便在需要直接对集群进行快速更新时发送警报而不是覆盖。

Argo CD 有哪些功能?

Argo CD 是一种非常简单有效的方式来实现声明式的版本控制应用部署,它能自动监控和拉取 Git 仓库中的 manifest 更改,同时还支持简单的回滚和恢复到先前状态,无需手动恢复集群中的每个更新。

它还通过 GitOps 工作流提供自动化和可追溯性,以及用于可视化 Kubernetes 资源的 Web UI。

Argo CD 支持多种方式定义 Kubernetes manifest:它支持 Kubernetes YAML 文件、Helm Charts、Kustomize 以及其他生成 Kubernetes manifest 的模板文件。

Argo CD 还提供命令行界面应用、Grafana 指标 Dashboard,以及应用事件和 API 调用的审计跟踪。

Argo CD 拥有非常简单的集群灾难恢复过程:如果一个集群发生故障,只需将新集群指向 Git 仓库,由于其声明式特性,它将自动重新创建完全相同的状态,无需任何人工干预。


使用 Git 和 Argo CD 控制 Kubernetes 集群访问非常简单——您可以配置谁可以提交合并请求,以及谁可以实际批准这些合并请求,从而通过 Git 以间接方式清晰地管理集群访问。此外,无需向 Jenkins 等其他工具提供外部访问权限,因为 Argo CD 已经在集群中运行,并且是唯一实际应用更改的工具,从而保证了集群凭证的安全。

先决条件

  • 安装 Docker Desktop

  • 启用 Kubernetes

  • 安装 Argo CD

开始

步骤 1. 安装 Argo CD

brew install argocd

骤 2. 创建新命名空间

创建一个命名空间 argocd,所有 Argo CD 资源将安装到其中。

kubectl create namespace argocd
步骤 3. 安装 Argo CD 资源
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml


kubectl get po -n argocd
NAME                                  READY   STATUS              RESTARTS   AGE
argocd-application-controller-0       0/1     ContainerCreating   0          3m9s
argocd-dex-server-65bf5f4fc7-5kjg6    0/1     Init:0/1            0          3m13s
argocd-redis-d486999b7-929q9          0/1     ContainerCreating   0          3m13s
argocd-repo-server-8465d84869-rpr9n   0/1     Init:0/1            0          3m12s
argocd-server-87b47d787-gxwlb         0/1     ContainerCreating   0          3m11s
步骤 4. 确保所有 Pod 都在运行
kubectl get po -n argocd
NAME                                  READY   STATUS    RESTARTS   AGE
argocd-application-controller-0       1/1     Running   0          5m25s
argocd-dex-server-65bf5f4fc7-5kjg6    1/1     Running   0          5m29s
argocd-redis-d486999b7-929q9          1/1     Running   0          5m29s
argocd-repo-server-8465d84869-rpr9n   1/1     Running   0          5m28s
argocd-server-87b47d787-gxwlb         1/1     Running   0          5m27s

步骤 5. 配置端口转发以访问 Dashboard

kubectl port-forward svc/argocd-server -n argocd 8080:443
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
步骤 6. 登录
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

HcD1I0XXXXXQVrq-

步骤 7. 使用 Homebrew 在 Mac 上安装 Argo CD CLI

brew install argocd

步骤 8. 访问 Argo CD API Server

默认情况下,Argo CD API Server 不会暴露外部 IP。要访问 API Server,请选择以下任一方法来暴露 Argo CD API Server

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
service/argocd-server patched
步骤 9. 登录 Argo CD
argocd login localhost      
WARNING: server certificate had error: x509: certificate signed by unknown authority. Proceed insecurely (y/n)? y
Username: admin
Password: 
'admin:login' logged in successfully
Context 'localhost' updated

步骤 10. 更新密码

% argocd account update-password
*** Enter password of currently logged in user (admin):                       
*** Enter new password for user admin: 
*** Confirm new password for user admin: 
Password updated
Context 'localhost' updated
ajeetraina@Ajeets-MacBook-Pro ~ % 

步骤 11. 注册要部署应用的集群

由于我们在 Docker Desktop 上运行,我们将相应地添加它。

argocd cluster add docker-desktop
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `docker-desktop` with full cluster level admin privileges. Do you want to continue [y/N]? y
INFO[0002] ServiceAccount "argocd-manager" created in namespace "kube-system" 
INFO[0002] ClusterRole "argocd-manager-role" created    
INFO[0002] ClusterRoleBinding "argocd-manager-role-binding" created 
Cluster 'https://kubernetes.docker.internal:6443' added

步骤 12. 创建新的 Redis 应用


点击“创建”并提供仓库 URL:https://github.com/argoproj/argo-cd/tree/master/manifests/base/redis 

argocd app list     
NAME       CLUSTER                                  NAMESPACE  PROJECT  STATUS  HEALTH   SYNCPOLICY  CONDITIONS  REPO                                 PATH                  TARGET
redisdemo  https://kubernetes.docker.internal:6443  argocd     default  Synced  Healthy  <none>      <none>      https://github.com/argoproj/argo-cd  manifests/base/redis  HEAD
步骤 13. 删除 Redis 应用
argocd app delete redisdemo
示例:投票应用

我们来尝试部署一个投票应用。投票应用每个客户端只接受一次投票。如果客户端已提交投票,则不会再次注册投票。

  • 一个 Python Web 应用,允许您在两个选项之间投票

  • 一个收集新投票的 Redis 队列

  • 一个 .NET worker,用于消费投票并将其存储到...

  • 一个由 Docker 卷支持的 Postgres 数据库

  • 一个显示实时投票结果的 Node.js Web 应用


前往 Argo CD 控制面板,输入 仓库 URL,并提供正确的 PATH。点击“Create App”(创建应用程序)以在 Docker Desktop 上部署应用程序。

接下来,通过选择“Group by Node”(按节点分组)来可视化完整的应用程序。

按父资源分组

点击“Events”(事件)部分,密切关注事件。

以下是投票应用程序的完整概览。

通过 http://localhost:31000/ 访问应用程序

通过 http://localhost:31001/ 访问结果
输入一些文本...