网站突然掉排名,百度联盟个人怎么接广告,简单个人网页设计html,高唐网站制作一、背景
为什么一个已经在使用 Kubernetes 本身方面已经很挣扎的开发人员还要处理虚拟集群呢#xff1f;答案可能会让您感到惊讶#xff0c;但虚拟集群实际上比单独的物理集群更容易处理#xff0c;并且与本地 k3d、KinD 或 minikube 部署的集群相比具有相当多的优势。如果…一、背景
为什么一个已经在使用 Kubernetes 本身方面已经很挣扎的开发人员还要处理虚拟集群呢答案可能会让您感到惊讶但虚拟集群实际上比单独的物理集群更容易处理并且与本地 k3d、KinD 或 minikube 部署的集群相比具有相当多的优势。如果经常使用 Kubernetes可能知道问题所在想尝试一个新应用程序切换到另一个项目来工作或者您有一段时间没有使用本地 Kubernetes 集群并且忘记了其中部署了什么。由于使用新的空集群比重用现有集群要容易得多因此只需重置整个集群。对我来说这种情况经常发生每天多次重置本地 docker-desktop 实例有时想同时处理多个项目这些项目可能由于它们的 CRD 和 Operator 依赖关系而发生冲突。
二、KinD、k3d 和 minikube 来救场
你可能会觉得太 Low应该为每个项目使用单独的 KinD、k3d 或 minikube 集群而不是一遍又一遍地重置 docker-desktop 实例。但应该知道这种方法也有它的问题如果定期重置这些集群甚至同时运行多个集群将很难在本地 docker 安装中与磁盘空间和资源开销做权衡。问题源于这些工具创建 Kubernetes 集群的方式可能已经注意到在创建新的 KinD、k3d 或 minikubedocker 驱动程序集群时它们会创建一个运行整个 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 namespacesNAME 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 --forconditionready pod -l appguestbook 然后运行以下命令开始端口转发
$ 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 集群感到恼火请尝试使用虚拟集群。