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

news2024/11/26 10:47:41

介绍

在不断发展的科技世界中,快速构建高质量的软件至关重要。在真实环境中测试应用程序是及早发现和修复错误的关键。但是,在真实环境中设置 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.coloradmin.cn/o/1296500.html

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

相关文章

Github入门教程之高效搜索和查看需要的项目

对咱们新入门的小白来说,前两天手把手注册 Github 账号的任务已经完成,接下来,学习如何高效搜索和查看自己感兴趣的内容。 下面是之前教程传送门 超详细GitHub注册和登录教程-CSDN博客 一. 搜索 可以在页面左上角「Search or jump to ...」…

IDEA 社区版 add GitLab Account

问题 IntelliJ IDEA Community Edition 2023.3(社区版)在使用GitLab连接时,使用个人访问令牌出现报错,代码: GraphQL error:[No such type ProjectMember,so it cant be a fraggment condition,Field id doesnt exis…

iview Table实现跨页勾选记忆功能以及利用ES6的Map数据结构实现根据id进行对象数组的去重

因为iview Table组件的勾选是选中当前页的所有数据,当我们切到别的页面时,会发送请求给后端,这个时候就会刷新我们之前页码已经选中的数据。现在有个需求就是,在我们选择不同页码的数据勾选中之后,实现跨页勾选记忆功能,就是说已经打钩了的数据,不管切到哪一页它都是打钩…

Python django-xadmin:构建强大的 Django 后台管理系统

概要 Django作为一款强大的Web框架,其后台管理系统提供了便捷的数据管理和操作方式。而 django-xadmin 则为Django的后台管理系统提供了更加强大的功能和灵活的定制选项。在本文中,我们将深入研究如何使用django-xadmin,并通过详细的示例代码…

智能优化算法应用:基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于鱼鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鱼鹰算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【c语言指针详解】指针的基本概念和用法

目录 一、指针的基本概念和用法 二、指针运算 2.1 指针的自增和自减运算 2.2 指针的自增和自减运算 三、数组和指针 四、指针和函数 4.1 在函数中使用指针作为参数和返回值 4.1.1 使用指针作为函数参数 4.1.2 使用指针作为函数返回值 4.2 指针参数的传值和传引用特性 4.2.1 指针…

Windows 系统,TortoiseSVN 无法修改 Log 信息解决方法

使用SVN提交版本信息时,注释内容写的不全。通过右键TortoiseSVN的Show log看到提交的的注释,右键看到Edit log message的选项,然而提交后却给出错误提示: Repository has not been enabled to accept revision propchanges; ask …

【模型量化】神经网络量化基础及代码学习总结

1 量化的介绍 量化是减少神经网络计算时间和能耗的最有效的方法之一。在神经网络量化中,权重和激活张量存储在比训练时通常使用的16-bit或32-bit更低的比特精度。当从32-bit降低到8-bit,存储张量的内存开销减少了4倍,矩阵乘法的计算成本则二…

Mint Blockchain,一个聚焦在 NFT 领域的 L2 网络

Mint 是什么? Mint 是一个聚焦在 NFT 领域的创新型 L2 网络。Mint Blockchain 致力于促进 NFT 资产协议标准的创新和现实商业场景中 NFT 资产的大规模采用。 不管是过去 3 年在以太坊网络涌现的 NFT,还是当下在比特币网络活跃的“铭文” NFT&#xff0c…

HarmonyOS开发(九):数据管理

1、概述 1.1、功能简介 数据管理为开发者提供数据存储、数据管理能力。 它分为两个部分: 数据存储:提供通用数据持久化能力,根据数据特点,分为用户首选项、键值型数据库和关系型数据库。数据管理:提供高效的数据管…

gitlab注册无中国区电话验证问题

众所周知gitlab对中国区不友好,无法直接注册,页面无法选择86的手机号进行验证码发送。 Google上众多的方案是修改dom,而且时间大约是21年以前。 修改dom,对于现在的VUE、React框架来说是没有用的,所以不用尝试。 直接看…

springboot3远程调用

RPC 两个服务器之间的调用 远程请求 内部服务之间的调用 可以通过 cloud 注册中心 openfeign等 外部服务的调用 http请求 外部协议 api:远程接口 sdk:本地调用 调用阿里云的天气请求

Navicat 技术指引 | 适用于 GaussDB 分布式的日志查询与配置设置

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

Python---random库

目录 基本随机数函数(): rand.seed() random() 扩展随机数函数(): random库包含两类函数:基本随机数函数,扩展随机数函数 基本随机数函数:seed(),random() 扩展随机数函数:randint,getrandbits(),uniform(),randrange(),choice(),shuff…

分布式和微服务区别

1.分布式 微服务和分布式的区别 1.将一个大的系统划分为多个业务模块,业务模块分别部署到不同的机器上,各个业务模块之间通过接口进行数据交互。区别分布式的方式是根据不同机器不同业务。 2.分布式是否属于微服务? 答案是肯定的。微服务的意…

微信小程序引入Vant Weapp修改样式不起作用,使用外部样式类进行覆盖

一、引入Vant Weapp后样式问题 在项目中使用第三方组件修改css样式时,总是出现各种各样问题,修改的css样式不起作用,没有效果,效果不符合预期等。 栗子(引入一个搜索框组件)实现效果: 左侧有一个搜索文字背景为蓝色,接着跟一个搜索框 wxml <view class"container&q…

cache 2.单机并发缓存

0.对原教程的一些见解 个人认为原教程中两点知识的引入不够友好。 首先是只读数据结构 ByteView 的引入使用是有点迷茫的&#xff0c;可能不能很好理解为什么需要ByteView。 第二是主体结构 Group的引入也疑惑。其实要是熟悉groupcache&#xff0c;那对结构Group的使用是清晰…

修改pip源

修改pip源 永久修改 PS C:\Users\Dell> pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/Writing to C:\Users\Dell\AppData\Roaming\pip\pip.ini临时修改 pip install -i(即--index-url简写) http://mirrors.aliyun.com/pypi/simple/ selenium…

图像叠加中文字体

目录 1) 前言2) freetype下载3) Demo3.1) 下载3.2) 编译3.3) 运行3.4) 结果3.5) 更详细的使用见目录中说明 4) 积少成多 1) 前言 最近在做图片、视频叠加文字&#xff0c;要求支持中文&#xff0c;基本原理是将图片或视频解码后叠加文字&#xff0c;之后做图片或视频编码即可。…

一文讲解关于MCU启动原理的几个关键问题

MCU最开始一启动后去哪里读代码&#xff1f; CPU上电启动后被设计为去地址0x00000000位置处读取代码&#xff1b;首先会连续读取两个字&#xff0c;分别是栈指针初始值和复位异常处理函数的地址&#xff1b;然后跳去执行复位异常处理函数。 当然在一些早期的ARM处理器设计中&a…