创建应用

在仓库 ​​https://gitee.com/zouzou_busy/devops_test​​​ 里有个 app 目录,里面有个 ​​myapp-deployment.yaml​​​ 文件 和 ​​myapp-service.yaml​​ 文件,用来演示我们 argo cd 的功能

myapp-deployment.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: zouzou0214/myapp:v1
name: myapp
ports:
- containerPort: 8008

myapp-service.yaml

apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- port: 8008
targetPort: 8008
type: NodePort
selector:
app: myapp

通过 CLI 来创建应用

[root@master1 ~]# 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://charts.helm.sh/stable --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 kasane --repo https://github.com/argoproj/argocd-example-apps.git --path plugins/kasane --dest-namespace default --dest-server https://kubernetes.default.svc --config-management-plugin kasan

Flags:
......

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

argocd app create app01 --repo https://gitee.com/zouzou_busy/devops_test.git --path app --dest-server https://kubernetes.default.svc --dest-namespace demo1
application 'app01' created
  • app01:应用的名称
  • --repo:仓库地址
  • --path:仓库里存放资源的路径,我这里的是在 app 目录下
  • --dest-server:部署到的服务器地址
  • --dest-namespace:部署的命名空间地址,我这里为 demo1

部署成功后就可以在页面上查看到了

云原生--argocd 创建应用、部署应用、回滚_命名空间

通过 UI 创建应用

除了上面使用命令行创建之外,我们还可以使用 ui 进行创建

登录 ui 后,点击 +NEW APP 创建应用,如下

云原生--argocd 创建应用、部署应用、回滚_git_02

将应用命名为 app02,使用 default project,并将同步策略设置为 Manual。如下

云原生--argocd 创建应用、部署应用、回滚_git_03

​SYNC POLICY​​​ 如果选择的是 ​​Automatic​​ 后,会有两个选项,如下

云原生--argocd 创建应用、部署应用、回滚_git_04

​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​​​ 状态的资源执行同步操作。一个​​path​​​ 下可能有多个资源,有些是​​synced​​​ 的,有些是​​OutOfSync​​ 的,勾选上之后,只对 OutOfSync 的资源做同步
  • ​REPLACE​​:将使用 kubectl replace/create 命令同步资源,而非默认的 apply
  • ​PRUNE PROPAGATION POLICY​​:资源修剪传播策略,默认值使用 foreground 策略,还有 background 和 orphan
  • ​RESPECT IGNORE DIFFERENCES​​​:在同步阶段忽略期望状态的字段。例如我们有个 deployment,里面的 replicas 为 20。代表我们期望的 pod 数量为 20 个,但如果我们进行灰度发布的时候,可能多,也可能少。这个时候,如果不勾选​​RESPECT IGNORE DIFFERENCES​​ ,就会导致灰度发布出现问题,所以这时候我们最好是勾选上该参数

然后在下面配置 ​​Repository URL​​​ 为 ​​https://gitee.com/zouzou_busy/devops_test.git​​​,将 Revision 设置为 HEAD,并将路径设置为 app。然后下面的 Destination 部分,将 cluster 设置为 ​​inCluster​​ 和 namespace 为 demo2

云原生--argocd 创建应用、部署应用、回滚_命名空间_05

SOURCE

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

DESTINATION

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

Directory:这里还可以选择 helm、Kustomize、Plugin 等。下面以 directory 为例

  • DIRECTORY RECURSE:对目录进行递归

对应的 yaml 可以点击右上角 EDIT AS YAML 查看

云原生--argocd 创建应用、部署应用、回滚_github_06

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app02
spec:
destination:
name: ''
namespace: demo2
server: 'https://kubernetes.default.svc'
source:
path: app
repoURL: 'https://gitee.com/zouzou_busy/devops_test.git'
targetRevision: HEAD
project: default
syncPolicy:
automated: null
syncOptions:
- CreateNamespace=true

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

云原生--argocd 创建应用、部署应用、回滚_命名空间_07

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

通过 CRD 创建

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

创建一个 argocd-app03.yaml 文件,内容如下

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: app03 # 名称为 app03
spec:
destination:
name: ''
namespace: demo3 # 命名空间为 demo3
server: 'https://kubernetes.default.svc'
source:
path: app
repoURL: 'https://gitee.com/zouzou_busy/devops_test.git'
targetRevision: HEAD
project: default
syncPolicy:
automated: null
syncOptions:
- CreateNamespace=true

云原生--argocd 创建应用、部署应用、回滚_命名空间_08

部署应用

上面我们创建好了应用,但还没有部署,所以 namespace、pod、deployment、svc 都没有

使用 CLI 同步

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

# 查看应用 app01 的状态
[root@master1 k8s-yaml]# argocd app get app01
Name: app01 # 应用名称
Project: default
Server: https://kubernetes.default.svc # 部署的服务
Namespace: demo1 # 部署的 ns
URL: https://10.6.215.30:32382/applications/app01
Repo: https://gitee.com/zouzou_busy/devops_test.git # 资源仓库
Target:
Path: app # 仓库里的资源路径
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: OutOfSync from (d7306f4) # 同步状态
Health Status: Missing # 健康状态

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp OutOfSync Missing
apps Deployment demo1 myapp OutOfSync Missing

因为 app01 是我们通过命名行创建的,ns 写的是 demo1,没有设置自动创建。如果你集群上没有这个命名空间,需要先手动创建

# 创建 ns
[root@master1 k8s-yaml]# kubectl create ns demo1
namespace/demo1 created

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

# 同步应用 app01
[root@master1 k8s-yaml]# argocd app sync app01
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2022-08-18T21:40:18+08:00 Service demo1 myapp OutOfSync Missing
2022-08-18T21:40:18+08:00 apps Deployment demo1 myapp OutOfSync Missing
2022-08-18T21:40:18+08:00 Service demo1 myapp Synced Healthy
2022-08-18T21:40:19+08:00 apps Deployment demo1 myapp OutOfSync Missing deployment.apps/myapp created
2022-08-18T21:40:19+08:00 Service demo1 myapp Synced Healthy service/myapp created
2022-08-18T21:40:19+08:00 apps Deployment demo1 myapp Synced Progressing deployment.apps/myapp created

Name: app01
Project: default
Server: https://kubernetes.default.svc
Namespace: demo1
URL: https://10.6.215.30:32382/applications/app01
Repo: https://gitee.com/zouzou_busy/devops_test.git
Target:
Path: app
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to (d7306f4)
Health Status: Progressing

Operation: Sync
Sync Revision: d7306f4c729378979e1972a2cf857a9847ba0b8e
Phase: Succeeded
Start: 2022-08-18 21:40:18 +0800 CST
Finished: 2022-08-18 21:40:19 +0800 CST
Duration: 1s
Message: successfully synced (all tasks run)

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp Synced Healthy service/myapp created
apps Deployment demo1 myapp Synced Progressing deployment.apps/myapp created

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

在查看 app01 的状态

# 查看应用 app01 的状态
[root@master1 k8s-yaml]# argocd app get app01
Name: app01
Project: default
Server: https://kubernetes.default.svc
Namespace: demo1
URL: https://10.6.215.30:32382/applications/app01
Repo: https://gitee.com/zouzou_busy/devops_test.git
Target:
Path: app
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to (d7306f4)
Health Status: Progressing # 状态为 Progressing(进行中)了

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp Synced Healthy service/myapp created # 状态是 Healthy
apps Deployment demo1 myapp Synced Progressing deployment.apps/myapp created # 状态也是 Progressing

等一会在去查看状态

[root@master1 k8s-yaml]# argocd app get app01
Name: app01
Project: default
Server: https://kubernetes.default.svc
Namespace: demo1
URL: https://10.6.215.30:32382/applications/app01
Repo: https://gitee.com/zouzou_busy/devops_test.git
Target:
Path: app
SyncWindow: Sync Allowed
Sync Policy: <none>
Sync Status: Synced to (d7306f4)
Health Status: Healthy # 状态为 Healthy(健康)的了

GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp Synced Healthy service/myapp created # 状态也是 Healthy
apps Deployment demo1 myapp Synced Healthy deployment.apps/myapp created # 状态也是 Healthy

 然后查看 pod、deploy、svc

# pod、svc、deploy 都正常运行了
[root@master1 k8s-yaml]# kubectl get pod,svc,deploy -n demo1
NAME READY STATUS RESTARTS AGE
pod/myapp-85757559dc-2j46l 1/1 Running 0 8m12s
pod/myapp-85757559dc-hz57n 1/1 Running 0 8m12s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.111.135.216 <none> 8008:32060/TCP 8m12s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 2/2 2 2 8m12s

访问 ip:32060,可以看到下面页面则表示部署成功

云原生--argocd 创建应用、部署应用、回滚_git_09

通过 UI 页面同步

可以看到上面我们使用命令行同步的已经在 ui 上显示正常了,状态也是 Healthy 的

云原生--argocd 创建应用、部署应用、回滚_git_10

在页面上同步我们只需要点击 ​​SYNC​​​,会弹出一个抽屉,可以进行一些更改,在点击 ​​SYNCHRONIZE​​即可

云原生--argocd 创建应用、部署应用、回滚_git_11

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

云原生--argocd 创建应用、部署应用、回滚_命名空间_12

也可以查看日志、event 等信息

云原生--argocd 创建应用、部署应用、回滚_命名空间_13

查看 pod、deploy、svc。都运行正常

# 查看 pod,svc,deploy
[root@master1 k8s-yaml]# kubectl get pod,svc,deploy -n demo2
NAME READY STATUS RESTARTS AGE
pod/myapp-85757559dc-b5j9p 1/1 Running 0 4m25s
pod/myapp-85757559dc-kxzbt 1/1 Running 0 4m25s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.100.144.60 <none> 8008:31264/TCP 4m26s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 2/2 2 2 4m26s

访问 ip:31264 看到如下页面,则部署成功

云原生--argocd 创建应用、部署应用、回滚_github_14

更新应用

上面我们已经部署好了两个应用 app01 和 app02,现在来更改一下 myapp-deployment.yaml 文件,将镜像改为 v2

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- image: zouzou0214/myapp:v2 # 改为 v2 版
name: myapp
ports:
- containerPort: 8008

等待几分钟,查看应用状态(也可以点击下面的刷新按钮),可以看到 app02 的状态变成了 OutOfSync。这是因为 argocd 检测到了仓库里有变动。app01 是我手动点击了 SYNC

云原生--argocd 创建应用、部署应用、回滚_git_15

我们点击 app02 的 ​​SYNC​​ 进行同步,等待一会查看状态

云原生--argocd 创建应用、部署应用、回滚_命名空间_16

查看 pod、svc、deploy,都正常运行

# 查看 pod,svc,deploy
[root@master1 k8s-yaml]# kubectl get pod,svc,deploy -n demo2
NAME READY STATUS RESTARTS AGE
pod/myapp-77c6b7455d-rbnvk 1/1 Running 0 5m32s
pod/myapp-77c6b7455d-slh68 1/1 Running 0 2m50s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.100.144.60 <none> 8008:31264/TCP 19m

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 2/2 2 2 19m

如果看到如下页面则部署成功

云原生--argocd 创建应用、部署应用、回滚_命名空间_17

查看详情

云原生--argocd 创建应用、部署应用、回滚_git_18

查看 rs,可以看到,是有两个 rs 的,一个副本数为 0,一个副本数为 2

# 查看 rs
[root@master1 k8s-yaml]# kubectl get rs -n demo2
NAME DESIRED CURRENT READY AGE
myapp-77c6b7455d 2 2 2 14m
myapp-85757559dc 0 0 0 28m

回滚

上面我们的 app02 已经有两个版本了,现在最新的是 v2 版本,我们也可以可以回滚到第一个版本

点击 ​​HISTORY AND ROLLBACK​

云原生--argocd 创建应用、部署应用、回滚_git_19

找到要回滚的版本,点击 Rollback

云原生--argocd 创建应用、部署应用、回滚_命名空间_20

在回滚的时候需要禁用 AUTO-SYNC 自动同步,点击 OK 确认即可。

等待一会可以看到此时已经回滚成功,此时 Pod 是 v1 版本的,并且由于此时线上的版本并不是 Git 仓库中最新的版本,因此此时同步状态是 OutOfSync

云原生--argocd 创建应用、部署应用、回滚_github_21

查看 rs

# 回滚之前的
[root@master1 k8s-yaml]# kubectl get rs -n demo2
NAME DESIRED CURRENT READY AGE
myapp-77c6b7455d 2 2 2 14m
myapp-85757559dc 0 0 0 28m

# 回滚之后的,可以看到之前的 rs 的副本数从 0 变为了 2
[root@master1 k8s-yaml]# kubectl get rs -n demo2
NAME DESIRED CURRENT READY AGE
myapp-77c6b7455d 0 0 0 20m
myapp-85757559dc 2 2 2 34m

查看 pod,svc,deployment

# 查看 pod,svc,deploy
[root@master1 k8s-yaml]# kubectl get pod,svc,deploy -n demo2
NAME READY STATUS RESTARTS AGE
pod/myapp-85757559dc-4xv27 1/1 Running 0 2m53s
pod/myapp-85757559dc-5659l 1/1 Running 0 2m57s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/myapp NodePort 10.100.144.60 <none> 8008:31264/TCP 36m

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/myapp 2/2 2 2 36m

访问 31264 端口

云原生--argocd 创建应用、部署应用、回滚_命名空间_22