使用 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)功能和服务/资源/环境启停和克隆功能,可以在资源有限的情况下一键启停切换多套测试环境,以快速进行测试验证工作,在增加资源利用率的同时提升部署效率并节省成本,切实助力企业降本增效。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后端返回base64文件前端如何下载

1.后端返回base64格式文件 2.前端代码 <style lang"less" scoped> import "./style/common.less";.table-div-a {color: #409EFF;text-decoration: underline;cursor: pointer; } </style><template><div class"template-con…

WPF仿网易云搭建笔记(1):项目搭建

文章目录 前言项目地址动态样式组合样式批量样式覆盖Prism新建UserControler修改Material Design 笔刷收放列表可以滚动的StackPanel列表点击展开或折叠 实现效果 前言 今天接着继续细化代码&#xff0c;把整体框架写出来 项目地址 WPF仿网易云 Gitee仓库 动态样式 【WPF】C#…

使用Pytorch实现Grad-CAM并绘制热力图

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 看一下这个main cnn.py的文件 那这里我为了方便 就直接从官方的torch vision这个库当中导入一些我们常用的model 比如说我这里的例子是采用的mobile net v3 large这个模型 然后这里我将pretrain设…

融合科技,升级医疗体验——医院陪诊服务的技术创新

随着科技的迅猛发展&#xff0c;医疗服务领域也在积极借助技术手段提升患者体验。本文将探讨如何利用先进的技术代码&#xff0c;将医院陪诊服务推向新的高度。 1. 医疗预约系统的实现 # 通过Python代码实现医疗预约系统 class MedicalAppointment:def __init__(self, patie…

持续集成交付CICD:使用Maven命令下载Nexus制品

目录 一、实验 1.Maven安装 2.Nexus搭建公共组仓库及Maven全局配置文件 3.使用Maven命令下载Nexus制品 一、实验 1.Maven安装 &#xff08;1&#xff09;CentOS环境安装步骤 tar -xf apache-maven-3.8.6-bin.tar.gz #解压 mv apache-maven-3.8.6 /usr/local/maven #移动…

django与数据库交互关于当前时间的坑

背景 在线上服务中使用时间进行数据库操作时发现异常&#xff0c;而在本地环境无法成功复现此问题&#xff0c;导致难以进行故障排查。 核心问题 view.py class XxxViewSet(viewsets.ModelViewSet):queryset Xxx.objects.with_status().order_by("status", &quo…

集简云 x 零售企业丨快速集成有赞商城和微盛企微管家,实现私域运营自动化

客户介绍 某公司是一家知名的饮料厂商&#xff0c;自1998年成立以来&#xff0c;一直致力于研发和生产各种热门饮品&#xff0c;如果汁、碳酸饮料、矿泉水等。因其独特的口感和健康的品质深受消费者的喜爱。企业拥有多个知名品牌&#xff0c;享有极高的品牌知名度和市场份额。该…

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…

P4 Qt如何添加qss样式表文件和添加图片资源

目录 前言 01 添加图片资源文件 02 添加qss文件 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Qt基础_ChenPi的博客-CSDN博客》✨✨✨ &#x1f33a;本篇简介 &#xff1a;这一章…

华为OD机试 - 生成哈夫曼树(Java JS Python C)

题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二叉树中序遍历结果统一,增加以下限制: 二叉树节点中,左节…

【后端学前端学习记录】第一天 css动画 内凹导航栏

1、学习信息 css动画 内凹导航栏_哔哩哔哩_bilibili 随便找的的视频&#xff0c;主要原因是在公司不方便有声音 2、源码 最终源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title…

案例064:基于微信小程序的考研论坛设计

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【git push ERROR: commit id: missing Change-Id in message footer】

使用 gerrit 后&#xff0c;提交代码会出现如下截图问题&#xff1a; 临时解决&#xff1a; step1: 把上面红色的那条gitidir复制下来执行下&#xff1a; step2:执行下面的命令会添加change_id git commit --amendstep3: 然后推送代码到服务器上 git push origin HEAD:refs/fo…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式3

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 思路&#xff1a;通过VectorImage和动态修改Feature尺寸实现Feature跟随地图比例尺尺寸变化 优点&#xff1a;结合第1和第2种方式的…

3接上篇 我的自定义GPTs的改进优化 与物理世界连接成功 GPTs的创建与使用定义和执行特定任务的功能模块 通过API与外部系统或服务的交互

https://blog.csdn.net/chenhao0568/article/details/134875067?spm1001.2014.3001.5502 从服务器日志里看到请求多了一个“location” 23.102.140.123 - - [08/Dec/2023:14:02:20 0800] "GET /getWeather.php?location&locationNewYork HTTP/1.1" 200 337 &…

机器学习与低代码开发:创新驱动的双剑合璧

引言 随着科技的日新月异&#xff0c;机器学习和低代码开发已经成为引领技术行业变革的两大重要趋势。机器学习通过模拟人类的学习方式&#xff0c;让计算机具备了自我学习和预测的能力&#xff0c;打破了传统计算机程序的局限性。而低代码开发则以简化软件开发过程为目标&…

Gateway和spring-boot-starter-web的恩怨情仇

为什么取这个题目&#xff0c;其实与我踩到的坑有关&#xff0c;说起来这个坑非常神奇&#xff0c;这里面就涉及到Gateway和spring-boot-starter-web底层所依赖的技术不兼容的问题。 一、背景 SpringCloud 版本 ---- Finchley.SR2 SpringBoot 版本 ---- 2.0.6.RELEASE 如果同…

排序算法-插入/希尔排序

1 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 1.2直…

Selenium自动化测试总结

一、Selenium自动化测试&#xff08;基于python&#xff09; 1、Selenium简介&#xff1a; 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中&#xff0c;本质是通过驱动浏览器&#xff0c;模拟浏览器的操作&#xff0c;比如跳转、…

通过静态HTTP实现负载均衡

在当今的互联网环境中&#xff0c;随着用户数量的不断增加和业务需求的不断扩大&#xff0c;单台服务器往往无法承受所有的访问压力。为了确保网站的可用性和性能&#xff0c;负载均衡成为了一种常见的解决方案。本文将探讨如何通过静态HTTP实现负载均衡&#xff0c;以提升网站…