23 张图细讲使用 Devtron 简化 K8S 中应用开发

news2025/7/12 13:33:21

23 张图细讲使用 Devtron 简化 K8S 中应用开发

在本文中,您将学习如何在多集群环境中使用 Devtron 在 K8S 上进行应用开发。

https://devtron.ai/

Devtron 附带用于构建、部署和管理微服务的工具。它通过提供直观的 UI 和 Helm 图表支持来简化 K8S 上的部署。今天,我们将使用自定义 Helm 图表运行一个示例 Spring Boot 应用程序。将它部署在跨多个 K8S 集群的不同命名空间中。示例应用程序连接到数据库,该数据库在 K8S 上运行并已使用 Devtron Helm 图表部署。

在 K8S 上安装 Devtron

第一步,在 K8S 上安装 Devtron。有两种安装选项:带 CI/CD 模块或不带它。本文不会构建 CI/CD 流程,但是这个模块中包含了一些重要功能。首先,添加 Devtron Helm 存储库:

$ helm repo add devtron https://helm.devtron.ai

然后,执行以下 Helm 命令:

$ helm install devtron devtron/devtron-operator \
    --create-namespace --namespace devtroncd \
    --set installer.modules={cicd}

有关详细的安装说明,请参阅 Devtron 文档。

https://docs.devtron.ai/getting-started/install/install-devtron-with-cicd

使用 Kind 创建第二个 K8S 集群

为了在本地机器上准备多集群环境,我们将使用 Kind, 通过执行以下命令来创建第二个 K8S 集群 c1 :

https://kind.sigs.k8s.io/

$ kind create cluster --name c1

第二个集群的上下文是:kind-c1。创建 Kind 集群后,它将成为默认上下文。

alt

现在,我们的目标是将新创建的 Kind 集群添加为 Devtron 的托管集群。一个 Devtron 实例可以管理多个 K8S 集群。当然,默认情况下,它只管理一个本地集群。在我们将 Kind 集群添加到 Devtron 仪表板之前,应该首先在该集群上配置权限。以下脚本将生成一个bearer token用于身份验证,以便 Devtron 能够与目标集群通信:

$ curl -O https://raw.githubusercontent.com/devtron-labs/utilities/main/kubeconfig-exporter/kubernetes_export_sa.sh && bash kubernetes_export_sa.sh cd-user devtroncd https://raw.githubusercontent.com/devtron-labs/utilities/main/kubeconfig-exporter/clusterrole.yaml

bearer token打印在该命令的输出中,复制它。

alt

我们还必须提供目标集群的 master API 的 URL。由于在 Kind 上运行 K8S,我需要获取包含 Kind 的 Docker 容器的内部地址。为了获得它,我们需要运行以下命令:

$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' c1-control-plane

这是我的 Kind 集群的 IP 地址:

alt

现在,我们拥有了在 Devtron 仪表板中添加新托管集群所需的所有数据。为此,导航到Global Configuration部分。然后选择Clusters and Environments项并单击Add cluster按钮。需要填写 Kind 集群 URL 和之前生成的bearer token

alt

如果一切正常,您应该会在托管集群列表中看到第二个集群。现在,您还需要根据下面显示的消息在 Kind 上安装 Devtron 代理:

alt

创建环境

我们将定义三个环境。在 Devtron 环境中分配给集群。我们将在本地集群(local)上创建一个环境,和另外两个 Kind 集群 ( remote-dev, remote-devqa) 。每个环境都有一个目标命名空间。为了简化,命名空间的名称与环境名称相同。当然,您可以设置任何想要的名称。

alt

现在,切换到Clusters视图。

alt

如您所见,现在有两个集群连接到 Devtron:

alt

我们可以看一下每个集群的详细信息。在这里,您可以看到kind-c1集群的详细视图:

alt

添加自定义 Helm 存储库

Devtron 最重要的功能之一是对 Helm 图表的支持。默认情况下,Devtron 中有几个可用的 Helm 存储库,包括bitnamielastic,也可以添加自定义存储库。这里使用我自己的 Helm 存储库,其中包含用于部署 Spring Boot 应用程序的图表。我已经将它放在 GitHub 上:

https://piomin.github.io/helm-charts/

我们的图表名称是spring-boot-api-app,最新版本是0.3.2

alt

为了在 Devtron 中添加自定义存储库,我们需要再次进入Global Configurations部分。然后转到Chart repositories菜单项,然后单击Add repository按钮。如下所示,我添加了一个新存储库piomin

alt

创建存储库后,您可以转到Chart Store部分以验证新图表是否可用。

alt

使用 Devtron 部署 Spring Boot 应用程序

现在,我们可以进行实践中最重要的部分:应用程序部署。我们的示例 Spring Boot 应用程序位于 GitHub 上的以下存储库中:

https://github.com/piomin/sample-spring-kotlin-microservice.git

这是一个用 Kotlin 编写的简单 REST 应用程序。它公开了一些用于添加和返回人员的 HTTP 端点,并使用内存存储。这是 Spring @RestController

@RestController
@RequestMapping("/persons")
class PersonController(val repository: PersonRepository) {

   val log: Logger = LoggerFactory.getLogger(PersonController::class.java)

   @GetMapping("/{id}")
   fun findById(@PathVariable id: Int): Person? {
      log.info("findById({})", id)
      return repository.findById(id)
   }

   @GetMapping("/age/{age}")
   fun findByAge(@PathVariable age: Int): List<Person> {
      log.info("findByAge({})", age)
      return repository.findByAge(age)
   }

   @GetMapping
   fun findAll(): List<Person> = repository.findAll()

   @PostMapping
   fun add(@RequestBody person: Person): Person = repository.save(person)

   @PutMapping
   fun update(@RequestBody person: Person): Person = repository.update(person)

   @DeleteMapping("/{id}")
   fun remove(@PathVariable id: Int)Boolean = repository.removeById(id)

}

假设我们正在开发最新版本,想将其部署在 K8S 上以执行一些开发测试。第一步,将在本地构建应用程序并使用 Jib Maven 插件将镜像推送到容器注册表。这是所需的配置:

<plugin>
  <groupId>com.google.cloud.tools</groupId>
  <artifactId>jib-maven-plugin</artifactId>
  <version>3.3.0</version>
  <configuration>
    <to>
      <image>piomin/sample-spring-kotlin-microservice</image>
      <tags>
        <tag>1.1</tag>
      </tags>
    </to>
    <container>
      <user>999</user>
    </container>
  </configuration>
</plugin>

让我们使用以下命令构建镜像并将其推送到容器注册表:

$ mvn clean compile jib:build -Pjib,tomcat

除了 YAML 模板,Helm 存储库还包含一个用于values.yaml 验证的 JSON schema 。多亏了该 schema ,我们将能够利用 Devtron GUI 从图表创建应用程序。让我们看看它是如何工作的。

单击自定义图表后,将被重定向到包含详细信息的页面。最新版本的图表是0.3.2. 只需单击部署按钮。

在下一页上,需要提供应用程序的配置。目标环境是存在于主集群上的local。多亏 Devtron 对 Helm values.schema.json 的支持,使得我们使用 GUI 表单定义所有值。例如,可以增加更改镜像的值到最新的:1.1

alt

部署应用程序后,我们可以验证其状态:

alt

让我们进行一些测试调用。示例 Spring Boot 公开了 Swagger UI,因此我们可以轻松发送 HTTP 请求。要与运行在 K8S 上的应用程序交互,应该为服务启用端口转发kubectl port-forward svc/sample-spring-boot-api 8080:8080。执行该命令后,您可以通过 http://localhost:8080/swagger-ui.html 访问地址 Swagger UI:

alt

Devtron 允许我们查看 pod 日志。还可以用 grep。下面展示了与测试调用相关的日志。

alt

将应用部署到远程集群

现在,我们将示例 Spring Boot 应用程序部署到远程集群。为了做到这一点,请转到与以前相同的页面,但不要选择本地环境,而是选择remote-dev,它与kind-c1集群相关联。

alt

现在,有两个相同的应用程序在两个不同的集群上运行。我们可以对在 Kind 集群上运行的应用程序和本地集群执行相同的操作,例如验证其状态或检查日志。

alt

部署应用组

假设我们要部署连接到数据库的应用程序。我们可以使用名为Chart Group的 Devtron 功能一步完成。使用该功能,我们可以将 Spring Boot 的 Helm 图表和 Postgres 的图表放在同一个逻辑组中。然后,我们可以将整个组部署到目标环境中。要创建图表组,请转到 Chart Store 菜单,然后单击Create Group按钮。您应该设置组的名称并选择将包含的图表。对我来说,就是bitnami/postgresql图表和我的自定义 Helm 图表。

alt

创建组后,您将在Chart Store主页面上看到它。现在,只需单击它即可部署应用程序。

alt

单击带有图表组的磁贴后,您将被预测到部署页面。

alt

单击Deploy to…按钮后,Devtron 会将您重定向到下一页。您可以为该组的所有成员图表设置目标项目和环境。我们会将它们从集群部署到kind-c1集群的remote-devqa命名空间中。其中的镜像,可以填写我的 Docker 帐户中的:piomin/person:1.1

默认情况下,它会尝试连接到postgres主机上的数据库。唯一需要注入应用容器的是 postgresql Secret(由 Bitnami Helm 图表生成)中postgres用户密码。要注入该Secret中的环境变量,请在自定义 Spring Boot 图表中使用extraEnvVarsSecret参数。最后,让我们通过单击Deploy按钮在remove-devqa命名空间中部署 Spring Boot 和 Postgres 。

alt

这是本次实践中已部署应用程序的最终列表:

alt

总结

  • 借助 Devtron,可以使用 Helm 图表轻松地支持跨多个 K8S 集群部署应用程序。
  • Devtron 简化了 K8S 的开发,可以通过图表组功能部署所有需要的应用程序。
  • 可以使用 GUI 仪表板管理和监控应用程序。
  • 可以在仪表板中执行所有操作,而无需自己传递任何 YAML 清单或执行 kubectl命令。

本文由 mdnice 多平台发布

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

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

相关文章

Java数据结构 | 模拟实现优先级队列

目录 一、前言 二、堆模拟实现优先级队列 2.1 堆的概念 2.2 堆的性质 2.3 堆的存储方式 2.4 堆的创建 一、前言 在前面我们学习过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队…

mybatis-plus代码生成工具

mybatis-plus版本升级尝试遇到的问题 若遇到高版本&#xff1a;【全局覆盖已有文件的配置已失效&#xff0c;已迁移到策略配置中】or【覆盖已有文件&#xff08;已迁移到策略配置中&#xff0c;3.5.4版本会删除此方法&#xff09;】这句话&#xff0c;可参考文章中解决办法 参考…

python机器人编程——基于单目视觉、固定场景下的自动泊车(下)

目录一、前言二、主要思路step0 设定一个中间位置step1 掉转马头step2 直线匀速前进step3 调整姿态step4 视觉匹配三、效果四、全篇总结一、前言 本篇来讨论一下在固定场景下&#xff0c;如何仅通过单目视觉&#xff0c;实现差速小车的自动停靠&#xff0c;这种方式实现成本比…

_cpp 位图

文章目录1. 位图概念1.1 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。2. 位图的实现2.1 运行结果&#xff1a;3. 位图应用3.1 具体代码封装实现如下3.2 部分结果演示&#xff1a;3.3 应用总结&#x…

力扣(LeetCode)791. 自定义字符串排序(C++)

排序 这道题只关心 orderorderorder 出现的字符&#xff0c;在 sss 中的排序。 sss 中不在 orderorderorder 的字符&#xff0c;在排序后是什么位置&#xff0c;不影响答案。 可以用 sortsortsort 函数&#xff0c;传入我们自定义的排序方式&#xff0c;按照 orderorderorder …

【JavaSE】类和对象 (二) —— 封装、包以及 static 关键字

目录 1. 封装 1.1 封装的概念 1.2 访问限定符 2. 包 2.1 包的概念 2.2 导入包中的类 2.3 自定义包 2.3.1 包的基本规则 2.3.2 创建一个包 2.4 包访问权限——defualt 3. 何为封装 3.1 private 关键字 4. static 成员 4.1 对学生类的进一步思考 4.2 static 修饰成员变量 4.3 …

计算机毕业设计之java+javaweb的物业管理系统

项目介绍 系统权限按管理员,物业和住户这三类涉及用户划分。 (a) 管理员&#xff1a;管理员使用本系统涉到的功能主要有&#xff1a;首页,个人中心,用户管理,员工管理,房屋类型管理,房源信息管理,房屋预约管理,订单信息管理,我的收藏管理,系统管理等功能。 (b) 住户&#xf…

基于单片机的导盲拐杖设计

目 录 引言 1 1 系统概述 1 1.1 设计研究的背景和意义 1 1.2 本次设计内容 1 2 系统设计的整体方案 2 2.1 主控芯片的方案论证 2 2.2 显示模块的方案论证 3 2.3 本章小节 4 3 系统硬件电路设计 4 3.1 单片机最小系统的电路设计 4 3.1.1 STC…

李峋同款爱心代码!跳动的心,给你爱的人一个惊喜!

Hello 大家好 如何浪漫的表白&#xff0c;作为程序员出身的小编&#xff0c;今天就带你实现热播剧《点燃我&#xff0c;温暖你》中超火的李峋同款爱心代码&#xff01;前面是教程&#xff0c;怕麻烦的朋友可以直接划到文末&#xff0c;下载现成的&#xff0c;下载完成后打开就可…

java毕业设计基于的校园头条新闻管理系统的设计与实现(附源码、数据库)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

【Linux】基础:进程地址空间

【Linux】基础&#xff1a;进程地址空间 摘要&#xff1a;本文首先通过复习关于C语言内存空间的知识来做实验提出问题&#xff0c;从而引入进程的地址空间。需要理解的是进程地址空间的组织形式与其表示意义&#xff0c;在需要理解如何完成进程地址空间的划分以及关键对应物理内…

C++12 ---对象于对象的关系

一、对象于对象的关系 在一个系统中&#xff0c;一个对象可能与不同的对象相关&#xff0c;以下是不同的关系。 依赖(Dependency) (使用一个) 关联(Association) (使用一个) 聚合(Aggregation) (有一个) 组合(Composition ) (有一个&#xff0c;"用..来实现") …

从Matlab实例学习遗传算法

文章目录前言问题背景遗传算法Matlab实例代码附录君主方案遗传算法解决旅行商问题前言 本文旨在使用智能优化算法及其MATLAB实例&#xff08;第2版&#xff09; 一书中的例子&#xff0c;来透彻理解遗传算法的本质。 问题背景 目标&#xff1a; 求解最大化函数 f(x)x10sin⁡…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java星光之夜香水网站的设计与开发bfmcr

大学计算机专业毕业的&#xff0c;实际上到了毕业的时候&#xff0c;基本属于会与不会之间。说会&#xff0c;是因为学了整套的理论和方法&#xff0c;就是所谓的科班出身。说不会&#xff0c;是因为实践能力极差。 不会的问题&#xff0c;集中体现在毕设的时候&#xff0c;系…

CTFSHOW菜狗杯 web

文章目录web签到web2 c0me_t0_s1gn我的眼里只有$抽老婆一言既出驷马难追TapTapTapWebshell化零为整无一幸免传说之下&#xff08;雾&#xff09;算力超群算力升级2遍地飘零茶歇区小舔田&#xff1f;LSB探姬Is_Not_Obfuscate龙珠NFTweb签到 eval($_REQUEST[$_GET[$_POST[$_COOK…

Ubuntu22.04虚拟机配置双网

文章目录Ubuntu22.04虚拟机配置双网一、 虚拟机网络1、 简介1.1 概述1.2 四种网络2、 配置双网2.1 NAT2.2 主机模式3、 添加到虚拟机二、 ubuntu设置Ubuntu22.04虚拟机配置双网 一、 虚拟机网络 1、 简介 1.1 概述 近期在使用VirtualBox的时候遇到这样的场景&#xff0c;我…

Docker(五)—— 镜像原理、容器快照commit

一、如何得到镜像 1&#xff09;从远程仓库下载 2&#xff09;朋友/同事拷贝给你 3&#xff09;自己制作DockerFile 二、联合文件系统 Docker的镜像是由一层层的文件系统组成&#xff0c;这种层级的文件系统叫做联合文件系统UnionFS。 三、Docker镜像加载原理 1. bootfs:…

第十四届蓝桥杯校内模拟赛第一期——Python

第十四届蓝桥杯校内模拟赛第一期——Python 文章目录第十四届蓝桥杯校内模拟赛第一期——Python1.二进制位数问题描述参考答案扩展2. 晨跑问题描述参考答案扩展3. 调和级数问题描述参考答案4. 山谷问题描述参考答案5. 最小矩阵问题描述参考答案6. 核酸日期问题描述输入格式输出…

redux与react-redux的学习笔记之react-redux

redux与react-redux前言一、redux和react-redux是啥&#xff1f;二、redux使用步骤1.引入库2.原理图原理图释义actions1&#xff09;含义2&#xff09;demostore.js1&#xff09;含义2&#xff09;demoreducer.js1&#xff09;含义2&#xff09;demoCount.jsx1&#xff09;含义…

2022年,我们为什么要学习C++?

“C已死” 大学时代&#xff0c;我就听过这样的说法——差不多十多年前的事儿了。那时候至少在美国&#xff0c;Java已经成了各公司的主流语言。程序员也许都很熟悉Joel Spolsky在2005年12月对JavaSchools发起的批驳。此外&#xff0c;作为微软应对Java的手段&#xff0c;2000…