Argo CD 创建部署应用

发布时间 2023-08-10 17:34:37作者: evescn

创建应用

Git 仓库 https://gitee.com/gmkk/kustomize-demo.git 是一个示例库,可以用该应用来演示 Argo CD 的工作原理。

通过 CLI 创建应用

使用 argocd app create xxx 命令来创建一个应用:

$ argocd app create --help
Create an application

Usage:
  argocd app create APPNAME [flags]

Examples:

  # Create a directory app
  argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --directory-recurse

  # Create a Jsonnet app
  argocd app create jsonnet-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path jsonnet-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --jsonnet-ext-str replicas=2

  # Create a Helm app
  argocd app create helm-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path helm-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --helm-set replicaCount=2

  # Create a Helm app from a Helm repo
  argocd app create nginx-ingress --repo https://kubernetes-charts.storage.googleapis.com --helm-chart nginx-ingress --revision 1.24.3 --dest-namespace default --dest-server https://kubernetes.default.svc

  # Create a Kustomize app
  argocd app create kustomize-guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path kustomize-guestbook --dest-namespace default --dest-server https://kubernetes.default.svc --kustomize-image gcr.io/heptio-images/ks-guestbook-demo:0.1

  # Create a app using a custom tool:
  argocd app create ksane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasane


Flags:
......

直接执行如下所示命令即可:

# login
[root@node argocd]# argocd login argocd.evescn.com:20080 --insecure 

# list
[root@node argocd]# argocd app list

# create
[root@node ~]# argocd app create t1 --repo https://gitee.com/gmkk/kustomize-demo.git --revision main --path base --dest-server https://kubernetes.default.svc --dest-namespace default
application 't1' created

通过 UI 创建应用

除了可以通过 CLI 工具来创建应用,我们也可以通过 UI 界面来创建,定位到 argocd.k8s.local 页面,登录后,点击 +New App 新建应用按钮,如下图:

New App

将应用命名为 t2,使用 default project,并将同步策略设置为 Manual

配置应用

然后在下面配置 Repository URLhttps://gitee.com/gmkk/kustomize-demo.git,将 Revision 设置为 HEAD,并将路径设置为 base。然后下面的 Destination 部分,将 cluster 设置为 in-cluster 和 namespace 为 default

配置Repo

填写完以上信息后,点击页面上方的 Create 安装,即可创建 t2 应用,创建完成后可以看到当前应用的处于 OutOfSync 状态:

t2 application

Argo CD 默认情况下每 3 分钟会检测 Git 仓库一次,用于判断应用实际状态是否和 Git 中声明的期望状态一致,如果不一致,状态就转换为 OutOfSync 。默认情况下并不会触发更新,除非通过 syncPolicy 配置了自动同步。

通过 CRD 创建

除了可以通过 CLI 和 Dashboard 可以创建 Application 之外,其实也可以直接通过声明一个 Application 的资源对象来创建一个应用,如下所示:

## t3.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: t3
  finalizers: []
spec:
  destination:
    name: ''
    namespace: default
    server: 'https://kubernetes.default.svc'
  source:
    path: base
    repoURL: 'https://gitee.com/gmkk/kustomize-demo.git'
    targetRevision: main
  sources: []
  project: default
  syncPolicy:
    automated: null

## 部署服务
[root@node argocd]# kubectl -n argocd apply -f t3.yaml 
application.argoproj.io/t3 created

[root@node argocd]# kubectl -n argocd get applications
NAME   SYNC STATUS   HEALTH STATUS
t1     OutOfSync     Missing
t2     OutOfSync     Missing
t3     OutOfSync     Missing

CRD

部署应用

由于上面我们在创建应用的时候使用的同步策略为 Manual,所以应用创建完成后没有自动部署,需要我们手动去部署应用。同样可以通过 CLI 和 UI 界面两种同步方式。

使用 CLI 同步

应用创建完成后,我们可以通过如下所示命令查看其状态:

[root@node argocd]# argocd app get t1
Name:               argocd/t1
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          default
URL:                https://argocd.evescn.com/applications/t1
Repo:               https://gitee.com/gmkk/kustomize-demo.git
Target:             
Path:               base
SyncWindow:         Sync Allowed
Sync Policy:        <none>
Sync Status:        OutOfSync from  (3ec469a)
Health Status:      Missing

CONDITION              MESSAGE                                                         LAST TRANSITION
SharedResourceWarning  Deployment/nginx is part of applications argocd/t1 and t3       2023-08-09 10:40:19 +0800 CST
SharedResourceWarning  Service/nginx-service is part of applications argocd/t1 and t3  2023-08-09 10:40:19 +0800 CST


GROUP  KIND        NAMESPACE  NAME           STATUS     HEALTH   HOOK  MESSAGE
       Service     default    nginx-service  OutOfSync  Missing        
apps   Deployment  default    nginx          OutOfSync  Missing  

应用程序状态为初始 OutOfSync 状态,因为应用程序尚未部署,并且尚未创建任何 Kubernetes 资源。要同步(部署)应用程序,可以执行如下所示命令:

argocd app sync t1

此命令从 Git 仓库中检索资源清单并执行 kubectl apply 部署应用,执行上面命令后 t1 应用便会运行在集群中了,现在我们就可以查看其资源组件、日志、事件和评估其健康状态了。

img

通过 UI 同步

直接添加 UI 界面上应用的 Sync 按钮即可开始同步:

img

img

sync 操作

同步完成后可以看到我们的资源状态:

Sync 完成

也可以通过 kubectl 查看到我们部署的资源:

[root@node argocd]# kubectl get pods
NAME                    READY   STATUS    RESTARTS       AGE
nginx-589cf4885-bcpjr   1/1     Running   0              6m1s

[root@node argocd]# kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.68.0.1       <none>        443/TCP   8d
nginx-service   ClusterIP   10.68.160.182   <none>        80/TCP    6m4s

和我们从 Git 仓库中同步 base 目录下面的资源状态也是同步的,证明同步成功了。

期望状态

更新/回滚服务

服务部署完成后,我们可以修改 git 仓库中,资源定义的 pod 数量 replicas: 3 ,查看 argoCD 是否回触发检查

img

在 UI 界面上点击 Sync 按钮即开始同步:

img

完成服务 pod 数量从 1 到 3 后,接下来我们进行服务回滚,点击 UI 界面 History and rollback 按钮

img

在需要回滚的版本上点击右侧3个点,进行服务回滚

img

Argo CD 参数

创建服务参数

img

  • Application Name: 服务名称
  • Project Name: 服务所属项目,没有创建项目,默认为空
  • SYNC POLICY: 同步策略
    • Manual: 手动同步
    • Automatic: 自动同步
      • ​​RRUNE RESOURCES​​:自动修剪。集群上某个资源在 GitRepo 中找不到对应的配置时,自动删除集群上的该资源
      • ​​SELF HEAL​​:自愈。因各种原因(如手动修改)集群上资源的实时状态而导致与 GitRepo 不匹配时,自动将实际状态与 GitRepo 的期望状态同步。例如,GitRepo 中定义 pod 的数量为2,你在集群上改为了 3 个 pod,如果你不勾选 self heal。则 ArgoCD 则不会在同步(对一次提交只同步一次),这时 pod 的数量就一直为 3。但你如果勾选了 self heal,ArgoCD 就会轮询去同步,将你的 pod 改为你 GitRepo 里的数量

自动同步仅发生在应用处于 OutOfSync 状态时,ArgoCD 并不会对处于 Synced 或 Error 状态的 Application 执行自动同步,对于 GitRepo 上的一次提交,自动同步仅会执行一次,除非同时启用 Self Heal 机制,启用了自动同步的 Application 不支持 RollBack

img

  • SYNC OPTIONS(同步选项)
    • SKIP SCHEMA VALIDATION​​:是否执行资源规范格式的校验,相当于 ”kubectl apply --validate={true|false}“,默认为 true

    • AUTO-CREATE NAMESPACE​​:自动创建命名空间。如果部署的应用没有命名空间,则自动创建

    • ​PRUNE LAST​​:同步后进行修剪,即其他资源已经部署且转为健康状态后在进行 prune

    • APPLY OUT OF SYNC ONLY​​​:仅对那些处于 ​​OutOfSync​​​ 状态的资源执行同步操作。避免大量对象时资源APl消耗

    • RESPECT IGNORE DIFFERENCES​​​:支持忽略差异配置

    • SERVER-SIDE APPLY:部署操作在服务端运行(避免文件过大)

    • ​​PRUNE PROPAGATION POLICY​​:资源修剪传播策略,默认值使用 foreground 策略,还有 background 和 orphan

    • REPLACE​​:将使用 kubectl replace 命令同步资源,而非默认的 apply

  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - Validate=false #禁用Kubectl验证
      - CreateNamespace=true # 自动创建命名空间
      - PruneLast=true # 同步后进行修剪
      - ApplyOutOfSyncOnly=true # 仅对那些处于 ​​OutOfSync​​​ 状态的资源执行同步操作
      - RespectIgnoreDifferences=true #支持忽路差异配置 (ianoreDifferences)
      - PrunePropagationPolicy=background # 级联删除策略 (backoround. foreground and orphan.)
      - Replace=true # kubectl replace替换

详细文档:https://argo-cd.readthedocs.io/en/stable/user-guide/sync-options/

img

  • SOURCE
    • Repository URL:定义k8s资源清单的 git 仓库地址
    • Revision:要使用的 Revision,通常是指源码库上的 branch、tag、commit 或 helm chart 版本
    • Path:git 仓库中含有配置文件的子目录路径

img

  • DESTINATION
    • CLuster URL:部署的目标集群
    • Namespace:部署集群的 namespace

img

  • Directory:这里还可以选择 helm、Kustomize、Plugin 等

img

服务状态信息

img

  • Synced:已同步
  • OutOfSync:未同步

img

  • Healthy:健康资源
  • Progressing:正在执行
  • Suspended:资源挂载暂停
  • Healthy:资源监控
  • Degraded:资源故障
  • Missing:集群不存在资源

自动同步参数

Argo CD 资源检测周期默认时间为 180s,如果要修改此配置,可以在 argocd-configmap 中新增配置:

timeout.reconciliation: 180s

sync process 同步流程

  • 获取所有设置为 auto-sync 的 Apps
  • 从每个 App 的 Git 存储库中获取最新状态
  • 将 Git 状态与集群应用状态对比
  • 如果相同,不执行任何操作并标记为 synced
  • 如果不同,标记为 out-of-sync