使用 Kubernetes 为 CI/CD 流水线打造高效可靠的临时环境

介绍

在不断发展的科技世界中,快速构建高质量的软件至关重要。在真实环境中测试应用程序是及早发现和修复错误的关键。但是,在真实环境中设置 CI/CD 流水线进行测试可能既棘手又昂贵。

 

Kubernetes 是一个流行的容器编排平台,提供临时环境解决方案。在 Kubernete 的帮助下,用户能根据需求创建临时的现实环境去允许您进行测试和部署应用程序,还无需担忧管理永久基础设施的麻烦。

 

本文深入探讨了如何使用 Kubernetes 设置临时环境,以确保彻底的测试和顺利部署。了解一下如何使用 Kubernetes 简化 CI/CD 流水线,提高代码质量并节省成本。

 

CI/CD 流水线是什么

CI/CD 流水线是一种简化的软件开发方法,能够使开发人员快速将代码更改整合到他们的应用程序中。这种方法促进持续整合、测试和部署,从而能及时交付高质量的软件。

 

CI/CD 流水线的好处

CI/CD流水线具有众多的优势,其中包括:

 

高效的开发周期:CI/CD 流水线可以自动执行重复的任务,精简开发的过程并减少手动的工作量。开发者可以无缝合并代码更改,消除瓶颈并加速功能交付。

 

早期漏洞检测:纳入到 CI/CD 流水线中的自动化测试有助于早些识别错误和问题。这种方法最大限度地减少了错误修复的成本并提高了整体代码质量。

 

一致的测试覆盖率:每一次代码提交都会执行自动化测试,确保一致的测试覆盖率和软件质量的持续提升。这种积极主动的方法可以防止退化的出现,并促进产品的可靠性。

 

加强协作:CD/CI 流水线提供透明且可追踪的开发活动记录,培养成员们之间的协作。开发人员可以轻松的追踪更改,识别编写者并维护一致的开发流程。

 

临时环境:敏捷测试和无缝部署

临时环境是短暂且隔离的空间,为开发人员提供一个安全且受控的环境去测试和布置微服务,而不被中断的生产环境所打扰。鉴于优秀的管理和扩展容器化应用程序的能力,Kubernetes 被视为创建临时环境的理想工具。

 

通过使用 Kubernetes 中的自定义资源,开发人员可以定义这些环境的配置,包括资源需求,从而实现快速高效的创建和销毁。

 

这个方法有利于敏捷开发,并使团队能够可靠、自信地交付代码更改。

Kubernetes CI/CD 流水线的关键组件

Kubernetes 适用于基于容器的现代应用程序部署。因此,在使用 Kubernetes 构建有效的 CI/CD 流水线时应考虑以下关键组件:

 

容器:封装代码和依赖关系的独立软件单元,有助于在不同环境中快速、一致地部署应用程序。

 

运行集群:执行容器化应用程序的工作节点组。自动扩展功能可确保按照需求水平扩展,处理增加的流量或资源压力。

 

版本控制系统(VCS):便于管理源代码变更,使开发人员能够将更新无缝推送到共享源代码库中。

 

配置管理:追踪 VCS 中的变更,深入了解代码版本发展过程。支持跨网络部署更新,简化基础架构管理。

 

镜像 Registries:用于存储容器镜像的集中存储库,精简了 CI/CD 流程中的访问。

 

安全考虑因素:在从源代码库到生产部署,在整个 CI/CD 流水线中保护敏感数据。

 

持续的监测和可观测性:利用 Prometheus 等工具实时监控应用程序性能,实现问题检测和解决。

CI/CD 和 Kubernetes 的最佳实践

说到建立基于 Kubernetes 的 CI/CD 流水线,这里有一些最佳实践:
 

运用 GitOps

GitOps 利用 Git 版本进行控制,对所有与部署相关的操作进行适当跟踪和监控,以确保可靠的部署流程。这有助于管理配置文件和跟踪所有部署版本,从而提高可靠性。
 

运用 Helm 来打包应用程序

Helm 通过提供被称为 charts 的打包应用程序而简化了 Kubernetes 上的软件包管理。它使开发人员更容易创建可重复的部署,同时还允许他们定制自己的应用程序,而无需编写任何额外的代码或脚本。
 

遵循安全最佳实践

Kubernetes 环境中的安全问题不容忽视,因为它往往是现代企业在处理敏感数据时面临的最大威胁之一。

实施 Kubernetes 安全最佳实践,比如身份验证模型和授权策略,有助于确保集群安全,防止恶意用户对 Kubernetes 集群管理的资源进行未经授权的访问或活动。

运用 canary/blue-green 部署模式

通过使用这些模式,您可以提高生产环境的可靠性和稳定性,同时确保可以识别和解决任何潜在问题,而不会影响用户体验或功能。
 

  • Canary 部署只允许一小部分用户访问新功能,如果更新导致不良行为,可以快速回滚。

 

  • Blue-green 部署允许您在两个相同版本的应用程序之间切换流量,这样在测试阶段成功解决任何重大错误之前,旧版服务仍可运行。
     

避免在容器中硬编码机密和配置

容器镜像不应包含密码、API 密钥或令牌等机密信息。相反,您应该将这些敏感信息存储在外部秘密存储中,如 AWS Secrets Manager 或 Hashicorp Vault,并在部署过程中使用 Helm Charts 或 kubectl 等工具检索这些信息。

 

这将确保这些重要凭证经过加密,并与容器镜像分开保存,因为容器镜像可能会与其他服务共享,或者在容器镜像被泄露时公开暴露。

 

设置和实际操作

我们将展示两种方法。第一种是共享 Kubernetes 集群,其中每个临时环境都是一个单独的命名空间,但底层集群是相同的。第二种是为每个临时环境建立一个单独的集群。

 

第一种方法更具成本效益,而第二种方法则能在合规需要时提供不同环境之间更多的分离。

 

在这个演示中,我们将有一个由2个微服务和一个 Mongo 数据库组成的系统,我们将在其中一个微服务上打开一个拉取请求,通过打开这个 PR,我们将在 Kubernetes 上创建一个新环境,我们将使用 vcluster 来创建和销毁临时环境,在完成测试后,我们应该更轻松地关闭或合并拉取请求,这将触发另一个流水线来销毁临时环境。

 

我已经在本地的 Kubernetes 集群上部署了这些工作负载,使用 GitHub Action 工作流和 kustomize 创建了流水线,以轻松部署整个系统。
 
对于开发环境,我们需要创建流水线,为每个微服务自动创建临时环境,我们的流水线应包含以下步骤:

 

  1. 检验代码
  2. 建立 docker 镜像
  3. 推进新的 docker 镜像
  4. 更新 Kubernetes 的清单列表
  5. 部署新的临时环境
  6. 部署这个环境中的整个系统
  7. 提供对该环境的访问权限

 
请注意:这并不是开发工作流程的最终流水线,这些步骤只是为了演示。

 

我们将使用 vcluster 创建完全隔离的 Kubernetes 环境,请参考下面的 GitHub Action workflow 文件:
 
image.png

 
该流水线上的步骤将创建一个镜像,并将其推送到我们的 docker registry,然后用新标签更新 Github,之后将部署一个虚拟集群,并通过正常的 KUBECONFIG 文件提供对它的访问。

 

您可以根据自己的用户授权方式,以不同的方式处理集群访问问题。

 

现在运行 vcluster list 命令,我们就能看到新创建的临时集群,集群名称取决于 GitHub 上的提交 SHA 和用户 ID,以避免创建同名集群。

 

现在让我们检查已部署的工作负载。
 
image.png

 
现在我们已将全部的工作负载部署到新的环境并有且仅针对该环境。

 

由于开发环境是在开发人员需要时按需创建的,因此最好每隔几个小时就自动销毁这些开发环境,以避免主集群资源一直处于繁忙状态

 

现在,我们已经完成了开发工作,准备开启拉取请求,将新变更合并到主分支,在创建 PR 时,将创建一个新环境,仅用于测试新变更,该环境应供 QA 和测试团队使用,以接受新变更/功能。

 

PR GitHub workflow 与开发环境几乎相同,但我们不会在 GitHub 上推送新的镜像 tag,而是直接将其部署到新创建的临时环境中。

 
image.png
 

总结

总之,临时环境为大型团队开发和测试软件提供了一种经济高效的方式。它们无需管理和维护永久环境,从而降低了基础设施成本,加快了开发周期。随着云原生技术的发展、微服务架构的普及,应用系统的服务及依赖资源的数量迅猛增长。在应用环境管理自动化程度不高的情况下,繁琐的环境部署配置工作使得大量研发测试环境即便空闲时段也处于运行状态,资源长期占用不释放,导致不必要的开销。因此,研发测试环境的资源治理是在降本增效大背景下一项艰巨的任务

 

Walrus 支持对全套应用系统的统一编排,并在最新版本中提供环境随时启停的特性。用户可以在闲时停止整个应用环境,回收底层运行的服务和环境资源。在环境停止期间,Walrus 保留整个应用系统的配置数据,便于下次重启时,应用环境中的所有服务和资源可以轻松回到停止前的状态,极大降低资源消耗成本,实现研发测试环境资源的有效治理。
 

除此之外,利用 Walrus 0.4 中提供的服务/资源草稿(Services/Resources Draft)功能和服务/资源/环境启停和克隆功能,可以在资源有限的情况下一键启停切换多套测试环境,以快速进行测试验证工作,在增加资源利用率的同时提升部署效率并节省成本,切实助力企业降本增效。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】蓝牙氛围灯

Docs 一、项目搭建和开发流程 一、项目需求和产品定义 1.需求梳理和产品定义 一般由甲方公司提出,或由本公司市场部提出 需求的重点是:这个产品究竟应该做成什么样?有哪些功能?具体要求和参数怎样?此外还要考虑售价…

【postgresql】ERROR: INSERT has more expressions than target columns

执行下面sql insert into apply_account_cancellation3 select * from pply_account_cancellation; 返回下面错误信息 insert into apply_account_cancellation3 select * from apply_account_cancellation > ERROR: INSERT has more expressions than target colu…

如何将 MySQL 数据库转换为 SQL Server

本文解释了为什么组织希望将其 MySQL 数据库转换为 Microsoft SQL 数据库。本文接着详细介绍了尝试转换之前需要记住的事项以及所涉及的方法。专业的数据库转换器工具将帮助您快速将 MySQL 数据库记录转换为 MS SQL Server。 在继续之前,我们先讨论一下 MySQL 到 M…

新能源汽车生产污废水需要哪些工艺及设备

新能源汽车的快速发展带来了许多环境问题,其中之一就是生产过程中产生的污废水。由于新能源汽车的生产过程与传统汽车有所不同,因此需要采用特定的工艺和设备来处理和处理这些废水。 首先,新能源汽车生产过程中产生的污废水主要来自洗涤和冷却…

游戏中小地图的制作__unity基础开发教程

小地图的制作 Icon标识制作制作摄像机映射创建地图UI效果“不一样的效果” 在游戏中经常可以看到地图视角的存在,那么地图视角是如何让实现的呢? 这一期教大家制作一个简易的小地图。 💖点关注,不迷路。 老样子,我们还…

C++ Qt开发:LineEdit单行输入组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍LineEdit单行输入框组件的常用方法及灵活运用…

【NR技术】NR NG-RAN整体架构 -功能划分(三)

1 概述 NG-RAN节点包括: gNB,向终端提供NR用户平面和控制平面协议终端;ng-eNB,向终端提供E-UTRA用户平面和控制平面的协议终端。gNB和ng- eNB通过Xn接口相互连接。gnb和NG- eNB也通过NG接口连接到5GC,更具体地说,通过NG-C接口连…

深入浅出:HTTPS单向与双向认证及证书解析20231208

介绍: 网络安全的核心之一是了解和实施HTTPS认证。本文将探讨HTTPS单向认证和双向认证的区别,以及SSL证书和CA证书在这些过程中的作用,并通过Nginx配置实例具体说明。 第一部分:HTTPS单向认证 定义及工作原理:HTTPS单向认证是一…

网络游戏APP备案|游戏

网络游戏APP备案|游戏 网络游戏备案分析需要备案原因(个人看法)对小公司对大公司 总结 网络游戏备案分析 相信做网络游戏的伙伴们在23年都收到了各个平台的公告,网络游戏需要进行APP的备案。也就是说网路游戏现在安卓平台也不是你想上架测试…

2024年甘肃省职业院校技能大赛信息安全管理与评估赛项一阶段样题一

2024年甘肃省职业院校技能大赛高职学生组电子与信息大类信息安全管理与评估赛项样题一 竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 1.第一阶段:模块一 网络平台搭建与设备安全防…

python——第十七天

方法重写(overwrite) 、方法覆盖(override ):在继承的基础上,子类继承了父类的方法,如果不能满足自己使用,我们就可以重写或覆盖该方法 函数重载(overload): 在强数据类型的编程语言中(如Java、C、C等等): 函数名称…

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列 1、队列:先进先出 队列是项的有序集合,其中,添加新项的一端称为队尾,移除项的另一端称为队首。一个元素在从队尾进入队列后,就会一直向队首移动,直到…

被迫搬家,宽带迁移怎么办?

广州一栋违建烂尾楼,13年里从未停止出租,年年住满人。这栋楼没有贴外墙,裸露的水泥表面都被雨水腐蚀,很多阳台没有建好,只是简单加装了护栏,存在巨大安全隐患。 为什么烂尾楼年年满人呢? 因为它…

【MounRiver stdio】报错

collect2.exe: error: ld returned 1 exit status 问题 mounriver studio Type ‘SPI_DEV’ could not be resolved 解决方法: SPI_DEV 类型 未知 这个软件感觉不太好用相比keil

用 CSS 写一个渐变色边框的输入框

Using_CSS_gradients MDN 多渐变色输入框&#xff0c;群友问了下&#xff0c;就试着写了下&#xff0c;看了看 css 渐变色 MDN 文档&#xff0c;其实很简单&#xff0c;代码记录下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta ch…

系列十、SpringBoot + MyBatis + Redis实现分布式缓存(基于注解方式)

一、概述 上篇文章 系列九、SpringBoot MyBatis Redis实现分布式缓存 介绍了基于xml方式实现分布式缓存的效果&#xff0c;当前大家使用的技术栈基本是springboot各种框架的组合&#xff0c;而springboot显著的一个特点就是去xml配置&#xff0c;那么在无xml配置的情形下&…

痤疮分割 实验心路历程

数据集的制作 将labelme生成的标注文件记普通的json文件转成coco数据集格式的json文件 图像分辨率过大 如果不做任何调整&#xff1a; 会出现“killed”的报错&#xff0c;表示图片像素过大&#xff0c;显卡内存不够&#xff0c;无法支撑训练 显卡 换成更高性能的显卡&am…

12.11 C++ 作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

【操作系统和计网从入门到深入】(二)进程

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

IP与以太网的转发操作

TCP模块在执行连接、收发、断开等各阶段操作时&#xff0c;都需要委托IP模块将数据封装成包发送给通信对象。 网络中有路由器和集线器两种不同的转发设备&#xff0c;它们在传输网络包时有着各自的分工。 (1)路由器根据目标地址判断下一个路由器的位置 (2)集线器在子网中将网…