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

创建应用

在仓库 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

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

通过 UI 创建应用

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

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

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

SYNC POLICY 如果选择的是 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 状态的资源执行同步操作。一个 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 URLhttps://gitee.com/zouzou_busy/devops_test.git,将 Revision 设置为 HEAD,并将路径设置为 app。然后下面的 Destination 部分,将 cluster 设置为 inCluster 和 namespace 为 demo2

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 查看

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 状态: 

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

部署应用

上面我们创建好了应用,但还没有部署,所以 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,可以看到下面页面则表示部署成功

通过 UI 页面同步

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

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

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

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

查看 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 看到如下页面,则部署成功

更新应用

上面我们已经部署好了两个应用 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

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

查看 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

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

查看详情

查看 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

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

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

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

查看 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 端口

 
posted @ 2022-10-17 10:18  邹邹很busy。  阅读(1287)  评论(0编辑  收藏  举报