Argo CD 创建部署应用
Argo CD
创建部署应用
创建应用
Git 仓库 https://gitee.com/evescn/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/evescn/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
新建应用按钮,如下图:
将应用命名为 t2,使用 default project,并将同步策略设置为 Manual
:
然后在下面配置 Repository URL
为 https://gitee.com/evescn/kustomize-demo.git,将 Revision 设置为 HEAD,并将路径设置为 base。然后下面的 Destination 部分,将 cluster 设置为 in-cluster
和 namespace 为 default
:
填写完以上信息后,点击页面上方的 Create 安装,即可创建 t2 应用,创建完成后可以看到当前应用的处于 OutOfSync
状态:
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/evescn/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
部署应用
由于上面我们在创建应用的时候使用的同步策略为 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/evescn/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 应用便会运行在集群中了,现在我们就可以查看其资源组件、日志、事件和评估其健康状态了。
通过 UI 同步
直接添加 UI 界面上应用的 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 是否回触发检查
在 UI 界面上点击 Sync
按钮即开始同步:
完成服务 pod 数量从 1 到 3 后,接下来我们进行服务回滚,点击 UI 界面 History and rollback
按钮
在需要回滚的版本上点击右侧3个点,进行服务回滚
Argo CD
参数
创建服务参数
- 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
- 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/
- SOURCE
- Repository URL:定义k8s资源清单的 git 仓库地址
- Revision:要使用的 Revision,通常是指源码库上的 branch、tag、commit 或 helm chart 版本
- Path:git 仓库中含有配置文件的子目录路径
- DESTINATION
- CLuster URL:部署的目标集群
- Namespace:部署集群的 namespace
- Directory:这里还可以选择 helm、Kustomize、Plugin 等
服务状态信息
- Synced:已同步
- OutOfSync:未同步
- 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