Karmada 管理有状态应用 Xline 的早期探索与实践

news/2024/4/27 13:52:57/文章来源:https://blog.csdn.net/DatenLord/article/details/136937751

背景与动机

目前随着云原生技术和云市场的不断成熟,越来越多的 IT 厂商开始投入到跨云多集群的怀抱当中。以下是 flexera 在 2023 年中关于云原生市场对多云多集群管理的接受程度的调查报告(http://info.flexera.com)


从 flexera 的报告中可以看出,目前在整个云原生市场中已经有超过 87% 的企业正在同时使用多个云厂商的服务,其中使用单一公有云和单一私有云的仅占13%。而其中使用了多云部署的厂商中则有 15% 的用户选择了多公有云或多私有云部署,而采用了混合云部署的用户比例则达到了 72%。这些统计数据都从侧面反映了云原生技术和云市场的不断成熟,未来将会是编程式多云管理服务的时代。

除了外部趋势以外,单一集群下的局限性也成为了推动用户拥抱多云多集群管理的一个内在动力。单集群部署的局限性包括但不限于:

  • 单点故障,难以容忍集群级别的故障,小的集群联邦优于大的 K8s 集群
  • 单集群的边界限制,例如一个 Node 默认只有 110 个 Pod,一个集群最多容纳 5000 个 Node
  • 业务层面上的发展需要,例如 Xline 本身作为一款跨集群的分布式键值存储
  • ....

Karmada 作为一款开源的多集群管理工具,已经被 Shopee、DaoCloud 等公司应用在了生产环境中。但由于 Karmada 目前缺少对有状态应用管理的支持,因此应用实践上主要还是以无状态应用的管理为主。

为了更好地应对未来多云多集群管理的趋势,在多云多集群场景下更好地管理有状态应用,Xline 和 Karmada 社区成立了工作小组,共同推进 Karmada 对有状态应用管理的支持。

Karmada 管理有状态应用存在哪些挑战?

要理解 Karmada 在多集群下管理有状态应用之前,我们需要先回顾一下 K8s 在单集群下管理有状态应用的实现。

早在 2012 年的时候,Randy Bias 就 “开放和可扩展云架构”进行了有影响力的演讲。在那次演讲中,他提出了 “宠物模式”与 “家畜模式”。


这两种模式分别对应了应用的无状态和有状态。其中,对于家畜模式而言,他们不需要有特定的名字,个体与个体之间也不存在本质的区别,因此,当其中的某个个体出现问题时,我们往往可以直接使用另外一个个体来代替它。而对于宠物模式来讲,每个个体都需要有一个特定的名字(标识符),每个个体都是独一无二的,因此当其中的某个个体出现了问题时,你需要进行特殊的照顾,以便帮助它恢复健康。

而 K8s 在 1.5 版本中首次引入了 StatefulSet 这一 API 对象,并在 1.9 版本中稳定可用的状态。目前已经被广泛应用于运行有状态应用。它为所管理的 Pod 提供了固定的 Pod 身份标识,每个 Pod 的持久化存储以及 Pod 之间严格的启停顺序。

那么问题来了,有状态的应用到底有哪些状态,而 K8s 的 StatefulSet 又是如何初步解决有状态应用的状态问题?
 



而在 Karmada 多集群场景下,有状态的应用则带来了如下的问题:

  1. 如何保证跨集群的多个应用实例能够有一个全局统一的启停顺序,这对一些应用实例的 scale in/out 和滚动更新会带来影响。对于一个基于共识协议的分布式 KV 存储来讲,scale 的过程需要经过 membership change,其中会涉及到集群中 majority 修改的判定。如果缺少全局统一的顺序保证,多个 member cluster 同时进行 scale out,则会对共识协议达成共识的行为带来正确性上的影响
  2. 如何保证跨集群的所有应用都有全局唯一的实例标识,一个自然的解决方案便是将 member cluster id 一起纳入到实例标识当中
  3. 如何解决跨集群的应用通信问题,以及提供全局统一的网络标识。目前,在我们的尝试和实践当中,我们通过 submariner 来打通多个 member cluster 之间的网络通信。目前的实现方式上依赖了某个具体的网络插件
  4. 如何解决跨集群的有状态应用的更新、以及扩缩容等常见的功能,提供更细粒度的更新策略,例如在 member cluster 中实现如 Partition Update 的功能


为了更好地解决上述提到的问题,需要在 Karmada 上引入新的 Workload 来实现跨集群版本的 “StatefulSet”。

Xline 的一些早期尝试

由于目前 Karmada 社区对新 API 的很多实现细节还没有讨论清楚的前提下,我们对 Xline 在 karmada 下的部署,扩缩容和更新做了一些简单的探索与尝试。方案整体的架构如下:


在整体架构上,目前采用的是一个双层 Operator 的方式,在 Karmada 的控制面上,我们部署了一个 Karmada Xline Operator,由它来负责对定义在 Karmada 上的一些 Xline 资源进行解释和拆分,并将其下发到 member cluster 上。而 member cluster 上的 Xline Operator 在监测到对应的资源被创建出来之后,则会进入到相应的 Reconcile 过程,从而完成相应的操作。

部署

让我们先来看看在单集群下,分布式应用集群的常见部署方法(以 etcd operator 部署 etcd 集群为例)。etcd-operator 部署 etcd 集群可以分为两个阶段:

  1. Bootstrap: 创建一个 etcd 的种子节点,种子节点的 initial-cluster-state 为 new,并制定了唯一的 initial-clsuter-token
  2. Scale out:在种子集群上执行 member add,更新集群网络拓扑,然后启动新的 etcd 节点,新节点中的 initial-cluster 为更新后的网络拓扑,并且 initial-cluster-state 为 existing

然而,在跨集群场景下,由于不同的 member cluster 中的 pod 启动顺序缺少全局统一的启动顺序,不同 member cluster 下的 Xline Operator 会并发执行集群扩充操作,这会对共识协议的成员变更过程带来不利的影响。而为了绕开上述问题,Xline 采用了静态部署的方式,具体过程如下图:


首先,用户需要先在 karmada 上定义好相应的资源来描述跨集群的 Xline 集群的集群拓扑。Karmada Xline Opeartor 在监测到资源被 apply 后,会对资源进行解释和拆分,将其转换为member cluster 上的 XlineCluster 这个 CR 并下发。XlineCluster 这个 CR 当中会包含当前 member cluster 应当创建的 replica 数量,同时也会包含其他集群的 member cluster id 以及对应的 replica 数量。而 member cluster 上的 Xline Operator 在监测到 CR 的创建后,会进入 Reconcile 的过程,利用下发的集群拓扑结构,生成整个 Xline 集群中其他节点的 dns name,并启动 Xline 的 Pod。

在探索的早期,静态部署的方式由于在部署过程中不涉及 membership change,从而绕开了 Karmada 多集群下应用实例缺乏全局统一启动顺序的问题。但软件行业没有银弹,静态部署也是如此,它有如下的一些 trade off。下表是针对动态部署和静态部署在单集群与多集群场景下特点的对比:
 




扩缩容

在 Karmada 下对有状态应用进行 scale in/out 具体可分为两种:
水平 scale in/out —— 移除/增加一个 member cluster,并在其上 scale in/out 节点

  • 垂直 scale in/out —— 在原有的 member cluster 上进行 scale in/out


水平 scale out


如上图所示,整体的过程如下:

  1. 创建好对应的 member cluster,配置好 submariner 网络,并将其加入到 Karmada 中进行管理
  2. 修改 Karmada 上的 Xline 资源,在 member cluster 字段中添加新的记录 member4: 4 表示,要在 member4上扩充 4 个 Xline 的 Pod
  3. Karmada Xline Operator 会将资源进行拆分解释,并下发到 member4 上
  4. member4 上的Xline Operator 在接收到相应资源后,进入对应的 Reconcile 过程,调用 Xline client 执行 member add,达成共识后,将新的 Xline Pod 启动起来,重复上述过程,直到 member4 上 Xline 的 replicas 达到指定数量

垂直 scale out


对于垂直 scale out,其大致过程也如上图所示:

  1. 修改 Karmada 上的 Xline 资源,例如指定 member1 中的 Xline 的 Pod 从 3 扩充到 4
  2. Karmada Xline Operator 会将资源进行拆分解释,并下发到 member1 上
  3. member1 上的 Xline Operator 在接收到资源修改通知后,进入对应的 Reconcile 过程,调用 Xline client 执行 member add,达成共识后,将新的 Xline Pod 启动起来,重复上述过程,直到 member1 上 Xline 的 replicas 达到指定数量


目前,由于 scale in/out 不可避免地会涉及到 membership change 的过程,而在 Karmada 下不同 member cluster 之间缺少必要的同步机制,因此,scale 的过程还是存在局限性:一次水平 scale out 只能扩容一个集群,一次垂直扩容也只能在某个指定的 member cluster 上进行。

滚动更新


对于滚动更新而言,大致的过程如上图所示:

  1. 用户修改 Karmada 上的 Xline 资源,修改其中的 xline 镜像版本
  2. Karmada Xline Operator 会将资源进行拆分解释,并下发到 member cluster 上
  3. member cluster 上的 Xline Operator 在监测到资源发生变化后,会进入相应的 Reconcile 流程,执行滚动更新操作。member cluster 上的更新流程和单集群上的更新没有区别。


目前主要支持的更新方式为默认的滚动更新,但从实际的应用场景来看,至少需要考虑以下两个问题:

  1. 更新的过程当中会涉及旧 Xline 节点的停止和新 Xline 节点的启动,需要有额外的机制来保证更新过程不会产生不可用的问题
  2. 需要支持更多细粒度的更新策略,例如 Partition Update。在多个 member cluster 中,应当优先更新只有 follower 存在的集群,并且在更新 leader 所在的 member cluster 时,还应当将 leader 转移到更新好了的 member cluster 上,以避免极端情况下,leader 因为 Rolling update 而导致频繁下台的情况

总结

鉴于多云多集群管理的发展趋势以及 Xline 本身业务上的特性,Karmada 社区和 Xline 社区目前成立了工作小组,共同推动有状态应用在 Karmada 多集群下的管理。为了更优雅地解决 Karmada 多集群管理有状态应用的问题,我们需要引入新的 Karmada workload。目前,由于 Karmada 社区对于新的 workload 的实现细节还没有达成共识,因此,在早期的尝试阶段,Xline 采用了两层的 Operator 方式,通过 Karmada Xline Operator 对顶层资源进行解释和拆分,并下发至 member cluster,再由 member cluster 上的 Xline Operator 来对资源进行调谐。

通过这样的方式,我们对在 Karmada 上部署 Xline 以及滚动更新做了一些早期的尝试与探索,为未来新的 Karmada StatefulSet workload 的开发与设计做了一些前期的铺垫。

Xline社区会议

为了更全面地向大家介绍Xline的进展,同时促进Xline社区的发展,我们将于2024年3月29日北京时间晚上11:00召开Xline社区会议

欢迎您届时登陆zoom观看直播:
会议号: 813 0547 8985
密码: 520159
会议链接
https://zoom.us/j/81305478985?pwd=PsnbMGQy1ZqxYyd67cAkaGROfnIoQa.1

Xline于2023年6月加入CNCF 沙箱计划,是一个用于元数据管理的分布式KV存储。Xline项目以Rust语言写就。感谢每一位参与的社区伙伴对Xline的帮助和支持,也欢迎更多使用者和开发者参与体验和使用Xline。

GitHub链接:
https://github.com/xline-kv/Xline
Xline官网:www.xline.cloud

Xline Discord: 
https://discord.gg/mJdTjzfD

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python_1

要求: 代码: # 先将分钟数转化成年数,再将余数做为天数 minute float(input("请输入分钟数:")) year_1 (minute / 60 / 24) // 365 day_1 (minute / 60 / 24) % 365 now f"{minute}分钟{year_1}年{day_1}天&q…

Polkadot、Kusama 和六大领先平行链现已上线 Dune 数据分析平台!

3 月 19 日对于波卡社区来说是一个关键性的时刻,因为 Polkadot 数据首次在领先的区块链数据开源分析平台 Dune 上可以被访问和使用。这是 Colorful Notion 和 Dune 之间战略合作的结果,这次的合作与集成将使 Polkadot 生态系统的可见性大幅增强&#xff…

力扣面试150 阶乘后的零 数论 找规律 质因数

Problem: 172. 阶乘后的零 思路 👨‍🏫 大佬神解 一个数末尾有多少个 0 ,取决于这个数 有多少个因子 10而 10 可以分解出质因子 2 和 5而在阶乘种,2 的倍数会比 5 的倍数多,换而言之,每一个 5 都会找到一…

HTML 常用标签总结

本篇文章总结了一些我在学习html时所记录的标签&#xff0c;虽然总结并不是非常全面&#xff0c;但都是一些比较常用的。 html元素标签 首先一个html界面是由无数个元素标签组成的&#xff0c;每个元素具有它的属性 1.input 单行文本框 标签type属性——text <input ty…

机器学习周记(第三十一周:文献阅读-GGNN)2024.3.18~2024.3.24

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文模型 1.2.1 数据处理 1.2.2 门控图神经网络 1.2.3 掩码操作 2 相关知识 2.1 图神经网络&#xff08;GNN&#xff09; 2.2 图卷积神经网络&#xff08;GCN&#xff09; 3 相关代码 摘要 本周阅读了一篇利用图神…

IDEA2023版本整合SpringBoot热部署

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 开发环境篇 ✨特色专栏&#xff1a; M…

波奇学Linux:自定义协议和序列和反序列化

TCP是面向字节流的如何保证&#xff0c;读取上来的数据是一个"完整"的报文 tcp传输控制协议&#xff1a;什么时候发&#xff0c;发多少&#xff0c;出错怎么办 read和write都是从用户到内核空间的拷贝&#xff0c;数据不一定传输到另一个台主机的缓冲区&#xff0c;…

精品凉拌菜系列热卤系列课程

这一系列课程涵盖精美凉拌菜和美味热卤菜的制作技巧。学员将学习如何选材、调味和烹饪&#xff0c;打造口感丰富、色香俱佳的菜肴。通过实践训练&#xff0c;掌握独特的烹饪技能&#xff0c;为家庭聚餐或职业厨艺提升增添亮点。 课程大小&#xff1a;6.6G 课程下载&#xff1…

IDEA 远程调试

1.什么是远程调试 Java提供了一个远程调试功能&#xff0c;支持设置断点及线程级的调试同时&#xff0c;不同的JVM通过接口的协议联系&#xff0c;本地的Java文件在远程JVM建立联系和通信。 2.服务端开启远程调试 开启远程调试功能&#xff0c;需要修改tomcat 的catalina.sh…

链表队列LinkQueue

入队&#xff1a;往尾巴上放 1.先定义一个新节点&#xff0c;指针置空 2. 连接 3. 移动尾指针 出队&#xff1a;从头部出队 1. 定义一个temp指针 2. head指针指向下一个 3. 通过free 释放temp指针所指 4. 若指完后&#xff0c;head所指为NULL&#xff0c;则把尾指…

Windows前后端部署(达梦,东方通)

打开虚拟机&#xff0c;打开远程路径服务 将素材复制到虚拟机并解压&#xff08;jkd,达梦&#xff0c;东方通&#xff0c;nginx&#xff09; 双击安装jdk(一直下一步) 安装达梦 双击 直接下载完成 东方通下载&#xff08;双击程序&#xff09; 改端口号8080 把许可文件放到东方…

设计模式——观察者模式Observer

Q&#xff1a;观察者模式属于哪一类设计模式 A&#xff1a;观察者模式属于行为学模式 Q&#xff1a;什么是观察者模式 A&#xff1a;当一个对象的状态发生改变时&#xff0c;所有依赖它的对象都得到通知&#xff0c;并自动更新 观察者模式解析&#xff1a;报纸类维护了一个…

文心一言 VS 讯飞星火 VS chatgpt (224)-- 算法导论16.3 6题

六、假定我们有字母表 C{0&#xff0c;1&#xff0c;…&#xff0c;n-1} 上的一个最优前缀码&#xff0c;我们希望用最少的二进制位传输此编码。说明如何仅用 2n-1n⌈lgn⌉ 位表示 C 上的任意最优前缀码。(提示&#xff1a;通过对树的遍历&#xff0c;用 2n-1 位说明编码树的结…

第十四届蓝桥杯省赛C++ A组所有题目以及题解(C++)【编程题均通过100%测试数据】

第一题《幸运数》【模拟】 【问题描述】 小蓝认为如果一个数含有偶数个数位&#xff0c;并且前面一半的数位之和等于后面一半的数位之和&#xff0c;则这个数是他的幸运数字。例如 2314是一个幸运数字,因为它有4个数位,并且2314。现在请你帮他计算从1至100000000之间共有多少…

Flink RPC初探

1.RPC概述 RPC( Remote Procedure Call ) 的主要功能目标是让构建分布式计算(应用)更容易&#xff0c;在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标&#xff0c;RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。 总而言之&…

jenkins权限分配

1.安装权限插件 Role-Based Strategy 2.创建用户 3.修改全局安全配置中的授权策略为Role-Based Strategy 4.进入Manage and Assign Roles创建Global roles和Item roles 4.进入Assign Roles给用户分配role

UI风格汇:材料设计(Material Design),是对扁平风格的延展。

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;主要讲解各类UI风格特征、辨识方法、应用场景、运用方法等&#xff0c;本次带来的材料风格风格的解读&#xff0c;有设计需求&#xff0c;我们也可以接单。 一、什么是材料设计&#xff08;…

apisix创建https

总结了下apisix 使用https 的问题和方法 1、apisix 默认https 端口是9443 2、apisix 需要上传证书后才可以使用https 否二curl测试会报错 SSL routines:CONNECT_CR_SRVR_HELLO 3、apisix 上传证书方法 我是使用的自签名证书&#xff0c;注意自签名证书的Common Name 要写你…

静态路由表学习实验

实验要求&#xff1a;各个pc设备可以通信&#xff0c;并且可以访问外网&#xff0c;假设R1已连接外网 拓扑结构 思路&#xff1a;配置pc机ip地址&#xff0c;子网掩码&#xff0c;和网关&#xff08;网关地址是上层路由接口的地址&#xff09;&#xff0c;配置路由各个接口地址…

【Qt】使用Qt实现Web服务器(七):动态模板引擎

1、示例 2、源码 2.1 模板配置参数 配置文件中关于模板配置参数如下 path为存放模板的目录suffix为模板文件后缀[templates] path=templates suffix=.tpl encoding=UTF-8 cacheSize=1000000