云原生之深入解析如何使用Vcluster Kubernetes加速开发效率
一、背景
- 为什么一个已经在使用 Kubernetes 本身方面已经很挣扎的开发人员还要处理虚拟集群呢?答案可能会让您感到惊讶,但虚拟集群实际上比单独的物理集群更容易处理,并且与本地 k3d、KinD 或 minikube 部署的集群相比具有相当多的优势。
- 如果经常使用 Kubernetes,可能知道问题所在:想尝试一个新应用程序,切换到另一个项目来工作,或者您有一段时间没有使用本地 Kubernetes 集群并且忘记了其中部署了什么。
- 由于使用新的空集群比重用现有集群要容易得多,因此只需重置整个集群。对我来说,这种情况经常发生,每天多次重置本地 docker-desktop 实例,有时想同时处理多个项目,这些项目可能由于它们的 CRD 和 Operator 依赖关系而发生冲突。
二、KinD、k3d 和 minikube 来救场?
- 你可能会觉得太 Low,应该为每个项目使用单独的 KinD、k3d 或 minikube 集群而不是一遍又一遍地重置 docker-desktop 实例。但应该知道这种方法也有它的问题,如果定期重置这些集群,甚至同时运行多个集群,将很难在本地 docker 安装中与磁盘空间和资源开销做权衡。
- 问题源于这些工具创建 Kubernetes 集群的方式,可能已经注意到,在创建新的 KinD、k3d 或 minikube(docker 驱动程序)集群时,它们会创建一个运行整个 Kubernetes 集群的单节点容器。在 minikube 和 KinD 的情况下,这是一个包含 vanilla Kubernetes 二进制文件的容器,而在 k3d 的情况下,毫无疑问它是 k3s。节点本身包括小型 Kubernetes 设置所需的一切,包括单独的 systemd、containerd 以及通常的其他一些集群工具。虽然这很有效,但它也有几个缺点:需要重新拉取新集群中的所有容器镜像,跨本地集群的通信通常很困难,并且运行这些集群会产生大量开销。
三、虚拟集群是解决方案
- 认为虚拟 Kubernetes 集群可以在这里进行改进。下面一起看下虚拟 Kubernetes 集群与 KinD、k3d 和 minikube 的不同之处,以了解为什么它可以成为很好的替代品。
- 主要区别在于虚拟集群只复制 Kubernetes 控制平面,而不是节点本身。没有托管集群就无法存在,因此虚拟集群永远不能完全替代 docker-desktop、KinD 或 k3d 等发行版。将虚拟集群想象成虚拟机。如果没有物理的支持,它也无法存在。因此,虚拟集群不是复制一个完整的 Kuberentes 节点及其所有进程和 CNI 或 CRI 等底层驱动程序,而是重用现有 Kubernetes 集群的节点,并且仅为每个虚拟集群创建一个微小的单独的控制平面。
- 这具有很大的优势,可以重用主机集群(安装了虚拟集群的集群)中的许多部分,例如节点、存储和网络。所以你可以去掉运行 Kubernetes 集群所需的大部分其他进程,例如 kubelet、kube-proxy、CNI 和 CRI 驱动程序、containerd、systemd 等。顺便说一句,这也意味着你可以重用所有已经拉取到主机集群的镜像。另一个好处是访问另一个虚拟集群的应用程序也非常容易,因为它们共享相同的底层网络。
- 为了实现这一点,虚拟集群发行版只是重用现有的发行版,如 k3s、 k0s 甚至常规的 kubernetes 二进制文件来部署控制平面。因此,如果您认为 k3s 很小,可以尝试使用 k3s 的虚拟集群,并禁用其中的 90% 。除了控制平面之外,还有一个名为 syncer 的小型管理程序用于将纯虚拟控制平面中创建的工作负载实际同步到主机集群,从而将虚拟集群转变为实际可用的集群。这听起来非常复杂,但实际上它非常简单并且工作得很好。
四、验证
- 你可能会想: 这听起来不错,但我不想要一个难以使用的解决方案,我只想运行一个简单的命令来创建和删除一个集群,就像 KinD 或 minikube 正在做的那样。好消息是,在最新版本的 vcluster(完全开源且最流行的虚拟集群实现)0.10.0 中,已经将虚拟集群的处理简化为超级简单的一行命令:
https://github.com/loft-sh/vcluster
- 首先从发布页面,下载 vcluster 二进制文件:
https://github.com/loft-sh/vcluster/releases
- 或者使用文档中的教程:
https://www.vcluster.com/docs/quickstart
- 确保已经设置了本地 Kubernetes 发行版(例如 docker-desktop、rancher-desktop、KinD、minikube 或 k3d),然后运行以下命令在其中创建一个新的虚拟集群:
$ vcluster create my-vcluster
- 恭喜,就是这样,刚刚部署了第一个虚拟集群,几秒钟后,vcluster 应该可以使用:
$ kubectl get namespaces
NAME STATUS AGEkube-system Active 40sdefault Active 40skube-public Active 40skube-node-lease Active 40s
- 现在可以开始使用它并在虚拟集群中部署应用程序。例如,留言簿应用程序:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/all-in-one/guestbook-all-in-one.yaml
- 等到应用程序启动:
$ kubectl wait --for=condition=ready pod -l app=guestbook
- 然后运行以下命令开始端口转发:
$ kubectl port-forward service/frontend 9080:80
- 然后在浏览器中导航到页面http://localhost:9080/以查看正在运行的留言簿应用程序。要跳回原始集群,请使用:
$ vcluster disconnect
- 有趣的是,vcluster 将在主机集群的单个命名空间内创建所有同步资源。只有少数核心资源实际同步到主机集群,而大多数其他资源纯粹保留在虚拟集群中。要查看 vcluster 的同步工作负载,请在主机集群中运行以下命令:
$ kubectl get pods -n vcluster-my-vcluster
NAME READY STATUS RESTARTS AGEcoredns-76dd5485df-75jgf-x-kube-system-x-my-vcluster 1/1 Running 0 7m25sfrontend-f7d9c57d4-8wp44-x-default-x-my-vcluster 1/1 Running 0 7m13sfrontend-f7d9c57d4-d2trf-x-default-x-my-vcluster 1/1 Running 0 7m13sfrontend-f7d9c57d4-k6sb6-x-default-x-my-vcluster 1/1 Running 0 7m13smy-vcluster-0 2/2 Running 0 7m35sredis-master-857d99cc8-tr949-x-default-x-my-vcluster 1/1 Running 0 7m13sredis-replica-6fd587fb56-gjht5-x-default-x-my-vcluster 1/1 Running 0 7m13sredis-replica-6fd587fb56-mksx4-x-default-x-my-vcluster 1/1 Running 0 7m13s
- 可以看到 vcluster 将重命名工作负载,以确保具有相同名称的多个 pod 在同一主机命名空间内不会发生冲突。要了解有关哪些资源实际同步到主机集群的更多信息,您可以查看文档。
- 运行以下命令清理主机集群中的所有内容:
vcluster delete my-vcluster
五、 总结
- 一个新的 Kubernetes 集群总是比一个已经存在的集群更好用。现在,虚拟集群不仅可以在复杂的多租户环境中使用,而且可以在本地测试或开发集群中使用。
- 虚拟集群不能单独存在,没有主机集群。但它们可以成为并行运行多个 KinD、k3d 或 minikube 实例的好选择。它们比完整的独立 Kubernetes 集群更轻量、更易于访问且速度更快。因此,如果对不断重置本地 Kubernetes 集群感到恼火,请尝试使用虚拟集群。
相关文章:
云原生之深入解析如何使用Vcluster Kubernetes加速开发效率
一、背景 为什么一个已经在使用 Kubernetes 本身方面已经很挣扎的开发人员还要处理虚拟集群呢?答案可能会让您感到惊讶,但虚拟集群实际上比单独的物理集群更容易处理,并且与本地 k3d、KinD 或 minikube 部署的集群相比具有相当多的优势。如果…...
PCL 已知同名点对计算旋转矩阵并对点云进行旋转
目录 一、 算法概述二、代码实现三、测试示例一、 算法概述 适用:已知三组及三组以上的同名点对,计算旋转矩阵;然后根据旋转矩阵对点云进行旋转,最后保存旋转后的点云文件。 二、代码实现 #include <Eigen/Core> #include <Eigen/Dense>...

MyBatis ORM映射
MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时无法自动ORM 因此需要使用到ORM映射。 共有两种解决办法:1.列的别名 2.结果映射 1.列的别名 在SQL中使用 as 为查询字段添加列别名,以匹配属性名 public List<…...

在线客服系统推荐:为何选择Zoho Desk?
客户和企业的关系并不止于一次买卖关系,企业后续持续的服务不仅是对客户的保障,更能收获良好的品牌口碑和持续的良性收益。所以,企业需要在客户旅程的每一个阶段为客户提供优质服务。而在这段服务旅程中,在线客服系统承担了重要的…...

手绘心情树叶,探索情绪世界
人生如同滚雪球,关键在于找到湿润的雪和陡峭的坡。正如巴菲特所言。昨天参与JSTO的经历,让我深有同感。徐老师分享的主题是《手绘心情树叶,探索情绪世界》,发现在JSTO这个平台上,伙伴们的成长速度惊人。从系统的角度看…...

智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于水基湍流算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.水基湍流算法4.实验参数设定5.算法结果6.…...
打开和关闭GBASE南大通用数据库连接
下面的样例代码使用连接字符串通过GBASE南大通用Connection 类创建连接对象、 打开连接、关闭连接GBASE南大通用。 C# 示例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using Sys…...
Zookeeper 集群搭建过程中常见错误
文章目录 Mode: standalone启动失败 Mode: standalone 这通常表示 Zookeeper 配置为单节点模式,而不是集群模式。需要检查 zoo.cfg 文件中的配置,确保包含了所有集群节点的信息。 启动失败 /usr/bin/java ZooKeeper JMX enabled by default Using con…...

Linux开发工具——vim篇
vim开发工具的使用 文章目录 vim开发工具的使用认识vimvim常用三种模式vim正常模式命令集模式切换移动光标删除文字赋值替换撤销上一次操作更改跳到指定的行 vim末行模式命令集列出行号跳到文件中的某一行:保存文件离开vim查找字符: 总结题外话ÿ…...

基于YOLOv5的吸烟检测系统设计与实现
一、项目背景 吸烟检测作为保障公共健康和环境安全的重要任务之一,一直备受关注。传统的吸烟检测方法往往依赖人工判断,存在准确性低和实时性差的问题。为了解决这些问题,本项目基于深度学习技术进行了吸烟检测系统的设计与实现,…...

递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、二叉树的遍历1.1 链式结构二叉树的创建1.1 二叉树结构图 二、 前序遍历代码演示:2.1 前序遍历递…...

WebGL开发数字孪生项目
WebGL(Web Graphics Library)是一种用于在Web浏览器中渲染交互式3D图形的JavaScript API。虽然WebGL本身并不是一个数字孪生开发框架,但它提供了强大的图形渲染功能,可以用于开发与数字孪生相关的项目。以下是一些可以使用WebGL开…...

【51单片机系列】C51中的中断系统扩展实验
本文是关于51单片机中断系统的扩展实验。 文章目录 一、 扩展实验一:使用外部中断0控制蜂鸣器,外部中断1控制直流电机二、扩展实验二:修改定时器初值,设定3秒钟的定时时间让LED模块闪烁三、扩展实验三:使用定时器1和数…...

Poi实现复杂Excel导出,理解POI操作Excel思路!!!
前言 对于简单excel报表导出,有很多简单的工具如easypoi,而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景,而我们实际生产中面临的都是客户自定以的一个负责报表导出,这是利用…...
关于 jsconfig.json 文件在导入文件路径提示方面
前文:以前我弄不清 jsconfig.json 文件的作用是什么,只觉得 tsconfig.json 文件是用来 ts 编译的配置项,js 又不用编译为什么会需要 jsconfig.json 文件。搬了这么久的砖,也算是有所心得,今日记下以备不时之需。 jsco…...

验证码:防范官网恶意爬虫攻击,保障用户隐私安全
网站需要采取措施防止非法注册和登录,验证码是有效的防护措施之一。攻击者通常会使用自动化工具批量注册网站账号,以进行垃圾邮件发送、刷量等恶意活动。验证码可以有效阻止这些自动化工具,有效防止恶意程序或人员批量注册和登录网站。恶意程…...

python学习笔记--异常捕获
异常场景 numinput("input you number:") n9000 try:resultn/int(num)print({} 除以num 结果为{}.format(n,result)) except ZeroDivisionError as err:print("0不可以作为除数,出现报错{}".format(err)) except ValueError as err:print(&quo…...

ChatGPT如何计算token数?
GPT 不是适用于某一门语言的大型语言模型,它适用于几乎所有流行的自然语言。所以 GPT 的 token 需要 兼容 几乎人类的所有自然语言,那意味着 GPT 有一个非常全的 token 词汇表,它能表达出所有人类的自然语言。如何实现这个目的呢?…...

页面菜单,通过get请求一个url后,跳转另外一个页面,+丢失问题
业务场景描述: 在A系统,菜单点击跳B系统这个操作。 A系统菜单是get请求到B系统的一个缓冲页面,然后这个缓冲页面获取到url中的accessToken后,在这个页面中通过post请求后端接口。 问题描述: 当accessToken中包含了…...
高并发场景下的延时双删
基本介绍 "延时双删"是一种在并发编程中使用的技术,用于处理缓存和数据库之间的数据一致性问题。在高并发的场景下,这种方法特别有用。下面是对延时双删的详细介绍: 基本概念: 缓存与数据库的不一致:在并发…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...