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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: ## 概述本文介绍如何在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
AI 代码解读

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

frontend:
  replicaCount: 3
  image:
    repository: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
    tag: "v1"
AI 代码解读

配置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
AI 代码解读

● 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
AI 代码解读

注意:请将<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
AI 代码解读

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

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

$ kubectl -n appcenter patch Application guestbook --type=merge -p "$(cat syncPolicy.patch)"
AI 代码解读

步骤三: 设置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)"
AI 代码解读

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

argocd-image-updater.argoproj.io/image-list: <image_spec_list>
AI 代码解读

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

[<alias_name>=]<image_path>[:<version_constraint>]
AI 代码解读

你可以使用如下的格式的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>
AI 代码解读

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

frontend:
  replicaCount: 3

  image:
    repository: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
    tag: "v1"
AI 代码解读

所以对应的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
AI 代码解读

步骤四: 设置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)"
AI 代码解读

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

推送新版本的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
AI 代码解读

查看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
AI 代码解读

查看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
AI 代码解读

配置解析

密钥凭证配置

在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
AI 代码解读

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

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

其中 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>
AI 代码解读

配置容器镜像的更新

Annotation格式说明

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

argocd-image-updater.argoproj.io/image-list: <image_spec_list>
AI 代码解读

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

[<alias_name>=]<image_path>[:<version_constraint>]
AI 代码解读

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

镜像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
AI 代码解读

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

argocd-image-updater.argoproj.io/<image_name>.allow-tags: <match_func>
AI 代码解读

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

regexp:<expression>
AI 代码解读

即标准的正则表达式。

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

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

为容器镜像设置别名

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


argocd-image-updater.argoproj.io/image-list: guestbook=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/guestbook
AI 代码解读

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>
AI 代码解读

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

argocd-image-updater.argoproj.io/guestbook.update-strategy: latest
AI 代码解读

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
AI 代码解读

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>
AI 代码解读

示例:

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
AI 代码解读
相关实践学习
通过容器镜像仓库与容器服务快速部署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
流生
+关注
目录
打赏
0
0
0
0
78712
分享
相关文章
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
361 180
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
ACK One多集群Service帮助大批量应用跨集群无缝迁移
ACK One多集群Service可以帮助您,在无需关注服务间的依赖,和最小化迁移风险的前提下,完成跨集群无缝迁移大批量应用。
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
412 2
阿里云容器服务ACK AI助手正式上线带来的便利性
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等