赛尔校园公共服务平台 Logo
平台使用
阿里云
百度云
移动云
智算服务
教育生态
登录 →
赛尔校园公共服务平台 Logo
平台使用 阿里云 百度云 移动云 智算服务 教育生态
登录
  1. 首页
  2. 阿里云
  3. 分布式云容器平台ACK One
  4. 实践教程
  5. CICD
  6. ACK One GitOps最佳实践
  7. 使用ACK One分布式工作流集群构建容器镜像CI

使用ACK One分布式工作流集群构建容器镜像CI

  • ACK One GitOps最佳实践
  • 发布于 2025-04-18
  • 0 次阅读
文档编辑
文档编辑

本文介绍如何使用ACK One分布式工作流集群构建容器镜像CI。

前提条件

  • 已创建工作流集群,从ACK One控制台获取分布式工作流Argo实例的KubeConfig,并通过kubectl连接至工作流集群。具体操作,请参见通过kubectl工具连接集群。

  • 已为RAM用户授权。

  • 已创建ACR企业版实例。

使用限制

暂不支持通过修改代码来自动触发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/buildkit的moby/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: build-echo-server-2
    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: build-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. 在工作流控制台页面左侧,选择NAMESPACE为default,查看工作流列表。

相关文章

最佳实践概述 2025-04-18 18:06

在完整的CI/CD流水线中,您可以通过修改代码自动触发CI构建,并将镜像推送到容器镜像服务ACR,然后触发ACK One GitOps将应用持续部署到各个集群。本文通过示例介绍完整流程中ACK One GitOps最佳实践的相关概念和流程。 相关概念

基于ACK One GitOps部署的应用示例介绍 2025-04-18 18:06

本文介绍基于ACK One GitOps部署的应用示例。 应用部署仓库的目录结构 一个完整的CI/CD流水线中,涉及业务代码仓库和应用部署代码仓库两类。ACK One GitOps本实践的仓库说明如下。 业务代码仓库包含2个,分别从echo-server项目

使用ACK One分布式工作流集群构建容器镜像CI 2025-04-18 18:06

本文介绍如何使用ACK One分布式工作流集群构建容器镜像CI。 前提条件 已创建工作流集群,从ACK One控制台获取分

使用ACK One GitOps部署应用 2025-04-18 18:06

ACK One GitOps托管并完全兼容ArgoCD相关能力,支持持续迭代,可通过使用Git部署模板代替模板化分发能力。本文介绍如何通过ACK One GitOps控制台或CLI的方式部署应用。 前提条件 已开启舰队管理功能。具体操作,请参见

基于ACK One GitOps和ACR构建CICD流水线 2025-04-18 18:06

ACK One GitOps可实现多集群GitOps应用的持续交付,容器镜像服务ACR支持绑定业务代码仓库,以实现应用的持续集成。本实践基于这两者构建开发(Dev)、预发(Staging)、生产(Production)集群的CI/CD流水线,实现代码修改提交到代码仓库后,自动将最新镜像更新至应用,并

基于ACK One Gitops使用Argo Rollouts实现金丝雀发布 2025-04-18 18:05

ACK One整合了ArgoCD GitOps的能力,同时结合渐进式发布组件Argo Rollouts,通过Git Commit实现全自动的金丝雀发布。本文介绍如何通过ACK One GitOps结合Argo Rollouts组件快速构建应用的金丝雀发布能力。

目录
Copyright © 2025 your company All Rights Reserved. Powered by 赛尔网络.
京ICP备14022346号-15
gongan beian 京公网安备11010802041014号