在ACK上使用Git+Appcenter+ACR构建应用GitOps全自动化交付流水线

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文介绍如何在ACK上使用Git、Appcenter和ACR构建应用GitOps全自动化交付流水线。

概述

本文介绍如何在ACK上使用Git、Appcenter和ACR构建应用GitOps全自动化交付流水线。

我们将演示Appcenter自动监听ACR镜像仓库变化,若有符合过滤条件的容器镜像tags更新,则自动触发以下流程:

ACR中镜像仓库tags更新 -> 自动更新Appcenter中应用参数配置 -> 镜像变更信息自动回写Git -> 将变更自动同步到ACK集群

这实际上是解耦了CI和CD流程,你可以使用任意第三方CI系统完成CI流程:
Git应用源码拉取 -> 容器镜像构建 -> 容器镜像推送至ACR

当CI流程成功将应用镜像推送到ACR镜像仓库时,就可以自动化触发CD流程的运行并更新应用容器镜像。

使用限制说明

● 只适用于通过Appcenter创建的应用
● 只适用于通过Kustomize或Helm编排渲染托管在Git系统中的应用编排
● 仅对同步策略设置为auto-sync的应用生效
● 私有镜像拉取凭证必须与Appcenter系统部署在同一个集群中,暂不支持跨集群读取私有镜像拉取凭证
● Appcenter组件版本需要>=2.2.5.1

快速开始

示例应用概述

请fork到您自己的账号下,方便后续示例应用自动更新容器镜像并正确回写到Github应用仓库;
guestbook应用编排目录结构如下:

├── helm
│   ├── Chart.yaml
│   ├── templates
│   │   ├── frontend-deployment.yaml
│   │   ├── frontend-service.yaml
│   │   ├── ingress.yaml
│   │   ├── redis-master-deployment.yaml
│   │   ├── redis-master-service.yaml
│   │   ├── redis-slave-deployment.yaml
│   │   └── redis-slave-service.yaml
│   ├── values-idc.yaml
│   └── values.yaml
└── README.md

guestbook应用中频繁更新的应用镜像为frontend deployment中的guestbook镜像,values.yaml中相关参数如下所示:

frontend:
  replicaCount: 3
  image:
    repository: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
    tag: "v1"

配置Appcenter定期检查ACR镜像仓库的Container Registry访问凭证

Appcenter定期检查ACR镜像仓库的Container Registry访问凭证配置在appcenter命名空间下名为argocd-image-updater-config的Configmap中,默认配置如下所示:

$ kubectl -n appcenter get cm argocd-image-updater-config -oyaml
apiVersion: v1
data:
  registries.conf: |
    registries:
    - name: AlibabaCloud Container Registry
      api_url: https://registry.cn-hangzhou.aliyuncs.com
      prefix: registry.cn-hangzhou.aliyuncs.com
      credentials: secret:appcenter/acr#acr
kind: ConfigMap
metadata:
  name: argocd-image-updater-config
  namespace: appcenter

● name: 容器镜像仓库配置的名称
● api_url: 容器镜像仓库API地址
● prefix: 容器镜像仓库的查询前缀
● credentials:容器镜像仓库访问凭证,格式为secret:<secret_namespace>/<secret_name>#<your_key>

以默认配置为例,需要在appcenter命名空间下配置名为acr的secret,用于appcenter访问cn-hongkong区域的ACR镜像仓库:

$ kubectl -n appcenter apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: acr
type: Opaque
stringData:
  acr: <your_username>:<your_password>
EOF

注意:请将<your_username>:<your_password>更换为您自己的容器镜像仓库访问凭证

使用Appcenter部署Git源类型的应用

控制台创建应用可以参考

步骤一:使用Appcenter创建一个guestbook应用

依照上述文档使用Appcenter创建一个guestbook应用,示例应用的yaml编排如下所示:

$ kubectl -n appcenter get application guestbook -oyaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: appcenter
spec:
  destination:
    namespace: guestbook
    server: https://192.168.0.32:6443
  project: default
  source:
    helm:
      valueFiles:
      - values.yaml
    path: helm
    repoURL: https://github.com/haoshuwei/guestbook.git
    targetRevision: main

步骤二: 设置guestbook应用更新策略为auto-sync

$ cat <<EOF > syncPolicy.patch
spec:
  syncPolicy:
    automated: {}
EOF

$ kubectl -n appcenter patch Application guestbook --type=merge -p "$(cat syncPolicy.patch)"

步骤三: 设置guestbook应用自动更新容器镜像

$ cat <<EOF > imageUpdate.patch
metadata:
  annotations:
    argocd-image-updater.argoproj.io/image-list: guestbook=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
    argocd-image-updater.argoproj.io/guestbook.helm.image-name: frontend.image.repository
    argocd-image-updater.argoproj.io/guestbook.helm.image-tag: frontend.image.tag
EOF

$ kubectl -n appcenter patch Application guestbook --type=merge -p "$(cat imageUpdate.patch)"

你可以使用如下的格式的Annotation描述1个或多个容器镜像:

argocd-image-updater.argoproj.io/image-list: <image_spec_list>

&ltimage_spec_list&gt是一个容器镜像,或使用“,”隔开的容器镜像列表,完整的描述方式如下所示:

[<alias_name>=]<image_path>[:<version_constraint>]

你可以使用如下的格式的Annotation描述Helm编排的应用如何更新image name和image tag:

argocd-image-updater.argoproj.io/<alias_name>.helm.<image_name>: <helm_values>
argocd-image-updater.argoproj.io/<alias_name>.helm.<image_tag>: <helm_values>

本示例中,guestbook的values.yaml文件中frontend组件对应的容器镜像编排参数如下所示:

frontend:
  replicaCount: 3

  image:
    repository: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
    tag: "v1"

所以对应的Annotation描述如下:

argocd-image-updater.argoproj.io/guestbook.helm.image-name: frontend.image.repository
argocd-image-updater.argoproj.io/guestbook.helm.image-tag: frontend.image.tag

步骤四: 设置guestbook应用自动更新容器镜像后回写git

$ cat <<EOF > gitWriteback.patch
metadata:
  annotations:
    argocd-image-updater.argoproj.io/write-back-method: git
EOF

$ kubectl -n appcenter patch Application guestbook --type=merge -p "$(cat gitWriteback.patch)"

测试应用容器镜像自动更新

推送新版本的guestbook镜像:

$ docker tag registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook:v1 registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook:v4
$ docker push registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook:v4

查看Appcenter下argocd-image-updater组件日志:

$ kubectl -n appcenter logs -f argocd-image-updater-<xxx>
time="2022-03-28T07:28:27Z" level=info msg="Successfully updated image 'registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook:v1' to 'registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook:v4', but pending spec update (dry run=false)" alias=guestbook application=guestbook image_name=haoshuwei24/guestbook image_tag=v1 registry=registry.cn-hangzhou.aliyuncs.com
time="2022-03-28T07:28:27Z" level=info msg="Committing 1 parameter update(s) for application guestbook" application=guestbook

查看Github上guestbook应用中是否自动生成.argocd-source-guestbook.yaml文件:
image.png

查看guestbook应用是否已自动更新最新版本容器镜像:

$ kubectl -n guestbook get deploy frontend -ojsonpath="{.spec.template.spec.containers[0].image}" 
registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook:v4

配置解析

密钥凭证配置

在guestbook的示例应用中,我们演示了Appcenter自动监听ACR镜像仓库变化并更新应用的示例。

这个过程中会涉及到秘钥凭证有:
● Appcenter定期检查ACR镜像仓库的Container Registry访问凭证
● Appcenter回写应用容器镜像变更信息到Git系统的Git Credentials访问凭证

(1)Appcenter定期检查ACR镜像仓库的Container Registry访问凭证
请参考https://yuque.antfin-inc.com/op0cg2/xggqal/ufdih5/edit#CTbq9
(2)配置Appcenter回写应用容器镜像变更信息到Git系统的Git Credentials访问凭证
Appcenter回写应用容器镜像变更信息到Git系统的Git Credentials访问凭证配置有2种方式:
● 使用Appcenter中存储的Git Credentials访问凭证(使用Appcenter创建应用并配置git访问凭证时创建)
指定Application使用git凭证的方式如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd-image-updater.argoproj.io/write-back-method: git

● 存储在Secret中,示例如下:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  annotations:
    argocd-image-updater.argoproj.io/write-back-method: git:secret:appcenter/git-creds

其中 git:secret:appcenter/git-creds 表示appcenter命名空间下名为git-creds的Secret资源,创建该Secret的示例如下:

$ kubectl -n appcenter create secret generic git-creds \
  --from-literal=username=<your_username> \
  --from-literal=password=<your_password>

配置容器镜像的更新

Annotation格式说明

你可以在Appcenter创建的应用中通过设置Annotation标记1个或者多个容器镜像可被自动更新,格式如下所示:

argocd-image-updater.argoproj.io/image-list: <image_spec_list>

<image_spec_list> 可以是单个容器镜像,也可以是“,”逗号分割的一组容器镜像列表,每1个容器镜像描述的格式都可以是如下所示:

[<alias_name&gt=]<image_path>[:<version_constraint>]

下面会对镜像描述的格式有进一步说明。

镜像tags条件过滤

以registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook镜像为例,当ACR镜像仓库中guestbook镜像有新tags推送时:

(1)任何镜像tags都可以触发应用更新,如下所示:

argocd-image-updater.argoproj.io/image-list: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook

(2)通过正则表达式过滤允许的tags,格式如下所示:

argocd-image-updater.argoproj.io/<image_name>.allow-tags: <match_func>

其中<match_func>的格式如下所示:

regexp:<expression>

即标准的正则表达式。

例如只允许v2到v9的tags触发应用更新,Annotation如下所示:

argocd-image-updater.argoproj.io/<image_name>.allow-tags: regexp:^v[1-9]

为容器镜像设置别名

可以为应用的容器镜像设置别名,方便在做配置时引用,别名只允许字母字符串,容器镜像别名只允许在 image-list的Annotation重使用,如下所示:

argocd-image-updater.argoproj.io/image-list: guestbook=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook

guestbook即容器镜像registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook的别名

设置镜像更新策略

容器镜像更新策略支持以下几种,默认的镜像更新策略为semver

策略 描述
semver 按语义化版本号排序并更新到最新的镜像tag
latest 按创建时间排序并更新到最新的镜像tag
name 按字母排序并更新到最新的镜像tag
digest 更新到最新的推送的可变标签版本

Annotation的格式如下所示:

argocd-image-updater.argoproj.io/<image_name>.update-strategy: <strategy>

例如设置guestbook=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook的镜像更新策略为latest

argocd-image-updater.argoproj.io/guestbook.update-strategy: latest

Helm编排类型应用的参数设置

Helm编排类型的应用可能包含多个容器镜像的描述,比如guestbook示例应用中有frontend.image.repository、frontend.image.tag、redis.master.image.repository、redis.master.image.tag,示例如下所示:

annotations:
  argocd-image-updater.argoproj.io/image-list: guestbook=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook,redis-master=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/redis
  argocd-image-updater.argoproj.io/guestbook.helm.image-name: frontend.image.repository
  argocd-image-updater.argoproj.io/guestbook.helm.image-tag: frontend.image.tag
  argocd-image-updater.argoproj.io/redis-master.helm.image-name: redis.master.image.repository
  argocd-image-updater.argoproj.io/redis-master.helm.image-tag: redis.master.image.tag

Kustomize编排类型应用的参数设置

Kustomize编排类型的应用容器镜像的自动更新设置,需要先为被更新的容器镜像设置别名(可以包含tag),然后设置原始容器镜像地址(不包含tag),Annotation格式如下所示:

annotations:
  argocd-image-updater.argoproj.io/image-list: <image_alias>=<image_name>:<image_tag>
  argocd-image-updater.argoproj.io/<image_alias>.kustomize.image-name: <original_image_name>

示例:

annotations:
  argocd-image-updater.argoproj.io/image-list: guestbook=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
  argocd-image-updater.argoproj.io/guestbook.kustomize.image-name: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。 &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之如何下载流水线构建过程中生成的jar
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之如何限制在本地的构建主机创建的流水线的并发数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
52 5
|
1月前
|
运维 jenkins 持续交付
自动化运维之路:构建高效CI/CD流水线
在软件开发的快节奏中,持续集成和持续部署(CI/CD)流水线是提升效率、保障质量的关键。本文将引导你理解CI/CD流水线的重要性,并手把手教你如何搭建一个高效的自动化运维系统。通过实际代码示例,我们将一步步实现从代码提交到自动测试、部署的全流程自动化,确保软件交付过程既快速又可靠。
|
3月前
|
缓存 运维 前端开发
阿里云云效操作报错合集之如何解决在使用流水线构建net8应用时遇到无法构建的报错
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
47 0
|
3月前
|
前端开发 Devops 持续交付
【前端自动化新高度】Angular与Azure DevOps完美结合:从零构建持续集成与持续部署的全自动流水线,提升开发效率与软件交付质量!
【8月更文挑战第31天】Angular作为领先的前端框架,以强大功能和灵活性深受开发者喜爱。Azure DevOps提供一站式DevOps服务,涵盖源码管理、持续集成(CI)及持续部署(CD)。本文将指导你如何在Azure DevOps中搭建Angular项目的CI/CD流程,并通过具体示例代码展示整个过程。首先,我们将创建一个Angular项目并初始化Git仓库;然后,在Azure DevOps中设置CI流水线,定义YAML文件以自动化构建和部署流程。最终实现每次提交代码后自动构建并部署至Azure Web App,极大提升了开发效率和软件交付速度,使团队更专注于创新。
37 0
|
3月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之流水线构建出现问题,连接不到nuget,该如何处理
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
监控 Devops jenkins
DevOps实践:构建自动化CI/CD流水线
【8月更文挑战第28天】本文深入探讨了DevOps文化下,如何通过构建自动化的持续集成和持续部署(CI/CD)流水线来提高软件开发的效率和质量。文章不仅分享了构建流水线的步骤,而且提供了实际的代码示例,旨在帮助读者理解并实现自己的自动化流程。
120 0
|
4月前
|
存储 弹性计算 监控
建设云上稳定性问题之为什么要在云效平台创建发布流水线并将源代码编译环节替换为从OSS下载构建部署物
建设云上稳定性问题之为什么要在云效平台创建发布流水线并将源代码编译环节替换为从OSS下载构建部署物

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版
  • 下一篇
    无影云桌面