KubeSphere + Argo CD,實(shí)現(xiàn)真正的 GitOps!
來自社區(qū)用戶 willqy 的分享
Argo CD 簡介
Argo CD 是用于 Kubernetes 的聲明性 GitOps 持續(xù)交付工具,應(yīng)用程序定義,配置和環(huán)境應(yīng)為聲明性的,并應(yīng)受版本控制,應(yīng)用程序部署和生命周期管理應(yīng)該是自動(dòng)化、可審核且易于理解。
Argo CD 遵循 GitOps 模式,該模式使用 Git 倉庫作為定義所需應(yīng)用程序狀態(tài)的真實(shí)來源。
Argo CD 可在指定的目標(biāo)環(huán)境中自動(dòng)部署所需的應(yīng)用程序狀態(tài),應(yīng)用程序部署可以在 Git 提交時(shí)跟蹤對(duì)分支,標(biāo)簽的更新,或固定到清單的特定版本。
官網(wǎng):https://argoproj.github.io/[1]
Argo CD 架構(gòu)圖:

Argo CD 被實(shí)現(xiàn)為 kubernetes 控制器,該控制器持續(xù)監(jiān)視正在運(yùn)行的應(yīng)用程序,并將當(dāng)前的活動(dòng)狀態(tài)與所需的目標(biāo)狀態(tài)(在 Git 存儲(chǔ)庫中指定)進(jìn)行比較。當(dāng)已部署應(yīng)用程序的運(yùn)行狀態(tài)偏離目標(biāo)狀態(tài)時(shí)將被 Argo CD 視為 OutOfSync。
Argo CD 報(bào)告并可視化差異,同時(shí)提供了自動(dòng)或手動(dòng)將實(shí)時(shí)狀態(tài)同步回所需目標(biāo)狀態(tài)的功能。在 Git 存儲(chǔ)庫中對(duì)所需目標(biāo)狀態(tài)所做的任何修改都可以自動(dòng)應(yīng)用并同步到指定的目標(biāo)環(huán)境中。
Argo CD 支持的 Kubernetes 配置清單包括 helm charts、kustomize 或純 YAML/json 文件等。
本篇文章涉及內(nèi)容:
使用 KubeSphere DevOps 實(shí)現(xiàn) CI 部分, CD 部分由 Argo CD 完成; Argo CD 持續(xù)監(jiān)測 Git 倉庫某個(gè)目錄下 yaml 文件變動(dòng),自動(dòng)將 yaml 文件部署到 k8s 集群; Argo CD 持續(xù)監(jiān)測 Harbor 鏡像倉庫某個(gè)鏡像 tag 變動(dòng),自動(dòng)將最新鏡像部署到 K8s 集群。
基本原理圖:

準(zhǔn)備 Git 代碼倉庫
準(zhǔn)備 2 個(gè) Git 倉庫,一個(gè)源碼倉庫,一個(gè) yaml 文件倉庫,源碼和 yaml 文件分離。

源碼倉庫可參考以下鏈接,離線環(huán)境原因,這里選擇第二個(gè)示例 spring-demo:
https://github.com/KubeSphere/DevOps-java-sample[2] https://github.com/willzhang/spring-demo[3]
yaml 文件倉庫可參考以下鏈接,這里命名為 argocd-gitops:
https://github.com/argoproj/argocd-example-apps[4]
yaml 倉庫下創(chuàng)建 javademo 目錄,并創(chuàng)建 2 個(gè)簡單的 yaml 文件:
[root@jenkins git]# tree argocd-gitops/
argocd-gitops/
├── javademo
│ ├── javademo-deployment.yaml
│ └── javademo-svc.yaml
javademo-deployment.yaml 示例,當(dāng)前鏡像 tag 可隨意指定,執(zhí)行 CI 時(shí)會(huì)實(shí)時(shí)替換該參數(shù):
apiVersion: apps/v1
kind: Deployment
metadata:
name: javademo
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app: javademo
template:
metadata:
labels:
app: javademo
spec:
containers:
- image: 10.39.140.196:8081/apps/javademo:replace
name: javademo
ports:
- containerPort: 8080
javademo-svc.yaml:
apiVersion: v1
kind: Service
metadata:
name: javademo
spec:
type: NodePort
ports:
- port: 8012
targetPort: 8080
selector:
app: javademo
部署 Argo CD
Argo CD 有多種部署方式,可以直接部署 yaml 文件:
kubectl create namespace Argo CD
kubectl apply -n Argo CD -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
這里使用 helm 方式部署,可直接指定 Argo CD server service 類型 nodePort:
helm repo add argo https://argoproj.github.io/argo-helm
helm install Argo CD \
--namespace=Argo CD --create-namespace \
--set server.service.type=NodePort \
argo/argo-cd
查看運(yùn)行的 Pod:
[root@master ~]# kubectl -n Argo CD get pods
NAME READY STATUS RESTARTS AGE
argocd-application-controller-5db8c6f8f9-qnmtr 1/1 Running 0 8h
argocd-dex-server-84b5cbfbc9-fc7rf 1/1 Running 0 8h
argocd-redis-7c7c79dcd9-hjhgr 1/1 Running 0 8h
argocd-repo-server-5fb9cbb945-9xmc7 1/1 Running 0 8h
argocd-server-8d8cb6488-pjwt4 1/1 Running 0 8h
如果使用 KubeSphere 部署 Argo CD,首先需要配置 Argo CD helm 倉庫,進(jìn)入企業(yè)空間,選擇應(yīng)用模板上傳離線 helm chart 包,或在應(yīng)用倉庫配置公網(wǎng) helm repo 地址。
完成后進(jìn)入項(xiàng)目,點(diǎn)擊部署新應(yīng)用,選擇 Argo CD helm chart 進(jìn)行部署即可:

安裝 Argo CD CLI
要與 Argo CD API Server 進(jìn)行交互,我們需要安裝 CLI 命令:
wget https://github.com/argoproj/argo-cd/releases/download/v1.7.10/argocd-linux-amd64
cp argocd-linux-amd64 /usr/local/bin/Argo CD
chmod +x /usr/local/bin/Argo CD
Argo CD version
如果上面 Argo CD 使用 yaml 方式部署,修改 serivce 類型為 nodeport,以便訪問 Argo CD API Server:
kubectl patch svc argocd-server -n Argo CD -p '{"spec": {"type": "NodePort"}}'
查看 Argo CD server service,記錄 nodeport 信息:
[root@master ~ ]# kubectl -n Argo CD get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.99.232.27 <none> 5556/TCP,5557/TCP,5558/TCP 5d
argocd-metrics ClusterIP 10.107.37.4 <none> 8082/TCP 5d
argocd-redis ClusterIP 10.106.160.6 <none> 6379/TCP 5d
argocd-repo-server ClusterIP 10.100.101.100 <none> 8081/TCP,8084/TCP 5d
argocd-server NodePort 10.106.141.243 <none> 80:31195/TCP,443:32079/TCP 5d
argocd-server-metrics ClusterIP 10.109.81.234 <none> 8083/TCP 5d
Argo CD 默認(rèn)登錄用戶為 admin,初始密碼為 argocd-server pod 名稱,獲取 pod 名稱:
podName=`kubectl get pods -n Argo CD -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2`
使用 Argo CD CLI 登錄,以 nodeIP 和 nodePort 作為 Argo CD server 登錄地址:
Argo CD login 10.39.140.248:31195 --username admin --password $podName
修改默認(rèn)密碼:
Argo CD account update-password \
--current-password $podName \
--new-password Argo CD@123
瀏覽器登錄 Argo CD UI:
https://10.39.140.248:31195
部署 Argo CD 應(yīng)用
登陸 Argo CD UI 后,選擇 NEW APP 創(chuàng)建 application,選擇 EDIT AS AYML:

粘貼以下內(nèi)容,SAVE 后點(diǎn)擊左上 CREATE,當(dāng)然也可以直接使用 kubectl apply 命令執(zhí)行以下內(nèi)容,效果相同。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: javademo
namespace: Argo CD
finalizers:
- resources-finalizer.Argo CD.argoproj.io
spec:
project: default
source:
path: javademo
repoURL: http://10.39.140.196:10080/gogs/argocd-gitops.git
targetRevision: HEAD
destination:
namespace: apps
server: https://kubernetes.default.svc
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- Validate=false
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
參數(shù)說明:
metadata 字段:指定了應(yīng)用名稱,命名空間必須指定 Argo CD,添加 finalizers 字段可在刪除應(yīng)用時(shí)級(jí)聯(lián)刪除相關(guān) K8s 資源; source 字段:指定了 yaml 文件所在 Git 倉庫 URL,及要監(jiān)測的 yaml 文件存放目錄,該目錄下文件有任何變更 Argo CD 都會(huì)自動(dòng)將其更新部署到 K8s 集群; destination 字段:指定監(jiān)測的 yaml 文件要部署到哪個(gè) K8s 集群及哪個(gè)命名空間下; syncPolicy 字段:指定自動(dòng)同步策略和頻率,不配置時(shí)需要手動(dòng)觸發(fā)同步。
另外如果使用私有 Git 倉庫,需要?jiǎng)?chuàng)建憑證,這里的憑證是 Argo CD 訪問 yaml 文件 Git 倉庫的憑證:

等效的 Argo CD cli 命令:
Argo CD repo add http://10.39.140.196:10080/gogs/argocd-gitops --username gogs --password xxxxxx
創(chuàng)建后 Argo CD 會(huì)自動(dòng)將 Git 倉庫 javademo 目錄下的 yaml 文件部署到 K8s 集群,此時(shí)應(yīng)用無法正常啟動(dòng),因?yàn)?yaml 文件中的鏡像 tag 還不存在,拉取鏡像會(huì)失?。?/p>
也可以使用 Argo CD CLI 查看部署的應(yīng)用:
[root@master ~]# Argo CD app get javademo
Name: javademo
Project: default
Server: https://kubernetes.default.svc
Namespace: apps
URL: https://10.39.140.248:31195/applications/javademo
Repo: http://10.39.140.196:10080/gogs/argocd-gitops.git
Target: HEAD
Path: javademo
SyncWindow: Sync Allowed
Sync Policy: Automated (Prune)
Sync Status: Synced to HEAD (1b96380)
Health Status: Progressing
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Service apps javademo Synced Healthy service/javademo unchanged
apps Deployment apps javademo Synced Progressing deployment.apps/javademo unchanged
在 KubeSphere UI 查看 Pod 狀態(tài),一直在重試?yán)$R像:

使用 kubectl 命令查看,狀態(tài)為 ImagePullBackOff :
[root@master ~]# kubectl -n apps get pods
NAME READY STATUS RESTARTS AGE
javademo-64d46bff8-6dgjn 0/1 ImagePullBackOff 0 13m
[root@master ~]# kubectl -n apps get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
javademo ClusterIP 10.111.56.180 <none> 8012/TCP 33m
KubeSphere 創(chuàng)建流水線
創(chuàng)建 CI 流水線,使用 KubeSphere DevOps 完成源碼編譯、鏡像構(gòu)建并推送到 Harbor 倉庫,最后以 git commit 方式更新 yaml 倉庫中 image 字段。
由于此時(shí) Argo CD 持續(xù)監(jiān)測 yaml 倉庫配置文件變動(dòng),當(dāng) CI 部分執(zhí)行 git push 時(shí)便會(huì)觸發(fā) Argo CD 更新 yaml 文件到 k8s 集群。
在 KubeSphere DevOps 工程下創(chuàng)建一條空流水線,命名為 javademo,進(jìn)入流水線,選擇編輯 Jenkinsfile,復(fù)制以下內(nèi)容:
pipeline {
environment {
GIT_URL='http://10.39.140.196:10080/gogs/spring-demo.git'
GIT_CREDENTIAL_ID = 'git-id'
GIT_BRANCH = 'master'
REGISTRY = '10.39.140.196:8081/apps/javademo'
REGISTRY_CREDENTIAL_ID = 'harbor-id'
}
agent {
node {
label 'maven'
}
}
stages {
stage('SCM Checkout') {
steps {
git branch: "${GIT_BRANCH}", credentialsId: "${GIT_CREDENTIAL_ID}", url: "${GIT_URL}"
}
}
stage('source build') {
steps {
container('maven') {
sh 'mvn clean package'
}
}
}
stage('docker build & push') {
steps {
script {
env.COMMIT_ID = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
env.TIMESTRAP = sh(returnStdout: true, script: 'date +%Y%m%d%H%M%S').trim()
env.DOCKER_TAG = "dev_${TIMESTRAP}_${COMMIT_ID}_${BUILD_NUMBER}"
}
container('maven') {
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$REGISTRY_CREDENTIAL_ID" ,)]) {
sh 'docker build -t $REGISTRY:$DOCKER_TAG .'
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY:$DOCKER_TAG'
}
}
}
}
stage('update docker tag') {
environment {
BUILD_USER = 'admin'
BUILD_USER_EMAIL = 'admin@Argo CD.com'
YAML_REPO_URL='http://${username}:${password}@10.39.140.196:10080/gogs/argocd-gitops.git'
}
steps {
withCredentials([usernamePassword(passwordVariable : 'password' ,usernameVariable : 'username' ,credentialsId : "$GIT_CREDENTIAL_ID" ,)]) {
sh """
git config --global user.name "$BUILD_USER"
git config --global user.email "$BUILD_USER_EMAIL"
git clone ${YAML_REPO_URL} && cd argocd-gitops
sed -i "s#$REGISTRY.*#${REGISTRY}:${DOCKER_TAG}#g" javademo/javademo-deployment.yaml
git add -A && git commit -m "update tag: ${DOCKER_TAG}" && git push ${YAML_REPO_URL}
"""
}
}
}
}
}
注意修改相關(guān)參數(shù),流水線中引用了 2 個(gè)憑證:
GIT_CREDENTIAL_ID 為內(nèi)網(wǎng) gogs git 倉庫賬號(hào)密碼 REGISTRY_CREDENTIAL_ID 為 Harbor 倉庫賬號(hào)密碼
運(yùn)行流水線前需要在 DevOps 工程下提前創(chuàng)建好相關(guān)憑證,后續(xù)需要在 jenkinsfile 中引用。

最終流水線如下,點(diǎn)擊運(yùn)行,等待流水線執(zhí)行完成,查看狀態(tài)為成功:

查看流水線構(gòu)建日志,可以看到執(zhí)行了以下過程,其中最后 update docker tag 步驟,執(zhí)行了 2 個(gè)關(guān)鍵操作,sed 命令替換鏡像 tag,然后執(zhí)行 git push 更新 yaml 倉庫。

查看推送到 Harbor 倉庫的鏡像:

Argo CD 監(jiān)測到 yaml 文件變更后更新至 K8s 集群:

Argo CD UI 查看使用的鏡像:

登錄 KubeSphere UI 查看應(yīng)用狀態(tài)為運(yùn)行中:

在 Git 倉庫直接修改 yaml 文件配置,同樣能夠觸發(fā) Argo CD 同步,例如將 service 類型改為 nodePort:

等待 Argo CD 自動(dòng)同步配置更新到 K8s 集群,瀏覽器以 nodeport 方式訪問 java web 應(yīng)用:

部署 Argo CD Image Updater
上面演示了基于 Git 倉庫變更作為應(yīng)用部署的事實(shí)來源,下面演示另一種方式,以鏡像 tag 變更作為應(yīng)用部署的事實(shí)來源。Argo CD 提供了Argo CD Image Updater小工具,用于實(shí)現(xiàn)該操作。
Argo CD image updater 是一種自動(dòng)更新由 Argo CD[5]管理的 Kubernetes 工作負(fù)載容器鏡像的工具。
該工具目前還在開發(fā)中,并且有以下特性和局限性:
只能更新由 Argo CD 管理并由 Helm 或 Kustomize 工具生成的應(yīng)用程序的鏡像; 對(duì)廣泛使用的容器倉庫的默認(rèn)支持:Dockerhub、Harbor 私有鏡像倉庫等; 能夠使用匹配器功能過濾鏡像倉庫返回的標(biāo)簽列表; 鏡像拉取 secrets 必須存在于 Argo CD Image Updater 在其中運(yùn)行(或可以訪問)的同一 Kubernetes 集群中。當(dāng)前不可能從其他集群中獲取這些 secrets。 在當(dāng)前版本中,Argo CD Image Updater 不會(huì)將任何更改寫回到 Git 存儲(chǔ)庫。
官方文檔:
https://argocd-image-updater.readthedocs.io/en/stable/[6]
Argo CD Image Updater 部署略顯繁瑣,部署操作如下:
1、在 Argo CD 中創(chuàng)建本地用戶
創(chuàng)建 Argo CD 鏡像更新程序需要訪問 Argo CD API Server 的憑據(jù),使用一個(gè) image-updater 具有適當(dāng) API 權(quán)限的帳戶,將以下用戶定義添加到 argocd-cm:
# kubectl -n Argo CD edit cm argocd-cm
data:
accounts.image-updater: apiKey
為用戶創(chuàng)建訪問令牌,將令牌的值復(fù)制到某個(gè)地方,稍后將需要它。
Argo CD account generate-token --account image-updater --id image-updater
2、在 Argo CD 中授予 RBAC 權(quán)限
為image-updater用戶配置適當(dāng)?shù)?RBAC 權(quán)限,Argo CD Image Updater 需要應(yīng)用程序的update和get權(quán)限。
# kubectl -n Argo CD edit cm argocd-rbac-cm
data:
policy.default: role:readonly
policy.csv: |
p, role:image-updater, applications, get, */*, allow
p, role:image-updater, applications, update, */*, allow
g, image-updater, role:image-updater
3、 安裝 Argo CD Image Updater
yaml 文件下載:https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests[7]
kubectl create ns argocd-image-updater
kubectl apply -n argocd-image-updater -f manifests/install.yaml
4、 配置鏡像倉庫
即使您不打算使用私有鏡像倉庫,您也需要至少配置一個(gè) empty registries.conf:
# kubectl -n argocd-image-updater edit cm argocd-image-updater-config
data:
registries.conf: ""
沒有此條目argocd-image-updater Pod 將無法啟動(dòng)。
如果使用私有鏡像倉庫可參考以下配置,以 Harbor 鏡像倉庫為例:
data:
Argo CD.insecure: "true"
log.level: debug
registries.conf: |
registries:
- name: harbor
api_url: http://10.39.140.196:8081
prefix: 10.39.140.196:8081
ping: yes
insecure: yes
5、 配置 API 訪問令牌密鑰
當(dāng)從清單安裝到 Kubernetes 集群時(shí),Argo CD Image Updater 將從名為Argo CD_TOKEN的環(huán)境變量中讀取訪問 Argo CD API 所需的令牌,該環(huán)境變量是從名為Argo CD.token的 secret 字段中設(shè)置的argocd-image-updater-secret。
Argo CD.token的值應(yīng)設(shè)置為您上面生成的訪問令牌的 base64 編碼值。作為一種捷徑,您可以使用kubectl生成密鑰,并將其應(yīng)用于現(xiàn)有資源:
YOUR_TOKEN=xxx
kubectl create secret generic argocd-image-updater-secret \
--from-literal Argo CD.token=$YOUR_TOKEN --dry-run -o yaml |
kubectl -n argocd-image-updater apply -f -
更改后,必須重新啟動(dòng) argocd-image-updater Pod,即運(yùn)行
kubectl -n argocd-image-updater rollout restart deployment argocd-image-updater
新建 yaml 倉庫 Kustomize 文件
由于 image updater 僅支持 helm 或 Kustomize 類型 yaml,這里新建一個(gè)基于 Kustomize 的 yaml 目錄,修改 yaml 中的參數(shù)不要與之前的沖突即可:
[root@jenkins git]# tree argocd-gitops/kustomize-javademo/
argocd-gitops/kustomize-javademo/
├── javademo-deployment.yaml
├── javademo-svc.yaml
└── kustomization.yaml
javademo-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: javademo-tag
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app: javademo-tag
template:
metadata:
labels:
app: javademo-tag
spec:
containers:
- image: 10.39.140.196:8081/apps/javademo:replace
name: javademo-tag
ports:
- containerPort: 8080
javademo-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: javademo-tag
spec:
ports:
- port: 8012
targetPort: 8080
selector:
app: javademo-tag
kustomization.yaml
amePrefix: kustomize-
resources:
- javademo-deployment.yaml
- javademo-svc.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
登錄 Argo CD UI 新建一個(gè) Argo CD 應(yīng)用,和之前相比增加了 annotations 參數(shù),指定要監(jiān)測的鏡像地址,更新策略為 latest,另外修改了 source path:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
annotations:
argocd-image-updater.argoproj.io/image-list: javademo=10.39.140.196:8081/apps/javademo
argocd-image-updater.argoproj.io/javademo.update-strategy: latest
name: javademo-tag
namespace: Argo CD
finalizers:
- resources-finalizer.Argo CD.argoproj.io
spec:
destination:
namespace: apps
server: https://kubernetes.default.svc
project: default
source:
path: kustomize-javademo
repoURL: http://10.39.140.196:10080/gogs/argocd-gitops.git
targetRevision: HEAD
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- Validate=false
- CreateNamespace=true
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
登錄 KubeSphere UI 重新創(chuàng)建一條 ci 流水線,刪除 update docker tag 步驟即可,已經(jīng)不需要基于 git push 來觸發(fā)應(yīng)用部署了:
pipeline {
environment {
GIT_URL='http://10.39.140.196:10080/gogs/spring-demo.git'
GIT_CREDENTIAL_ID = 'git-id'
GIT_BRANCH = 'master'
REGISTRY = '10.39.140.196:8081/apps/javademo'
REGISTRY_CREDENTIAL_ID = 'harbor-id'
}
agent {
node {
label 'maven'
}
}
stages {
stage('SCM Checkout') {
steps {
git branch: "${GIT_BRANCH}", credentialsId: "${GIT_CREDENTIAL_ID}", url: "${GIT_URL}"
}
}
stage('source build') {
steps {
container('maven') {
sh 'mvn clean package'
}
}
}
stage('docker build & push') {
steps {
script {
env.COMMIT_ID = sh(returnStdout: true, script: "git log -n 1 --pretty=format:'%h'").trim()
env.TIMESTRAP = sh(returnStdout: true, script: 'date +%Y%m%d%H%M%S').trim()
env.DOCKER_TAG = "dev_${TIMESTRAP}_${COMMIT_ID}_${BUILD_NUMBER}"
}
container('maven') {
withCredentials([usernamePassword(passwordVariable : 'DOCKER_PASSWORD' ,usernameVariable : 'DOCKER_USERNAME' ,credentialsId : "$REGISTRY_CREDENTIAL_ID" ,)]) {
sh 'docker build -t $REGISTRY:$DOCKER_TAG .'
sh 'echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'
sh 'docker push $REGISTRY:$DOCKER_TAG'
}
}
}
}
}
}
查看流水線日志,鏡像成功推送到 harbor 倉庫:

harbor 倉庫鏡像 tag 更新,Argo CD image updater 自動(dòng)將最新 tag 更新到 K8s 集群。

查看鏡像 tag

以后每次 Harbor 倉庫生成最新鏡像,Argo CD 都會(huì)自動(dòng)將其更新到 K8s 集群。
腳注
https://argoproj.github.io/: https://argoproj.github.io/
[2]https://github.com/KubeSphere/DevOps-java-sample: https://github.com/KubeSphere/DevOps-java-sample
[3]https://github.com/willzhang/spring-demo: https://github.com/willzhang/spring-demo
[4]https://github.com/argoproj/argocd-example-apps: https://github.com/argoproj/argocd-example-apps
[5]Argo CD: https://github.com/argoproj/argo-cd
[6]https://argocd-image-updater.readthedocs.io/en/stable/: https://argocd-image-updater.readthedocs.io/en/stable/
[7]https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests: https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests
