精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

ArgoCD Image Updater是如何運作的?

云計算 云原生
Argo CD Image Updater 會定期輪詢 Argo CD 中配置的應用程序,并查詢相應的鏡像倉庫以獲取可能的新版本。如果在倉庫中找到新版本的鏡像,并且滿足版本約束,Argo CD 鏡像更新程序將指示 Argo CD 使用新版本的鏡像更新應用程序。

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

Argo CD Image Updater 會定期輪詢 Argo CD 中配置的應用程序,并查詢相應的鏡像倉庫以獲取可能的新版本。如果在倉庫中找到新版本的鏡像,并且滿足版本約束,Argo CD 鏡像更新程序將指示 Argo CD 使用新版本的鏡像更新應用程序。

根據您的應用程序自動同步策略,Argo CD 將自動部署新的鏡像版本或將應用程序標記為不同步,您可以通過同步應用程序來手動觸發鏡像更新。

它是如何運作的?

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

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

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

特征

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

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

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

安裝

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

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

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

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

配置

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

ArgoCD Image Updater 可以使用以下方法獲取憑據:

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

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

  • 通用 Secret:通用 Secret 是包含單個鍵值對的 Secret,鍵值對可以是任何格式,比如我們可以用下面的命令來創建一個:
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) 的方式引用。

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

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

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

將其引用為 ext:<full_path_to_script>。

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

首先我們在 Github 個人設置頁面中創建一個個人訪問令牌,如下圖所示:

Token

這個 Token 的權限要包括 write:packages 和 read:packages,這樣我們才能推送和拉取鏡像,創建后會得到一個 Token。

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

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

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

登錄成功后我們可以使用以下命令將 Docker 鏡像標記為 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> 替換想要使用的標簽(例如默認的 latest 標簽)。

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

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

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

github packages

現在回到我們的鏡像更新程序中,使用上面的 Token 來創建一個 Secret:

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

設置憑據后,將它們配置在 ArgoCD 鏡像更新程序的配置中,以通過鏡像倉庫進行身份驗證,我們可以修改鏡像更新程序的配置:

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 # 憑據
        defaultns: library # 默認命名空間
        default: true # 默認倉庫

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

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

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

add git repo

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

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 存儲庫創建應用程序時,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

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

gitops-demo

如果該應用出現了如下所示的錯誤信息:

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

則表面當前使用的 project 沒有權限創建 namespace,我們只需要為其添加對應的權限即可:

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

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

$ 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

需要注意要在目標命名空間中添加 Image Pull Secret。

正常我們這個應用就可以運行了:

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

但是在 Dashboard 中我們可以看到應用雖然已經是 Synced 狀態,但是 APP HEALTH 一直顯示為 Progressing 狀態。

App Health

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

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 字段是否為空,如果為空則表示健康狀態為 Progressing,否則為 Healthy,但實際情況卻是并不是所有的 Ingress 資源對象都會自動生成 status.loadBalancer.ingress 字段,比如我們這里就并沒有生成。

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

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 已創建"
        else
          hs.status = "Progressing"
          hs.message = "Ingress 正在創建中"
        end
        return hs

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

App Health

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

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:^.*$ # 允許所有標簽
    argocd-image-updater.argoproj.io/myalias.pull-secret: pullsecret:argocd/ghcr-secret # 指定憑據
    argocd-image-updater.argoproj.io/myalias.update-strategy: latest # 指定更新策略
    # argocd-image-updater.argoproj.io/myalias.ignore-tags: latest, master # 指定忽略的標簽
    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" # 強制更新
spec:
  destination:
    namespace: gitops-demo
    server: https://kubernetes.default.svc
  project: default
  source:
    path: helm # 從 Helm 存儲庫創建應用程序時,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

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

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

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

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

修改代碼

現在我們重新構建一個新的鏡像并推送到 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 分鐘從鏡像倉庫去檢索鏡像版本變化,一旦發現有新的鏡像版本,它將自動使用新版本來更新集群內工作負載的鏡像,并將鏡像版本回寫到 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 提交記錄,可以看到在回寫時,ArgoCD Image Updater 并不會直接修改倉庫的 values.yaml 文件,而是會創建一個專門用于覆蓋 Helm Chart values.yaml 的 .argocd-source-devops-demo.yaml 文件。

git commit

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

app sync

當然現在訪問應用結果就是我們更改后的內容了:

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

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

同樣我們可以將 Argo CD Image Updater 使用的默認提交消息更改為適合你的方式??梢詣摻ㄒ粋€簡單的模板(使用 Golang Template),并通過將 argocd-image-updater-config ConfigMap 中的密鑰 git.commit-message-template 設置為模板的內容來使其可用,例如:

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

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

模板中提供了兩個頂級變量:

  • .AppName 是正在更新的應用程序的名稱。
  • .AppChanges 是更新所執行的更改的列表。此列表中的每個條目都是一個結構體,為每個更改提供以下信息:
  • .Image 保存已更新圖像的全名。
  • .OldTag 保存更新之前的標簽名稱或 SHA 摘要。
  • .NewTag 保存更新為的標簽名稱或 SHA 摘要。
責任編輯:姜華 來源: k8s技術圈
相關推薦

2021-12-17 22:52:44

物聯網電信技術

2021-02-15 15:36:04

采礦加密貨幣區塊鏈

2022-06-07 14:30:40

區塊鏈比特幣以太坊

2014-11-10 09:29:13

Google

2020-02-12 15:08:41

KVM內部運作

2024-04-08 14:29:45

AI工廠數據中心

2010-08-30 09:05:45

2022-05-24 17:00:41

區塊鏈IT比特幣

2010-08-16 14:41:49

開源社區Ubuntu

2017-06-23 15:45:09

AndroidThread

2010-08-23 16:28:24

開源社區DebianUbuntu

2014-09-17 11:45:20

iOS編程App運作

2022-04-26 12:45:52

TikTok機器學習人工智能

2021-05-28 17:24:32

人工智能AI深度學習

2017-10-30 15:26:54

數據中心超融合云計算

2012-08-13 09:39:57

虛擬化

2023-05-31 07:32:37

2022-04-28 08:00:00

TikTok人工智能架構

2023-10-09 16:22:17

2016-05-18 14:13:02

Edge瀏覽器微軟
點贊
收藏

51CTO技術棧公眾號

26uuu精品一区二区三区四区在线| 欧美三级午夜理伦三级中文幕| 欧美日韩亚洲不卡| 国产精品igao激情视频| 性感美女福利视频| 久久精品理论片| 97涩涩爰在线观看亚洲| 三区四区在线观看| www.爱久久| 欧美午夜电影在线播放| 高清欧美精品xxxxx| 99re在线视频| 99久久精品一区| 国产精品久久久久久久app| 免费毛片在线播放免费 | 欧美网站一区二区| 你真棒插曲来救救我在线观看| 三级外国片在线观看视频| 成人免费视频一区二区| 91嫩草在线视频| 国产精品熟女视频| av成人天堂| 久久久久久久久久久亚洲| 亚洲欧洲综合网| 精品久久网站| 亚洲精品一区二区三区蜜桃下载| 中国黄色片一级| 性欧美freehd18| 狠狠综合久久av一区二区小说| 国产尤物av一区二区三区| 日韩黄色影院| 国产精品黄色在线观看| 日韩在线三区| 免费a在线观看| wwwwww.欧美系列| 国产精品乱码视频| 亚洲国产精品久久久久久6q| 精东粉嫩av免费一区二区三区| 国产成人综合久久| 精产国品一区二区| 日日夜夜精品视频天天综合网| 欧美一级大片在线免费观看| 在线免费观看毛片| 国内久久精品| 午夜精品视频网站| 精品一级少妇久久久久久久| 欧美日韩蜜桃| 久久久久久久久亚洲| 青娱乐91视频| 黑丝一区二区| 久久久久久有精品国产| 国产精彩视频在线| 日韩午夜在线| 欧美在线视频免费播放| 国产乡下妇女做爰毛片| 亚洲激情一区| 欧美与黑人午夜性猛交久久久| 毛片视频网站在线观看| 媚黑女一区二区| 国产精品福利在线观看| 波多野结衣影片| 麻豆精品视频在线观看免费| 国产日韩精品在线播放| 国产视频一二三四区| 国产精品77777竹菊影视小说| 999国产视频| 五月婷婷在线观看视频| 久久综合成人精品亚洲另类欧美| 久久久久久国产精品mv| 国产一二三在线观看| 国产精品亲子伦对白| 在线观看成人av电影| av观看在线| 午夜精品成人在线| 亚洲免费av一区二区三区| 精品美女一区| 日韩免费观看高清完整版 | 国产精品第13页| 欧美人与动牲交xxxxbbbb| 已婚少妇美妙人妻系列| 亚洲午夜精品久久久| 精品一区二区免费视频| 国产精品久久久久免费| 国产九色在线| 亚洲最新视频在线观看| 黄色影院一级片| 岛国精品在线| 精品国产乱码久久久久久老虎 | 国产精品传媒| 伊人久久久久久久久久久| 久久国产精品国语对白| 国产亚洲精品v| 91九色国产视频| 婷婷综合激情网| 日韩人妻一区二区三区| 亚洲国产日韩在线观看| 91丨porny丨国产| 亚洲视频在线观看日本a| 最爽无遮挡行房视频在线| 精品国产成人在线| 999久久久精品视频| 免费观看成人www动漫视频| 有码中文亚洲精品| 国产精久久久久久| 激情综合色综合久久| 久久99国产精品| 91高清在线观看视频| 色8久久人人97超碰香蕉987| 日本r级电影在线观看| 欧美猛男做受videos| 久久久久在线观看| 国产又粗又黄又爽| 久久精品水蜜桃av综合天堂| 99热久久这里只有精品| 在线高清欧美| 在线电影欧美日韩一区二区私密| 国产一级淫片a| 稀缺小u女呦精品呦| 日本www在线观看视频| 偷窥国产亚洲免费视频| 国产美女视频免费看| 婷婷成人在线| 久久久综合免费视频| 国产免费av电影| 国产精品午夜在线| 50路60路老熟妇啪啪| 成人直播在线观看| 欧美国产第二页| 国产又粗又猛又爽又黄视频| 国产午夜三级一区二区三| 久久综合九色综合88i| 午夜视频一区二区在线观看| 91久久电影| 日韩一区二区三区视频在线观看 | 国产私拍福利精品视频二区| 日韩电影第一页| 国产精品18p| 黄色片视频免费观看| 中文字幕中文字幕在线中高清免费版 | 欧美专区日韩专区| av男人的天堂av| 亚洲在线日韩| 欧美成人一区二区在线| 欧洲一区精品| 亚洲男人的天堂网站| 男人天堂2024| 国产欧美一区二区精品性色超碰| 成年人免费在线播放| 免费看成人吃奶视频在线| 91福利视频在线观看| 青青草视频在线免费观看| 精品免费在线观看| 日韩人妻无码一区二区三区| 免费在线欧美黄色| 色大师av一区二区三区| 日韩电影精品| 欧美韩国理论所午夜片917电影| av中文在线观看| 亚洲成av人综合在线观看| 国产激情第一页| 久久久久久久高潮| 伊人久久99| 亚洲综合影院| 91av视频在线观看| 成人18在线| 日韩欧美国产高清| 97超碰人人干| 欧美激情一区不卡| ass极品水嫩小美女ass| 亚洲精品九九| 亚洲高清123| 国产精品日韩精品在线播放| 久久久久成人网| 免费国产在线视频| 51午夜精品国产| 日韩手机在线观看| 国产欧美日韩在线| 国产又黄又嫩又滑又白| 亚洲影院在线| 国产又爽又黄ai换脸| 久久精品福利| 国产精品欧美日韩久久| 国产偷倩在线播放| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | www.激情五月.com| 日本不卡在线| 欧美体内she精视频| 天天看片中文字幕| 久久亚洲一区二区三区四区| 992kp免费看片| 亚洲免费网址| 今天免费高清在线观看国语| 亚洲图区在线| 操人视频欧美| 欧美91在线|欧美| 4p变态网欧美系列| 制服丝袜中文字幕在线| 亚洲色图校园春色| 韩国av在线免费观看| 在线免费观看日本欧美| 久久精品国产亚洲av香蕉| 国产精品美女久久久久久久久 | 国产精品一国产精品| 97人人澡人人爽| 男女啪啪999亚洲精品| 日本久久久久久| av中文字幕在线看| 成人97在线观看视频| 国产鲁鲁视频在线观看免费| 亚洲福利在线看| 精品人妻一区二区三区含羞草| 欧美在线免费播放| 欧美三日本三级少妇99| 一区二区三区美女| 国产极品美女在线| 国产精品热久久久久夜色精品三区| 人妻无码一区二区三区| 成人一级视频在线观看| 伦伦影院午夜理论片| 裸体一区二区三区| 亚洲成人福利在线观看| 亚洲一区二区三区四区五区午夜 | 国产亚洲精品成人| 亚洲色图都市小说| 免费一级suv好看的国产网站| 久久久久久久久久久黄色| 日本五十肥熟交尾| 成人av中文字幕| 精品人妻一区二区免费| 国产精品99久久久| 欧美日韩一区二区区别是什么| 久久精品国产精品亚洲精品| 欧美一级黄色影院| 日韩激情中文字幕| 亚洲精品一二三四五区| 免费永久网站黄欧美| 99福利在线观看| 美女国产精品| 国产精品亚洲二区在线观看| 国产又粗又黄又猛| 久久一区二区三区国产精品| 亚洲男人在线天堂| 久久综合中文字幕| 90岁老太婆乱淫| 国产午夜精品美女毛片视频| 免费污网站在线观看| 国产欧美一区二区三区在线老狼| 国产特级黄色录像| 国产免费观看久久| 日本少妇aaa| 亚洲免费观看高清| 欧美黑人精品一区二区不卡| 亚洲线精品一区二区三区| 亚洲国产精一区二区三区性色| 午夜欧美2019年伦理| 国产精品第5页| 欧美一a一片一级一片| 国产又大又黄的视频| 日韩精品一区二区三区四区视频| 亚洲精品综合网| 国产午夜精品麻豆| 欧美三级电影一区二区三区| 久久成人人人人精品欧| 免费网站在线观看人| 777精品视频| 欧美成人app| 成人高清在线观看| 亚洲福利天堂| 亚洲人久久久| 亚洲欧洲综合| 精品久久久久久中文字幕2017| 精品一区二区综合| 人妻无码中文久久久久专区| 久久久不卡网国产精品一区| 亚洲熟女少妇一区二区| 亚洲午夜三级在线| 久久久久久亚洲av无码专区| 欧美一区二区三区性视频| 日日躁夜夜躁白天躁晚上躁91| 亚洲欧洲日本专区| 91国内在线| 国产精品免费电影| 综合伊人久久| 亚洲综合五月天| 国产欧美一区二区色老头 | 伊人伊成久久人综合网小说 | 538国产精品一区二区免费视频| 亚洲电影有码| 国产精品视频在线免费观看| av伊人久久| 五月丁香综合缴情六月小说| 秋霞成人午夜伦在线观看| wwwxxx色| 欧美国产精品专区| 成人精品免费在线观看| 欧美久久一二三四区| 亚洲欧洲精品视频| 欧美成人精品影院| 精品176极品一区| 久久国产精品高清| 伊人色综合久久久| 亚洲成人自拍一区| 亚洲性生活大片| 亚洲男人av在线| 国产网红女主播精品视频| 国产在线观看精品| 国产精品嫩模av在线| 日韩黄色短视频| 国产成人在线视频免费播放| 少妇无套高潮一二三区| 精品久久香蕉国产线看观看gif| 国产叼嘿视频在线观看| 中文字幕亚洲欧美日韩高清 | 国产精品草莓在线免费观看| 在线观看免费91| 国产情侣一区二区三区| 精品国产一区二区三区四区vr | 国产丝袜一区二区三区| av网站免费在线观看| 国产欧美一区二区三区在线看| 亚洲电影一级片| www.中文字幕在线| 成人久久18免费网站麻豆 | jzzjzzjzz亚洲成熟少妇| 日韩av电影手机在线观看| 老司机aⅴ在线精品导航| 国产欧美精品aaaaaa片| 国产精品影视网| www日韩在线| 777欧美精品| 免费在线观看黄色网| 成人h猎奇视频网站| 色欧美自拍视频| 亚洲精品综合在线观看| 中文字幕一区二区三区在线观看| 懂色av蜜臀av粉嫩av喷吹| 亚洲欧美国产精品久久久久久久| 国产99在线观看| 国产综合动作在线观看| 99精品免费网| 精品人妻一区二区三区日产乱码卜| 亚洲国产一区二区视频| 日韩中文字幕观看| 国产麻豆9l精品三级站| 日韩在线免费观看av| 日韩欧美中文免费| 久久天堂电影| 国产精品美女www爽爽爽视频| 精品国产一区二区三区久久久蜜臀| 少妇人妻互换不带套| 国产日韩av一区二区| 91丨九色丨丰满| 欧美大奶子在线| 国产成人在线中文字幕| 欧美二区在线视频| 久久婷婷久久一区二区三区| 欧美一级做a爰片免费视频| 中文字幕日韩有码| 免费一级欧美在线大片| 久无码久无码av无码| 久久综合色之久久综合| 中文字幕 国产精品| xxx一区二区| 成人香蕉社区| 好男人www社区| 六月丁香综合网| 欧美成人精品在线观看| 成人精品毛片| 久久久精品麻豆| 亚洲一区在线看| 韩国中文字幕2020精品| 91精品视频大全| 野花国产精品入口| 国产在线免费av| 亚洲成人a级网| 99热播精品免费| 嫩草影院中文字幕| 久久久99久久| wwwav网站| 国产成人高清激情视频在线观看| 伊人青青综合网| 国产手机在线观看| 欧美成人猛片aaaaaaa| 原纱央莉成人av片| 亚洲国产一二三精品无码| 26uuu色噜噜精品一区二区| 国产精品久久免费| 欧美亚洲另类在线| 亚洲澳门在线| 精品国产av无码| 日韩欧美在线影院| 日本在线精品| 999在线观看视频| 亚洲欧美在线aaa| 欧美日韩伦理片| 懂色中文一区二区三区在线视频| 日本aⅴ亚洲精品中文乱码| 国产乡下妇女做爰视频| 久久色在线播放| 欧洲毛片在线视频免费观看|