公众号关注 「奇妙的 Linux 世界」
设为「星标」,每天带你玩转 Linux !
作者:piotr.minkowski
译文:https://tinyurl.com/22z5hxp3
译者:进击云原生
在本文中,您将学习如何在多集群环境中使用 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 集群后,它将成为默认上下文。
![230556dfe766a82b0d7ccc6142d30cc9.png](https://i-blog.csdnimg.cn/blog_migrate/e02753c2864cde6c757dfd30a110c815.png)
现在,我们的目标是将新创建的 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
打印在该命令的输出中,复制它。
![a250045fcc3e4ed8cac13112c5405565.png](https://i-blog.csdnimg.cn/blog_migrate/f04cf7f6a8443ef6488acc07cb8c0506.png)
我们还必须提供目标集群的 master API 的 URL。由于在 Kind 上运行 K8S,我需要获取包含 Kind 的 Docker 容器的内部地址。为了获得它,我们需要运行以下命令:
$ docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' c1-control-plane
这是我的 Kind 集群的 IP 地址:
![9ee77bbfce0828e6feb910552c0220ad.png](https://i-blog.csdnimg.cn/blog_migrate/f0e4d647510b49483aa892ce7dd4bc05.png)
现在,我们拥有了在 Devtron 仪表板中添加新托管集群所需的所有数据。为此,导航到Global Configuration
部分。然后选择Clusters and Environments
项并单击Add cluster
按钮。需要填写 Kind 集群 URL 和之前生成的bearer token
。
![a14b8561c41d73c970173f7471e403c1.png](https://i-blog.csdnimg.cn/blog_migrate/3fa88dd6b368239c98ae9d7b38a7a983.png)
如果一切正常,您应该会在托管集群列表中看到第二个集群。现在,您还需要根据下面显示的消息在 Kind 上安装 Devtron 代理:
![f31d4216cc6499af2ec0a6061e328049.png](https://i-blog.csdnimg.cn/blog_migrate/7652641acbb94edfe0e5ba5921268728.png)
创建环境
我们将定义三个环境。在 Devtron 环境中分配给集群。我们将在本地集群 (local )上创建一个环境,和另外两个 Kind 集群 ( remote-dev
, remote-devqa
) 。每个环境都有一个目标命名空间。为了简化,命名空间的名称与环境名称相同。当然,您可以设置任何想要的名称。
![ef1b37e9d231f64186e91e39b5ad436a.png](https://i-blog.csdnimg.cn/blog_migrate/c6117e3e1ff41f24949aab90fea9c78b.png)
现在,切换到Clusters
视图。
![ebb782849737465da661aafc685fa0a0.png](https://i-blog.csdnimg.cn/blog_migrate/10f3fd6115f4458119ce2cafff1e37ab.png)
如您所见,现在有两个集群连接到 Devtron:
![4820d9150e3f3465dc58e0d720c586bc.png](https://i-blog.csdnimg.cn/blog_migrate/8b631c00a07debaa9dd38331c612df61.png)
我们可以看一下每个集群的详细信息。在这里,您可以看到kind-c1
集群的详细视图:
![31922888166965e70903ea03b7cf0dde.png](https://i-blog.csdnimg.cn/blog_migrate/2fb366a8e371b7523ac39f36a8c92643.png)
添加自定义 Helm 存储库
Devtron 最重要的功能之一是对 Helm 图表的支持。默认情况下,Devtron 中有几个可用的 Helm 存储库,包括bitnami
或elastic
,也可以添加自定义存储库。这里使用我自己的 Helm 存储库,其中包含用于部署 Spring Boot 应用程序的图表。我已经将它放在 GitHub 上:
https://piomin.github.io/helm-charts/
我们的图表名称是spring-boot-api-app
,最新版本是0.3.2
。
![dfcec9ccba3303c51f8589c25c843c4a.png](https://i-blog.csdnimg.cn/blog_migrate/8fc1d716d3cf4c7826a2850de1c334a4.png)
为了在 Devtron 中添加自定义存储库,我们需要再次进入Global Configurations
部分。然后转到Chart repositories
菜单项,然后单击Add repository
按钮。如下所示,我添加了一个新存储库piomin
。
![0c7bc0903265357f1740b6521d254322.png](https://i-blog.csdnimg.cn/blog_migrate/9b656a4f0b2b8954e7ecbc94a2aff374.png)
创建存储库后,您可以转到Chart Store
部分以验证新图表是否可用。
![a13acd5a81b096a40508dc19a8577deb.png](https://i-blog.csdnimg.cn/blog_migrate/bc478dbc88b352066f0eada8a309a712.png)
使用 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
。
![b759ad0d577c75e94606fc41a16b2fe5.png](https://i-blog.csdnimg.cn/blog_migrate/628f211396a6e8715e24056f97b95703.png)
部署应用程序后,我们可以验证其状态:
![31f287d963de57d8c867a4e0372ce47f.png](https://i-blog.csdnimg.cn/blog_migrate/4a340595da27a65ce58a2a10eea72063.png)
让我们进行一些测试调用。示例 Spring Boot 公开了 Swagger UI,因此我们可以轻松发送 HTTP 请求。要与运行在 K8S 上的应用程序交互,应该为服务启用端口转发kubectl port-forward svc/sample-spring-boot-api 8080:8080
。执行该命令后,您可以通过 http://localhost:8080/swagger-ui.html
访问地址 Swagger UI:
![da5ef3df663177b15b6cf8a6016c0fc5.png](https://i-blog.csdnimg.cn/blog_migrate/5afb44891fd823418ac92c98e08125b5.png)
Devtron 允许我们查看 pod 日志。还可以用 grep
。下面展示了与测试调用相关的日志。
![f1be436e56452e4f4e35bff50ef9e1d1.png](https://i-blog.csdnimg.cn/blog_migrate/a0dc0872a1a5258f9bfdc219449f1e18.png)
将应用部署到远程集群
现在,我们将示例 Spring Boot 应用程序部署到远程集群。为了做到这一点,请转到与以前相同的页面,但不要选择本地环境,而是选择remote-dev
,它与kind-c1
集群相关联。
![a03c642220606f597f4bf640f4b2fdfd.png](https://i-blog.csdnimg.cn/blog_migrate/79d8893d075c33d7cdc8b3d32427c436.png)
现在,有两个相同的应用程序在两个不同的集群上运行。我们可以对在 Kind 集群上运行的应用程序和本地集群执行相同的操作,例如验证其状态或检查日志。
![1824bcbf62f6f927910c8a8549ddf7a3.png](https://i-blog.csdnimg.cn/blog_migrate/6d78b0a3fea3cd00fb3aaabb006db27f.png)
部署应用组
假设我们要部署连接到数据库的应用程序。我们可以使用名为Chart Group
的 Devtron 功能一步完成。使用该功能,我们可以将 Spring Boot 的 Helm 图表和 Postgres 的图表放在同一个逻辑组中。然后,我们可以将整个组部署到目标环境中。要创建图表组,请转到 Chart Store 菜单,然后单击Create Group
按钮。您应该设置组的名称并选择将包含的图表。对我来说,就是bitnami/postgresql
图表和我的自定义 Helm 图表。
![c6734e2d5258c4419fa27bb9cf46e6ab.png](https://i-blog.csdnimg.cn/blog_migrate/4d41316b0466c97930e3df895d33f976.png)
创建组后,您将在Chart Store
主页面上看到它。现在,只需单击它即可部署应用程序。
![d54396cc9e276278566a7700e6583cc3.png](https://i-blog.csdnimg.cn/blog_migrate/496eb3c415e05efa25418883e8bbdbfc.png)
单击带有图表组的磁贴后,您将被预测到部署页面。
![9fd0b4e01c1f8e3274552b13b818abdc.png](https://i-blog.csdnimg.cn/blog_migrate/174e4f25b68725defe9f9a0deb87c0d3.png)
单击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 。
![e4f708e7b4dff60d829e7399ba1f1434.png](https://i-blog.csdnimg.cn/blog_migrate/8697754dd7c6461fb61f481f5e5d9a65.png)
这是本次实践中已部署应用程序的最终列表:
![5f46b9d9ed69a9cae94623cd0406b181.png](https://i-blog.csdnimg.cn/blog_migrate/63201df56ffaaeed387f232fc99ad8c5.png)
总结
借助 Devtron,可以使用 Helm 图表轻松地支持跨多个 K8S 集群部署应用程序。
Devtron 简化了 K8S 的开发,可以通过图表组功能部署所有需要的应用程序。
可以使用 GUI 仪表板管理和监控应用程序。
可以在仪表板中执行所有操作,而无需自己传递任何 YAML 清单或执行
kubectl
命令。
本文转载自:「 进击云原生 」,原文:https://url.hi-linux.com/DYCFx ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。
最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。
你可能还喜欢
点击下方图片即可阅读
如何优雅的监控 Kubernetes Pod 网络状态
点击上方图片,『美团|饿了么』外卖红包天天免费领
更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!