基于ACK One和ACR 构建应用全自动化GitOps交付的实践

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本文介绍如何在ACK One实例上构建应用GitOps全自动化交付流水线。

背景信息

您可以使用任意第三方CI系统完成如下CI流程:

image.png

当CI流程成功将应用镜像推送到ACR镜像仓库时,就可以自动化触发CD流程的运行并更新应用容器镜像。本文示例主要演示ACK One GitOps自动监听ACR镜像仓库变化,若有符合过滤条件的容器镜像tags更新,则触发以下流程:

image.png

使用限制

  • 仅适用于通过ACK One GitOps系统创建的应用。
  • 仅适用于通过Kustomize或Helm编排渲染托管在Git系统中的应用编排。
  • 仅对同步策略设置为auto-sync的应用生效。
  • 私有镜像拉取凭证必须与GitOps系统部署在同一集群中,不支持跨集群读取私有镜像拉取凭证。


前置条件


快速开始


本文示例应用的GitHub地址为:https://github.com/AliyunContainerService/gitops-demo.git

由于本示例中涉及将应用变更回写到Git仓库中,所以首先需要您fork以上Git仓库到自己的账号下。例如本次演示将使用fork的仓库地址: https://github.com/haoshuwei/gitops-demo.git


gitops-demo应用的目录结构为:

.
├── manifests
│   └── helm
│       ├── Chart.yaml
│       ├── templates
│       │   ├── deployment.yaml
│       │   ├── _helpers.tpl
│       │   ├── hpa.yaml
│       │   ├── ingress.yaml
│       │   ├── NOTES.txt
│       │   ├── serviceaccount.yaml
│       │   ├── service.yaml
│       │   └── tests
│       │       └── test-connection.yaml
│       ├── values-oversea.yaml
│       └── values.yaml
└── README.md

其中values.yaml文件中,通过image.tag动态渲染应用锁使用的镜像tag:

image:
  repository: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server
  pullPolicy: IfNotPresent
  # Overrides the image tag whose default is the chart appVersion.
  tag: "v1.0"

步骤一 在GitOps系统中创建应用

连接和访问GitOps系统,可参考 https://help.aliyun.com/document_detail/464255.html#section-q3r-rjg-t9k

Git源仓库添加,可参考 https://help.aliyun.com/document_detail/464259.html

应用创建参考: https://help.aliyun.com/document_detail/464576.html


(1)CLI创建:创建应用gitops-demo,参数详情如下:

argocd app create gitops-demo --repo https://github.com/AliyunContainerService/gitops-demo.git --path  manifests/helm --dest-namespace gitops --dest-server https://xx.xx.XX.XX:6443 --sync-policy none
argocd app sync gitops-demo

(2)UI创建:创建应用gitops-demo,参数详情如下:

image.png

image.png

查看应用运行情况:

image.png


步骤二 配置应用自动更新

当您推送了一个新版本的应用镜像到ACR镜像仓库时,希望GitOps系统可以自动检测到该新版镜像并自动将其更新到实际环境中。在配置应用自动更新之前,您需要先知晓以下内容:

  • GitOps系统中基于ACR镜像仓库变化触发应用自动更新的功能,由argocd-image-updater组件负责,该组件目前处于alpha阶段,建议只在开发测试环境中使用,如需在生产环境中使用,请您仔细评估,风险自担。
  • GitOps系统创建的应用会在argocd命名空间下生成一个Application CR,我们将通过为该Application CR添加annotations来配置应用自动更新。
  • GitOps系统需要您手动配置ACR镜像仓库的登录用户名密码用于监听镜像仓库变化。


(1) 查看gitops-demo应用的Application CR

$ kubectl -n argocd get application gitops-demo -oyaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: gitops-demo
  namespace: argocd
spec:
  destination:
    namespace: gitops
    server: https://x.xxx.xxx.x:6443
  project: default
  source:
    helm:
      valueFiles:
      - values.yaml
    path: manifests/helm
    repoURL: https://github.com/haoshuwei/gitops-demo.git
    targetRevision: HEAD
  syncPolicy:
    automated: {}
    syncOptions:
    - CreateNamespace=true

(2) 为gitops-demo添加annotations

生成imageUpdate.patch:

$ cat <<EOF > imageUpdate.patch
metadata:
  annotations:
    argocd-image-updater.argoproj.io/image-list: echoserver=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server
    argocd-image-updater.argoproj.io/echoserver.helm.image-tag: image.tag
    argocd-image-updater.argoproj.io/echoserver.update-strategy: semver
    argocd-image-updater.argoproj.io/echoserver.allow-tags: regexp:^v[1-9].*
    argocd-image-updater.argoproj.io/write-back-method: git:secret:argocd/git-creds
EOF

为gitops-demo添加annotations:

$ kubectl -n argocd patch Application gitops-demo --type=merge -p "$(cat imageUpdate.patch)"

(3) 配置访问ACR和Git仓库的凭证

配置访问ACR的凭证:

$ kubectl -n argocd apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: acr
type: Opaque
stringData:
  acr: <your_username>:<your_password>  # 将<your_username>:<your_password>更换为您自己的容器镜像仓库访问凭证。
EOF

配置访问Git仓库的凭证:

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

步骤三 测试应用的自动更新

(1) push新的镜像tag到ACR镜像仓库

$ docker pull registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server:v1.0
$ docker tag registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server:v1.0 registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server:v2.0
$ docker push registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server:v2.0

(2) 执行以下命令,查看argocd命名空间下argocd-image-updater容器的日志。

$ kubectl -n argocd logs -f argocd-server-xxxxxxxxxx-xxxxx -c argocd-image-updater

预期输出:

time="2022-12-29T09:58:13Z" level=info msg="Successfully updated the live application spec" application=gitops-demo
time="2022-12-29T09:58:13Z" level=info msg="Processing results: applications=1 images_considered=1 images_skipped=0 images_updated=1 errors=0"

查看目标集群中的应用镜像是否已自动更新。

(3) GitHub上查看Git仓库中是否自动生成manifests/helm/.argocd-source-gitops-demo.yaml文件(表示回写Git成功)。

image.png

配置应用镜像的自动更新

1. 配置更新指定的容器镜像

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

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

可以是单个容器镜像,也可以用半角逗号(,)分割的一组容器镜像列表,每个容器镜像描述的格式如下所示:

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

是应用的容器镜像别名,以便在做其它配置时引用。别名只允许字母字符串,且只允许在image-listAnnotation中使用。例如本文示例中,指定需要自动更新的镜像为registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server,为其设置的别名为echoserver:

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


2. 镜像tags的条件过滤

registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server镜像为例,您可以设置过滤条件,当且仅当ACR镜像仓库中echo-server镜像有符合过滤规则的新tags推送时,才出发应用的自动更新。

通过正则表达式过滤允许的tags,规范如下所示:

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

其中,的格式为regexp:即为标准的正则表达式。

例如本文中的示例为:

argocd-image-updater.argoproj.io/echoserver.allow-tags: regexp:^v[1-9].*

3. 设置容器镜像更新策略

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

更新策略

描述

semver

按语义化版本号排序并更新到最新的镜像tag

latest

按创建时间排序并更新到最新的镜像tag(注意:并非镜像推送到仓库的时间)

name

按字母排序并更新到最新的镜像tag

digest

更新到最新推送的可变标签版本。

Annotation的格式如下所示:

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

本示例中使用的镜像更新策略为semver,如下所示:

argocd-image-updater.argoproj.io/echoserver.update-strategy: semver

4. Helm/Kustomize编排的应用参数设置

  • Helm编排的应用参数设置

应用可能包含多个容器镜像的描述,比如gitops-demo示例应用的values.yaml文件中有image.repository image.tag配置,那么Annotations的配置如下所示:

annotations:
  argocd-image-updater.argoproj.io/image-list: echoserver=registry.cn-hangzhou.aliyuncs.com/haoshuwei24/echo-server
  argocd-image-updater.argoproj.io/echoserver.helm.image-name: image.repository
  argocd-image-updater.argoproj.io/echoserver.helm.image-tag: 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>


配置访问ACR镜像仓库的凭证

您需配置如下访问凭证才能通过GitOps系统自动监听ACR镜像仓库的变化并更新应用。ACR镜像仓库相关的配置保存在argocd命名空间下名为argocd-image-updater-configConfigMap中。

查看默认配置如下所示:

$ kubectl -n argocd get cm argocd-image-updater-config -oyaml
apiVersion: v1
data:
  registries.conf: |
    registries:
    - name: AlibabaCloud Container Registry
      api_url: https://registry-vpc.<RegionID>.aliyuncs.com
      prefix: registry-vpc.<RegionID>.aliyuncs.com
      insecure: no
      credentials: secret:argocd/acr#acr
kind: ConfigMap
metadata:
  labels:
    app.kubernetes.io/name: argocd-image-updater-config
    app.kubernetes.io/part-of: argocd-image-updater
  name: argocd-image-updater-config
  namespace: argocd

参数

说明

name

容器镜像仓库配置的名称。

api_url

容器镜像仓库API地址,<RegionID>会根据当前地域动态渲染自动生成。

prefix

容器镜像仓库的查询前缀,该前缀中<RegionID>会根据当前地域动态渲染自动生成。

credentials

容器镜像仓库的查询前缀,该前缀在安装GitOps时根据当前地域动态渲染自动生成。

如果您使用的是ACREE镜像仓库,请替换对应的api_url和prefix字段的值。

根据 credentials: secret:argocd/acr#acr 配置,我们需要再argocd命名空间下创建名为acr的secret保存访问ACR镜像仓库的凭证:

kubectl -n argocd apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: acr
type: Opaque
stringData:
  # 将<your_username>:<your_password>更换为您自己的容器镜像仓库访问凭证。
  acr: <your_username>:<your_password>  
EOF

配置访问Git仓库的凭证

若您在GitOps系统中添加Git Repository时,配置了用户名和密码,则使用该Git Repository的应用默认拥有回写应用容器镜像变更信息到Git系统的权限,可以通过添加以下Annotations配置使用该Git凭证:

annotations:
  argocd-image-updater.argoproj.io/write-back-method: git

若您需要自定义配置该Git凭证,则可以通过添加以下Annotations配置使用指定Git凭证:

annotations:
  argocd-image-updater.argoproj.io/write-back-method: git:secret:argocd/git-creds

并在argocd命名空间下创建名为git-creds的secret:

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


更多image-updater的用法请参考: https://argocd-image-updater.readthedocs.io/en/stable/

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
16天前
|
机器学习/深度学习 运维 Prometheus
构建高效运维体系:从自动化部署到智能监控的全方位实践
在当今数字化时代,企业对运维效率和稳定性的要求越来越高。本文将探讨如何构建一个高效的运维体系,从自动化部署、持续集成与持续交付(CI/CD)、智能监控、故障管理以及数据驱动决策等方面进行深入分析和实践指导。通过这些方法,企业可以实现更快速、更可靠的软件发布和问题解决,提升整体运营效率。
|
10天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
3年前的云栖大会,我们发布分布式云容器平台ACK One,随着3年的发展,很高兴看到ACK One在混合云,分布式云领域帮助到越来越多的客户,今天给大家汇报下ACK One 3年来的发展演进,以及如何帮助客户解决分布式领域多云多集群管理的挑战。
阿里云容器服务 ACK One 分布式云容器企业落地实践
|
12天前
|
敏捷开发 运维 Prometheus
构建高效运维体系:从基础架构到自动化管理
本文探讨了如何通过优化基础架构、引入自动化工具和流程,以及加强团队协作,构建高效的运维体系。通过案例分析和实践建议,帮助运维人员实现系统的稳定性、可靠性和可维护性。
|
6天前
|
机器学习/深度学习 运维 Cloud Native
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为信息技术的重要支柱,其效率与创新能力直接关系到企业信息系统的稳定性和业务连续性。本文将探讨如何通过技术手段,实现运维从传统手工操作向自动化、智能化的转变,进而构建一个高效、可靠的运维体系。我们将从自动化工具的应用开始,逐步深入到智能运维的实践,最终展望云原生架构下的运维未来趋势。
|
10天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为保障企业IT系统稳定运行的关键环节,正经历着前所未有的变革。本文将探讨如何通过实施自动化和引入智能化技术,构建一个更加高效、可靠的运维体系,以应对日益复杂的业务需求和技术挑战。
22 1
|
18天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进之旅
在当今数字化时代,运维作为信息技术领域的核心组成部分,其重要性日益凸显。随着企业业务的不断扩展和技术的日新月异,传统手工运维方式已难以满足现代IT架构的需求。因此,构建一个高效、智能的运维体系成为业界共识。本文将探讨如何通过自动化和智能化手段,实现运维效率的质的飞跃,并分享一些成功案例与实践经验。
|
2天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的实践之路
在当今信息技术飞速发展的时代,运维作为保障企业信息系统稳定运行的关键环节,其重要性日益凸显。本文将探讨如何通过构建高效的运维体系,实现从被动响应到主动预防的转变,以及如何利用自动化工具提升运维效率和质量。我们将从运维的基本概念出发,逐步深入到监控、自动化和安全管理等方面,为企业提供一套实用的运维优化方案。
6 0
|
5月前
|
人工智能 运维 Kubernetes
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
327 2
阿里云容器服务ACK AI助手正式上线带来的便利性
|
5月前
|
存储 Kubernetes Docker
容器服务ACK常见问题之阿里云控制台进不去了如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。
|
5月前
|
人工智能 弹性计算 调度
阿里云容器服务 ACK 产品技术动态(202312)
容器服务 Kubernetes 版 ACK 【新功能】 Feature:支持基于机密虚拟机的 AI 模型推理保护 ACK 现已支持将基于 Intel® Trusted Domain Extension(Intel® TDX)技术的 ECS 实例加入 TDX 机密虚拟机计算节点池,使集群具备 TDX 机密计算能力,实现 AI 模型的可信推理和微调,保障模型数据的机密性与完整性。结合 PyTorch 与 Intel® AMX指令集,您可以在 32 核实例上实现秒级出图的推理能力。
490 1

相关产品

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