建立應用
在倉庫 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(同步政策)
-
:是否執行資源規範格式的校驗,相當于 ”kubectl apply --validate={true|false}“,預設為 trueSKIP SCHEMA VALIDATION
-
:自動建立命名空間。如果部署的應用沒有命名空間,則自動建立AUTO-CREATE NAMESPACE
-
:在同步操作的最後在執行修剪操作,即其他資源已經部署且轉為健康狀态後在進行 prunePRUNE LAST
-
:僅對那些處于APPLY OUT OF SYNC ONLY
狀态的資源執行同步操作。一個OutOfSync
下可能有多個資源,有些是path
的,有些是synced
的,勾選上之後,隻對 OutOfSync 的資源做同步OutOfSync
-
:将使用 kubectl replace/create 指令同步資源,而非預設的 applyREPLACE
-
:資源修剪傳播政策,預設值使用 foreground 政策,還有 background 和 orphanPRUNE PROPAGATION POLICY
-
:在同步階段忽略期望狀态的字段。例如我們有個 deployment,裡面的 replicas 為 20。代表我們期望的 pod 數量為 20 個,但如果我們進行灰階釋出的時候,可能多,也可能少。這個時候,如果不勾選RESPECT IGNORE DIFFERENCES
,就會導緻灰階釋出出現問題,是以這時候我們最好是勾選上該參數RESPECT IGNORE DIFFERENCES
然後在下面配置
Repository URL
為 https://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 端口