使用 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.mzph.cn/news/208348.shtml

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

相关文章

【qt】Qt+OpenCv读取带有中文路径的图片

【opencv4.5.1版本】下载exe解压即可。。。https://opencv.org/releases/page/2/ 【qt5.15.2】 pro文件 QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to …

硕士毕业论文格式修改要点_word

目录 0、最开始要做的事情1、更改样式(先善器)2、多级标题(解决自动更新问题必要的基础设置)2、插入图片(1)设置一个图片样式——“无间隔”(2)插入题注(3)修…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(完整版)

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的…

小白学java栈的经典算法问题——第四关白银挑战

内容1.括号匹配问题2.最小栈3.最大栈 1.括号匹配问题 栈的典型题目还是非常明显的,括号匹配、表达式计算等等几乎都少不了栈,本小节我们就看两个最经典的问题 首先是LeetCode20,链接 本道题还是比较简单的,其中比较麻烦的是如何判断两个符…

力扣面试题 08.12. 八皇后(java回溯解法)

Problem: 面试题 08.12. 八皇后 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 八皇后问题的性质可以利用回溯来解决,将大问题具体分解成如下待解决问题: 1.以棋盘的每一行为回溯的决策阶段,判断当前棋盘位置能否放置棋子 2.如何判…

hbuilder + uniapp +vue3 开发微信云小程序

1、创建项目: 2、创建项目完成的默认目录结构: 3、在根目录新建一个文件夹cloudFns(文件名字随便),存放云函数源码: 4、修改manifest.json文件:添加 小程序 appid和cloudfunctionRoot&#xff0…

python的websocket方法教程

WebSocket是一种网络通信协议,它在单个TCP连接上提供全双工的通信信道。在本篇文章中,我们将探讨如何在Python中使用WebSocket实现实时通信。 websockets是Python中最常用的网络库之一,也是websocket协议的Python实现。它不仅作为基础组件在…

pyside/qt03——人机协同的编程教学—直接面向chatGPT实战开发(做中学,事上练)

先大概有个草图框架,一点点丰富 我纠结好久,直接用Python写UI代码 还是用designer做UI 再转Python呢, 因为不管怎么样都要转成Python代码, 想了想还是学一下designer吧,有个中介,有直观理解。 直接这样也可…

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

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

设计并实现一个多线程图书馆管理系统,涉及数据库操作

没有实现全部功能,希望路过的大佬,可以实现全部功能,在评论区聊聊 创建数据库library-demo CREATE DATABASE library-demo创建图书表book CREATE TABLE book (bookId int(11) NOT NULL AUTO_INCREMENT COMMENT 图书ID,bookName varchar(15)…

HarmonyOS创建JavaScript(类 Web开发模式)项目

上文 HarmonyOS带大家创建自己的第一个Page页面并实现路由跳转(ArkTS)带大家创建了我们项目中第一个自己创建的page 并完成了一个跳转逻辑的编写 上文的开发模式是 ArkTS 的 也被称为 声明式开发范式 还有一种 javaScript的 类Web开发模式 这种方式就类似于我们传统的前端开发模…

基于微群机器人的二次开发

请求URL: http://域名地址/modifyGroupName 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wId是String登录实例标识chatRoom…

读书笔记-《数据结构与算法》-摘要2[冒泡排序]

冒泡排序 核心:冒泡,持续比较相邻元素,大的挪到后面,因此大的会逐步往后挪,故称之为冒泡。 public class BubbleSort {public static void main(String[] args) {int unsortedArray[] new int[]{6, 5, 3, 1, 8, 7, 2…

Leetcode每日一题学习训练——Python3版(到达首都的最少油耗)

版本说明 当前版本号[20231205]。 版本修改说明20231205初版 目录 文章目录 版本说明目录到达首都的最少油耗理解题目代码思路参考代码 原题可以点击此 2477. 到达首都的最少油耗 前去练习。 到达首都的最少油耗 ​ 给你一棵 n 个节点的树(一个无向、连通、无环…

倒计时模块复习

经典回顾倒计时 倒计时的基本布局介绍。 一个内容区域和一个输入区域,内容区域进行划分 直接使用flex布局会更快一点。 js代码 我们利用一下模块化思想,直接把获得时间这个功能写成一个函数。方便后续的调用 function getTime() {const date new Date…

MES管理系统通过哪些方面提升产品质量管理水平

在当今高度竞争的市场环境中,质量成为了企业生存和发展的关键因素。工厂作为生产产品的核心场所,其质量管理水平直接影响到产品的质量和企业的声誉。为了应对这一挑战,许多工厂引入了MES管理系统解决方案。本文将探讨MES管理系统如何帮助工厂…

【UE5】监控摄像头效果(上)

目录 效果 步骤 一、视角切换 二、摄像头画面后期处理 三、在场景中显示摄像头画面 效果 步骤 一、视角切换 1. 新建一个Basic关卡,添加第三人称游戏资源到项目浏览器 2. 新建一个Actor蓝图,这里命名为“BP_SecurityCamera” 打开“BP_Securit…

模电笔记。。。。

模电 2.8 蜂鸣器 按照蜂鸣器驱动方式分为有源蜂鸣器和无源蜂鸣器 有源的有自己的震荡电路,无源的要写代码控制。 里面有个线圈,相当于电感,储能,通直隔交。 蜂鸣器的参数:额定电压,工作电压&#xff0…

【CCF-B】1/2区,录用见刊极快!2个月录用!

计算机类 • 好刊解读 今天小编带来Taylor and Francis旗下计算机领域快刊,CCF-B类推荐的期刊解读,期刊审稿周期短,投稿友好,如您有投稿需求,可作为重点关注!后文有相关领域真实发表案例,供您投…

防水,也不怕水。Mate X5是如何做到让你湿手湿屏也不影响操作的?

相信不少人都碰到过当手机屏幕存在小水珠时,触控变得不灵敏,或者出现“幽灵触屏”,指东打西的情况。 尤其是在洗澡、做饭,或者在户外遇到下雨天气时,如果打湿的手机收到重要聊天消息或者电话,却因为湿屏导…