如何利用 knest 构建数据中心的 Kubernetes as a Service?

news2025/1/18 18:46:00

随着越来越多的企业和应用转向云原生架构,对 Kubernetes 集群的需求也日趋多样化和灵活化。出于故障隔离的考虑,企业的数据中心往往需要多个独立的 Kubernetes 集群来承载不同的业务,而不是全部署在一个共享 Kubernetes 集群上。

此外,由于业务负载普遍具有动态变化的特点,因此每个 Kubernetes 集群的规模也存在动态变化的需求,以适应增长的业务负载,并在业务负载降低时能及时释放计算资源以节省开销。这些 Kubernetes 集群运维的需求可以统一归类到 Kubernetes as a service,即 KaaS 服务。

在主流公有云上,KaaS 是其中非常重要和核心的组成。公有云的 KaaS 可以快速便捷地为其用户创建生产就绪的高可用 Kubernetes 集群,并且提供后续为集群扩容、缩容的运维操作。通常来说,公有云 KaaS 提供的 Kubernetes 集群的节点都是虚拟机,以提高物理资源的利用率。

在私有的企业数据中心,KaaS 需要企业 IT 部门从零构建,包括虚拟化平台、Kubernetes 管理平台、用户终端等多套系统的采购和集成,往往耗时又耗钱。此外,传统主流的虚拟化平台往往因需要支持广泛的虚拟化场景而集成了过多的功能,在单纯支持 Kubernetes 集群的场景下,显得笨重而低效。

为此,SmartX 开源了基于 Cloud Hypervisor 的 Kubernetes 原生轻量虚拟化平台 Virtink,并且在 Virtink 基础上进一步开源了 knest 命令行工具,帮助用户一键式地在 Virtink 上创建和运维 Kubernetes 集群,以更直接、更简单、更高效的方式为私有数据中心提供 KaaS 的能力基础。本文将详细介绍 knest 的功能和使用,帮助用户认识和了解 knest。

准备 Kubernetes 主机集群

就如上面我们提到的,Virtink 是 Kubernetes 原生的虚拟化平台,意味着它需要部署运行在一个 Kubernetes 集群上。为避免混淆,在接下来的内容中,我们这个 Kubernetes 集群称为 Kubernetes 主机集群,而将部署在 Virtink 虚拟机上的 Kubernetes 集群称为 Kubernetes 虚拟机集群。

值得注意的是,Kubernetes 主机集群的节点并不要求一定是物理机,也可以是支持嵌套虚拟化的虚拟机。如果您的手头已有一个现成的 Kubernetes 集群,可以选择将其作为接下来的主机集群,但需要确保集群的每个节点都支持 KVM。

如果您目前没有可用的 Kubernetes 集群,那么可以选择用 minikube 在您的本地创建一个临时的 Kubernetes 集群作为主机集群,例如:

minikube start --memory 6g --cni calico.yaml

这里我们选择不使用 minikube 默认的 CNI 而使用 Calico,是因为接下来要创建的 Kubernetes 虚拟机集群中的 Calico 需要 Kubernetes 主机集群的 CNI 支持 pod 中的 IPIP 包。Minikube 默认的 CNI 并不支持这个功能,因为选择使用 Calico。并且,Calico 默认是关闭这个功能的,我们需要增加一个环境变量来开启这个功能:

curl -LO https://projectcalico.docs.tigera.io/manifests/calico.yaml

sed -i '/^ # Use Kubernetes API as the backing datastore.$/i \ \ \ \ \ \ \ \ \ \ \ \ - name: FELIX_ALLOWIPIPPACKETSFROMWORKLOADS\n value: "true"' calico.yaml

使用 knest 创建 Kubernetes 虚拟机集群

首先,如果您还没有安装 knest 的话,请在项目的最新 release 中选择对应平台的二进制文件,并安装,例如:

curl -LO https://github.com/smartxworks/knest/releases/download/v0.6.0/knest-linux-amd64

sudo install knest-linux-amd64 /usr/local/bin/knest

接下来,使用 knest 创建 Kubernetes 虚拟机集群:

knest create demo --pod-network-cidr 10.245.0.0/16 --service-cidr 10.112.0.0/12

值得注意的是,Kubernetes 虚拟机集群的 pod 网络段和 service 网络段必须和 Kubernetes 主机集群的区分开,网络段之间不能有重叠。

如果您的 Kubernetes 主机集群是 minikube,那么 minikube 默认的 pod 网络段和 service 网络段分别是 10.244.0.0/16 和 10.96.0.0/12,因此这里选择分别往上走一个网络段作为 Kubernetes 虚拟机集群的 pod 网络段和 service 网络段。

扩容 Kubernetes 虚拟机集群

上面创建的 Kubernetes 虚拟机集群仅包含一个 control plane 节点,且无 worker 节点。如果您的 Kubernetes 主机集群有足够的计算资源,可以选择用 knest 的扩容命令为其添加更多的 control plane 节点和 worker 节点。

而如果您使用的是 minikube 作为 Kubernetes 主机集群,且本地有至少 10G 的可以内存,那么可以选择将 minikube 集群的内容扩大到 10G,然后用 knest 为 Kubernetes 虚拟机集群添加一个 worker 节点:

knest scale demo --worker-machine-count 1

创建持久化的 Kubernetes 虚拟机集群

通过上面创建的 Kubernetes 虚拟机集群默认使用 Virtink 的 ContainerRootfs 类型的存储。ContainerRootfs 存储能够将 Docker image 中的目录作为虚拟机的 rootfs,因此能够完全利用 Docker 的工具链来构建虚拟机的镜像,但它无法持久化。

如果虚拟机关机后再次启动,其 rootfs 会重新从 Docker image 构建,即无法持久化在虚拟机运行过程中保存到 rootfs 中的文件。如果您希望您的 Kubernetes 虚拟机集群的每个节点都是持久化的,knest 也支持创建持久化的 Kubernetes 虚拟机集群,例如:

knest create demo --pod-network-cidr 10.245.0.0/16 --service-cidr 10.112.0.0/12 --persistent --host-cluster-cni calico --machine-addresses 10.244.0.100-10.244.0.110

值得注意的是,考虑到 Kubernetes 虚拟机集群节点需要固定 IP,因此建议 Kubernetes 主机集群的 CNI 选择支持固定 IP 的 CNI,例如 Calico 和 kube-ovn。

在使用 knest 创建持久化的 Kubernetes 虚拟机集群时,需要通过 --host-cluster-cni 参数提供 Kubernetes 主机集群的 CNI 类型,以使 knest 能够将 IP 以适当的方式标注到 VM 上,使其最终能通过 CNI 正确获得固定 IP。

此外,您也需要通过 --machine-addresses 参数提供一定数量的固定 IP,以满足 Kubernetes 虚拟机集群的固定 IP 分配需要。

总结

在企业数据中心构建 Kubernetes as a Service 并非一件容易的事,其中涉及到虚拟化平台、Kubernetes 管理运维平台、用户终端等多个平台的集成。SmartX 开源的 knest 工具,基于其另一个开源的 Kubernetes 原生轻量虚拟化引擎 Virtink 项目,提供一键式创建和运维高效、安全、低开销的 Kubernetes 虚拟化集群,是数据中心 KaaS 较为理想的基础构件。

欢迎您扫描下方二维码,添加 SmartX 开源社区管理员微信,加入 Virtink 社区,与云原生专家和工程师们一起讨论 Knest 和 Virtink 。或者您也可以通过邮箱(virtink@smartx.com)联系我们,沟通您的想法和问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

elastic search window安装,基础概念,项目实例

elastic searchelasticsearch场景window 安装教程基本配置成功标志基础知识名词概念介绍文档元数据索引创建原则创建实例创建索引指定 分区,片区的创建创建带有类型、映射的索引(Index)创建文档创建文档spring boot 整合项目实践全文检索高亮显示elasticsearch场景 …

CANoe的各模块节点是如何选择应用层通道的

当CANoe为Channel-based access模式时,需要配置软硬件通道的映射;当CANoe为Network-based access模式时,需要配置软硬件网络的映射 通道映射: 网络映射: 当然,只有CANoe软件工作模式为Real bus时,才需要软硬件通道或网络映射。如果工作模式为Simulated bus时,不需要软…

如何使用 Authing 实现 AWS CLI 单点登录?

越来越多企业和开发者依赖使用 Authing 单点登录 SSO 来便捷无缝的访问 AWS 服务。随着组织将更多业务上云,为员工提供无缝安全的访问认证,以此来提升员工的工作效率和保障企业的信息安全至关重要。 但随着业务的扩张,会发现在 AWS 环境中管…

pdf转换成word加密怎么办,这个方法能派上用场!

处理文档的时候难免遇到各种难题,就比如格式切换,PDF转word就是很常见的需求。有些工作性质比较特殊,对文档对保密性也有要求。这时候不仅要会把PDF转成word文档,还要学会给文档加密。有没有工具能把这两件事都办到呢?答案是有&a…

直播美颜SDK贴纸功能实现流程、贴纸代码分析

时下,直播美颜SDK已经成了大家日常拍摄以及专业美颜的必备工具。另外它也接入到了各种社交平台、短视频平台、直播平台中,此类平台中大部分用户都熟练掌握了美颜SDK的拍摄技巧,特别是短视频平台中,几乎每个用户都曾经使用过。根据…

极光笔记 | 如何为 iOS 16 创建一个实时活动

01、iOS 16 中的 Live Activity (实时活动)是什么?根据 Apple 官方描述,“实时活动是一项新功能,可帮助用户直接从锁定屏幕实时获知各种事情的进展,例如体育比赛、锻炼、拼车或送餐订单进度等等” 。例如&a…

Revit中基线的作用和【类型可见性】功能

一、Revit中基线的作用 Revit中基线是一个重要但又容易被忽视的内容,本文就简单介绍一下基线的一些常用功能,基线的作用: 1、参照底图 基线调整为其他层时,可以在当前视图中半色调显示,方便参照。 2、定位 3、基线还可…

【UE4 第一人称射击游戏】35-击中目标时添加准心提示

上一篇:【UE4 第一人称射击游戏】34-制作一个简易计时器本篇效果:可以看到击中目标后有了一个红色准心的提示效果步骤:新建一个控件蓝图,命名为“Hitmarker”双击打开“Hitmarker”,拖入一个图像控件,锚点设…

前端性能优化(七):前沿优化解决方案

目录 一:拯救移动端图标 - SVG 1.1.从 PNG 到 IconFont 1.2.从 IconFont 到 SVG 二:使用 Flexbox 优化布局 三:优化资源的加载顺序 3.1.Preload 3.2.Prefetch 四:预渲染页面 五:Windowing(窗口化&…

Tomcat集群应用同步 —— 源码分析

文章目录前言一、应用同步的配置与实现原理二、应用同步源码分析三、如何获取集群的节点列表四、通讯模块Tribe五、集群的Session同步六、集群的Session共享总结前言 相信大家对Tomcat的集群部署都不陌生,以往,我们手动搭建一个Tomcat的集群环境&#x…

2023年运动耳机最新排行榜公布、公认最好用的五款运动耳机推荐

建议大家不要轻易尝试那些低价运动耳机,因为这些耳机大多数,只能满足基本听个响,舒适度和蓝牙稳定性都有代提高。通勤使用还勉强,运动强度一大,耳机容易掉落不说,蓝牙连接也很容易掉线,体验感受…

【自学Python】Python算术运算符

Python算术运算符 Python算术运算符教程 Python 中算术运算符是对 数值类型 的 变量 进行运算的,比如:加、减、乘、除、取模、整除和乘方运算等。 Python算数运算符语法 运算符说明实例结果加12.34 43.2155.55-减43.21 - 12.3430.87*乘2 * 3.141596…

springdata个人学习笔记

​ 入门 初始化springboot 依赖引入 <!-- springdata--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId&g…

node与node-sass版本对应

node&#xff1a;14.0.0 npm install sass-loader7.3.1 node-sass4.14.1 --savenode-sass对应node https://github.com/sass/node-sass/releases node-sass 和 sass-loader 的对应关系一般的情况下4.XX.YY&#xff0c;XX就是对应Node XX 版本 参考

Java常用工具类方法(下)

8. IOUtilsIO流在我们日常工作中也用得比较多&#xff0c;尽管java已经给我们提供了丰富的API。但我们不得不每次读取文件&#xff0c;或者写入文件之后&#xff0c;写一些重复的的代码。手动在finally代码块中关闭流&#xff0c;不然可能会造成内存溢出。有个好消息是&#xf…

一文搞懂Linux 环境变量

一文搞懂Linux 环境变量1.环境变量分类2.读取环境变量3.环境变量修改在 Linux 系统中&#xff0c;环境变量是用来定义系统运行环境的一些参数&#xff0c;比如每个用户不同的主目录&#xff08;HOME&#xff09;。 1.环境变量分类 按照作用域来分&#xff0c;环境变量可以简单…

【阶段三】Python机器学习13篇:机器学习项目实战:支持向量机分类的算法原理

本篇的思维导图: 支持向量机分类的算法原理 支持向量机分类算法的基本思路 1.最大间隔 支持向量机说到底就是一种“线性分类器”,它以“间隔”作为损失的度量,目标通过不断调整多维的“直线”——超平面,使得间隔最大化。所谓“支持向量”,就是所有数据点中直接参…

Lichee_RV学习系列---移植dhrystone

系列文章目录 Lichee_RV学习系列—认识Lichee_RV、环境搭建和编译第一个程序 文章目录系列文章目录一、dhrystone简介二、dhrystone源码下载三、dhrystone移植1、移植官方源码2、移植GitHub开源代码a&#xff1a;修改Makefile文件b&#xff1a;编译3、执行dhrstone代码总结一、…

Flink源码解析一之RPC原理解析

在阅读 Flink 源码过程中,如果你见到有这种类型的代码,其实就是在发送 RPC 请求 // resourceManagerGateway 就可以理解成: 当前节点中,对于 ResourceManager 代理对象的封 装 resourceManagerGateway.requestSlot(); // 代码跳转到:resourceManager.requestSlot()…

C++20标准下的左值与右值

C20标准下的左值与右值一、什么是左值与右值二、左值引用三、右值引用四、值类别五、标准库 move 函数5.1 用 static_cast将左值转换为右值5.2 使用 std::move 将左值转换为右值一、什么是左值与右值 左值&#xff1a;左值可以出现在赋值语句的左边或者右边右值&#xff1a;右…