天天看點

雲原生--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

部署成功後就可以在頁面上檢視到了

雲原生--argocd 建立應用、部署應用、復原

通過 UI 建立應用

除了上面使用指令行建立之外,我們還可以使用 ui 進行建立

登入 ui 後,點選 +NEW APP 建立應用,如下

雲原生--argocd 建立應用、部署應用、復原

将應用命名為 app02,使用 default project,并将同步政策設定為 Manual。如下

雲原生--argocd 建立應用、部署應用、復原

​SYNC POLICY​

​​ 如果選擇的是 ​

​Automatic​

​ 後,會有兩個選項,如下

雲原生--argocd 建立應用、部署應用、復原

​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 建立應用、部署應用、復原

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 建立應用、部署應用、復原
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 建立應用、部署應用、復原

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 建立應用、部署應用、復原

部署應用

上面我們建立好了應用,但還沒有部署,是以 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 建立應用、部署應用、復原

通過 UI 頁面同步

可以看到上面我們使用指令行同步的已經在 ui 上顯示正常了,狀态也是 Healthy 的

雲原生--argocd 建立應用、部署應用、復原

在頁面上同步我們隻需要點選 ​

​SYNC​

​​,會彈出一個抽屜,可以進行一些更改,在點選 ​

​SYNCHRONIZE​

​即可

雲原生--argocd 建立應用、部署應用、復原

同步完成後可以看到我們的資源狀态:

雲原生--argocd 建立應用、部署應用、復原

也可以檢視日志、event 等資訊

雲原生--argocd 建立應用、部署應用、復原

檢視 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 建立應用、部署應用、復原

更新應用

上面我們已經部署好了兩個應用 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 建立應用、部署應用、復原

我們點選 app02 的 ​

​SYNC​

​ 進行同步,等待一會檢視狀态

雲原生--argocd 建立應用、部署應用、復原

檢視 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 建立應用、部署應用、復原

檢視詳情

雲原生--argocd 建立應用、部署應用、復原

檢視 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 建立應用、部署應用、復原

找到要復原的版本,點選 Rollback

雲原生--argocd 建立應用、部署應用、復原

在復原的時候需要禁用 AUTO-SYNC 自動同步,點選 OK 确認即可。

等待一會可以看到此時已經復原成功,此時 Pod 是 v1 版本的,并且由于此時線上的版本并不是 Git 倉庫中最新的版本,是以此時同步狀态是 OutOfSync

雲原生--argocd 建立應用、部署應用、復原

檢視 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 建立應用、部署應用、復原