【GitOps系列】使用 ArgoCD ApplicationSet 来实现多环境管理

news2024/9/27 5:56:29

文章目录

      • 前言
      • 自动多环境管理概述
      • 自动化管理多环境实战
        • 示例应用简介
        • ApplicationSet 简介
        • 部署 ApplicationSet
        • 访问多环境
      • 创建新环境实验
      • 结语

前言

聊起多环境,通常可能会立即想到下面几个常见的环境:

  • 开发环境
  • 测试环境
  • 预发布环境
  • 生产环境

为了让不同职责的人员在不同的环境下独立工作,我们一般会将不同环境隔离。通常,开发环境主要用于开发人员的日常开发,测试环境则是为测试团队而准备的,预发布是正式发布到生产环境之前的最后一道防线,除了数据以外,应该尽量和生产环境保持一致。
当然,对有些团队来说,他们可能还希望开发人员之间相互隔离,也就是为每一个开发者分配一个独立的开发环境,使他们互不干扰。
在非云原生技术架构体系下,环境一般是由特定的团队人工维护的。所以,要想得到一个新的环境,由于文档和技术方面的原因,过程并不简单。但是,在云原生的业务架构体系下,应用是通过标准的 Kubernetes 对象被“定义”出来的。所以,在这种情况下,得到一个新的环境就变得非常容易了。本次学习如何使用ArgoCD ApplicationSet来实现 GitOps 自动多环境管理,并通过ArgoCD Generator来达到“代码即环境”的效果。

自动多环境管理概述

使用 ArgoCD ApplicationSet 来实现自动多环境管理的整体架构
在这里插入图片描述
在这张架构图中,首先会创建一个 ApplicationSet 对象,它是一个 Application 集合。它可以生成 Application CRD 资源,进而自动创建多个 ArgoCD 应用。不同应用实际上就对应了不同的环境。
ApplicationSet 怎么知道要创建几个 Application 对象呢?这就需要用到 ApplicationSet Generators 了。
ApplicationSet Generators 是一个可以自动生成 Application 对象的生成器,它可以通过遍历 Git 仓库中的目录来决定生成几个 Application 对象,如下架构图:
在这里插入图片描述
假设我们现在有一个 Helm 应用的 Git 仓库,env 目录下存放了不同环境的values.yaml配置文件,那么,ApplicationSet Generators 就可以遍历这些目录,并且自动创建不同环境的 Application 对象,这样就实现了目录和环境的映射关系。也就是说,当我们需要创建一个新的环境时, 只需要创建一个目录以及配置文件 values.yaml 就可以了!
这样,不管是为同一个应用创建不同的环境,还是为不同的开发者创建隔离的开发环境,都可以把创建环境等同于创建目录,实现了 “代码即环境”。

自动化管理多环境实战

示例仓库代码:https://github.com/Hugh-yw/kubernetes-example/tree/main/helm-env

示例应用简介

将示例应用克隆到本地之后,进入 helm-env 目录,目录结构如下:

.
├── Chart.yaml
├── applicationset.yaml
├── env
│   ├── dev
│   │   └── values.yaml
│   ├── prod
│   │   └── values.yaml
│   └── test
│       └── values.yaml
└── templates
    ├── frontend.yaml
    └── ingress.yaml

从它的目录结构可以看出,它由 Chart.yaml、applicationset.yaml、env 目录和 templates 目录组成,熟悉 Helm 的同学应该一眼就能看出,其实它是一个 Helm Chart。不同的是,Helm 的配置文件 values.yaml 并没有放在 Chart 的根目录,而是放在了 env 目录下。

templates 目录存放着示例应用的 Kubernetes 对象,为了简化演示过程,本次只部署前端相关的对象,也就是 frontend.yaml。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: frontend
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: {{ .Release.Namespace }}.env.my
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend-service
                port:
                  number: 3000

需要注意的是:我在 Ingress 对象中使用了 Helm 的内置变量,也就是 Release.Namespace,它实际上指的是 Helm Chart 部署的命名空间,我把它和域名做了拼接。不同的环境将会被部署到独立的命名空间下,这样也就使不同的环境具备了独立的访问域名,如下图所示:
在这里插入图片描述

ApplicationSet 简介

它可以自动生成多个 Application 对象,不同的 Application 对象实际上对应了不同的环境。
示例应用目录下有一个名为 applicationset.yaml 的文件,它定义了 ApplicationSet 的内容。

cat applicationset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: frontend
  namespace: argocd
spec:
  generators:
  - git:
      repoURL: "https://github.com/Hugh-yw/kubernetes-example.git"
      revision: HEAD
      files:
      - path: "helm-env/env/*/values.yaml"
  template:
    metadata:
      name: "{{path.basename}}"
    spec:
      project: default
      source:
        repoURL: "https://github.com/Hugh-yw/kubernetes-example.git"
        targetRevision: HEAD
        path: "helm-env"
        helm:
          valueFiles:
          - "env/{{path.basename}}/values.yaml"
      destination:
        server: 'https://kubernetes.default.svc'
        namespace: '{{path.basename}}'
      syncPolicy:
        automated: {}
        syncOptions:
          - CreateNamespace=true

这里我们分成两部分:
第一部分是 spec.generators,第二部分是 spec.template。
Generators 指的是生成器。这里,我们使用 Git 生成器,并指定了 Helm Chart 仓库地址。请注意, 你需要将这个地址替换为自己的仓库地址,如果仓库为私有权限,那么还需要在 ArgoCD 控制台配置仓库的凭据信息
revision 的值的 HEAD,指的是远端最新修改的版本。files 字段是配置的重点,它通过通配符“*”号来匹配 env 目录下的 values.yaml 文件,并为 template 字段下的 path 变量提供值。
template 字段:template 实际上就是在为 Application 配置模板,结合生成器,它能够动态生成 Application 对象。例如,metadata.name 字段配置了每一个 Application 的名称,在这个例子中,path.basename 变量对应三个值,分别是 env 下子目录的名称,也就是 dev、test 和 prod。
source.repoURL 字段表示 Helm Chart 的来源仓库, 替换为你的仓库地址。
此外,在 helm.valueFiles 里同样也用到了这个变量,在这里,我们为不同的环境指定了不同的 values.yaml,这样就实现了环境隔离。
最后,destination.namespace 字段也使用了变量,它配置了部署应用的命名空间。
最终,在这个例子中,ApplicationSet 会根据目录结构生成 三个 Application 对象,而 Application 对象又会在不同的命名空间下部署示例应用,它们分别对应 dev、test 和 prod 环境。

部署 ApplicationSet

kubectl apply -f applicationset.yaml 
applicationset.argoproj.io/frontend created

打开 ArgoCD 控制台,可以看到 ApplicationSet 创建了三个应用,名称分别为 dev、test 和 prod,并且它们分别被部署在了不同的命名空间下

访问多环境

dev.env.my test.env.my prod.env.my 域名提前配置好解析

到这里,我们就成功使用 ApplicationSet 创建了多个隔离环境。当我们需要对不同的环境进行更新时,只需要更新 env 目录下对应环境的 values.yaml 文件,就可以触发 ArgoCD 自动同步了,不同环境之间互不影响。
此外,当我们需要创建新的环境时,只需要在 env 目录下增加一个目录和 values.yaml 文件就可以了,ArgoCD 会根据配置自动创建新的环境。

创建新环境实验

首先,在 env 目录下创建 staging 目录,表示预发布环境

cd helm-env/env
mkdir staging

$ cp dev/values.yaml staging
$ git add .
$ git commit -m 'add stagign'
$ git push origin main

稍等几分钟,ArgoCD 将自动同步,并为我们创建新的 staging 环境,如下图所示:
在这里插入图片描述

结语

本次主要学习了如何通过 ApplicationSet 来创建和管理多环境。在实际的业务场景中,我们通常会有多环境的业务需求,相比较传统的创建环境的方式,使用 ApplicationSet 大大简化了拉起一个新环境的过程。

“代码即环境”听起来虽然比较抽象,但实现起来并没有这么困难。借助应用定义,结合 Git 仓库,我们很容易就可以实现多环境管理。需要注意的是,在众多 GitOps 多环境管理的方案中,你可能还会看到另一种方案: 通过分支来管理多环境。

简单对比一下这两种方式。采用多分支来管理 GitOps 中的多环境并不能够很好地同时解决可维护性和唯一可信源的问题。首先,分支管理模型会使我们面临差异和合并的问题,这对长期维护来说成本较高,并且在更新环境时,需要切换到不同的分支去操作,这更容易导致人为的错误。其次,分支的管理方式没有目录管理方式来得直观。
所以, 在实际的项目中,我推荐你按照这节课的讲解以目录的方式来管理不同的环境。

多环境除了可以用来区分开发环境、测试环境和生产环境之外,还可以很方便地为每一位开发者提供独立的开发环境。
此次演示中,由于所有环境都共用 Helm Chart 的 Template 目录,所以对于应用而言,我们只需要维护 Template 目录就可以间接管理所有的环境了。而对于不同的环境,我们可以使用环境目录下的 values.yaml 文件进行差异化的配置。这样就同时兼顾了可维护性和环境的差异化配置。

参考资料:
https://time.geekbang.org/column/intro/100312001

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

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

相关文章

TikTok运营五个要点,这些你都知道吗?

TikTok也就是海外版抖音,和抖音一样同属于字节跳动,其整个发展模式也类似于抖音,但相比抖音现在成熟的商业模式而言,TikTok还处于明显的娱乐阶段,虽然它也在缓慢的测试一些电商。 即使如此,由于抖音的巨大…

group normalization

1、 Theory look for this link for more information, actually only this image can illustrate the group normalization.you can ignore the rest of this artical. 2、 Code check this link for detailed about the formulation and the theory of the group normalzi…

基于 yolov8 的人体姿态评估

写在前面 工作中遇到,简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停…

软考A计划-系统集成项目管理工程师-信息系统安全管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

从excel中提取嵌入式图片的解决方法

1 发现问题 我的excel中有浮动图片和嵌入式图片,但是openpyxl的_image对象只提取到了浮动图片,通过阅读其源码发现,这是因为openpyxl只解析了drawing文件导致的,所以确定需要自己解析 2 解决思路 1、解析出media资源 2、解析…

阿里云“通义千问”开源,可免费商用

我是卢松松,点点上面的头像,欢迎关注我哦! 阿里云成为国内首个加入大模型开源行列的大型科技企业。就在昨天,阿里云公开表态,把自家的通义千问大模型开源。 阿里云把通用70亿参数模型,包括Qwen-7B和对话模…

python 变量赋值 修改之后 原值改变

ython 是一种动态语言,因此变量的类型和值 在运行时均可改变。当我们将一个变量赋值给另一个变量时,实际上是将变量的引用地址传递给新的变量,这意 味着新旧变量将指向同一个位置。因此,在更改其中一个变量的值时,另一…

第二十二篇:思路拓展:如何打造高性能的 React 应用?

React 应用也是前端应用,如果之前你知道一些前端项目普适的性能优化手段,比如资源加载过程中的优化、减少重绘与回流、服务端渲染、启用 CDN 等,那么这些手段对于 React 来说也是同样奏效的。 不过对于 React 项目来说,它有一个区…

linux 系统初始化基本yum命令

安装可能用到的系统工具 yum -y install vim telnet wget net-tools lrzsz unzip zip 安装常用工具和开发包 yum install -y which openssh-clients openssh-server less iproute bzip2 cmake gcc gcc-c gdb git libtool make man net-tools sysstat sudo psmisc nc net-t…

kvm+qemu+libvirt管理虚机

virt-manager 图形化创建虚拟机 #virt-manager纳管远程kvm虚拟机 # 可以指定kvm虚机的ssh端口和virt-manager所在主机的私钥 virt-manager -c qemussh://root10.197.115.17:5555/system?keyfileid_rsa --no-fork # 如果你生成的ssh-key 的名称是 test-key,在/home/ssh-key/ 目…

面向城乡公交的嵌入式系统远程升级设计方案

针对城乡公交站牌显示终端现场升级与维护困难的问题,提出了一种基于应用程序(IAP)技术的嵌入式系统远程升级设计方案。 通过IAP技术配合改良过的远程升级程序代替传统的现场烧写调试,节约了奔赴现场调试的时间和成本。 针对远程…

Django使用uwsgi+nginx部署,admin没有样式解决办法

Django使用uwsginginx部署,admin没有样式解决办法 如果使用了虚拟环境则修改nginx.conf文件中的/static/路径为你虚拟环境的路径,没有使用虚拟环境则改为你python安装路径下的static server {listen 8008;server_name location; #改为自己的域名,没域名…

嵌入式开发学习(STC51-8-IO扩展-串转并)

内容 通过74HC595模块控制LED点阵,以一行循环滚动显示 74HC595简介 51单片机IO口非常有限,如果想要连接更多外围设备,可以通过IO扩展来实现;其中一种IO口扩展方式-串转并,使用的芯片是74HC595; 1个74HC…

LiveGBS流媒体平台GB/T28181常见问题-无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查

LiveGBS无法注册不上海康NVR摄像机自带物联网卡摄像头注册GB/T28181国标平台看不到设备的时候如何抓包及排查 1、设备注册后查看不到1.1、是否是自带物联网卡的摄像头1.2、关闭萤石云1.3、防火墙排查1.4、端口排查1.5、IP地址排查1.6、设备TCP/IP配置排查1.7、设备多网卡排查1.…

HTML5注册页面

分析 注册界面实际上是一个表格&#xff08;对齐&#xff09;&#xff0c;一行有两个单元格。 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevic…

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒&#xff0c;左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…

【单片机】51单片机,TLC2543,驱动程序,读取adc

TLC2543 是一款 12 位精密模数转换器 (ADC)。 1~9、11、12——AIN0&#xff5e;AIN10为模拟输入端&#xff1b; 15——CS 为片选端&#xff1b; 17——DIN 为串行数据输入端&#xff1b;&#xff08;控制字输入端&#xff0c;用于选择转换及输出数据格式&#xff09; 16——…

完全背包问题

题目链接 题意&#xff1a;在01背包的基础上多了每个物品都可以无限取的条件 思路&#xff1a;首先考虑在01背包的基础上的暴力枚举&#xff0c;我们可以在枚举前i件物品最多拿j的容量时再遍历当前物品拿的数量 贴一个暴力tle代码&#xff1a; #include<bits/stdc.h> #d…

线程间的同步、如何解决线程冲突与死锁

一、线程同步概念&#xff1a; 线程同步是指在多线程编程中&#xff0c;为了保证多个线程之间的数据访问和操作的有序性以及正确性&#xff0c;需要采取一些机制来协调它们的执行。在多线程环境下&#xff0c;由于线程之间是并发执行的&#xff0c;可能会出现竞争条件&#xf…

VUE框架:vue2转vue3全面细节总结(2)导航守卫

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…