云原生之深入解析如何使用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中包含了…...
高并发场景下的延时双删
基本介绍 "延时双删"是一种在并发编程中使用的技术,用于处理缓存和数据库之间的数据一致性问题。在高并发的场景下,这种方法特别有用。下面是对延时双删的详细介绍: 基本概念: 缓存与数据库的不一致:在并发…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
