自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

ArgoCD Image Updater是如何運(yùn)作的?

云計(jì)算 云原生
Argo CD Image Updater 會定期輪詢 Argo CD 中配置的應(yīng)用程序,并查詢相應(yīng)的鏡像倉庫以獲取可能的新版本。如果在倉庫中找到新版本的鏡像,并且滿足版本約束,Argo CD 鏡像更新程序?qū)⒅甘?Argo CD 使用新版本的鏡像更新應(yīng)用程序。

Argo CD Image Updater 是一種自動更新由 Argo CD 管理的 Kubernetes 工作負(fù)載的容器鏡像的工具。 該工具可以檢查與 Kubernetes 工作負(fù)載一起部署的容器鏡像的新版本,并使用 Argo CD 自動將其更新到允許的最新版本。它通過為 Argo CD 應(yīng)用程序設(shè)置適當(dāng)?shù)膽?yīng)用程序參數(shù)來工作,類似于 argocd app set --helm-set image.tag=v1.0.1,但以完全自動化的方式。

Argo CD Image Updater 會定期輪詢 Argo CD 中配置的應(yīng)用程序,并查詢相應(yīng)的鏡像倉庫以獲取可能的新版本。如果在倉庫中找到新版本的鏡像,并且滿足版本約束,Argo CD 鏡像更新程序?qū)⒅甘?Argo CD 使用新版本的鏡像更新應(yīng)用程序。

根據(jù)您的應(yīng)用程序自動同步策略,Argo CD 將自動部署新的鏡像版本或?qū)?yīng)用程序標(biāo)記為不同步,您可以通過同步應(yīng)用程序來手動觸發(fā)鏡像更新。

它是如何運(yùn)作的?

Image Updater 程序通過讀取 ArgoCD 應(yīng)用程序資源中的 annotations 來工作,這些注解指定應(yīng)自動更新哪些鏡像。它會檢查指定鏡像倉庫中是否有較新的標(biāo)簽,如果它們與預(yù)定義的模式或規(guī)則匹配,則使用這些較新的標(biāo)簽更新應(yīng)用程序清單。此自動化過程可確保您的應(yīng)用程序始終運(yùn)行最新版本的鏡像,遵循 GitOps 的一致性和可追溯性原則。

Image Updater 基本的工作流程如下所示:

  • Annotation 配置:開發(fā)人員注解 ArgoCD 應(yīng)用程序以告訴 Image Updater 要跟蹤哪些鏡像,包括標(biāo)簽過濾和更新策略的規(guī)則。
  • 鏡像倉庫輪詢:Image Updater 定期輪詢配置的鏡像倉庫以查找符合指定條件的新標(biāo)簽。
  • 自動更新:當(dāng)找到新的匹配標(biāo)簽時(shí),Image Updater 會自動更新應(yīng)用程序的 Kubernetes 清單中的鏡像標(biāo)簽,并將更改提交回源 Git 存儲庫。
  • 同步變更:ArgoCD 檢測到提交的更改,同步更新的清單,并將它們應(yīng)用到 Kubernetes 集群。

特征

  • 更新由 Argo CD 管理且由 Helm 或 Kustomize 工具生成的應(yīng)用程序鏡像
  • 根據(jù)不同的更新策略更新應(yīng)用鏡像
  • semver:根據(jù)給定的鏡像約束更新到允許的最高版本
  • latest:更新到最近創(chuàng)建的鏡像標(biāo)簽
  • name:更新到按字母順序排序的列表中的最后一個(gè)標(biāo)簽
  • digest:更新到可變標(biāo)簽的最新推送版本
  • 支持廣泛使用的容器鏡像倉庫
  • 通過配置支持私有容器鏡像倉庫
  • 可以將更改寫回 Git
  • 能夠使用匹配器函數(shù)過濾鏡像倉庫返回的標(biāo)簽列表
  • 在 Kubernetes 集群中運(yùn)行,或者可以從命令行獨(dú)立使用
  • 能夠執(zhí)行應(yīng)用程序的并行更新

另外需要注意的是使用該工具目前有幾個(gè)限制:

  • 想要更新容器鏡像的應(yīng)用程序必須使用 Argo CD 進(jìn)行管理。不支持未使用 Argo CD 管理的工作負(fù)載。
  • Argo CD 鏡像更新程序只能更新其清單使用 Kustomize 或 Helm 呈現(xiàn)的應(yīng)用程序的容器鏡像,特別是在 Helm 的情況下,模板需要支持使用參數(shù)(即image.tag)。
  • 鏡像拉取密鑰必須存在于 Argo CD Image Updater 運(yùn)行(或有權(quán)訪問)的同一 Kubernetes 集群中。目前無法從其他集群獲取這些機(jī)密信息。

安裝

建議在運(yùn)行 Argo CD 的同一個(gè) Kubernetes 命名空間集群中運(yùn)行 Argo CD Image Updater,但這不是必需的。事實(shí)上,甚至不需要在 Kubernetes 集群中運(yùn)行 Argo CD Image Updater 或根本不需要訪問任何 Kubernetes 集群。但如果不訪問 Kubernetes,某些功能可能無法使用,所以強(qiáng)烈建議使用第一種安裝方法。

運(yùn)行鏡像更新程序的最直接方法是將其作為 Kubernetes 工作負(fù)載安裝到運(yùn)行 Argo CD 的命名空間中。這樣就不需要任何配置,也不會對你的工作負(fù)載產(chǎn)生任何影響。

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

安裝完成后我們就可以在 Argo CD 中看到 Argo CD Image Updater 組件了:

$ kubectl get pods -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          21m
argocd-applicationset-controller-587b5c864b-2kt2v   1/1     Running   0          7d4h
argocd-dex-server-6958d7dcf4-66s6s                  1/1     Running   0          7d4h
argocd-image-updater-57b788886d-d4qh5               1/1     Running   0          34s
argocd-notifications-controller-6847bd5c98-wqbjj    1/1     Running   0          7d4h
argocd-redis-6fcf5c8898-c6752                       1/1     Running   0          7d4h
argocd-repo-server-9646985c8-7dmj5                  1/1     Running   0          7d4h
argocd-server-67b76b54d7-hxx6q                      1/1     Running   0          7d4h

現(xiàn)在我們就可以直接去監(jiān)聽鏡像是否發(fā)生了變化,而不需要在 CI 流水線中去手動提交修改資源清單到代碼倉庫了。

配置

要充分利用 ArgoCD 鏡像更新程序,將其配置連接到鏡像倉庫至關(guān)重要,尤其是在使用私有倉庫或公共倉庫上的私有存儲庫時(shí)。以下是如何配置必要的憑據(jù)并了解可用的不同方法。

ArgoCD Image Updater 可以使用以下方法獲取憑據(jù):

  • 從 Kubernetes Secret 中獲取憑據(jù):標(biāo)準(zhǔn)的 Docker Pull Secret 或自定義 Secret,憑證格式為<username>:<password>,比如我們可以用下面的命令來創(chuàng)建一個(gè)。
kubectl create -n argocd secret docker-registry dockerhub-secret \
  --docker-username someuser \
  --docker-password s0m3p4ssw0rd \
  --docker-server "https://registry-1.docker.io"

這個(gè) secret 可以被引用為 pullsecret:<namespace>/<secret_name> (pullsecret:argocd/dockerhub-secret)。

  • 通用 Secret:通用 Secret 是包含單個(gè)鍵值對的 Secret,鍵值對可以是任何格式,比如我們可以用下面的命令來創(chuàng)建一個(gè):
kubectl create -n argocd secret generic some-secret \
  --from-literal=creds=someuser:s0m3p4ssw0rd

該 secret 可以用 secret:<namespace>/<secret_name>#<field_name> (secret:argocd/some-secret#creds) 的方式引用。

  • 環(huán)境變量:將憑證存儲在環(huán)境變量中,該變量可以傳遞到 ArgoCD Image Updater pod,我們可以在 pod 的配置中設(shè)置:
env:
  - name: DOCKER_HUB_CREDS
    value: "someuser:s0m3p4ssw0rd"

該 secret 可以用 env:<name_of_environment_variable> (env:DOCKER_HUB_CREDS) 的方式引用。

  • Script 腳本:使用以<username>:<password>格式輸出憑據(jù)的腳本。
#!/bin/sh
echo "someuser:s0m3p4ssw0rd"

將其引用為 ext:<full_path_to_script>。

我們這里就以 Github 的 Container Registry 為例,來演示下如何使用 ArgoCD Image Updater 來更新鏡像。

首先我們在 Github 個(gè)人設(shè)置頁面中創(chuàng)建一個(gè)個(gè)人訪問令牌,如下圖所示:

Token

這個(gè) Token 的權(quán)限要包括 write:packages 和 read:packages,這樣我們才能推送和拉取鏡像,創(chuàng)建后會得到一個(gè) Token。

然后我們可以在終端或命令行中,使用 GitHub 用戶名和 GitHub 的個(gè)人訪問令牌(PAT)登錄 GitHub Container Registry。

export PAT=<your-token>
echo $PAT | docker login ghcr.io -u <your-github-username> --password-stdin

將替換為個(gè)人訪問令牌,將替換為 GitHub 用戶名。

登錄成功后我們可以使用以下命令將 Docker 鏡像標(biāo)記為 GitHub Container Registry 鏡像:

docker tag <your-image-name>:<tag> ghcr.io/<your-github-username>/<your-image-name>:<tag>

將 <your-image-name>:<tag> 替換為本地 Docker 鏡像名與 tag 名,將 <your-github-username> 替換為 GitHub 用戶名,<tag> 替換想要使用的標(biāo)簽(例如默認(rèn)的 latest 標(biāo)簽)。

然后使用以下命令將 Docker 鏡像推送到 GitHub Container Registry 即可:

docker push ghcr.io/<your-github-username>/<your-image-name>:<tag>

完成以上步驟后,就可以在 GitHub 個(gè)人賬號的 的 Packages 部分看到 Docker 鏡像了,但是該鏡像默認(rèn)為 private 鏡像,Pull 使用時(shí)需要先登錄。

github packages

現(xiàn)在回到我們的鏡像更新程序中,使用上面的 Token 來創(chuàng)建一個(gè) Secret:

kubectl create -n argocd secret docker-registry ghcr-secret \
  --docker-username=cnych \
  --docker-password=$PAT \
  --docker-server="https://ghcr.io"

設(shè)置憑據(jù)后,將它們配置在 ArgoCD 鏡像更新程序的配置中,以通過鏡像倉庫進(jìn)行身份驗(yàn)證,我們可以修改鏡像更新程序的配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-image-updater-config
  namespace: argocd
data:
  registries.conf: |
    registries:
      - name: ghcr-hub
        api_url: https://ghcr.io # 鏡像倉庫地址
        credentials: pullsecret:argocd/ghcr-secret # 憑據(jù)
        defaultns: library # 默認(rèn)命名空間
        default: true # 默認(rèn)倉庫

上面配置中我們指定了 GitHub 鏡像倉庫的憑據(jù)為 pullsecret:argocd/ghcr-secret,這樣 ArgoCD Image Updater 在訪問 ghcr.io 時(shí)就會使用這個(gè)憑據(jù)。

接下來我們還需要將 ArgoCD Image Updater 與 Git 集成,這也是重點(diǎn),這樣 ArgoCD Image Updater 就可以將鏡像更新直接提交回源 Git 倉庫。

我們可以在 ArgoCD 的 Dashboard 中先添加一個(gè) Git 倉庫 https://github.com/cnych/k8s-devops-gitops-demo:

add git repo

接下來我們可以按照正常使用方式創(chuàng)建一個(gè)新的 Application 對象,對應(yīng)的資源清單文件如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: gitops-demo
  namespace: argocd
spec:
  destination:
    namespace: gitops-demo
    server: https://kubernetes.default.svc
  project: default
  source:
    path: helm # 從 Helm 存儲庫創(chuàng)建應(yīng)用程序時(shí),chart 必須指定 path
    repoURL: https://github.com/cnych/k8s-devops-gitops-demo.git
    targetRevision: master
    helm:
      parameters:
        - name: replicaCount
          value: "2"
      valueFiles:
        - my-values.yaml
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

直接創(chuàng)建上面的資源清單文件后,ArgoCD 會自動創(chuàng)建一個(gè) Application 資源對象,并且會自動同步到 Git 倉庫中,我們可以在 Git 倉庫中看到對應(yīng)的資源清單文件:

gitops-demo

如果該應(yīng)用出現(xiàn)了如下所示的錯(cuò)誤信息:

Namespace                gitops-demo                            SyncFailed        resource :Namespace is not permitted in project default

則表面當(dāng)前使用的 project 沒有權(quán)限創(chuàng)建 namespace,我們只需要為其添加對應(yīng)的權(quán)限即可:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: default
  namespace: argocd
spec:
  clusterResourceWhitelist: # 白名單,表示允許訪問的資源
    - group: "*"
      kind: "*"
  destinations:
    - name: "*"
      namespace: "*"
      server: "*"
  sourceRepos:
    - "*"

我們可以使用 argocd app get 命令來查看 Application 資源對象的狀態(tài):

$ argocd app get argocd/gitops-demo
Name:               argocd/gitops-demo
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          gitops-demo
URL:                https://grpc.argocd.k8s.local/applications/gitops-demo
Source:
- Repo:             https://github.com/cnych/k8s-devops-gitops-demo.git
  Target:           master
  Path:             helm
  Helm Values:      my-values.yaml
SyncWindow:         Sync Allowed
Sync Policy:        Automated (Prune)
Sync Status:        Synced to master (53d91ed)
Health Status:      Progressing

GROUP              KIND        NAMESPACE    NAME                        STATUS     HEALTH       HOOK  MESSAGE
                   Namespace                gitops-demo                 Running    Synced             namespace/gitops-demo created
apps               Deployment  default      gitops-demo-helm-guestbook  Succeeded  Pruned             pruned
                   Service     default      gitops-demo-helm-guestbook  Succeeded  Pruned             pruned
                   Service     gitops-demo  gitops-demo-devops-demo     Synced     Healthy            service/gitops-demo-devops-demo created
apps               Deployment  gitops-demo  gitops-demo-devops-demo     Synced     Progressing        deployment.apps/gitops-demo-devops-demo created
networking.k8s.io  Ingress     gitops-demo  gitops-demo-devops-demo     Synced     Progressing        ingress.networking.k8s.io/gitops-demo-devops-demo created

需要注意要在目標(biāo)命名空間中添加 Image Pull Secret。

正常我們這個(gè)應(yīng)用就可以運(yùn)行了:

$ curl http://gitops-demo.k8s.local/
{"msg":"Hello Tekton On GitLab With ArgoCD"}

但是在 Dashboard 中我們可以看到應(yīng)用雖然已經(jīng)是 Synced 狀態(tài),但是 APP HEALTH 一直顯示為 Progressing 狀態(tài)。

App Health

這是因?yàn)?ArgoCD 的健康狀態(tài)機(jī)制引起的,我們可以在源碼 https://github.com/argoproj/gitops-engine/blob/master/pkg/health/health_ingress.go#L7 中看到健康狀態(tài)的檢查邏輯。

func getIngressHealth(obj *unstructured.Unstructured) (*HealthStatus, error) {
 ingresses, _, _ := unstructured.NestedSlice(obj.Object, "status", "loadBalancer", "ingress")
 health := HealthStatus{}
 if len(ingresses) > 0 {
  health.Status = HealthStatusHealthy
 } else {
  health.Status = HealthStatusProgressing
 }
 return &health, nil
}

他需要檢查 Ingress 資源對象的 status.loadBalancer.ingress 字段是否為空,如果為空則表示健康狀態(tài)為 Progressing,否則為 Healthy,但實(shí)際情況卻是并不是所有的 Ingress 資源對象都會自動生成 status.loadBalancer.ingress 字段,比如我們這里就并沒有生成。

這個(gè)時(shí)候我們可以通過配置 argocd-cm 的配置資源來修改健康狀態(tài)檢查邏輯,添加如下所示的配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  resource.customizations: |
    networking.k8s.io/Ingress:
      health.lua: |
        hs = {}
        if obj.metadata ~= nil and obj.metadata.creationTimestamp ~= nil then
          hs.status = "Healthy"
          hs.message = "Ingress 已創(chuàng)建"
        else
          hs.status = "Progressing"
          hs.message = "Ingress 正在創(chuàng)建中"
        end
        return hs

上面的配置表示如果 Ingress 資源對象的 metadata.creationTimestamp 字段不為空,則表示健康狀態(tài)為 Healthy,否則為 Progressing,更新上面的配置后,我們再次查看應(yīng)用的健康狀態(tài)就會發(fā)現(xiàn)已經(jīng)變成了 Healthy 狀態(tài):

App Health

接下來我們就可以使用 ArgoCD Image Updater 來更新鏡像了,修改上面的 Application 資源清單文件,我們需要添加一些注解來指定需要更新的鏡像規(guī)則策略,如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: gitops-demo
  namespace: argocd
  annotations:
    argocd-image-updater.argoproj.io/image-list: myalias=ghcr.io/cnych/gitops-demo # 指定鏡像倉庫
    argocd-image-updater.argoproj.io/myalias.allow-tags: regexp:^.*$ # 允許所有標(biāo)簽
    argocd-image-updater.argoproj.io/myalias.pull-secret: pullsecret:argocd/ghcr-secret # 指定憑據(jù)
    argocd-image-updater.argoproj.io/myalias.update-strategy: latest # 指定更新策略
    # argocd-image-updater.argoproj.io/myalias.ignore-tags: latest, master # 指定忽略的標(biāo)簽
    argocd-image-updater.argoproj.io/write-back-method: git # 指定寫回方法
    argocd-image-updater.argoproj.io/git-branch: master # 指定 Git 分支
    argocd-image-updater.argoproj.io/myalias.force-update: "true" # 強(qiáng)制更新
spec:
  destination:
    namespace: gitops-demo
    server: https://kubernetes.default.svc
  project: default
  source:
    path: helm # 從 Helm 存儲庫創(chuàng)建應(yīng)用程序時(shí),chart 必須指定 path
    repoURL: https://github.com/cnych/k8s-devops-gitops-demo.git
    targetRevision: master
    helm:
      parameters:
        - name: replicaCount
          value: "2"
      valueFiles:
        - my-values.yaml
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true

這個(gè)新的資源對象中,我們添加了一些注釋,這些注釋用于配置 Argo CD Image Updater。這些配置用于指定自動更新容器鏡像的策略、參數(shù)和相關(guān)信息。以下是對這些注釋的詳細(xì)解釋:

  • argocd-image-updater.argoproj.io/image-list: 這個(gè)注解定義了應(yīng)用中使用的鏡像列表。
  • argocd-image-updater.argoproj.io/allow-tags: 這個(gè)注解指定了允許更新的鏡像標(biāo)簽,可以使用正則表達(dá)式的方式。
  • argocd-image-updater.argoproj.io/<alias>.pull-secret: 這個(gè)注解指定了用于拉取鏡像的 Secret。
  • argocd-image-updater.argoproj.io/update-strategy: 這個(gè)注解定義了鏡像更新策略。這里的值是 latest,表示使用最新的鏡像標(biāo)簽進(jìn)行更新,還可以指定的值包括:digest、name、semver。
  • latest: 使用最新的鏡像標(biāo)簽進(jìn)行更新。
  • digest: 使用鏡像的 digest 進(jìn)行更新。
  • name: 使用鏡像的名稱進(jìn)行更新。
  • semver: 使用 semver 進(jìn)行更新。
  • argocd-image-updater.argoproj.io/write-back-method: 這個(gè)注解定義了更新后的配置寫回方法。git 表示將更新后的配置寫回到 Git 倉庫。
  • git: 將更新后的配置寫回到 Git 倉庫。
  • patch: 使用 kubectl patch 命令更新資源。
  • replace: 使用 kubectl replace 命令更新資源。
  • argocd-image-updater.argoproj.io/git-branch: 這個(gè)注解定義了更新后的配置寫回到 Git 倉庫的分支。

現(xiàn)在我們重新更新 Application 資源對象即可。接下來我們只需要重新推送一個(gè)新的鏡像到 GitHub Container Registry 即可自動觸發(fā) ArgoCD Image Updater 更新鏡像。

我們更新下倉庫中的 main.go 文件:

修改代碼

現(xiàn)在我們重新構(gòu)建一個(gè)新的鏡像并推送到 GitHub Container Registry:

docker build --platform linux/amd64 -t ghcr.io/cnych/gitops-demo:v0.1.1 .
docker push ghcr.io/cnych/gitops-demo:v0.1.1

推送新的鏡像后,然后 Argo CD Image Updater 將會每 2 分鐘從鏡像倉庫去檢索鏡像版本變化,一旦發(fā)現(xiàn)有新的鏡像版本,它將自動使用新版本來更新集群內(nèi)工作負(fù)載的鏡像,并將鏡像版本回寫到 Git 倉庫中去,我們可以去查看 Argo CD Image Updater 的日志變化:

$ kubectl logs -f argocd-image-updater-57b788886d-d4qh5 -n argocd
time="2024-09-27T06:51:32Z" level=info msg="argocd-image-updater v0.14.0+af844fe starting [loglevel:INFO, interval:2m0s, healthport:8080]"
time="2024-09-27T06:51:32Z" level=warning msg="commit message template at /app/config/commit.template does not exist, using default"
time="2024-09-27T08:35:39Z" level=warning msg="\"latest\" strategy has been renamed to \"newest-build\". Please switch to the new convention as support for the old naming convention will be removed in future versions." image_alias=myalias image_name=ghcr.io/cnych/gitops-demo registry_url=ghcr.io
time="2024-09-27T08:35:40Z" level=info msg="Processing results: applicatinotallow=1 images_cnotallow=1 images_skipped=0 images_updated=0 errors=0"
xxxxxxxxxxxxxxtime="2024-09-27T08:37:40Z" level=info msg="Starting image update cycle, considering 1 annotated application(s) for update"
time="2024-09-27T08:37:40Z" level=warning msg="\"latest\" strategy has been renamed to \"newest-build\". Please switch to the new convention as support for the old naming convention will be removed in future versions." image_alias=myalias image_name=ghcr.io/cnych/gitops-demo registry_url=ghcr.io
time="2024-09-27T08:37:44Z" level=info msg="Setting new image to ghcr.io/cnych/gitops-demo:v0.1.1" alias=myalias applicatinotallow=gitops-demo image_name=cnych/gitops-demo image_tag=latest registry=ghcr.io
time="2024-09-27T08:37:44Z" level=info msg="Successfully updated image 'ghcr.io/cnych/gitops-demo:latest' to 'ghcr.io/cnych/gitops-demo:v0.1.1', but pending spec update (dry run=false)" alias=myalias applicatinotallow=gitops-demo image_name=cnych/gitops-demo image_tag=latest registry=ghcr.io
time="2024-09-27T08:37:44Z" level=info msg="Committing 1 parameter update(s) for application gitops-demo" applicatinotallow=gitops-demo
time="2024-09-27T08:37:44Z" level=info msg="Starting configmap/secret informers"
time="2024-09-27T08:37:44Z" level=info msg="Configmap/secret informer synced"
time="2024-09-27T08:37:44Z" level=info msg="Initializing https://github.com/cnych/k8s-devops-gitops-demo.git to /tmp/git-gitops-demo1873820104"
time="2024-09-27T08:37:44Z" level=info msg="secrets informer cancelled"
time="2024-09-27T08:37:44Z" level=info msg="configmap informer cancelled"
time="2024-09-27T08:37:44Z" level=info msg="git fetch origin --tags --force --prune" dir=/tmp/git-gitops-demo1873820104 execID=acebc
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git fetch origin --tags --force --prune]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1640.146246
time="2024-09-27T08:37:46Z" level=info msg="git config user.name argocd-image-updater" dir=/tmp/git-gitops-demo1873820104 execID=7ec2d
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git config user.name argocd-image-updater]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1.5687190000000002
time="2024-09-27T08:37:46Z" level=info msg="git config user.email noreply@argoproj.io" dir=/tmp/git-gitops-demo1873820104 execID=6e796
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git config user.email noreply@argoproj.io]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1.688394
time="2024-09-27T08:37:46Z" level=info msg="git checkout --force master" dir=/tmp/git-gitops-demo1873820104 execID=403bb
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git checkout --force master]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=4.522311
time="2024-09-27T08:37:46Z" level=info msg="git clean -ffdx" dir=/tmp/git-gitops-demo1873820104 execID=b3f03
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git clean -ffdx]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1.429556
time="2024-09-27T08:37:46Z" level=info msg="git -c gpg.format=openpgp commit -a -F /tmp/image-updater-commit-msg441967746" dir=/tmp/git-gitops-demo1873820104 execID=0efc6
time="2024-09-27T08:37:46Z" level=info msg=Trace args="[git -c gpg.format=openpgp commit -a -F /tmp/image-updater-commit-msg441967746]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=5.239213
time="2024-09-27T08:37:46Z" level=info msg="git push origin master" dir=/tmp/git-gitops-demo1873820104 execID=fcd1f
time="2024-09-27T08:37:47Z" level=info msg=Trace args="[git push origin master]" dir=/tmp/git-gitops-demo1873820104 operation_name="exec git" time_ms=1934.14529
time="2024-09-27T08:37:47Z" level=info msg="Successfully updated the live application spec" applicatinotallow=gitops-demo
time="2024-09-27T08:37:47Z" level=info msg="Processing results: applicatinotallow=1 images_cnotallow=1 images_skipped=0 images_updated=1 errors=0"

然后在 Git 倉庫中我們也可以看到有一條新的 commit 提交記錄,可以看到在回寫時(shí),ArgoCD Image Updater 并不會直接修改倉庫的 values.yaml 文件,而是會創(chuàng)建一個(gè)專門用于覆蓋 Helm Chart values.yaml 的 .argocd-source-devops-demo.yaml 文件。

git commit

自動提交變更后,Argo CD 就會自動同步部署應(yīng)用了。

app sync

當(dāng)然現(xiàn)在訪問應(yīng)用結(jié)果就是我們更改后的內(nèi)容了:

$ curl http://gitops-demo.k8s.local/
{"msg":"Hello ArgoCD With Image Updater"}

另外我們可以注意到每次 Git 提交都與作者的姓名和電子郵件地址相關(guān)聯(lián)。如果未配置,Argo CD 鏡像更新程序執(zhí)行的提交將使用 argocd-image-updater <noreply@argoproj.io> 作為作者。您可以使用 --git-commit-user 和 --git-commit-email 命令行開關(guān)覆蓋作者,或在 argocd-image-updater-config ConfigMap 中設(shè)置 git.user 和 git.email 即可。

同樣我們可以將 Argo CD Image Updater 使用的默認(rèn)提交消息更改為適合你的方式。可以創(chuàng)建一個(gè)簡單的模板(使用 Golang Template),并通過將 argocd-image-updater-config ConfigMap 中的密鑰 git.commit-message-template 設(shè)置為模板的內(nèi)容來使其可用,例如:

data:
  git.commit-message-template: |
    build: automatic update of {{ .AppName }}

    {{ range .AppChanges -}}
    updates image {{ .Image }} tag '{{ .OldTag }}' to '{{ .NewTag }}'
    {{ end -}}

模板中提供了兩個(gè)頂級變量:

  • .AppName 是正在更新的應(yīng)用程序的名稱。
  • .AppChanges 是更新所執(zhí)行的更改的列表。此列表中的每個(gè)條目都是一個(gè)結(jié)構(gòu)體,為每個(gè)更改提供以下信息:
  • .Image 保存已更新圖像的全名。
  • .OldTag 保存更新之前的標(biāo)簽名稱或 SHA 摘要。
  • .NewTag 保存更新為的標(biāo)簽名稱或 SHA 摘要。
責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2021-02-15 15:36:04

采礦加密貨幣區(qū)塊鏈

2021-12-17 22:52:44

物聯(lián)網(wǎng)電信技術(shù)

2014-11-10 09:29:13

Google

2022-06-07 14:30:40

區(qū)塊鏈比特幣以太坊

2020-02-12 15:08:41

KVM內(nèi)部運(yùn)作

2010-08-16 14:41:49

開源社區(qū)Ubuntu

2022-05-24 17:00:41

區(qū)塊鏈IT比特幣

2024-04-08 14:29:45

AI工廠數(shù)據(jù)中心

2010-08-30 09:05:45

2010-08-23 16:28:24

開源社區(qū)DebianUbuntu

2017-06-23 15:45:09

AndroidThread

2021-05-28 17:24:32

人工智能AI深度學(xué)習(xí)

2014-09-17 11:45:20

iOS編程App運(yùn)作

2022-04-26 12:45:52

TikTok機(jī)器學(xué)習(xí)人工智能

2017-10-30 15:26:54

數(shù)據(jù)中心超融合云計(jì)算

2012-08-13 09:39:57

虛擬化

2023-05-31 07:32:37

2022-04-28 08:00:00

TikTok人工智能架構(gòu)

2020-02-15 15:33:55

Python如何運(yùn)作

2016-05-18 14:13:02

Edge瀏覽器微軟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號