Argo CD应用管理

一个云原生应用程序通常包含多种Kubernetes资源类型,例如Deployment、ReplicaSet、Pod、PersistVolume、Service等,但在Kubernetes的原生能力下,并没有一个完整的概念可以直观地展示应用程序到底包含哪些资源。Argo CD通过Application CRD将分散在运行环境中的应用资源收敛在一起并通过统一视图的方式直观地展现给用户。除此之外,Argo CD还能在多集群环境下帮助用户中心化管理应用生命周期和应用发布。

Kubernetes环境中部署一个应用,我们需要声明式定义一些包含不同种类API资源对象的YAML编排文件,这些编排文件定义了应用包含哪些Service、Deployment、ConfigMap、Secret等子资源以及各个子资源的详细配置信息。如何高效管理或者重用这些应用编排,提高应用交付和运维效率是一个急需解决的问题。

Argo CD支持如下多种类型的应用编排。

  • Directory应用编排,即Kubernetes原生的应用编排方式。
  • Helm应用编排。
  • Kustomize应用编排。
  • Ksonnet应用编排,可以在GitHub访问其源码项目和使用方法,链接为https://github.com/ksonnet/ksonnet。
  • 对于其他类型的应用编排,Argo CD提供了一种插件的方式支持用户集成自定义应用编排工具Plugin。

Argo CD在创建应用时提供了选择应用编排方式的选项,默认为Directory。

创建应用

Argo CD支持使用CLI或者Web UI创建应用。先使用CLI从创建应用app01入手,逐步了解Argo CD是如何管理应用的。

1. 前置条件

使用Argo CD创建应用,需要指定源仓库和目标集群相关的信息,在本例中,将地址为https://github.com/haoshuwei/book-examples的Git仓库作为源仓库,部署应用Guestbook到线上生产集群production-aliyun和线下生产集群production-idc中。

首先,将源仓库(地址为https://github.com/haoshuwei/book-examples)添加至Argo CD系统,命令如下所示。

$ argocd repo add --name book-examples https://github.com/haoshuwei/book-examples
repository 'https://github.com/haoshuwei/book-examples' added

接着,将目标集群production-aliyun和production-idc添加至Argo CD系统,命令如下所示。

$ argocd cluster add kubernetes-admin-c0f5bbc7634e8446db9f3bde2cafc5d8b --name production-aliyun --kubeconfig=kubeconfig-production-aliyun
INFO[0000] ServiceAccount "argocd-manager" created in namespace "kube-system"
INFO[0000] ClusterRole "argocd-manager-role" created
INFO[0000] ClusterRoleBinding "argocd-manager-role-binding" created
Cluster 'https://192.168.0.32:6443' added

继续添加集群production-idc集群到Argo CD系统中,内容如下。

$ argocd cluster add minikube --name production-idc --kubeconfig=kubeconfig-production-idc
INFO[0000] ServiceAccount "argocd-manager" already exists in namespace "kube-system"
INFO[0000] ClusterRole "argocd-manager-role" updated
INFO[0000] ClusterRoleBinding "argocd-manager-role-binding" updated
Cluster 'https://192.168.0.238:8443' added

2. 使用CLI创建应用

使用CLI创建一个引用Git源仓库类型的应用,命令和参数格式如下所示。

$ argocd app create <APP NAME> --project <PROJECT NAME> --repo <GIT REPO URL> --revision <GIT REPO BRANCH/TAG> --path <GIT REPO SUBPATH> --dest-name   <CLUSTER NAME> --dest-namespace <CLUSTER NAMESPACE>

创建一个应用主要包含4部分参数配置,在本示例中,需要使用Argo CD部署应用Guestbook到集群production-aliyun中,应用Guestbook的Helm编排存放在地址https://github.com/haoshuwei/book-examples的Git源仓库子目录examples/guestbook/helm下,Git源仓库的部署分支为master,那么在创建应用guestbook-aliyun时需要相应地配置以下4部分内容。

1)基础配置

  • 应用名称:guestbook-aliyun。
  • 应用所属的项目:default。
  • 应用的同步(部署)策略:分为手动同步策略none和自动同步策略automated,如果设置为手动同步策略,则在Git源仓库中应用编排发生变化时,需要手动触发同步操作使其同步到实际运行环境中,如果设置为自动同步策略,那么Argo CD在检测到Git源仓库中的应用编排有变化时,会自动将其同步至实际运行环境。

2)源仓库配置

  • 源仓库类型:支持Git和Helm两种源仓库类型,本示例使用Git类型源仓库。
  • 源仓库地址:https://github.com/haoshuwei/book-examples。
  • 源仓库其他信息:如果是Git类型源仓库,则还需要配置修订版本信息和子目录信息,本示例中配置修订版本为master分支,子目录为examples/guestbook/helm;如果是Helm类型源仓库,则需要选择Helm Chart名称及其版本号。

3)目标集群配置

  • 目标集群的API Server地址或目标集群的名称:https://192.168.0.32:6443或production-aliyun。
  • 目标集群的命名空间:guestbook。

4)应用编排方式

  • Directory:表示Kubernetes原生的应用编排方式,其中最常用的一个参数设置项是--directory-recurse,值为true表示会把当前目录及其子目录下所有的编排文件都部署到集群中。
  • Kustomize:表示使用Kustomize工具进行应用编排,Argo CD支持为Kustomize编排设置--nameprefix和--namesuffix,即自动为应用添加前缀或后缀字段。
  • Helm:表示使用Helm工具进行应用编排,支持Helm 2和Helm 3,Argo CD会根据Chart.yaml文件中apiVersion的值是1还是2,判断使用Helm 2还是Helm 3,默认使用Helm 3。在Argo CD中,Helm类型应用编排支持选择任意参数配置文件,例如values.yaml或values-idc.yaml,对于参数配置文件中的各个参数项,也可以选择用新参数进行覆盖。
  • Ksonnet:表示使用Ksonnet工具进行应用编排,支持设置环境变量。
  • Plugin:表示使用用户自定义的编排工具,支持设置环境变量。

创建应用guestbook-aliyun的命令如下所示。

$ argocd app create guestbook-aliyun --project default --repo https://github.com/haoshuwei/book-examples --revision master --path examples/guestbook/helm--dest-server https://192.168.0.32:6443 --dest-namespace guestbook
application 'guestbook-aliyun' created

部署完毕后,可以查看当前应用列表,如下所示。

$ argocd app list
NAME              CLUSTER                    NAMESPACE  PROJECT  STATUS     HEALTH     SYNCPOLICY  CONDITIONS   REPO                                          PATH                     TARGET
guestbook-aliyun  https://192.168.0.32:6443  guestbook  default  OutOfSync  Missing    <none>      <none>       https://github.com/haoshuwei/book-examples    examples/guestbook/helm  master

通过上述命令可以看到,当前应用guestbook-aliyun属于项目default,应用引用的源仓库地址为https://github.com/haoshuwei/book-examples,源仓库分支为master,编排文件保存在examples/guestbook/helm目录下,应用将会被部署到API Server地址为https://192.168.0.32:6443、命名空间为guestbook的集群下。因为我们在创建应用时没有设置应用的同步策略,所以默认使用手动部署策略,即当前应用并没有真正被部署到集群环境中,只是将应用的编排文件下载到Argo CD系统中并将应用的多种子资源组合成一个应用,因此你会看到当前应用的STATUS字段的值为OutOfSync,HEALTH字段的值为Missing,表示应用Git源仓库中的声明式编排与环境中实际的运行状态不一致,且检测不到应用在实际环境中的运行状态。如果想将应用真正部署到集群中,则需要使用argocd app sync命令完成应用的同步操作。

Git源仓库中的声明式应用编排同步部署到集群,可以看到在应用部署到集群时关于应用及其子资源的一系列事件日志,如下所示。

$ argocd app sync guestbook-aliyun
TIMESTAMP                  GROUP  KIND        NAMESPACE  NAME          STATUS       HEALTH      HOOK  MESSAGE
2020-10-10T16:07:12+08:00         Service     guestbook  redis-slave   OutOfSync    Missing
2020-10-10T16:07:12+08:00  apps   Deployment  guestbook  frontend      OutOfSync    Missing
2020-10-10T16:07:12+08:00  apps   Deployment  guestbook  redis-master  OutOfSync    Missing
2020-10-10T16:07:12+08:00  apps   Deployment  guestbook  redis-slave   OutOfSync    Missing
2020-10-10T16:07:12+08:00         Service     guestbook  frontend      OutOfSync    Missing
2020-10-10T16:07:12+08:00         Service     guestbook  redis-master  OutOfSync    Missing
2020-10-10T16:07:12+08:00         Service     guestbook  redis-master  Synced       Healthy
2020-10-10T16:07:12+08:00         Service     guestbook  redis-slave   Synced       Healthy
2020-10-10T16:07:12+08:00         Service     guestbook  frontend      Synced       Healthy
2020-10-10T16:07:13+08:00  apps   Deployment  guestbook  redis-master  OutOfSync    Missing           deployment.apps/redis-master created
2020-10-10T16:07:13+08:00  apps   Deployment  guestbook  frontend      OutOfSync    Missing           deployment.apps/frontend created
2020-10-10T16:07:13+08:00         Service     guestbook  redis-master  Synced       Healthy           service/redis-master created
2020-10-10T16:07:13+08:00         Service     guestbook  redis-slave   Synced       Healthy           service/redis-slave created
2020-10-10T16:07:13+08:00         Service     guestbook  frontend      Synced       Healthy           service/frontend created
2020-10-10T16:07:13+08:00  apps   Deployment  guestbook  redis-slave   OutOfSync    Missing           deployment.apps/redis-slave created
2020-10-10T16:07:13+08:00  apps   Deployment  guestbook  redis-slave   Synced       Progressing       deployment.apps/redis-slave created
2020-10-10T16:07:13+08:00  apps   Deployment  guestbook  redis-master  Synced       Progressing       deployment.apps/redis-master created
2020-10-10T16:07:13+08:00  apps   Deployment  guestbook  frontend      Synced       Progressing       deployment.apps/frontend created
Name:               guestbook-aliyun
Project:            default
Server:
Namespace:          guestbook
URL:                https://172.27.8.59/applications/guestbook-aliyun
Repo:               https://github.com/haoshuwei/book-examples
Target:             master
Path:               examples/guestbook/helm
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        Synced to master (14afbac)
Health Status:      Progressing
Operation:          Sync
Sync Revision:      14afbac60b545658db6c666b13e5efefac95b211
Phase:              Succeeded
Start:              2020-10-10 16:07:11 +0800 CST
Finished:           2020-10-10 16:07:12 +0800 CST
Duration:           1s
Message:            successfully synced (all tasks run)
GROUP  KIND        NAMESPACE  NAME          STATUS  HEALTH       HOOK  MESSAGE
       Service     guestbook  redis-master  Synced  Healthy            service/redis-master created
       Service     guestbook  redis-slave   Synced  Healthy            service/redis-slave created
       Service     guestbook  frontend      Synced  Healthy            service/frontend created
apps   Deployment  guestbook  redis-slave   Synced  Progressing        deployment.apps/redis-slave created
apps   Deployment  guestbook  redis-master  Synced  Progressing        deployment.apps/redis-master created
apps   Deployment  guestbook  frontend      Synced  Progressing        deployment.apps/frontend created

再次查看应用列表,可以看到应用的STATUS字段更新为Synced,HEALTH字段更新为Healthy。

$ argocd app list
NAME              CLUSTER                    NAMESPACE  PROJECT  STATUS  HEALTH     SYNCPOLICY  CONDITIONS   REPO                                          PATH                     TARGET
guestbook-aliyun  https://192.168.0.32:6443  guestbook  default  Synced  Healthy <none>      <none>       https://github.com/haoshuwei/book-examples    examples/guestbook/helm  master

实际上,在成功将应用部署至目标集群的过程中,应用的健康状态会经历从Missing到Progressing再到Healthy的变化。

以同样的方式部署应用guestbook-idc到API Server地址为https://192.168.0.238:8443的集群production-idc中,与guestbook-aliyun相比,除了目标集群不同,我们还需要指定应用guestbook-idc在部署时使用values-idc.yaml文件,可以通过--values来指定这个配置,应用创建命令如下所示。

$ argocd app create guestbook-idc --project default --repo https://github.com/haoshuwei/book-examples --revision master --path examples/guestbook/helm --dest-server https://192.168.0.238:8443 --dest-namespace guestbook --values values-idc.yaml
application 'guestbook-idc' created

使用以下命令完成应用guestbook-idc的部署。

$ argocd app sync guestbook-idc

3. 使用UI创建应用

首先,通过导航栏进入applications页面。

点击NEW APP或者CREATE APPLICATION新建一个应用,此时会弹出一个应用配置页面的滑窗,如下所示。

 

应用创建配置页面

依次完成Guestbook应用的基础配置、源仓库配置、目标集群配置和Helm应用编排配置。点击CREATE完成应用的创建,此时会自动跳转回应用列表页面,如下所示。

 

应用列表

从图中可以看出,guestbook-aliyun应用当前的状态为Missing,需要点击Sync按钮,在弹出的滑窗中继续点击SYNCHRONIZE完成应用的部署。

部署完毕且应用运行正常则会看到guestbook应用的状态会变为Healthy。

在创建应用guestbook-idc时,与guestbook-aliyun唯一不同的参数配置是应用名称、目标集群地址以及Helm参数配置文件,最终部署好的应用状态如下所示。

 

应用guestbook-aliyun和guestbook-idc状态都为Healthy

应用的统一视图管理

Kubernetes原生的能力并没有一个完整的所谓“应用”的概念,所有Kubernetes资源都分散在集群中,不便查看和运维。Argo CD在应用的维度提供了一个统一视图的能力,可以非常方便地对多云混合云多集群环境下的应用进行统一视图和管控,分别在线上集群production-aliyun和线下集群production-idc中部署了应用guestbook-aliyun和guestbook-idc,可以通过Argo CD查看应用列表以及各个应用的概览信息,如下所示。

 

应用列表和概览

点击应用进入详情页面,可以直观地看到应用包含的多种Kubernetes子资源及拓扑关系,如图是应用guestbook-aliyun的资源拓扑图。

 

应用资源拓扑图

在这个页面中,我们可以清晰地看到应用在集群中的运行状态为Healthy,当前应用在环境中的实际运行状态与源仓库中声明的应用状态保持同步状态(Synced),且当前应用版本为master分支下commit id为14afbac的部署。

此外,还有很多功能选项帮助用户从多个维度了解当前应用的详细情况,例如点击APP DETAILS按钮可以查看应用详情。在应用详情页面中,可以查看应用的概览信息,如下所示。

 

应用详情之概览信息

最后,还可以在应用的资源拓扑图中点击指定的子资源并查看资源概况、事件信息、在实际环境和源仓库中的编排清单及其差异等信息,展示的是Deployment资源frontend的详细信息。

posted @ 2023-01-25 11:51  muzinan110  阅读(277)  评论(0编辑  收藏  举报