云原生之深入解析如何使用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中包含了…...
高并发场景下的延时双删
基本介绍 "延时双删"是一种在并发编程中使用的技术,用于处理缓存和数据库之间的数据一致性问题。在高并发的场景下,这种方法特别有用。下面是对延时双删的详细介绍: 基本概念: 缓存与数据库的不一致:在并发…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...