在K8S中使用ArgoCD做持續(xù)部署的方案
一、了解argocd
ArgoCD是一個(gè)基于Kubernetes的GitOps持續(xù)交付工具,應(yīng)用的部署和更新都可以在Git倉(cāng)庫(kù)上同步實(shí)現(xiàn),并自帶一個(gè)可視化界面。本文介紹如何使用Git+Argocd方式來(lái)實(shí)現(xiàn)在k8s中部署和更新應(yīng)用服務(wù)。關(guān)于ci這一塊這里不多介紹。主要講解argocd如何實(shí)現(xiàn)cd持續(xù)部署。在開(kāi)始前,需要部署一套k8s集群,可參考本文連接:http://m.fzitv.net/server/333836np5.htm

工作原理
ArgoCD 的核心理念是 GitOps,即以 Git 倉(cāng)庫(kù)作為單一的真理源,通過(guò)自動(dòng)化的方式將倉(cāng)庫(kù)中的應(yīng)用配置同步到 Kubernetes 集群中。
- 定義應(yīng)用: 用戶在 Git 倉(cāng)庫(kù)中定義應(yīng)用的 Kubernetes 資源清單,并將這些清單文件提交到 Git 倉(cāng)庫(kù)。
- 創(chuàng)建 ArgoCD Application: 在 ArgoCD 中創(chuàng)建一個(gè) Application 資源,該資源描述了應(yīng)用在 Git 倉(cāng)庫(kù)中的位置,以及在 Kubernetes 集群中部署的位置。
- 同步狀態(tài)監(jiān)控: ArgoCD Controller 持續(xù)監(jiān)控 Git 倉(cāng)庫(kù)中的配置,并與當(dāng)前集群狀態(tài)進(jìn)行對(duì)比。每次檢測(cè)到 Git 倉(cāng)庫(kù)中的應(yīng)用配置發(fā)生變化時(shí),Controller 會(huì)自動(dòng)更新集群中的資源,保持與 Git 倉(cāng)庫(kù)的一致性。
- 自動(dòng)同步與手動(dòng)同步: ArgoCD 支持自動(dòng)同步和手動(dòng)同步。自動(dòng)同步模式下,一旦檢測(cè)到 Git 倉(cāng)庫(kù)有變化,ArgoCD 會(huì)自動(dòng)更新 Kubernetes 集群中的資源。而在手動(dòng)同步模式下,用戶需要手動(dòng)觸發(fā)同步操作。
- 回滾功能: 如果應(yīng)用更新導(dǎo)致問(wèn)題,ArgoCD 提供了回滾功能,用戶可以輕松恢復(fù)到先前的狀態(tài)
CD 流水線有兩種模式:Push 和 Pull
Push 模式
目前大多數(shù) CI/CD 工具都使用基于 Push 的部署模式,例如 Jenkins。這種模式一般都會(huì)在 CI 流水線運(yùn)行完成后執(zhí)行一個(gè)命令(比如 kubectl)將應(yīng)用部署到目標(biāo)環(huán)境中。
這種 CD 模式的缺陷很明顯:
需要在環(huán)境安裝配置額外管理工具(比如 kubectl);
需要 Kubernetes 對(duì)其進(jìn)行授權(quán);
需要云平臺(tái)授權(quán);
無(wú)法感知部署狀態(tài)。也就無(wú)法感知期望狀態(tài)與實(shí)際狀態(tài)的偏差,需要借助額外的方案來(lái)保障一致性。
Kubernetes 集群或者云平臺(tái)對(duì) CI 系統(tǒng)的授權(quán)憑證在集群或云平臺(tái)的信任域之外,不受集群或云平臺(tái)的安全策略保護(hù),因此 CI 系統(tǒng)很容易被當(dāng)成非法攻擊的載體。
Pull 模式
Pull 模式會(huì)在目標(biāo)環(huán)境中安裝一個(gè) Agent,例如在 Kubernetes 集群中就靠 Operator 來(lái)充當(dāng)這個(gè) Agent。Operator 會(huì)周期性地監(jiān)控目標(biāo)環(huán)境的實(shí)際狀態(tài),并與 Git 倉(cāng)庫(kù)中的期望狀態(tài)進(jìn)行比較,如果實(shí)際狀態(tài)不符合期望狀態(tài),Operator 就會(huì)更新基礎(chǔ)設(shè)施的實(shí)際狀態(tài)以匹配期望狀態(tài)。
只有 Git 的變更可以作為期望狀態(tài)的唯一來(lái)源,除此之外,任何人都不可以對(duì)集群進(jìn)行任何更改,即使你修改了,也會(huì)被 Operator 還原為期望狀態(tài),這也就是傳說(shuō)中的不可變基礎(chǔ)設(shè)施。
目前基于 Pull 模式的 CD 工具有 Argo CD,F(xiàn)lux CD 以及 ks-devops。
二、部署argocd
github地址:https://github.com/argoproj/argo-cd
準(zhǔn)備環(huán)境
#下載argocd client wget https://github.com/argoproj/argo-cd/releases/download/v2.12.7/argocd-linux-amd64 #權(quán)限 chmod u+x argocd-linux-amd64 #移動(dòng)可執(zhí)行目錄 mv ./argocd-linux-amd64 /usr/local/bin/argocd #驗(yàn)證 argo version #準(zhǔn)備yaml文件 wget https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
修改svc類型
為了方便測(cè)試。將svc類型改成NodePort。實(shí)際工作中建議使用ingress
[root@master231 ~]# vim install.yaml
...
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: server
app.kubernetes.io/name: argocd-server
app.kubernetes.io/part-of: argocd
name: argocd-server
spec:
# 增加 type: NodePort
type: NodePort
ports:
- name: http
port: 80
# 該位置增加訪問(wèn)端口 300xxx (30000-32000)任意 我們?cè)O(shè)置成30080
nodePort: 30080
protocol: TCP
targetPort: 8080
- name: https
port: 443
protocol: TCP
targetPort: 8080
selector:
app.kubernetes.io/name: argocd-server
...部署
kubectl create namespace argocd kubectl apply -n argocd -f install.yaml
查看pod狀態(tài)
kubectl get all -n argocd
訪問(wèn)
https://10.0.0.231:30080/login

查看密碼
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo
密碼:****
賬號(hào):adminargocd客戶端命令行工具修改密碼
[root@master231 bin]# argocd login 10.0.0.231:30080 WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 10.0.0.231 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y Username: admin Password: 'admin:login' logged in successfully Context '10.0.0.231:30080' updated [root@master231 bin]# argocd account update-password *** Enter password of currently logged in user (admin): *** Enter new password for user admin: *** Confirm new password for user admin: Password updated Context '10.0.0.231:30080' updated [root@lc-master-1 ~]# argocd logout 192.168.0.71:8082 Logged out from '192.168.0.71:8082' [root@master231 bin]# argocd login 10.0.0.231:30080 WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 10.0.0.231 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y Username: admin Password: 'admin:login' logged in successfully Context '10.0.0.231:30080' updated
三、web界面介紹
設(shè)置介紹

添加倉(cāng)庫(kù)地址


添加成功

四、創(chuàng)建應(yīng)用
通過(guò) CLI 來(lái)創(chuàng)建應(yīng)用
在倉(cāng)庫(kù)https://gitee.com/ljh00928/test_cherry里有個(gè)app目錄,里面有個(gè) myapp-deployment.yaml 文件 和 myapp-service.yaml 文件,用來(lái)演示我們 argo cd 的功能
myapp-deployment.yaml
myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc
spec:
ports:
- port: 8009
targetPort: 8009
type: NodePort
selector:
app: myapp創(chuàng)建應(yīng)用
#查看幫助手冊(cè) argocd app create --help #部署應(yīng)用 argocd app create app01 --repo https://gitee.com/ljh00928/test_cherry.git --path app --dest-server https://kubernetes.default.svc --dest-namespace demo1
通過(guò) UI 創(chuàng)建應(yīng)用
同步策略:
自動(dòng)同步允許 Argo CD 自動(dòng)將 Git 倉(cāng)庫(kù)中的應(yīng)用程序狀態(tài)同步到 Kubernetes 集群中。
手動(dòng)同步要求用戶通過(guò) Argo CD UI 或 CLI 手動(dòng)觸發(fā)同步操作。

由于 Argo CD 支持部署應(yīng)用到多集群,所以如果你要將應(yīng)用部署到外部集群的時(shí)候,需要先將外部集群的認(rèn)證信息注冊(cè)到 Argo CD 中,如果是在內(nèi)部部署(運(yùn)行 Argo CD 的同一個(gè)集群,默認(rèn)不需要配置),直接使用 https://kubernetes.default.svc 作為應(yīng)用的 K8S APIServer 地址即可。
首先列出當(dāng)前 kubeconfig 中的所有集群上下文:
[root@master231 ~]# kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes-admin@kubernetes kubernetes kubernetes-admin orbstack
從列表中選擇一個(gè)上下文名稱并將其提供給 argocd cluster add CONTEXTNAME,比如對(duì)于 orbstack 上下文,運(yùn)行:
[root@master231 ~]# argocd cluster list SERVER NAME VERSION STATUS MESSAGE PROJECT https://kubernetes.default.svc in-cluster 1.23 Successf]ul argocd cluster add orbstack

查看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/ljh00928/test_cherry.git'
targetRevision: HEAD
project: default
syncPolicy:
automated: null
syncOptions:
- CreateNamespace=true填寫(xiě)完以上信息后,點(diǎn)擊頁(yè)面左上方的 Create 安裝,即可創(chuàng)建 app02 應(yīng)用,創(chuàng)建完成后可以看到當(dāng)前應(yīng)用的處于 OutOfSync 狀態(tài):

Argo CD 默認(rèn)情況下每 3 分鐘會(huì)檢測(cè) Git 倉(cāng)庫(kù)一次,用于判斷應(yīng)用實(shí)際狀態(tài)是否和 Git 中聲明的期望狀態(tài)一致,如果不一致,狀態(tài)就轉(zhuǎn)換為 OutOfSync。默認(rèn)情況下并不會(huì)觸發(fā)更新,除非通過(guò) syncPolicy 配置了自動(dòng)同步
SYNC OPTIONS(同步策略)
spec:
syncPolicy:
syncOptions:
- Validate=false
- CreateNamespace=true
- PruneLast=true
- ApplyOutOfSyncOnly=true
- Replace=false
- SkipDryRunOnMissingResource=true常見(jiàn)的同步選項(xiàng)包括:
Validate=false: 禁用資源的服務(wù)器端驗(yàn)證。這在某些自定義資源(CRD)可能尚未完全定義時(shí)非常有用。CreateNamespace=true: 如果命名空間不存在,自動(dòng)創(chuàng)建它。PruneLast=true: 在同步過(guò)程中最后執(zhí)行prune操作,以確保所有資源已經(jīng)創(chuàng)建。ApplyOutOfSyncOnly=true: 僅應(yīng)用那些狀態(tài)不同步的資源。Replace=false: 使用kubectl apply而不是kubectl replace來(lái)更新資源。SkipDryRunOnMissingResource=true: 在資源缺失時(shí)跳過(guò)dry-run檢查
五、部署應(yīng)用
上面我們創(chuàng)建好了應(yīng)用,但還沒(méi)有部署,所以 namespace、pod、deployment、svc 都沒(méi)有
使用 CLI 同步
應(yīng)用創(chuàng)建完成后,我們可以通過(guò)如下所示命令查看其狀態(tài)
[root@master231 ~]# argocd app get app01
Name: argocd/app01 #應(yīng)用名稱
Project: default
Server: https://kubernetes.default.svc #部署的服務(wù)
Namespace: demo1 #部署的ns
URL: https://10.0.0.231:30080/applications/app01
Source:
- Repo: https://gitee.com/ljh00928/test_cherry.git #資源倉(cāng)庫(kù)
Target:
Path: app #倉(cāng)庫(kù)里的資源路徑
SyncWindow: Sync Allowed
Sync Policy: Manual
Sync Status: OutOfSync from (30c6f26) #倉(cāng)庫(kù)里的資源路徑
Health Status: Missing #健康狀態(tài)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp-svc OutOfSync Missing
apps Deployment demo1 myapp OutOfSync Missin因?yàn)?app01 是我們通過(guò)命名行創(chuàng)建的,ns 寫(xiě)的是 demo1,沒(méi)有設(shè)置自動(dòng)創(chuàng)建。如果你集群上沒(méi)有這個(gè)命名空間,需要先手動(dòng)創(chuàng)建
[root@master231 ~]# kubectl create ns demo1 namespace/demo1 created
應(yīng)用程序狀態(tài)為初始 OutOfSync 狀態(tài),因?yàn)閼?yīng)用程序尚未部署,并且尚未創(chuàng)建任何 Kubernetes 資源。要同步(部署)應(yīng)用程序,可以執(zhí)行如下所示命令
#同步應(yīng)用app01
[root@master231 ~]# argocd app sync app01
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2025-03-25T15:12:33+08:00 Service demo1 myapp-svc OutOfSync Missing
2025-03-25T15:12:33+08:00 apps Deployment demo1 myapp OutOfSync Missing
2025-03-25T15:12:33+08:00 Service demo1 myapp-svc Synced Healthy
2025-03-25T15:12:33+08:00 Service demo1 myapp-svc Synced Healthy service/myapp-svc created
2025-03-25T15:12:33+08:00 apps Deployment demo1 myapp OutOfSync Missing deployment.apps/myapp created
2025-03-25T15:12:33+08:00 apps Deployment demo1 myapp Synced Progressing deployment.apps/myapp created
Name: argocd/app01
Project: default
Server: https://kubernetes.default.svc
Namespace: demo1
URL: https://10.0.0.231:30080/applications/app01
Source:
- Repo: https://gitee.com/ljh00928/test_cherry.git
Target:
Path: app
SyncWindow: Sync Allowed
Sync Policy: Manual
Sync Status: Synced to (30c6f26)
Health Status: Progressing
Operation: Sync
Sync Revision: 30c6f26bc59ce7f0605caac7c43e5316c55c89ce
Phase: Succeeded
Start: 2025-03-25 15:12:33 +0800 CST
Finished: 2025-03-25 15:12:33 +0800 CST
Duration: 0s
Message: successfully synced (all tasks run)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp-svc Synced Healthy service/myapp-svc created
apps Deployment demo1 myapp Synced Progressing deployment.apps/myapp created此命令從 Git 倉(cāng)庫(kù)中檢索資源清單并執(zhí)行 kubectl apply 部署應(yīng)用,執(zhí)行上面命令后 guestbook 應(yīng)用便會(huì)運(yùn)行在集群中了,現(xiàn)在我們就可以查看其資源組件、日志、事件和評(píng)估其健康狀態(tài)了。
#再次查看app01狀態(tài)
[root@master231 ~]# argocd app get app01
Name: argocd/app01
Project: default
Server: https://kubernetes.default.svc
Namespace: demo1
URL: https://10.0.0.231:30080/applications/app01
Source:
- Repo: https://gitee.com/ljh00928/test_cherry.git
Target:
Path: app
SyncWindow: Sync Allowed
Sync Policy: Manual
Sync Status: Synced to (30c6f26)
Health Status: Progressing #狀態(tài)為 Progressing(進(jìn)行中)了
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp-svc Synced Healthy service/myapp-svc created
apps Deployment demo1 myapp Synced Progressing deployment.apps/myapp created等一會(huì)在去查看狀態(tài)
[root@master231 ~]# argocd app get app01
Name: argocd/app01
Project: default
Server: https://kubernetes.default.svc
Namespace: demo1
URL: https://10.0.0.231:30080/applications/app01
Source:
- Repo: https://gitee.com/ljh00928/test_cherry.git
Target:
Path: app
SyncWindow: Sync Allowed
Sync Policy: Manual
Sync Status: Synced to (8a1ee3f)
Health Status: Healthy #狀態(tài)為 Healthy(健康)的了
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service demo1 myapp-svc Synced Healthy service/myapp-svc unchanged
apps Deployment demo1 myapp Synced Healthy deployment.apps/myapp unchanged然后查看 pod、deploy、svc
[root@master231 ~]# kubectl -n demo1 get all NAME READY STATUS RESTARTS AGE pod/myapp-6449b755f5-5fkzf 1/1 Running 0 2m26s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/myapp-svc NodePort 10.200.5.218 <none> 8009:31922/TCP 22m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp 1/1 1 1 22m NAME DESIRED CURRENT READY AGE replicaset.apps/myapp-5f748b96c 0 0 0 22m replicaset.apps/myapp-6449b755f5 1 1 1 7m18s
使用 UI 界面同步

查看資源狀態(tài)

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

查看 pod、deploy、svc。都運(yùn)行正常
[root@master231 ~]# kubectl -n demo2 get all NAME READY STATUS RESTARTS AGE pod/myapp-6449b755f5-4tl7m 1/1 Running 0 7m20s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/myapp-svc NodePort 10.200.164.64 <none> 8009:31185/TCP 7m20s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp 1/1 1 1 7m20s NAME DESIRED CURRENT READY AGE replicaset.apps/myapp-6449b755f5 1 1 1 7m20s
六、更新應(yīng)用
上面我們已經(jīng)部署好了兩個(gè)應(yīng)用 app01 和 app02,現(xiàn)在來(lái)更改一下 myapp-deployment.yaml 文件,將鏡像改為green

再次點(diǎn)擊sync同步按鈕,可以看見(jiàn)有兩個(gè)rs,一個(gè)副本數(shù)為 0,一個(gè)副本數(shù)為 1

[root@master231 ~]# kubectl -n demo2 get rs NAME DESIRED CURRENT READY AGE myapp-6449b755f5 0 0 0 19m myapp-65c5d9cf87 1 1 1 4m3s
七、回滾
上面我們的 app02 已經(jīng)有兩個(gè)版本了,現(xiàn)在最新的是 geen版本,我們也可以可以回滾到第一個(gè)版本
現(xiàn)在是這個(gè)版本

在回滾的時(shí)候需要禁用 AUTO-SYNC 自動(dòng)同步,點(diǎn)擊歷史和回滾。找到要回滾的版本,點(diǎn)擊 Rollback


這時(shí)候已經(jīng)回滾到第一個(gè)版本了

#回滾前 [root@master231 ~]# kubectl -n demo2 get rs NAME DESIRED CURRENT READY AGE myapp-6449b755f5 0 0 0 32m myapp-65c5d9cf87 1 1 1 16m #回滾后 [root@master231 ~]# kubectl -n demo2 get rs NAME DESIRED CURRENT READY AGE myapp-6449b755f5 1 1 1 35m myapp-65c5d9cf87 0 0 0 19m
查看 pod,svc,deployment
[root@master231 ~]# kubectl -n demo2 get all NAME READY STATUS RESTARTS AGE pod/myapp-6449b755f5-252l9 1/1 Running 0 3m10s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/myapp-svc NodePort 10.200.164.64 <none> 8009:31185/TCP 36m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/myapp 1/1 1 1 36m NAME DESIRED CURRENT READY AGE replicaset.apps/myapp-6449b755f5 1 1 1 36m replicaset.apps/myapp-65c5d9cf87 0 0 0 20m
到此這篇關(guān)于在K8S中使用ArgoCD做持續(xù)部署的文章就介紹到這了,更多相關(guān)K8S ArgoCD持續(xù)部署內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
玩客云安裝青龍面板實(shí)現(xiàn)京東簽到薅羊毛功能
這篇文章主要介紹了玩客云安裝青龍面板實(shí)現(xiàn)京東簽到薅羊毛,本人準(zhǔn)備的服務(wù)器就是玩客云,只需運(yùn)行一些常用的?docker?容器就行,需要的朋友可以參考下2022-05-05
Kubernetes調(diào)度機(jī)制與策略實(shí)驗(yàn)詳解
本文通過(guò)實(shí)際操作,詳細(xì)介紹了Kubernetes調(diào)度機(jī)制的核心原理和常用調(diào)度策略的配置方法,包括節(jié)點(diǎn)選擇、親和性與反親和性、污點(diǎn)與容忍等,實(shí)驗(yàn)環(huán)境為Kubernetes集群,并通過(guò)一系列步驟驗(yàn)證了這些調(diào)度策略的實(shí)際應(yīng)用2025-12-12
K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式
這篇文章主要介紹了K8S中設(shè)置JVM堆棧大小實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
使用sealos快速搭建K8s集群環(huán)境的過(guò)程
這篇文章主要介紹了使用sealos快速搭建K8s集群環(huán)境,主要包括sealos安裝方法,虛擬機(jī)設(shè)置方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
Kubernetes k8s configmap 容器技術(shù)解析
這篇文章主要為大家介紹了k8s configmap 容器技術(shù)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Kubernetes核心組件實(shí)戰(zhàn)解析之API?Server與Scheduler的生產(chǎn)級(jí)應(yīng)用指南
在Kubernetes集群中,kube-apiserver和kube-scheduler如同機(jī)場(chǎng)的塔臺(tái)控制系統(tǒng),一個(gè)負(fù)責(zé)全局通信調(diào)度,一個(gè)專注資源分配優(yōu)化,本文將深入解析這兩個(gè)核心組件在生產(chǎn)環(huán)境中的關(guān)鍵作用與實(shí)戰(zhàn)配置,需要的朋友可以參考下2025-03-03
CentOS 7下YUM 本地倉(cāng)庫(kù)的搭建詳細(xì)步驟
這篇文章主要介紹了CentOS 7下YUM 本地倉(cāng)庫(kù)的搭建詳細(xì)步驟的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
理解k8s控制器DaemonSet創(chuàng)建及使用場(chǎng)景
這篇文章主要為大家介紹了k8s控制器DaemonSet創(chuàng)建及使用場(chǎng)景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

