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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: ## 概述本文介绍如何在ACK上使用Git、Appcenter和ACR构建应用GitOps全自动化交付流水线。我们将演示Appcenter自动监听ACR镜像仓库变化,若有符合过滤条件的容器镜像tags更新,则自动触发以下流程:ACR中镜像仓库tags更新 -> 自动更新Appcenter中应用参数配置 -> 镜像变更信息自动回写Git -> 将变更自动同步到ACK集群这实际上是解耦了

概述

本文介绍如何在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

快速开始

示例应用概述

示例应用Github地址
请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>

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

[<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>
$ 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文件

查看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>=]<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天前
|
测试技术 开发工具 git
利用Git Hooks自动化你的开发流程
Git Hooks 是 Git 的强大功能,允许在特定事件(如提交、推送、合并请求)发生时自动执行脚本。通过合理设置和使用 Git Hooks,可以自动化测试、代码风格检查等任务,提高代码质量和开发效率。本文介绍了如何设置和使用常用的 Git Hooks,包括 `pre-commit`、`pre-push` 和 `post-merge`,并提供了最佳实践建议。
|
8天前
|
运维 Devops 持续交付
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第34天】在数字化时代的浪潮中,DevOps成为企业追求敏捷、高效和稳定的关键。本文将通过一个真实案例,展示如何构建一个高效的DevOps流水线,实现从代码提交到部署的全自动化流程。我们将探讨流水线设计的哲学、工具选择以及面临的挑战,并分享实际的代码示例和操作步骤,帮助读者理解自动化运维的精髓。
23 2
|
3月前
|
敏捷开发 Java 测试技术
阿里云云效产品使用合集之如何下载流水线构建过程中生成的jar
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之如何限制在本地的构建主机创建的流水线的并发数
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
25天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
47 5
|
1月前
|
测试技术 开发工具 git
利用Git Hooks自动化你的开发流程
【10月更文挑战第6天】在现代软件开发中,版本控制至关重要,Git作为主流工具,提供了强大的代码管理功能。Git Hooks 是 Git 的一个特性,可在特定事件(如提交、推送)发生时自动执行脚本,实现开发流程自动化。本文介绍 Git Hooks 的基本概念、常见用例及设置方法,涵盖 pre-commit、pre-push 等多种类型的 Hooks,并展示了如何利用它们进行代码格式化、自动化测试和风格检查,提升开发效率与代码质量。通过合理应用 Git Hooks,可以显著减少人为错误,确保代码一致性,并促进团队协作。
|
1月前
|
运维 监控 Devops
自动化运维的魔法:打造高效DevOps流水线
【10月更文挑战第6天】 在现代软件开发的快节奏中,自动化运维成为提高效率、保障质量的重要手段。本文将带你了解如何构建高效的DevOps流水线,从持续集成到部署,再到监控和反馈,我们将一步步揭开自动化运维的神秘面纱。你将学习到如何通过代码和工具的结合,实现软件交付过程的自动化,以及如何通过这一流程提升团队的协作和响应速度。让我们开始探索自动化运维的奇妙之旅吧!
|
1月前
|
运维 jenkins 持续交付
自动化运维之路:构建高效CI/CD流水线
在软件开发的快节奏中,持续集成和持续部署(CI/CD)流水线是提升效率、保障质量的关键。本文将引导你理解CI/CD流水线的重要性,并手把手教你如何搭建一个高效的自动化运维系统。通过实际代码示例,我们将一步步实现从代码提交到自动测试、部署的全流程自动化,确保软件交付过程既快速又可靠。
|
2月前
|
运维 Devops jenkins
自动化运维:打造高效DevOps流水线
【8月更文挑战第44天】本文将通过深入浅出的方式,带你构建一个自动化的DevOps流水线,提升开发和部署效率。从基础概念到实际操作,我们一步步剖析如何实现代码提交、自动测试、构建、部署的全过程自动化。你将学会使用Jenkins、Git、Docker等工具,并结合Shell脚本编写,完成一个完整的自动化流程。文章末尾附有完整的示例代码,助你快速上手实践。
|
3月前
|
Java Spring 传感器
AI 浪潮席卷,Spring 框架配置文件管理与环境感知,为软件稳定护航,你还在等什么?
【8月更文挑战第31天】在软件开发中,配置文件管理至关重要。Spring框架提供强大支持,便于应对不同环境需求,如电商项目的开发、测试与生产环境。它支持多种格式的配置文件(如properties和YAML),并能根据环境加载不同配置,如数据库连接信息。通过`@Profile`注解可指定特定环境下的配置生效,同时支持通过命令行参数或环境变量覆盖配置值,确保应用稳定性和可靠性。
62 0