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

Tekton 與 Argo CD 結(jié)合實現(xiàn) GitOps

云計算
前面我們使用 Tekton 完成了應(yīng)用的 CI/CD 流程,但是 CD 是在 Tekton 的任務(wù)中去完成的,現(xiàn)在我們使用 GitOps 的方式來改造我們的流水線,將 CD 部分使用 Argo CD 來完成。

前面我們使用 Tekton 完成了應(yīng)用的 CI/CD 流程,但是 CD 是在 Tekton 的任務(wù)中去完成的,現(xiàn)在我們使用 GitOps 的方式來改造我們的流水線,將 CD 部分使用 Argo CD 來完成。

這里我們要先去回顧下前面的 Tekton 實戰(zhàn)部分的內(nèi)容,整個流水線包括 clone、test、build、docker、deploy、rollback 幾個部分的任務(wù),最后的 deploy 和 rollback 屬于 CD 部分,我們只需要這部分使用 Argo CD 來構(gòu)建即可。

首先我們將項目 http://git.k8s.local/course/devops-demo.git 倉庫中的 Helm Chart 模板單獨提取出來放到一個獨立的倉庫中 http://git.k8s.local/course/devops-demo-deploy,這樣方便和 Argo CD 進(jìn)行對接,整個項目下面只有用于應(yīng)用部署的 Helm Chart 模板。

首先在 Argo CD 上面添加該倉庫:

然后創(chuàng)建新應(yīng)用,首先可以創(chuàng)建一個項目,在 Argo CD 中有一個 AppProject 的 CRD,表示應(yīng)用程序的邏輯分組,它由以下幾個關(guān)鍵屬性組成:

  • sourceRepos:項目中的應(yīng)用程序可以從中獲取清單的倉庫引用
  • destinations:項目中的應(yīng)用可以部署到的集群和命名空間
  • roles:項目內(nèi)資源訪問定義的角色
  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: AppProject 
  3. metadata: 
  4.   # 項目名 
  5.   name: demo 
  6.   namespace: argocd 
  7. spec: 
  8.   # 目標(biāo) 
  9.   destinations: 
  10.     # 此項目的服務(wù)允許部署的 namespace,這里為全部 
  11.   - namespace: '*' 
  12.     # 此項目允許部署的集群,這里為默認(rèn)集群,即為Argo CD部署的當(dāng)前集群 
  13.     server: https://kubernetes.default.svc 
  14.   # 允許的數(shù)據(jù)源 
  15.   sourceRepos: 
  16.   - http://git.k8s.local/course/devops-demo-deploy.git 

更多配置信息可以前往文檔 https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/ 查看,項目創(chuàng)建完成后,在該項目下創(chuàng)建一個 Application,代表環(huán)境中部署的應(yīng)用程序?qū)嵗?/p>

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Application 
  3. metadata: 
  4.   name: devops-demo 
  5.   namespace: argocd 
  6. spec: 
  7.   destination: 
  8.     namespace: default 
  9.     server: 'https://kubernetes.default.svc' 
  10.   project: demo 
  11.   source: 
  12.     path: helm  # 從 Helm 存儲庫創(chuàng)建應(yīng)用程序時,chart 必須指定 path 
  13.     repoURL: 'http://git.k8s.local/course/devops-demo-deploy.git' 
  14.     targetRevision: HEAD 
  15.     helm: 
  16.       parameters: 
  17.         - name: replicaCount 
  18.           value: '2' 
  19.       valueFiles: 
  20.         - my-values.yaml 

這里我們定義了一個名為 devops-demo 的應(yīng)用,應(yīng)用源來自于 helm 路徑,使用的是 my-values.yaml 文件,此外還可以通過 source.helm.parameters 來配置參數(shù),同步策略我們?nèi)匀贿x擇使用手動的方式,我們可以在 Tekton 的任務(wù)中去手動觸發(fā)同步。上面的資源對象創(chuàng)建完成后應(yīng)用就會處于 OutOfSync 狀態(tài),因為集群中還沒部署該應(yīng)用。

現(xiàn)在接下來我們?nèi)バ薷闹暗?Tekton 流水線,之前的 Pipeline 流水線如下所示:

  1. # pipeline.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Pipeline 
  4. metadata: 
  5.   name: pipeline 
  6. spec: 
  7.   workspaces: # 聲明 workspaces 
  8.     - name: go-repo-pvc 
  9.   params: 
  10.     # 定義代碼倉庫 
  11.     - name: git_url 
  12.     - name: revision 
  13.       type: string 
  14.       default"master" 
  15.     # 定義鏡像參數(shù) 
  16.     - name: image 
  17.     - name: registry_url 
  18.       type: string 
  19.       default"harbor.k8s.local" 
  20.     - name: registry_mirror 
  21.       type: string 
  22.       default"https://ot2k4d59.mirror.aliyuncs.com/" 
  23.     # 定義 helm charts 參數(shù) 
  24.     - name: charts_dir 
  25.     - name: release_name 
  26.     - name: release_namespace 
  27.       default"default" 
  28.     - name: overwrite_values 
  29.       default"" 
  30.     - name: values_file 
  31.       default"values.yaml" 
  32.   tasks: # 添加task到流水線中 
  33.     - name: clone 
  34.       taskRef: 
  35.         name: git-clone 
  36.       workspaces: 
  37.         - nameoutput 
  38.           workspace: go-repo-pvc 
  39.       params: 
  40.         - name: url 
  41.           value: $(params.git_url) 
  42.         - name: revision 
  43.           value: $(params.revision) 
  44.     - name: test 
  45.       taskRef: 
  46.         name: test 
  47.     - name: build # 編譯二進(jìn)制程序 
  48.       taskRef: 
  49.         name: build 
  50.       runAfter: # 測試任務(wù)執(zhí)行之后才執(zhí)行 build task 
  51.         - test 
  52.         - clone 
  53.       workspaces: # 傳遞 workspaces 
  54.         - name: go-repo 
  55.           workspace: go-repo-pvc 
  56.     - name: docker # 構(gòu)建并推送 Docker 鏡像 
  57.       taskRef: 
  58.         name: docker 
  59.       runAfter: 
  60.         - build 
  61.       workspaces: # 傳遞 workspaces 
  62.         - name: go-repo 
  63.           workspace: go-repo-pvc 
  64.       params: # 傳遞參數(shù) 
  65.         - name: image 
  66.           value: $(params.image) 
  67.         - name: registry_url 
  68.           value: $(params.registry_url) 
  69.         - name: registry_mirror 
  70.           value: $(params.registry_mirror) 
  71.     - name: deploy # 部署應(yīng)用 
  72.       taskRef: 
  73.         name: deploy 
  74.       runAfter: 
  75.         - docker 
  76.       workspaces: 
  77.         - name: source 
  78.           workspace: go-repo-pvc 
  79.       params: 
  80.         - name: charts_dir 
  81.           value: $(params.charts_dir) 
  82.         - name: release_name 
  83.           value: $(params.release_name) 
  84.         - name: release_namespace 
  85.           value: $(params.release_namespace) 
  86.         - name: overwrite_values 
  87.           value: $(params.overwrite_values) 
  88.         - name: values_file 
  89.           value: $(params.values_file) 
  90.     - namerollback # 回滾 
  91.       taskRef: 
  92.         namerollback 
  93.       when
  94.         - input: "$(tasks.deploy.results.helm-status)" 
  95.           operator: in 
  96.           values: ["failed"
  97.       params: 
  98.         - name: release_name 
  99.           value: $(params.release_name) 
  100.         - name: release_namespace 
  101.           value: $(params.release_namespace) 

現(xiàn)在我們需要去掉最后的 deploy 和 rollback 兩個任務(wù),當(dāng) Docker 鏡像構(gòu)建推送完成后,我們只需要去修改部署代碼倉庫中的 values 文件,然后再去手動觸發(fā) Argo CD 同步狀態(tài)即可(如果開啟了自動同步這一步都可以省略了),而回滾操作直接在 Argo CD 中去操作即可,不需要定義一個單獨的 Task 任務(wù)。

定義一個如下所示的 Taks 任務(wù):

  1. apiVersion: tekton.dev/v1alpha1 
  2. kind: Task 
  3. metadata: 
  4.   name: sync 
  5. spec: 
  6.   volumes: 
  7.   - name: argocd-secret 
  8.     secret: 
  9.       secretName: $(inputs.params.argocd_secret) 
  10.   params: 
  11.     - name: argocd_url 
  12.       description: "The URL of the ArgoCD server" 
  13.     - name: argocd_secret 
  14.       description: "The secret containing the username and password for the tekton task to connect to argo" 
  15.     - name: commit_id 
  16.       description: "The commit ID to update" 
  17.     - name: app_name 
  18.       description: "The name of the argo app to update" 
  19.     - name: app_revision 
  20.       default"HEAD" 
  21.       description: "The revision of the argo app to update" 
  22.   steps: 
  23.   - name: deploy 
  24.     image: argoproj/argocd 
  25.     volumeMounts: 
  26.     - name: argocd-secret 
  27.       mountPath: /var/secret 
  28.     command: 
  29.     - sh 
  30.     args: 
  31.     - -ce 
  32.     - | 
  33.       set -e 
  34.       echo "update commit id" 
  35.       argocd login --insecure $(params.argocd_url) --username $(/bin/cat /var/secret/username) --password $(/bin/cat /var/secret/password) 
  36.       argocd app sync $(params.app_name) --revision $(params.app_revision) 
  37.       argocd app wait $(params.app_name) --health 

由于我們這里只需要修改 Helm Chart 的 Values 文件中的 image.tag 參數(shù),最好的方式當(dāng)然還是在一個 Task 中去修改 values.yaml 文件并 commit 到 Repo 倉庫中去,當(dāng)然也可以為了簡單直接在 Argo CD 的應(yīng)用側(cè)配置參數(shù)即可,比如可以使用 argocd app set 命令來為應(yīng)用配置參數(shù),然后下面再用 argocd app sync 命令手動觸發(fā)同步操作,這里其實就可以有很多操作了,比如我們可以根據(jù)某些條件來判斷是否需要部署,滿足條件后再執(zhí)行 sync 操作,最后使用 wait 命令等待應(yīng)用部署完成。

除了通過手動 argocd app set 的方式來配置參數(shù)之外,可能更好的方式還是直接去修改 Repo 倉庫中的 values 值,這樣在源代碼倉庫中有一個版本記錄,我們可以新建如下所示的一個任務(wù)用來修改 values 值:

  1. apiVersion: tekton.dev/v1beta1 
  2. kind: Task 
  3. metadata: 
  4.   name: change-manifests 
  5. spec: 
  6.   params: 
  7.     - name: git_url 
  8.       description: Git repository containing manifest files to update 
  9.     - name: git_email 
  10.       default: pipeline@k8s.local 
  11.     - name: git_name 
  12.       default: Tekton Pipeline 
  13.     - name: git_manifest_dir 
  14.       description: Manifests files dir 
  15.     - name: tool_image 
  16.       default: cnych/helm-kubectl-curl-git-jq-yq 
  17.     - name: image_tag 
  18.       description: Deploy docker image tag 
  19.   steps: 
  20.     - name: git-push 
  21.       image: $(params.tool_image) 
  22.       env: 
  23.         - name: GIT_USERNAME 
  24.           valueFrom: 
  25.             secretKeyRef: 
  26.               name: gitlab-auth 
  27.               key: username 
  28.               optional: true 
  29.         - name: GIT_PASSWORD 
  30.           valueFrom: 
  31.             secretKeyRef: 
  32.               name: gitlab-auth 
  33.               keypassword 
  34.               optional: true 
  35.       command: ["/bin/bash"
  36.       args: 
  37.         - -c 
  38.         - | 
  39.           set -eu 
  40.           echo Load environment variables from previous steps 
  41.           source /workspace/env-config 
  42.           git config --global user.email "$(params.git_email)" 
  43.           git config --global user.name "$(params.git_name)" 
  44.           git clone --branch master --depth 1 http://${GIT_USERNAME}:${GIT_PASSWORD}@$(params.git_url) repo 
  45.           cd "repo/$(params.git_manifest_dir)" 
  46.           ls -l 
  47.           echo old value: 
  48.           cat my-values.yaml | yq r - 'image.tag' 
  49.           echo replacing with new value: 
  50.           echo $(params.image_tag) 
  51.           yq w --inplace my-values.yaml 'image.tag' "$(params.image_tag)" 
  52.           echo verifying new value 
  53.           yq r my-values.yaml 'image.tag' 
  54.           if ! git diff-index --quiet HEAD --; then 
  55.             git status 
  56.             git add . 
  57.             git commit -m "helm values updated by tekton pipeline in change-manifests task" 
  58.             git push 
  59.           else 
  60.               echo "no changes, git repository is up to date" 
  61.           fi 

現(xiàn)在我們的流水線就變成了如下所示的清單:

  1. # pipeline.yaml 
  2. apiVersion: tekton.dev/v1beta1 
  3. kind: Pipeline 
  4. metadata: 
  5.   name: pipeline 
  6. spec: 
  7.   workspaces: # 聲明 workspaces 
  8.     - name: go-repo-pvc 
  9.   params: 
  10.     # 定義代碼倉庫 
  11.     - name: git_url 
  12.     - name: git_infra_url 
  13.     - name: revision 
  14.       type: string 
  15.       default"master" 
  16.     # 定義鏡像參數(shù) 
  17.     - name: image 
  18.     - name: image_tag 
  19.     - name: registry_url 
  20.       type: string 
  21.       default"harbor.k8s.local" 
  22.     - name: registry_mirror 
  23.       type: string 
  24.       default"https://ot2k4d59.mirror.aliyuncs.com/" 
  25.     - name: git_manifest_dir 
  26.       default"helm" 
  27.     # 定義 argocd 參數(shù) 
  28.     - name: argocd_url 
  29.     - name: argocd_secret 
  30.     - name: app_name 
  31.     - name: app_revision 
  32.       type: string 
  33.       default"HEAD" 
  34.   tasks: # 添加task到流水線中 
  35.     - name: clone 
  36.       taskRef: 
  37.         name: git-clone 
  38.       workspaces: 
  39.         - nameoutput 
  40.           workspace: go-repo-pvc 
  41.       params: 
  42.         - name: url 
  43.           value: $(params.git_url) 
  44.         - name: revision 
  45.           value: $(params.revision) 
  46.     - name: test 
  47.       taskRef: 
  48.         name: test 
  49.     - name: build # 編譯二進(jìn)制程序 
  50.       taskRef: 
  51.         name: build 
  52.       runAfter: # 測試任務(wù)執(zhí)行之后才執(zhí)行 build task 
  53.         - test 
  54.         - clone 
  55.       workspaces: # 傳遞 workspaces 
  56.         - name: go-repo 
  57.           workspace: go-repo-pvc 
  58.     - name: docker # 構(gòu)建并推送 Docker 鏡像 
  59.       taskRef: 
  60.         name: docker 
  61.       runAfter: 
  62.         - build 
  63.       workspaces: # 傳遞 workspaces 
  64.         - name: go-repo 
  65.           workspace: go-repo-pvc 
  66.       params: # 傳遞參數(shù) 
  67.         - name: image 
  68.           value: $(params.image):$(params.image_tag) 
  69.         - name: registry_url 
  70.           value: $(params.registry_url) 
  71.         - name: registry_mirror 
  72.           value: $(params.registry_mirror) 
  73.     - name: manifests 
  74.       taskRef: 
  75.         name: change-manifests 
  76.       runAfter: 
  77.         - docker 
  78.       params: 
  79.       - name: git_url 
  80.         value: $(params.git_infra_url) 
  81.       - name: git_manifest_dir 
  82.         value: $(params.git_manifest_dir) 
  83.       - name: image_tag 
  84.         value: $(params.image_tag) 
  85.     - name: sync 
  86.       taskRef: 
  87.         name: sync 
  88.       runAfter: 
  89.         - manifests 
  90.       params: 
  91.       - name: argocd_url 
  92.         value: $(params.argocd_url) 
  93.       - name: argocd_secret 
  94.         value: $(params.argocd_secret) 
  95.       - name: app_name 
  96.         value: $(params.app_name) 
  97.       - name: app_revision 
  98.         value: $(params.app_revision) 

最后創(chuàng)建用于 Argo CD 登錄使用的 Secret 對象:

  1. apiVersion: v1 
  2. kind: Secret 
  3. metadata: 
  4.   name: argocd-auth 
  5. type: Opaque 
  6. stringData: 
  7.   username: admin 
  8.   password: admin321 

最后修改 Tekton Triggers 中的 Template,如下所示:

  1. # gitlab-template.yaml 
  2. apiVersion: triggers.tekton.dev/v1alpha1 
  3. kind: TriggerTemplate 
  4. metadata: 
  5.   name: gitlab-template 
  6. spec: 
  7.   params: # 定義參數(shù),和 TriggerBinding 中的保持一致 
  8.     - name: gitrevision 
  9.     - name: gitrepositoryurl 
  10.   resourcetemplates: # 定義資源模板 
  11.     - apiVersion: tekton.dev/v1beta1 
  12.       kind: PipelineRun # 定義 pipeline 模板 
  13.       metadata: 
  14.         generateName: gitlab-run- # TaskRun 名稱前綴 
  15.       spec: 
  16.         serviceAccountName: tekton-build-sa 
  17.         pipelineRef: 
  18.           name: pipeline 
  19.         workspaces: 
  20.           - name: go-repo-pvc 
  21.             persistentVolumeClaim: 
  22.               claimName: go-repo-pvc 
  23.         params: 
  24.           - name: git_url 
  25.             value: $(tt.params.gitrepositoryurl) 
  26.           - name: git_infra_url 
  27.             value: git.k8s.local/course/devops-demo-deploy.git 
  28.           - name: image 
  29.             value: "harbor.k8s.local/course/devops-demo" 
  30.           - name: image_tag 
  31.             value: "$(tt.params.gitrevision)" 
  32.           - name: argocd_url 
  33.             value: argocd.k8s.local 
  34.           - name: argocd_secret 
  35.             value: argocd-auth 
  36.           - name: app_name 
  37.             value: devops-demo 

現(xiàn)在我們的整個流水線就更加精簡了?,F(xiàn)在我們?nèi)?yīng)用倉庫中修改下源代碼并提交就可以觸發(fā)我們的流水線了。

可以看到當(dāng)我們提交代碼后,整個流水線構(gòu)建會一直卡在最后的 sync 任務(wù),這是因為我們執(zhí)行了 argocd app wait $(params.app_name) --health 這個命令,需要等待應(yīng)用健康后才會退出。

  1. $ curl devops-demo.k8s.local 
  2. {"msg":"Hello Tekton + ArgoCD On GitLab"

但實際上上面我們的應(yīng)用已經(jīng)部署成功了,只是 Argo CD 的健康檢查沒有通過,Argo CD 為幾種標(biāo)準(zhǔn)的 Kubernetes 資源提供了內(nèi)置的健康策略,然后將這些策略作為一個整體呈現(xiàn)在應(yīng)用的健康狀態(tài)中,比如會檢查副本數(shù)是否正常,PVC 是否綁定等,而對于 Ingress 資源會檢查 status.loadBalancer.ingress 列表是否非空,需要至少有一個 hostname 或 IP 值,而我們這里部署的 Ingress 中的值為空:

  1. $ kubectl get ingress devops-demo -o yaml 
  2. apiVersion: extensions/v1beta1 
  3. kind: Ingress 
  4. ...... 
  5. spec: 
  6.   rules: 
  7.   - host: devops-demo.k8s.local 
  8.     http: 
  9.       paths: 
  10.       - backend: 
  11.           serviceName: devops-demo 
  12.           servicePort: http 
  13.         path: / 
  14.         pathType: ImplementationSpecific 
  15. status: 
  16.   loadBalancer: {} 

所以健康檢查一直不通過,在 Argo CD 頁面上也可以證實是 Ingress 導(dǎo)致健康檢查沒通過: 

這個時候需要我們?nèi)プ远x Ingress 資源的監(jiān)控檢查方式,Argo CD 支持用 Lua 來編寫檢查規(guī)則,修改 Argo CD 的 Configmap 配置文件:

  1. $ kubectl edit cm -n argocd argocd-cm 
  2. # Please edit the object below. Lines beginning with a '#' will be ignored, 
  3. and an empty file will abort the edit. If an error occurs while saving this file will be 
  4. # reopened with the relevant failures. 
  5. apiVersion: v1 
  6. data: 
  7.   resource.customizations: |  # 定制 Ingress 資源的健康檢查方式 
  8.     extensions/Ingress: 
  9.         health.lua: | 
  10.           hs = {} 
  11.           hs.status = "Healthy" 
  12.           return hs 
  13. ...... 

修改完成后,我們的應(yīng)用就會變成健康狀態(tài)了。

如果需要回滾,則可以直接在 Argo CD 頁面上點擊 HISTORY AND ROLLBACK 安裝查看部署的歷史記錄選擇回滾的版本即可:

可以查看整個 Tekton 流水線的狀態(tài):

  1. $ tkn pr describe gitlab-run-vdlm6 
  2. Name:              gitlab-run-vdlm6 
  3. Namespace:         default 
  4. Pipeline Ref:      pipeline 
  5. Service Account:   tekton-build-sa 
  6. Timeout:           1h0m0s 
  7. Labels: 
  8.  tekton.dev/pipeline=pipeline 
  9.  triggers.tekton.dev/eventlistener=gitlab-listener 
  10.  triggers.tekton.dev/trigger=gitlab-push-events-trigger 
  11.  triggers.tekton.dev/triggers-eventid=eeda9157-5eb3-4399-be4b-88955cb56764 
  12.  
  13. 🌡️  Status 
  14.  
  15. STARTED         DURATION    STATUS 
  16. 4 minutes ago   2 minutes   Succeeded 
  17.  
  18. 📦 Resources 
  19.  
  20.  No resources 
  21.  
  22. ⚓ Params 
  23.  
  24.  NAME              VALUE 
  25.  ∙ git_url         http://git.k8s.local/course/devops-demo.git 
  26.  ∙ git_infra_url   git.k8s.local/course/devops-demo-deploy.git 
  27.  ∙ image           harbor.k8s.local/course/devops-demo 
  28.  ∙ image_tag       332798d9e28422341fd64704ab9b54b944d77084 
  29.  ∙ argocd_url      argocd.k8s.local 
  30.  ∙ argocd_secret   argocd-auth 
  31.  ∙ app_name        devops-demo 
  32.  
  33. 📝 Results 
  34.  
  35.  No results 
  36.  
  37. 📂 Workspaces 
  38.  
  39.  NAME            SUB PATH   WORKSPACE BINDING 
  40.  ∙ go-repo-pvc   ---        PersistentVolumeClaim (claimName=go-repo-pvc) 
  41.  
  42. 🗂  Taskruns 
  43.  
  44.  NAME                                 TASK NAME   STARTED         DURATION     STATUS 
  45.  ∙ gitlab-run-vdlm6-sync-svmxl        sync        3 minutes ago   42 seconds   Succeeded 
  46.  ∙ gitlab-run-vdlm6-manifests-d297d   manifests   3 minutes ago   26 seconds   Succeeded 
  47.  ∙ gitlab-run-vdlm6-docker-g2tqx      docker      4 minutes ago   48 seconds   Succeeded 
  48.  ∙ gitlab-run-vdlm6-build-mkcrd       build       4 minutes ago   9 seconds    Succeeded 
  49.  ∙ gitlab-run-vdlm6-test-gjr4c        test        4 minutes ago   4 seconds    Succeeded 
  50.  ∙ gitlab-run-vdlm6-clone-57vpw       clone       4 minutes ago   8 seconds    Succeeded 

 

最后用一張圖來總結(jié)下我們使用 Tekton 結(jié)合 Argo CD 來實現(xiàn) GitOps 的工作流:

 

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2022-08-16 22:39:01

Argo CDKubernetes

2021-06-24 07:20:21

Linked GitOps Argo CD

2024-09-11 09:25:00

2021-07-04 07:24:48

GitOps 工具 Argo CD

2023-09-27 08:24:49

2024-05-22 08:03:15

2021-12-08 12:20:55

KubernetesGitOpsLinux

2022-08-18 17:07:00

sopsGitOps

2021-02-10 08:24:47

微服務(wù)CICD

2024-08-07 10:14:35

2021-09-07 08:23:45

GitOpsCICD

2022-04-01 10:51:33

TektonArgoCDGitOps

2023-03-14 16:35:52

2021-05-13 18:23:53

Tekton云原生Kubernetes

2022-02-17 11:52:05

?Argo CD漏洞Kubernetes

2021-06-09 05:44:45

云原生 CICD

2021-11-26 08:14:05

云原生CICD

2021-07-12 06:36:08

釘釘Argo CDPrometheus

2023-10-08 07:59:25

2023-10-07 07:51:55

FluxCDKubernetes
點贊
收藏

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