全部產品
Search
文件中心

Container Service for Kubernetes:使用ACK One分布式工作流程叢集構建容器鏡像CI

更新時間:Mar 24, 2026

本文介紹如何使用ACK One分布式工作流程叢集構建容器鏡像CI。

前提條件

使用限制

暫不支援通過修改代碼來自動觸發CI流程。

ACK One分布式工作流程叢集功能優勢

展開查看ACK One分布式工作流程叢集功能優勢

工作流程叢集基於開源Argo Workflow專案構建,完全符合開源工作流程標準,如果您已在ACK叢集或者其他Kubernetes叢集運行Argo工作流程,無需修改現有工作流程,可以無縫遷移至工作流程叢集

通過工作流程叢集,您可以輕鬆編排工作流程,每個工作流程步驟使用容器運行,可以在短時間內輕鬆運行大規模機器學習或資料處理的計算密集型作業,可以快速運行CI/CD流水線。

  • 基於開源Argo Workflows,無需修改現有Argo工作流程可無縫遷移。

  • 開箱即用,無營運成本,無需關心版本升級,專註工作流程運行。

  • 極致彈性,自動擴充,資源用完即釋放,有效最佳化計算成本。

  • 可靠性高,多可用性區域負載平衡,調度可靠性高。

  • 增強控制面,效能、效率、穩定性、可觀測性大幅提升。

  • OSS儲存管理增強,支援大檔案上傳、Artifacts GC、串流。

  • 社區專家支援,協助業務團隊最佳化工作流程,有效提升運行效能、降低成本。

構建容器鏡像CI

本文在ACK One分布式工作流程叢集基礎上,使用BuildKit實現容器鏡像的構建和推送,本實踐使用的鏡像為docker hub https://hub.docker.com/r/moby/buildkitmoby/buildkit:v0.12.1-rootless

步驟一:工作流程叢集中建立Secret儲存ACR EE密碼

  1. 為ACR企業版執行個體(ACR EE)配置訪問憑證。具體操作,請參見配置訪問憑證

  2. 執行以下命令,在工作流程叢集中建立Secret儲存ACR EE密碼,供BuildKit使用。

    替換以下代碼中的${workflow_kubeconfig}$username:$password為您的實際配置資訊。

    # repositoryDomain: 例如demo-test-registry.cn-hangzhou.cr.aliyuncs.com
    kubectl --kubeconfig ${workflow_kubeconfig} create secret generic docker-config --from-literal="config.json={\"auths\": {\"$repositoryDomain\": {\"auth\": \"$(echo -n $username:$password|base64)\"}}}"

步驟二:在工作流程叢集中建立WorkflowTemplate

WorkflowTemplate主要用於定義Git Clone代碼、構建和推送鏡像。

  • Clone代碼:本文採用Public倉庫,如果是私人倉庫,可以使用token來拉取,如git clone https://[username]:[token]@gitlab.com/demo3624733/echo-server.git

  • 構建和推送鏡像:本檔使用BuildKit來構建鏡像。

本文通過不使用共用儲存和使用NAS共用儲存兩種方式介紹如何建立WorkflowTemplate。

不使用共用儲存

通過此方式可以快速構建CI流水線,無需關注共用儲存的使用。此處使用initContainer用於將代碼Clone到emptyDir,之後進入相應的臨時目錄構建鏡像。

  1. 使用以下YAML內容,建立worktemplate-1.yaml檔案。

    您可以在以下WorkflowTemplate的parameters欄位中指定代碼倉庫、分支及鏡像等,並將您的username和Token替換到以下YAML檔案中。

    展開查看worktemplate-1.yaml檔案

    apiVersion: argoproj.io/v1alpha1
    kind: WorkflowTemplate
    metadata:
      name: echo-server
    spec:
      arguments:
        parameters:
          - name: repo
            value: https://github.com/ivan-cai/echo-server.git
          - name: branch
            value: main
          - name: path
            value: echo-server
          - name: image
            value: demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server:v2-argo-08231710
      entrypoint: main
      volumes:
        - name: work
          emptyDir: {}
      templates:
        - name: main
          inputs:
            parameters:
              - name: repo
              - name: branch
              - name: path
              - name: image
          # Mount the configuration so we can push the image.
          # This should create the /.docker/config.json file.
          volumes:
            - name: docker-config
              secret:
                secretName: docker-config
          initContainers:
          - name: git-clone
            image: alpine/git:v2.26.2
            volumeMounts:
              - mountPath: /work
                name: work
            workingDir: /work/
            command:
              - git
            args:
              - clone
              - --depth
              - "1"
              - --branch
              - "{{inputs.parameters.branch}}"
              - --single-branch
              - "{{inputs.parameters.repo}}"
          container:
            readinessProbe:
              exec:
                command: [ sh, -c, "buildctl debug workers" ]
            image: moby/buildkit:v0.12.1-rootless
            volumeMounts:
              - name: work
                mountPath: /work
              - name: docker-config
                mountPath: /.docker
            workingDir: /work/{{inputs.parameters.path}}
            env:
              - name: BUILDKITD_FLAGS
                value: --oci-worker-no-process-sandbox
              - name: DOCKER_CONFIG
                value: /.docker
            command:
              - buildctl-daemonless.sh
            args:
              - build
              - --frontend
              - dockerfile.v0
              - --local
              - context=.
              - --local
              - dockerfile=.
              - --output
              - type=image,name={{inputs.parameters.image}},push=true
              - build-arg:GOPROXY=http://goproxy.cn,direct
  2. 執行以下命令,在工作流程叢集中建立WorkflowTemplate。

    kubectl --kubeconfig ${ackone_argo_kubeconfig} apply -f worktemplate-1.yaml

使用NAS共用儲存

此情境中,Git Clone和構建鏡像是兩個單獨的Pod,所以需要共用儲存。關於如何在工作流程叢集使用NAS儲存卷的操作,請參見使用儲存卷

  1. 使用以下YAML內容,建立worktemplate-2.yaml檔案。

    您可以在以下WorkflowTemplate的parameters欄位中指定代碼倉庫、分支及鏡像等,並將您的username和Token替換到以下YAML檔案中。

    展開查看worktemplate-2.yaml檔案

    apiVersion: argoproj.io/v1alpha1
    kind: WorkflowTemplate
    metadata:
      name: echo-server
    spec:
      arguments:
        parameters:
          - name: repo
            value: https://github.com/ivan-cai/echo-server.git
          - name: branch
            value: main
          - name: path
            value: echo-server
          - name: image
            value: demo-test-registry.cn-hangzhou.cr.aliyuncs.com/cidemo/echo-server:v2-argo
      entrypoint: main
      volumes:
        - name: work
          persistentVolumeClaim:
            claimName: pvc-nas
      templates:
        - name: main
          dag:
            tasks:
              - name: clone
                template: clone
                arguments:
                  parameters:
                    - name: repo
                      value: "{{workflow.parameters.repo}}"
                    - name: branch
                      value: "{{workflow.parameters.branch}}"
              - name: image
                template: image
                arguments:
                  parameters:
                    - name: path
                      value: "{{workflow.parameters.path}}"
                    - name: image
                      value: "{{workflow.parameters.image}}"
                depends: "clone"
        - name: clone
          inputs:
            parameters:
              - name: repo
              - name: branch
          container:
            volumeMounts:
              - mountPath: /work
                name: work
            image: alpine/git:v2.26.2
            workingDir: /work/
            # Do a shallow clone, which is the fastest way to clone, by using the
            # --depth, --branch, and --single-branch options
            command:
              - sh
              - -c
              - |
                if [ -d "{{workflow.parameters.path}}" ];then
                  rm -rf {{workflow.parameters.path}}
                fi
                git clone --depth 1 --branch {{inputs.parameters.branch}} --single-branch {{inputs.parameters.repo}}
        - name: image
          inputs:
            parameters:
              - name: path
              - name: image
          # Mount the configuration so we can push the image.
          # This should create the /.docker/config.json file.
          volumes:
            - name: docker-config
              secret:
                secretName: docker-config
          container:
            readinessProbe:
              exec:
                command: [ sh, -c, "buildctl debug workers" ]
            image: moby/buildkit:v0.9.3-rootless
            volumeMounts:
              - name: work
                mountPath: /work
              - name: docker-config
                mountPath: /.docker
            workingDir: /work/{{inputs.parameters.path}}
            env:
              - name: BUILDKITD_FLAGS
                value: --oci-worker-no-process-sandbox
              - name: DOCKER_CONFIG
                value: /.docker
            command:
              - buildctl-daemonless.sh
            args:
              - build
              - --frontend
              - dockerfile.v0
              - --local
              - context=.
              - --local
              - dockerfile=.
              - --output
              - type=image,name={{inputs.parameters.image}},push=true
              - build-arg:GOPROXY=http://goproxy.cn,direct
  2. 執行以下命令,在工作流程叢集中建立WorkflowTemplate。

    kubectl --kubeconfig ${ackone_argo_kubeconfig} apply -f worktemplate-2.yaml

步驟三:建立WorkFlow

  1. 使用以下YAML內容,建立workflow.yaml檔案。

    apiVersion: argoproj.io/v1alpha1
    kind: Workflow
    metadata:
      annotations:
        workflows.argoproj.io/pod-name-format: v1
      generateName: echo-server-
    spec:
      workflowTemplateRef:
        name: echo-server
  2. 執行以下命令,在工作流程叢集中建立WorkFlow。

    kubectl --kubeconfig ${ackone_argo_kubeconfig} create -f workflow.yaml

步驟四:通過ACK One控制台查看工作流程

公網訪問服務開通後,您可以通過ACK One控制台更快捷地訪問Agro控制台。

  1. 登入ACK One控制台,在左側導覽列選擇工作流程叢集

  2. 基礎資訊頁簽下,找到常用操作地區,單擊工作流程控制台(Argo)

  3. 在工作流程控制台頁面左側,選擇NAMESPACEdefault,查看工作流程列表。