ArgoCD +‘ArgoCD Image Updater小工具’ 實現映象倉庫tag變更自動觸發持續整合

耿晓芳發表於2024-10-17

部署思路踩坑整理

  1. ArgoCD和ArgoCD Image Updater是2個不同的程式。“ArgoCD Image Updater小工具”沒有整合在ArgoCD中需要單獨部署。
    單獨的ArgoCD能夠實現基於git倉庫變更作為應用部署的事實來源。 參考子頁:argocd根據映象tag變化實現自動釋出的2種方式。
  2. ArgoCD +“ArgoCD Image Updater小工具”能夠實現以映象倉庫中映象tag變更作為應用部署的事實來源。
  3. ArgoCD Image Updater小工具”部署略顯繁瑣,並不只是apply官方提供的yaml讓pod執行就可以了,需要打通和argocd的認證等操作。
  4. ArgoCD 或“ArgoCD Image Updater小工具”按照官方提供的install.yaml 部署後,如果修改其中的cm或者引數,不要採取在原yaml修改後再提交的方式,應該 用命令修改。因為yaml太長太複雜了!
  5. 配置了回寫時,ArgoCD Image Updater 並不會直接修改git倉庫yaml 檔案的tag,而是會建立一個.開頭的yaml 檔案(此例為".argocd-source-dev-smart-doc.yaml"),每次更新都會覆蓋此檔案的images內容。
  6. 其它
    1. argocd 配置gitlab,http使用者名稱密碼方式可以實現認證並回寫。
    2. harbor公開倉庫配置的時候不需要使用者名稱和密碼,可以使用http請求。
    3. “ArgoCD Image Updater小工具”會每隔2分鐘檢索配置的映象倉庫是否有新的映象需要拉取部署,但是UI頁面重新整理會有延時,如果要看最新的狀態需要點選下"REFRESH"按鈕。

ArgoCD + “ArgoCD Image Updater小工具” 部署步驟:

1、安裝ArgoCD

# kubectl create namespace argocd
# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

安裝 Argo CD CLI 命令列工具

# wget https://github.com/argoproj/argo-cd/releases/download/v1.7.10/argocd-linux-amd64

或者用win訪問 https://github.com/argoproj/argo-cd/releases 選擇合適的版本下載 argocd-linux-amd64 檔案
# cp argocd-linux-amd64 /usr/local/bin/argocd
# chmod +x /usr/local/bin/argocd
# argocd version

修改密碼:
方法一:登入argocd UI 會強制修改密碼。
方法二: 使用CLI工具修改預設密碼
參考: https://www.cnblogs.com/hahaha111122222/p/17462812.html

2、部署“ArgoCD Image Updater小工具”(部署略顯繁瑣)

官方文件: https://argocd-image-updater.readthedocs.io/en/stable/

2.1、在argocd中建立本地使用者併為使用者建立訪問令牌

# kubectl -n argocd edit cm argocd-cm
data:
  accounts.image-updater: apiKey

開啟後沒有data欄位,在最後頂格補入以上欄位。注意:apiKey中的K為大寫!!!
修改儲存後,再檢視格式大概如下,驗證多了data欄位

2.1.1 為使用者建立訪問令牌,儲存備用(下面配置API訪問令牌秘鑰會用到此處生成的令牌)

用argocd命令登入認證argocd(地址為argocd-server SVC暴露的埠),需要互動輸入y,忽略tls證書。

# argocd login 10.244.10.55:15471 --username admin --password argocd123

WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 10.244.10.55 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
'admin:login' logged in successfully
Context '10.244.10.55:15471' updated

執行下面命令的前提是上面已經用argocd命令登入了argocd

# argocd account generate-token --account image-updater --id image-updater

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcyODUyNDUyMCwiaWF0IjoxNzI4NTI0NTIwLCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.QecneA-yvcbU7Eoyi8egWwiAxN4zrf9FCWJXPeu0ick

2.2、在Argo CD中授予RBAC許可權

# kubectl -n argocd 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

開啟後沒有data欄位,在最後頂格補入以上欄位。
修改儲存後,再檢視驗證多了data欄位。

2.3、安裝Argo CD Image Update

建議在執行 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
或者地址:https://github.com/argoproj-labs/argocd-image-updater/tree/master/manifests

2.4、配置映象倉庫(此例為harbor,之前ecr有過實踐)

即使您不打算使用私有映象倉庫,您也需要至少配置一個empty registries.conf:

# kubectl -n argocd edit cm argocd-image-updater-config 
data:
  registries.conf: ""

沒有此條目argocd-image-updater pod將無法啟動。

如果使用私有映象倉庫可參考以下配置,以harbor映象倉庫為例:

data:
  argocd.insecure: "true"
  log.level: debug
  registries.conf: |
    registries:
    - name: harbor
      api_url: [http://reg1.ka.zkj.com](http://reg1.ka.zkj.com)
      prefix: reg1.ka.zkj.com
      ping: yes
      insecure: yes

開啟後沒有data欄位,在最後頂格補入以上欄位。
修改儲存後,再檢視驗證多了data欄位。如果url是域名要保證k8s中能夠解析到ip。

2.5、配置API訪問令牌秘鑰

根據上面生成的令牌設定變數

#YOUR_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhcmdvY2QiLCJzdWIiOiJpbWFnZS11cGRhdGVyOmFwaUtleSIsIm5iZiI6MTcyODUyNDUyMCwiaWF0IjoxNzI4NTI0NTIwLCJqdGkiOiJpbWFnZS11cGRhdGVyIn0.QecneA-yvcbU7Eoyi8egWwiAxN4zrf9FCWJXPeu0ick

建立並應用於現有資源,特別注意:命令中的名稱空間要修改為服務實際部署的NS

# kubectl create secret generic argocd-image-updater-secret \
>   --from-literal argocd.token=$YOUR_TOKEN --dry-run -o yaml |
>   kubectl -n argocd apply -f -
W1010 09:48:58.532655    3478 helpers.go:703] --dry-run is deprecated and can be replaced with --dry-run=client.
secret/argocd-image-updater-secret configured

更改後必須重啟服務

# kubectl -n argocd rollout restart deployment argocd-image-updater
deployment.apps/argocd-image-updater restarted

3、在gitlab倉庫中建立編排檔案

說明:gitlab倉裡有4個檔案。
回寫檔案:
.argocd-source-dev-smart-doc.yaml 是argocd 回寫後的檔案,這個是argocd image updater 應用建立後才會生成的!

編排檔案:
dp-smart-doc.yaml
svc-smart-doc.yaml

Kustomize工具檔案:
kustomization.yaml

---------檔案內容如下 -------------------
kustomization.yaml

namePrefix: kustomize-
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- dp-smart-doc.yaml
- svc-smart-doc.yaml

dp-smart-doc.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: smart-doc
  namespace: wa
  labels:
    group: service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: smart-doc
      tier: backend
  template:
    metadata:
      annotations: {}
      labels:
        app: smart-doc
        tier: backend
    spec:
      nodeSelector:
        smart: "true"
      dnsPolicy: ClusterFirst
      containers:
        - image: reg1.ka.zkj.com/dev/smart-doc:v1.241008-68-002
          imagePullPolicy: IfNotPresent
          name: smart-wealth
          ports:
            - containerPort: 9800
          #command: ["sleep","10000"]
          env:
            - name: TZ
              value: Asia/Shanghai
          resources:
            limits:
              cpu: 1000m
              memory: 4Gi
            requests:
              cpu: 1000m
              memory: 4Gi
          volumeMounts:
            - mountPath: /logs/smart-doc
              name: smart-doc
      terminationGracePeriodSeconds: 60
      volumes:
        - hostPath:
            path: "/home/zkj/wealth/logs/smart-doc"
            type: DirectoryOrCreate
          name: "smart-doc"

svc-smart-doc.yaml

apiVersion: v1
kind: Service
metadata:
  name: smart-doc
  namespace: wa
spec:
  type: NodePort
  ports:
    - port: 9800
      targetPort: 9800
      nodePort: 48528
  selector:
    app: smart-doc
    tier: backend

4、登入argocd UI,建立argocd應用。

4.1 首先setting一個gitlab倉庫地址,填入箭頭所指的內容。

因為gitlab地址是http的,千萬別忘了勾選忽略https驗證。

4.2 建立一個app,Applications -- +NEW APP -- EDIT AS YAML --清空後貼如如下內容(此檔案支援註釋):

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd-image-updater.argoproj.io/image-list: myalias=reg1.ka.zkj.com/dev/smart-doc   # harbor映象倉庫地址
    argocd-image-updater.argoproj.io/myalias.allow-tags: regexp:^.*$                     # tag的正則表達
    argocd-image-updater.argoproj.io/myalias.update-strategy: latest                     # 映象更新策略,詳見下節應用檔案配置項註釋
    argocd-image-updater.argoproj.io/write-back-method: git                              # 回寫的物件
    argocd-image-updater.argoproj.io/git-branch: master                                  # 倉庫分支
    argocd-image-updater.argoproj.io/myalias.force-update: "true"                        # 是否強制更新
  name: dev-smart-doc                                                                    # Argo CD 應用程式的名稱
  namespace: argocd                                                                      # argocd部署的名稱空間,注意不是程式的!
  #finalizers:
    #- resources-finalizer.Argo CD.argoproj.io
spec:
  destination:                                                                           # Kubernetes 叢集中的目標
    namespace: wa                                                                        # 被部署app的名稱空間
    server: https://kubernetes.default.svc
  project: default                                                   # 應用程式將被配置的專案名稱,這是在 Argo CD 中應用程式的一種組織方式
  source:
    path:  dev/smart-doc                                             # Kubernetes 資源清單在倉庫中的路徑。
    repoURL: http://10.244.8.185:30080/CD/wealth-helper.git          # gitlab原始碼的倉庫地址。
    targetRevision: master                                           # 想要使用的 git 分支。
  syncPolicy:              # 指定自動同步策略和頻率,不配置時需要手動觸發同步。
    automated:
      prune: true          # 預設情況下,當 Argo CD 檢測到 Git 中不再定義資源時,自動同步將不會刪除該資源。如果要允許開啟自動修剪刪除設定為: true。
      selfHeal: true          # 自動自愈
      allowEmpty: false       # 預設情況下,當沒有目標資源時,可以防止應用程式出現空資源。 如果要允許應用程式出現空資源設定為:true。
    syncOptions:
    - Validate=false
    - CreateNamespace=true
    retry:
      limit: 5
      backoff:
        duration: 5s           # 持續時間
        factor: 2             
        maxDuration: 3m        # 最大持續時間

CI執行後會將新構建的應用映象推送到映象倉庫中去。
然後 Argo CD Image Updater 將會每 2m0s(日誌時間戳可以確定[argocd掃描git庫的頻率是3m不要混了])從映象倉庫去檢索映象版本變化(暫時沒有查到在哪能修改這個時間),一旦發現有新的映象版本,它將自動使用新版本來更新叢集內工作負載的映象,並將映象版本回寫到 Git 倉庫。我們可以去檢視 Argo CD Image Updater 的日誌變化:

# kubectl logs -f argocd-image-updater-78f46ff74-dtb9l -n argocd
。。。。。。

4.3、以上4.2應用檔案配置項註釋

[!NOTE] 中文官方文件參考
https://argocd.devops.gold/user-guide/auto_sync/

ArgoCD Image Updater 透過 Application Annotations 標籤來實現對應的功能,這裡註釋一下每一個標籤的作用。

  • argocd-image-updater.argoproj.io/image-list: 指定需要監聽的映象,這裡的別名非常重要,會影響下面所有的設定。myalias可以用任何字元代替,映象地址這裡不寫tag。
  • argocd-image-updater.argoproj.io/update-strategy: 指定映象更新策略。注意,latest 並不代表監聽 latest 映象版本,而是以最新推送的映象作為更新策略。此外,semver 策略可以識別最高語義化版本的標籤,digest 策略可以用來區分同一 Tag 下不同映象 digest 的變更。

更新策略。此策略確定 Argo CD Image Updater 如何識別要更新的新映象版本。目前支援四種方法:‘semver’、’latest’、‘digest’ 和 ’name’。
在檢視它們之前,瞭解 “可變” 和 “不可變” 映象標記的含義很重要。可變儲存庫具有可以被新映象覆蓋的標記,而當儲存庫配置規定標記必須不可被新映象覆蓋時,標記就是不可變的。以下選項假定使用 “不可變” 標記。如果使用了可變標記,則應使用 “digest” 策略。
semver:此策略將應用程式更新到映象登錄檔中的最新映象版本,同時考慮語義版本控制約束(例如,X.Y.Z 格式,其中 X 為主版本、Y 為次版本,Z 為修補版本)。該選項可配置為僅升級到新的次要或修補版本,還支援透過附加配置支援預釋出版本。在下面的示例中,應用程式將使用較新的修補版本進行更新,但不會升級到新的次要或主要版本。
latest:此策略將應用程式更新為具有最新構建日期的映象。當特定構建具有多個標記時,Argo CD Image Updater 會選擇列表中以字母順序降序排序的最後一個 標記。如果只想考慮特定標記,可以使用帶有正規表示式的註釋。類似地,可以使用註釋來忽略標記列表。
digest:此策略基於登錄檔中可變標籤的更改來更新應用程式。當使用此策略時,將使用映象摘要來更新應用程式,因此叢集上的映象將顯示為<repository-name>/<image-name>@sha256:<hash>。
name: 此策略根據映象標籤的字母排序並使用列表中排序的最後一個標籤來更新應用程式。當使用日期/時間為映象標記時,可以使用此方法。類似於 “latest” 策略,可以使用正規表示式來考慮特定標記。

  • argocd-image-updater.argoproj.io/write-back-method:表示將映象版本回寫到映象倉庫。注意,這裡對倉庫的寫許可權來源於使用 argocd repo add 命令為 ArgoCD 配置的倉庫訪問許可權。
  • argocd-image-updater.argoproj.io/<映象別名>.pull-secret:為不同的映象別名指定映象拉取憑據,公開倉庫不需要配置。
  • argocd-image-updater.argoproj.io/<映象別名>.allow-tags:配置符合更新條件的映象 Tag,在這裡我們使用正規表示式匹配那些映象。

下面2個在Kustomize工具時暫時沒有用到。

  • argocd-image-updater.argoproj.io/<映象別名>.helm.image-name:配置 Helm Chart values.yaml 映象名稱所在的節點,在示例應用中,backend.image 和 frontend.image 是values.yaml 配置映象名稱的節點,ArgoCD 在回寫倉庫時會覆蓋這個值。
  • argocd-image-updater.argoproj.io/<映象別名>.helm.image-tag:配置 Helm Chart values.yaml 映象版本所在的節點,在示例應用中,backend.tag 和 frontend.tag 是 values.yaml 配置映象版本的節點,ArgoCD 在回寫倉庫時將會覆蓋這個值。

=======================================================
綜合參考:
https://cloudpods.csdn.net/657807ccb8e5f01e1e447b15.html KubeSphere對接ArgoCD
https://kubesphere.io/zh/blogs/kubesphere-argocd/ KubeSphere + Argo CD,實現真正的 GitOps!
https://mp.weixin.qq.com/s/cCKYaFCZ513djFfms-d1uA (陽明)使用 Argo CD 進行 GitOps 流水線改造
https://argocd.devops.gold/operator-manual/resource_actions/ Argo CD 中文文件 平臺工程 Devops

相關文章