精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美女优在线观看| www.国产色| 久久国产精品免费一区二区三区| 亚洲丝袜制服诱惑| 国产精品乱码| 69国产精品视频免费观看| 精品国产一区二区三区小蝌蚪 | 国产精品一区二区在线观看网站 | 精品国产第一页| 一级片视频在线观看| 色135综合网| 欧美成人精品福利| 免费日韩视频在线观看| 国产一区久久精品| 9l国产精品久久久久麻豆| 日韩美女在线看| 欧美黄色免费观看| 色综合中文网| 精品久久久久99| 91香蕉视频导航| 国产精品69xx| 国产精品二三区| 久久精品丝袜高跟鞋| 中文字幕一二三四| 99精品久久| 久久久极品av| 亚洲第一成人网站| 亚洲天堂中文字幕在线观看| 色成人在线视频| 成人污网站在线观看| 搡老岳熟女国产熟妇| 激情丁香综合五月| 国产成人av在线播放| 麻豆国产尤物av尤物在线观看| 国产一区二区三区四区大秀| 亚洲成人久久电影| 亚洲无在线观看| 欧美最新精品| 午夜精品免费在线| 台湾无码一区二区| 老司机在线永久免费观看| 久久久久一区二区三区四区| 成人欧美一区二区三区视频| 国产又粗又黄又爽视频| 视频在线观看91| 91精品91久久久久久| 青娱乐免费在线视频| 欧美韩国日本在线观看 | 国内在线免费高清视频| 本田岬高潮一区二区三区| 亚洲www在线观看| 伊人久久亚洲综合| 天堂蜜桃91精品| 欧美在线视频播放| 日韩少妇高潮抽搐| 亚洲第一伊人| 91国产精品91| 精品国产免费观看| 一级成人国产| 4p变态网欧美系列| 国产一级做a爱片久久毛片a| 激情成人亚洲| 国模精品一区二区三区色天香| 青娱乐免费在线视频| 午夜天堂精品久久久久| 欧美另类在线观看| 久久久久成人精品无码| 欧美日韩日本国产亚洲在线| 欧美另类老女人| 国产亚洲第一页| 1024日韩| 8050国产精品久久久久久| 永久免费看片在线播放| 99精品视频免费观看| 45www国产精品网站| 性色av免费观看| 日韩精品电影一区亚洲| 国产精品久久久久7777婷婷| 一区二区小视频| 国产一区二区女| 国产精品久久久久久免费观看| 特黄aaaaaaaaa真人毛片| 久久综合av免费| 色阁综合av| 麻豆影视国产在线观看| 亚洲一区二区在线观看视频| 无码专区aaaaaa免费视频| 天堂电影一区| 精品视频资源站| 亚洲欧美日韩网站| 高清欧美性猛交xxxx黑人猛| 国产视频精品xxxx| 久久久久久久久福利| 亚洲精品97| 久久久亚洲影院| 日本一本在线观看| 激情小说亚洲一区| 精品无码久久久久久久动漫| 国产毛片在线看| 亚洲免费三区一区二区| 欧美激情 国产精品| 欧美国产日韩电影| 精品国产一区二区在线观看| 日韩精品无码一区二区三区久久久| 久久国产综合| 久久久噜噜噜久久| 亚洲一区在线观| www.日韩av| 亚洲欧美日韩精品综合在线观看| 日本无删减在线| 色呦呦国产精品| 成人啪啪18免费游戏链接| 自拍视频一区| 欧美激情国产精品| 亚洲第一区av| 99久久精品久久久久久清纯| 一本色道久久综合亚洲二区三区| 福利网站在线观看| 8v天堂国产在线一区二区| 六十路息与子猛烈交尾| 久久综合成人| 日本亚洲欧洲色α| 欧美一级免费片| 亚洲日本va午夜在线影院| 精品人妻一区二区三区四区在线| 国产精品一区二区美女视频免费看| 日韩毛片在线看| 久久99久久久| 精品一区二区久久久| 欧美一区视久久| 国产盗摄——sm在线视频| 91精品国产综合久久久蜜臀粉嫩 | 色婷婷**av毛片一区| 99热在线观看免费精品| 国产一区二区三区av电影| 婷婷精品国产一区二区三区日韩 | 国产精品白丝jk喷水视频一区| 草逼视频免费看| 国产精品白丝在线| 中文字幕欧美人妻精品一区| 嫩草国产精品入口| 欧美疯狂xxxx大交乱88av| 国产又粗又黄又爽视频| 国产精品视频在线看| 色诱视频在线观看| 亚洲三级性片| 欧美一区二三区| 五月婷婷开心中文字幕| 亚洲成人免费视频| 国产艳妇疯狂做爰视频 | 婷婷久久综合九色综合99蜜桃| 亚洲欧美制服另类日韩| 国产尤物在线视频| 99久久99久久精品国产片果冻| 日本免费a视频| 51亚洲精品| 欧美激情乱人伦| 亚洲第一大网站| 亚洲自拍偷拍麻豆| 性猛交╳xxx乱大交| 国产精品激情电影| 国产欧美韩日| 国产va在线视频| 亚洲男人天天操| 日韩熟女一区二区| 国产午夜亚洲精品羞羞网站| 久热免费在线观看| 成人中文视频| 成人午夜两性视频| 调教一区二区| 亚洲二区在线播放视频| 日韩av免费网址| 91免费看片在线观看| 农村妇女精品一二区| 日韩不卡一区| 亚洲最大成人网色| 波多野结衣久久| 精品无人区乱码1区2区3区在线| 亚洲婷婷综合网| 中文字幕乱码久久午夜不卡 | 中文视频一区视频二区视频三区| 日韩三区四区| 欧美黑人巨大精品一区二区| 天天操天天爱天天干| 91久久香蕉国产日韩欧美9色| 亚洲精品视频网址| 国产精品一区二区在线看| 欧美视频在线免费播放| 亚洲肉体裸体xxxx137| 国产欧美一区二区白浆黑人| 少女频道在线观看高清| 日韩精品视频三区| 成人小视频在线播放| 自拍偷拍欧美激情| 久久久久麻豆v国产精华液好用吗| 久久aⅴ乱码一区二区三区| 亚洲日本japanese丝袜| 波多野结衣在线一区二区 | 精品在线观看视频| 青草视频在线观看视频| 欧美日韩一二| 国产精品国产一区二区| 成人看片网页| 欧美人在线观看| 免费成人av电影| 欧美一区二区三区四区高清| 日韩精品一区二区亚洲av| 亚洲欧洲国产日本综合| 加勒比精品视频| 狠狠网亚洲精品| jizzjizzxxxx| 狠狠色狠狠色综合日日tαg| 亚洲国产欧美日韩| 国产精品久久久久av蜜臀| 国产日韩精品一区二区| 密臀av在线播放| 久热精品在线视频| 触手亚洲一区二区三区| 精品国产一区二区三区久久影院| 中文字幕欧美色图| 天天综合网天天综合色| 久久久久久久久毛片| 国产网站一区二区| 欧美熟妇精品一区二区蜜桃视频| 久久国产三级精品| 国产淫片av片久久久久久| 精品999成人| 国产四区在线观看| 精品国产日韩欧美| 久久爱av电影| silk一区二区三区精品视频| 国产日韩欧美视频在线| 向日葵视频成人app网址| 91sa在线看| 18video性欧美19sex高清| 久久福利网址导航| 1769在线观看| 亚洲无av在线中文字幕| 午夜视频免费看| 亚洲第一页中文字幕| av中文在线观看| 91精品久久久久久久99蜜桃| 91午夜交换视频| 欧美视频完全免费看| 国产成人无码专区| 色综合久久综合网| 91九色丨porny丨肉丝| 亚洲成av人**亚洲成av**| 免费在线视频一区二区| 亚洲欧美一区二区三区孕妇| 久久成人小视频| 中文字幕日本不卡| 国精产品视频一二二区| 国产精品日韩精品欧美在线| 超碰人人干人人| 国产精品私房写真福利视频| 在线观看免费小视频| 国产三级一区二区三区| 美女被到爽高潮视频| 久久久久久久久免费| 99久久久无码国产精品衣服| 久久综合久久综合九色| 91国模少妇一区二区三区| 久久精品一级爱片| 香蕉久久久久久久| 成人免费在线视频观看| 伊人在线视频观看| 亚洲综合视频在线| 日韩欧美亚洲国产| 欧美性xxxxx| 免费看污视频的网站| 欧美色男人天堂| 国产视频在线观看免费| 欧美mv日韩mv| 四虎永久在线观看| 亚洲视频第一页| 欧美激情二区| 欧美日韩国产999| 国产美女高潮在线| 国产精品ⅴa在线观看h| 24小时成人在线视频| 97久久天天综合色天天综合色hd| 极品尤物一区| 婷婷五月色综合| 一区二区三区午夜视频| 人人妻人人做人人爽| 国产精品一区毛片| 久久撸在线视频| 国产二区国产一区在线观看| 无码精品一区二区三区在线播放 | 欧美日韩免费观看一区二区三区| 国产精品丝袜黑色高跟鞋| 精品国产99国产精品| 美女做暖暖视频免费在线观看全部网址91 | 在线电影中文日韩| а√资源新版在线天堂| 91精品国产色综合久久不卡98| 亚洲成人av观看| 91久久久一线二线三线品牌| 亚洲精品国模| 国产一二三四区在线观看| 日韩午夜av| 亚洲人视频在线| 成人黄页毛片网站| 麻豆视频免费在线播放| 夜夜精品视频一区二区| 波多野结衣在线电影| 欧美成人午夜电影| 国产小视频免费在线观看| 欧美日韩成人在线观看| 精品无人乱码一区二区三区 | 欧美黄色片在线观看| 国产成人精品亚洲日本在线观看| 99在线影院| 日韩综合在线| 亚洲熟妇av一区二区三区| 国产精品一区二区果冻传媒| 少妇精品无码一区二区免费视频| 亚洲成人1区2区| 国产精品久久综合青草亚洲AV| 亚洲女成人图区| 8x8ⅹ拨牐拨牐拨牐在线观看| 国产伊人精品在线| 国产一区不卡| 丰满爆乳一区二区三区| 国产成人午夜99999| 欧美a级片免费看| 色综合久久久久综合体桃花网| www五月婷婷| 久久精品久久精品亚洲人| 经典三级一区二区| 精品无人乱码一区二区三区的优势| 欧美黄色大片网站| 一级淫片在线观看| 国产精品每日更新| 亚洲黄网在线观看| 亚洲精品之草原avav久久| av中文在线资源| 99视频在线| 欧美91视频| www.51色.com| 国产精品国产三级国产普通话蜜臀 | 精品久久在线观看| 久久久999精品| 欧美成人高清视频在线观看| 清纯唯美一区二区三区| 欧美一级网站| 美国黄色a级片| 日韩欧美亚洲国产一区| 亚洲av片一区二区三区| 97激碰免费视频| 麻豆视频一区| 久久久999免费视频| 97精品久久久久中文字幕| 欧美不卡视频在线观看| 日韩精品免费在线播放| 理论不卡电影大全神| 九色视频成人porny| 国产视频一区欧美| 最新中文字幕视频| 色狠狠色噜噜噜综合网| 超碰在线影院| 成人在线观看视频网站| 91精品成人| 黄色激情在线观看| 精品国产户外野外| 色在线免费视频| 国产精品大片wwwwww| 欧美xxav| 国产精品二区视频| 亚洲成人免费在线观看| 深夜福利在线看| 国产成人一区二区三区电影| 不卡在线一区二区| 九九九九九伊人| 亚洲国产成人av好男人在线观看| 婷婷国产在线| 国产精品免费观看在线| 99精品国产一区二区三区| 手机看片国产精品| 亚洲成av人片一区二区三区| 免费在线黄色影片| 成人福利视频在线观看| 欧美午夜一区| 中文字幕成人动漫| 制服丝袜国产精品| www视频在线观看| 精品伦理一区二区三区| 青青草97国产精品免费观看| 动漫性做爰视频| 日韩www在线| 九七电影院97理论片久久tvb| 大荫蒂性生交片| 国产亚洲一区二区三区四区 | 欧美日韩精品一区| 久久成人久久鬼色| 日韩激情一区二区三区| 在线看日韩欧美| 给我免费播放日韩视频| 爱情岛论坛成人|