监听镜像版本变化触发 GitOps工作流

news2024/11/16 9:49:36

文章目录

      • 前言
      • 工作流总览
      • 安装和配置 ArgoCD Image Updater
      • 创建 Image Pull Secret(可选)
      • 创建 Helm Chart 仓库
      • 创建 ArgoCD Application
        • 删除旧应用(可选)
        • 配置仓库访问权限
        • 创建 ArgoCD 应用
      • 体验 GitOps 工作流
      • 总结

前言

在【GitOps系列】使用 ArgoCD 快速打造GitOps工作流 博文中,我们创建的 GitOps 工作流有下面两个重要的特点:

  1. 源码和 Helm Chart 在同一个仓库下
  2. 在 CI 阶段更新了 Helm Chart 镜像版本

在开发和发布分工明确的团队中,更推荐将源码和应用定义分离,考虑到安全性和发布的严谨性,也尽量不要通过 CI 直接修改应用定义。

更合理的研发规范设计应该是这样的:

开发负责编写代码,并通过 CI 生成制品(Docker 镜像),并对生成的制品负责。而SRE 团队则对应用定义负责。在发布环节, 开发可以随时控制要发布的镜像版本,而无需关注其他的应用细节,他们之间的工作流程图如下:
在这里插入图片描述
以上工作流程图我们可以看出,开发和 SRE 团队各司其职,只操作和自己相关的 Git 仓库,互不干扰。但 SRE 团队要怎么知道开发团队什么时候发布以及发布什么版本的镜像呢?
最原始的办法是:开发在需要发布的时候将镜像版本告诉 SRE 团队,SRE 团队手动修改 Helm Chart 镜像版本并推送到 Git 仓库,等待 ArgoCD 同步完成。
这种办法虽然有效,但沟通效率低且容易出错, 我们需要一种自动化的机制来替代这个过程。
那就是借助 ArgoCD Image Updater,我们可以让 ArgoCD 自动监控镜像仓库的更新情况,一旦工作负载中的镜像版本有更新,ArgoCD 就会自动将工作负载升级为新的镜像版本,并且还可以自动将镜像的版本号回写到 Helm Chart 仓库中,保持应用定义和集群状态的一致性。

工作流总览

最终要期望实现的效果如下:
在这里插入图片描述

  1. 将一个 Git 仓库拆分成了两个,一个存放源码,一个存放 Helm Chart;
  2. 不再使用 CI 更新 Helm Chart 镜像版本,而是使用 ArgoCD Image Updater 来自动监控镜像仓库的变更。

此外,由于在日常开发中,我们一般会采用多分支进行开发,这就随时可能产生新的镜像版本。为了将开发过程和需要发布到生产环境的镜像区分开,我们会为 Main 分支构建出来的镜像增加一个 Prefix 标识,例如 main-${commit_Id},并配置 ArgoCD Image Updater 只监控包含特定标识的镜像版本。
最终实现的效果是:
当开发将代码提交到 Git 仓库 Main 分支后,将触发自动构建,并将新的镜像版本推送到镜像仓库。ArgoCD Image Updater 会以 Poll 的方式每 2 分钟检查一次工作负载的镜像是否有新的版本,如果有,那么就将工作负载的镜像更新为最新版本,并将镜像版本号写入同步到存放 Helm Chart 的仓库中。

安装和配置 ArgoCD Image Updater

注: 前提需要安装好ArgoCD ~~~
~# kubectl apply -n argocd -f https://ghproxy.com/https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/stable/manifests/install.yaml

创建 Image Pull Secret(可选)

由于 ArgoCD 会主动 Poll 镜像仓库来检查是否存在新版本,如果你使用的是私有镜像仓库,那么你需要创建 Secret 对象,以便为 ArgoCD 提供访问镜像仓库的权限。
以 DockerHub 仓库为例,执行下面的命令来创建 Secret 对象:

$ kubectl create -n argocd secret docker-registry dockerhub-secret \
  --docker-username $DOCKER_USERNAME \
  --docker-password $DOCKER_PERSONAL_TOKEN \
  --docker-server "https://registry-1.docker.io"

secret/dockerhub-secret created

创建 Helm Chart 仓库

 $ cp -r ./kubernetes-example/helm ./kubernetes-example-helm
 $ cd kubernetes-example-helm && git init
PS:前往 GitHub 创建一个新的仓库,将其命名为 kubernetes-example-helm
$ git add .
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin https://github.com/Hugh-yw/kubernetes-example-helm.git
$ git push -u origin main

创建 ArgoCD Application

删除旧应用(可选)

清理之前实践的应用!!!
$ argocd app delete example --cascade

配置仓库访问权限

创建 ArgoCD 应用时,必须要配置仓库访问权限,但这里额外还实现了一个重要的功能:为 ArgoCD Image Updater 提供回写kubernetes-example-helm仓库的权限。

$ argocd repo add https://github.com/Hugh-yw/kubernetes-example-helm.git --username $USERNAME --password $PASSWORD

~# argocd repo list
TYPE  NAME  REPO                                                    INSECURE  OCI    LFS    CREDS  STATUS      MESSAGE  PROJECT
git         https://github.com/Hugh-yw/kubernetes-example-helm.git  false     false  false  true   Successful           
git         https://github.com/Hugh-yw/kubernetes-example.git       false     false  false  true   Successful       

创建 ArgoCD 应用

通过YAML创建:

# cat application.yaml 
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example
  annotations:
    argocd-image-updater.argoproj.io/backend.allow-tags: regexp:^main
    argocd-image-updater.argoproj.io/backend.helm.image-name: backend.image
    argocd-image-updater.argoproj.io/backend.helm.image-tag: backend.tag
    argocd-image-updater.argoproj.io/backend.pull-secret: pullsecret:argocd/dockerhub-secret
    argocd-image-updater.argoproj.io/frontend.allow-tags: regexp:^main
    argocd-image-updater.argoproj.io/frontend.helm.image-name: frontend.image
    argocd-image-updater.argoproj.io/frontend.helm.image-tag: frontend.tag
    argocd-image-updater.argoproj.io/frontend.pull-secret: pullsecret:argocd/dockerhub-secret
    argocd-image-updater.argoproj.io/image-list: frontend=cyw/frontend, backend=cyw/backend
    argocd-image-updater.argoproj.io/update-strategy: latest
    argocd-image-updater.argoproj.io/write-back-method: git
spec:
  destination:
    namespace: gitops-example-updater
    server: https://kubernetes.default.svc
  project: default
  source:
    path: .
    repoURL: https://github.com/Hugh-yw/kubernetes-example-helm.git
    targetRevision: main
  syncPolicy:
    automated: {}
    syncOptions:
      - CreateNamespace=true

$ kubectl create -f application.yaml  -n argocd 
PS:效果等同于使用 argocd app create 命令

ArgoCD Image Updater 通过 Application Annotations 标签来实现对应的功能,简单介绍下每一个标签的作用:

  • argocd-image-updater.argoproj.io/image-list:指定需要监听的镜像,这里我们指定示例应用的前后端镜像 cyw/frontend 和 cyw/backend,同时为前后端镜像法指定了别名,分别为 frontend 和 backend。这里的别名非常重要,会影响下面所有的设置。
  • argocd-image-updater.argoproj.io/update-strategy:指定镜像更新策略。注意, latest 并不代表监听 latest 镜像版本,而是以最新推送的镜像作为更新策略。此外,semver 策略可以识别最高语义化版本的标签,digest 策略可以用来区分同一 Tag 下不同镜像 digest 的变更。
  • argocd-image-updater.argoproj.io/write-back-method:表示将镜像版本回写到镜像仓库。注意,这里对仓库的写权限来源于使用 argocd repo add 命令为 ArgoCD 配置的仓库访问权限。
  • argocd-image-updater.argoproj.io/<镜像别名>.pull-secret:为不同的镜像别名指定镜像拉取凭据。
  • argocd-image-updater.argoproj.io/<镜像别名>.allow-tags:配置符合更新条件的镜像 Tag,在这里我们使用正则表达式匹配那些镜像 Tag 以 main 开头的镜像版本,其他镜像版本则忽略。
  • argocd-image-updater.argoproj.io/<镜像别名>.helm.image-name:配置 Helm Chart values.yaml 镜像名称所在的节点,在示例应用中,backend.image 和 frontend.image 是values.yaml 配置镜像名称的节点,ArgoCD 在回写仓库时会覆盖这个值。
  • argocd-image-updater.argoproj.io/<镜像别名>.helm.image-tag:配置 Helm Chart values.yaml 镜像版本所在的节点,在示例应用中,backend.tag 和 frontend.tag 是 values.yaml 配置镜像版本的节点,ArgoCD 在回写仓库时将会覆盖这个值。

体验 GitOps 工作流

作为开发同学,尝试修改 frontend/src/App.js 源代码文件,例如修改文件第 49 行的“Hi! I am a geekbang”内容。修改完成后, 将代码推送到 GitHub 的 main 分支 merge。
此时会触发两个 GitHub Action 工作流。其中,当 build-every-branch 工作流被触发时,它将构建 Tag 为 main 开头的镜像版本,并将其推送到镜像仓库中,如下图所示:
在这里插入图片描述
跟另一个 GitHub Action 工作流不同的是:
它也不会去主动修改 kubernetes-example-helm 仓库的 values.yaml 文件,在完成镜像推送后工作流也就结束了。
与此同时,ArgoCD Image Updater 将会每 2 分钟从镜像仓库检索 frontend 和 backend 的镜像版本,一旦发现有新的并且以 main 开头的镜像版本,它将自动使用新版本来更新集群内工作负载的镜像,并将镜像版本回写到 kubernetes-example-helm 仓库。
在回写时,ArgoCD Image Updater 并不会直接修改仓库的 values.yaml 文件,而是会创建一个专门用于覆盖 Helm Chart values.yaml 的.argocd-source-example.yaml文件。
在这里插入图片描述
当我们看到这个文件时,说明 ArgoCD Image Updater 已经触发了镜像更新,并且成功将镜像版本回写到了镜像仓库。同时,这个文件记录了详细的覆盖 values.yaml 值的策略。
这样,当 ArgoCD 在做自动同步时,会将这份文件的内容覆盖 values.yaml 对应的值,比如 frontend.tag 的值会被覆盖为 main-e1f492f,这样,回写后的 Helm Chart 和集群内资源对象就仍然能够保持一致性。

至此,我们就完成了通过监听新镜像版本来触发 GitOps 工作流的整个过程。

总结

此次实践,我们将应用源码和应用定义(Helm Chart)拆分成了两个仓库,在开发和发布角色相对独立的研发流程下,这种方式既能够保持他们之间职责独立,权责清晰,同时还保留了开发随时发布生产环境的能力,但是希望集成审批流程,有足够权限的人审批通过后再进行发布!

值得注意的是:在实际的业务场景中,研发同学一般会使用多分支的模式来开发。这意味着每个分支的每个提交都会产生新的镜像版本,所以,为了区分开发过程的镜像和需要被发布到生产环境的镜像,在此次实践中约定了以main开头的镜像版本即为需要发布到生产环境的镜像版本。你可以根据项目的实际情况做调整,例如使用v1.0.0的版本号来区分,同时更新argocd-image-updater.argoproj.io/<镜像别名>.allow-tags字段的正则表达式。

总体来说,在这种仓库分离的场景下,要将开发者的提交和发布过程自动化地连接起来,双方需要重点关注生产环境的镜像版本策略,并将它配置到 ArgoCD 应用的 Annotations 注解内,这样便能够让 ArgoCD Image Updater 代替人工来自动监控需要发布到生产环境的image。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/806135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FastDeploy的方式在OK3588上部署yolov7-- C++

FastDeploy介绍 ⚡️FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具&#xff0c; 支持云边端部署。提供超过 &#x1f525;160 Text&#xff0c;Vision&#xff0c; Speech和跨模态模型&#x1f4e6;开箱即用的部署体验&#xff0c;并实现&#x1f51a;端到端的…

附录1-将uni-app运行到微信开发者工具

目录 1 在manifest.json写入AppID 2 配置微信开发者工具的安装路径 3 微信开发者工具的安全设置 4 运行 5 修改一些配置项 1 在manifest.json写入AppID 2 配置微信开发者工具的安装路径 如果你忘了安装在哪里了&#xff0c;可以右键快捷方式看一下属性 在运行设置…

邻接矩阵与邻接表

文章目录 0 前面几种数据结构的回顾1 图1.1 图的定义1.2 常见术语1.3 图的抽象数据类型定义1.4 表示一个图1.4.1 邻接矩阵表示法1.4.2 邻接表 1.5 图的构建1.5.1 邻接矩阵法1.5.2 邻接表法 0 前面几种数据结构的回顾 1 图 1.1 图的定义 图&#xff1a; G (V,E) // Graph (V…

Moke 一百万条 Mysql 的数据

文章目录 前言创建数据库创建表结构生成数据 前言 想研究一下&#xff0c;数据量大的情况下&#xff0c;如何优化前端分页&#xff0c;所以需要 Moke 一些数据 创建数据库 在 Mysql的基础上&#xff0c;可以写个语句执行 CREATE DATABASE test_oneMillion; USE test_oneMi…

Jmeter —— 录制脚本

1. 第一步&#xff1a;添加http代理服务器&#xff0c;在测试计划--》添加--》非测试元件--》http代理服务器 2. 第二步&#xff1a;添加线程组&#xff08;这个线程组是用来放录制的脚本&#xff0c;不添加也可以&#xff0c;就直接放在代理服务器下&#xff09; 测试计划--》…

【Linux】sed修改文件指定内容

sed修改文件指定内容&#xff1a; 参考&#xff1a;(5条消息) Linux系列讲解 —— 【cat echo sed】操作读写文件内容_shell命令修改文件内容_星际工程师的博客-CSDN博客

如何连接远程服务器?快解析内内网穿透可以吗?

如今我们迎来了数字化转型的时代&#xff0c;众多企业来为了更好地推动业务的发展&#xff0c;常常需要在公司内部搭建一个远程服务器。然而&#xff0c;对于企业员工来说&#xff0c;在工作过程中经常需要与这个服务器进行互动&#xff0c;而服务器位于公司的局域网中&#xf…

活动目录(Active Directory) 管理工具

每个IT管理员几乎每天都在Active Directory管理中面临许多挑战&#xff0c;尤其是在管理Active Directory用户帐户方面。手动配置用户属性非常耗时、令人厌烦且容易出错&#xff0c;尤其是在大型、复杂的 Windows 网络中。Active Directory管理员和IT经理大多必须执行重复和世俗…

20.3 HTML 表格

1. table表格 table标签是HTML中用来创建表格的元素. table标签通常包含以下子标签: - th标签: 表示表格的表头单元格(table header), 用于描述列的标题. - tr标签: 表示表格的行(table row). - td标签: 表示表格的单元格(table data), 通常位于tr标签内, 用于放置单元格中的…

进阶高级测试专项,Pytest自动化测试框架总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、pyets种有四种…

【2023.7.29】浅谈手办——新人入坑指南

目录 前言入坑指南1.声明2.介绍3.树状图 总结参考文章 前言 出于对动漫的热爱&#xff0c;相信很多人都会买手办&#xff0c;本人在大一时开始入手了第一个手办&#xff0c;超大猿王路飞&#xff08;高约50cm&#xff09;&#xff0c;当时对手办还不是很了解&#xff0c;只知道…

mapboxGL中楼层与室内地图的结合展示

概述 质量不够&#xff0c;数量来凑&#xff0c;没错&#xff0c;本文就是来凑数的。前面的几篇文章实现了楼栋与楼层单体化的展示、室内地图的展示&#xff0c;本文结合前面的几篇文章&#xff0c;做一个综合的展示效果。 实现效果 实现 1. 数据处理 要实现上图所示的效果…

Java-数组的定义和使用

一、数组的基本概念 1.1 为什么要使用数组 假设现在要存5个学生的javaSE考试成绩&#xff0c;并对其进行输出&#xff0c;则可有 public static void main(String[] args){ int score1 70; int score2 80; int score3 85; int score4 60; …

学C的第三十一天(上)【通讯录的实现】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第三十天【自定义类型&#xff1a;结构体、枚举、联合】_高高的胖子的博客-CSDN博客 通讯录需求&#xff1a; 实现一个通讯录&#xff0c; 通讯录中存放保存人的信息&#xff1…

C# PaddleInference.PP-HumanSeg 人像分割 替换背景色

效果 项目 VS2022.net4.8OpenCvSharp4Sdcb.PaddleInference 包含4个分割模型 modnet-hrnet_w18 modnet-mobilenetv2 ppmatting-hrnet_w18-human_512 ppmattingv2-stdc1-human_512 部分代码 using OpenCvSharp; using Sdcb.PaddleInference; using System; using System.…

aop实现方式及基本使用

aop实现方式 aspectj 编译器增强&#xff0c;直接修改源码可以不借助Spring实现 也没有用代理对象 &#xff08;ajc编译器&#xff09; aop 的原理并非代理一种, 编译器也能玩出花样&#xff08;直接修改源码&#xff09; 运行时需要在 VM options 里加入 -javaagent:D:/envir…

阿里云服务器CPU大全_处理器主频性能说明

阿里云服务器CPU型号是什么&#xff1f;处理器主频多少&#xff1f;云服务器ECS和轻量应用服务器CPU处理器性能如何&#xff1f;阿里云服务器网分享阿里云服务器CPU型号大全、处理器主频性能型号汇总&#xff1a; 目录 阿里云服务器CPU处理器大全 通用型云服务器CPU 计算型…

【动态规划刷题 2】使⽤最⼩花费爬楼梯 解码⽅法

使⽤最⼩花费爬楼梯 746 . 使用最小花费爬楼梯 链接: 746 . 使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 …

《向量数据库指南》:向量数据库Pinecone如何集成hugging-face-endpoints

目录 端点 创建嵌入 Vector DB 创建和索引嵌入向量 拥抱面推理端点允许访问简单的模型推理。结合Pinecone,我们可以轻松生成和索引高质量的向量嵌入。 让我们通过初始化生成向量嵌入的推理端点来开始吧。 端点 我们首先前往拥抱面推理端点主页,如果需要,注册一个账…

某厂生产三种产品 I, II, III。 每种产品要经过 A、 B两道工序加工。 设该厂有两种规格的设备能完成 A 工序, 它们以A1、 A2表示; 有三种规格的设备能完成 B 工序, 它们以B1、

数学建模算法与应用习题1-3 通俗解析 一.题干二.解答2.1 先读懂题干2.2 解体思路 一.题干 某厂生产三种产品 I&#xff0c; II&#xff0c; III。 每种产品要经过 A、 B两道工序加工。 设该厂有两种规格的设备能完成 A 工序&#xff0c; 它们以A1、 A2表示&#xff1b; 有三种…