在Argo CD中自动创建多个应用程序

799 阅读4分钟

在之前的文章中,我演示了Argo CD如何使基于拉动的GitOps部署变得简单。在本教程中,我将向你展示如何使用Argo CD本身在Argo CD中自动创建多个应用程序。

由于Argo CD的工作是监听 repo,并将它发现的Manifest文件应用到集群中,你也可以用这种方法来配置Argo CD的内部结构。在我之前的例子中,我使用GUI创建了一个有三个副本的Nginx应用程序样本。这一次,我使用与之前相同的方法,但我从GUI中创建一个应用程序,以部署三个独立的应用程序。app-1,app-2, 和app-3

配置我们的子应用程序

首先,先为你的三个应用程序创建Manifest文件。在我的example-assets 仓库中,我已经在argocd/my-apps创建了三个应用程序。这三个应用程序都是Nginx,有三个副本。请确保在自己的文件夹中创建每个应用程序。

创建一个YAML文件来定义第一个应用程序,并将其保存为my-apps/app-1/app.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-1
  labels:
    app: nginx-app-1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-app-1
  template:
    metadata:
      labels:
        app: nginx-app-1
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

为第二个应用程序创建另一个YAML文件,并保存为my-apps/app-2/app.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-2
  labels:
    app: nginx-app-2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-app-2
  template:
    metadata:
      labels:
        app: nginx-app-2
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

为你的最终应用程序创建第三个文件,并保存为my-apps/app-3/app.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-3
  labels:
    app: nginx-app-3
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx-app-3
  template:
    metadata:
      labels:
        app: nginx-app-3
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

现在你的Manifest文件已经准备好了,你必须创建指向这些Manifest的Argo CD应用程序。

Argo CD可以通过三种不同的方式进行配置:使用GUI、使用CLI或使用Kubernetes Manifest文件。在这篇文章中,我使用第三种方法。

在一个新文件夹中创建以下Manifest文件argocd/argo-apps 。这是argocd-apps/app-1.yml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-1
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  project: default
  source:
    path: argocd/my-apps/app-1
    repoURL: https://gitlab.com/ayush-sharma/example-assets.git
    targetRevision: HEAD

这是argocd-apps/app-2.yml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-2
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  project: default
  source:
    path: argocd/my-apps/app-2
    repoURL: https://gitlab.com/ayush-sharma/example-assets.git
    targetRevision: HEAD

而这是argocd-apps/app-3.yml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-3
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  project: default
  source:
    path: argocd/my-apps/app-3
    repoURL: https://gitlab.com/ayush-sharma/example-assets.git
    targetRevision: HEAD

如你所见,你正在argocd 命名空间中创建一个名为Application 的Kubernetes对象。这个对象包含了源 Git 仓库和目标服务器的详细信息。你的应用程序正指向你之前创建的Nginx清单文件。

配置我们的主应用程序

现在你需要告诉Argo CD如何找到你的三个Nginx应用程序。通过创建另一个应用程序来做到这一点。这种模式被称为App of Apps 模式,其中一个应用程序包含部署多个子应用程序的指令。

在GUI中创建一个新的应用程序,名为my-apps ,配置如下。

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-apps
spec:
  destination:
    namespace: default
    server: 'https://kubernetes.default.svc'
  source:
    path: argocd/argocd-apps
    repoURL: 'https://gitlab.com/ayush-sharma/example-assets.git'
    targetRevision: HEAD
  project: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

一旦它被创建,my-apps 开始在GUI中进行同步。

Automating ArgoCD with ArgoCD! - Main app.

图1:用ArgoCD自动化!- 主应用程序。

同步完成后,你的三个Nginx应用程序也出现在GUI中。

Automating ArgoCD with ArgoCD! - Dashboard.

图2:用ArgoCD!自动生成ArgoCD!仪表盘。- 仪表板。

由于你没有启用AutoSync ,所以手动同步app-1app-2app-3 。一旦同步,你的Nginx副本就会被部署到所有三个应用程序。

Automating ArgoCD with ArgoCD! - Deployment.

图3:用ArgoCD!自动部署ArgoCD。- 部署。

总结

掌握App of Apps 模式对于充分利用Argo CD的全部功能至关重要。这种方法允许你干净地管理应用程序组。例如,部署Prometheus、Grafana、Loki和其他重要服务可以由DevOps应用程序管理,而部署前端代码则可以由前端应用程序管理。为每个人配置不同的同步选项和 repo 位置,可以精确控制不同的应用程序组。