当前位置: 首页 > news >正文

云原生之深入解析如何使用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 集群感到恼火,请尝试使用虚拟集群。

相关文章:

  • WAF绕过常见方法
  • SpringMVC01
  • 天猫数据分析(天猫查数据工具):2023年天猫平台假发行业市场销售数据分析报告
  • XZ_iOS 之 M1 M2 M3的M系列芯片的Mac苹果电脑安装cocoapods
  • Redis cluster集群设置密码
  • Wireshark与其他工具的整合
  • ImageIO类的使用
  • urllib2 HTTP头部注入
  • 【递归 回溯】LeetCode-226. 翻转二叉树
  • 还在用nvm?来试试更快的node版本管理工具——fnm
  • 【C语言】自定义类型——枚举、联合体
  • 【Android Studio】各个版本下载地址
  • Springboot访问html页面
  • ansible在ubuntu下的安装和使用
  • Android Studio: 解决Gradle sync failed 错误
  • 【刷算法】从上往下打印二叉树
  • Android优雅地处理按钮重复点击
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Git 使用集
  • golang 发送GET和POST示例
  • LeetCode18.四数之和 JavaScript
  • MySQL主从复制读写分离及奇怪的问题
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue的全局变量和全局拦截请求器
  • windows-nginx-https-本地配置
  • 将回调地狱按在地上摩擦的Promise
  • 今年的LC3大会没了?
  • 聊聊flink的TableFactory
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何设计一个微型分布式架构?
  • 使用parted解决大于2T的磁盘分区
  • 携程小程序初体验
  • 学习HTTP相关知识笔记
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​configparser --- 配置文件解析器​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • (2)MFC+openGL单文档框架glFrame
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)终结任务
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net Core和.Net Standard直观理解
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .Net中间语言BeforeFieldInit
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [100天算法】-x 的平方根(day 61)
  • [20140403]查询是否产生日志
  • [20170728]oracle保留字.txt