KubeBlocks v0.9 解读|最高可管理 10K 实例的 InstanceSet 是什么?

news2024/11/15 10:59:01

实例(Instance)是 KubeBlocks 中的基本单元,它由一个 Pod 和若干其它辅助对象组成。为了容易理解,你可以先把它简化为一个 Pod,下文中将统一使用实例这个名字。

InstanceSet 是一个通用 Workload API,负责管理一组实例。KubeBlocks 中所有的 Workload 最终都通过 InstanceSet 进行管理。

相比于 K8s 原生的 StatefulSet、Deployment 等 Workload API,InstanceSet 加入了更多数据库领域相关特性的考虑和设计,比如角色、高可用等,使得其在支持数据库等有复杂状态的 Workload 上,具备更强的能力。

使用 InstanceSet

InstanceSet 为其管理的每一个实例生成一个固定的名字,并会生成一个 Headless Service,从而使得每一个实例都有一个固定的网络标识。基于该标识,属于同一个 InstanceSet 的实例可以相互发现对方,属于同一个 Kubernetes 集群中的其它系统也可以发现该 InstanceSet 下的每个实例。

InstanceSet 通过 VolumeClaimTemplates 为每个实例生成固定标识的存储卷(Volume),其它实例或系统可以通过实例的固定标识找到实例,进而进一步访问到存储卷里的数据。

在进行更新时,InstanceSet 支持按照确定性顺序对所有实例进行滚动更新(RollingUpdate),并且可配置滚动更新的多种行为。

类似的,在进行水平扩缩容时,InstanceSet 会按照确定性的顺序进行添加或删除实例操作

在这些基础特性之上,InstanceSet 针对数据库高可用等需求,进一步支持了原地更新实例模板指定实例下线基于角色的服务基于角色的更新策略等特性。

下面对这些特性做进一步说明。

实例名称如何生成

InstanceSet 通过实例模板渲染实例对象,渲染的实例数量通过 Replicas 字段进行控制。

apiVersion: workloads.kubeblocks.io/v1alpha1
kind: InstanceSet
metadata:
  name: mydb
spec:
  replicas: 3
  template:
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mydb
        image: registry.kubeblocks.io/mydb:15.1
        ports:
        - containerPort: 5123
          name: db
        volumeMounts:
        - name: data
          mountPath: /var/mydb/
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 10Gi

上面这个例子,声明了一个名叫 mydb 的 InstanceSet,它由 3 个实例(replicas=3)构成。每个实例由 templatevolumeClaimTemplates 组成的实例模板渲染生成。其中 template 用来渲染实例中的 Pod,volumeClaimTemplates 用来渲染实例中的 PVC。

实例名称生成的模式(Pattern)是 $(instanceSet.name)-$(instanceID)。默认情况下,instanceIDordinal,在该示例中,instanceSet.namemydbordinal 从 0 开始递增,最终生成的实例名称为:mydb-0mydb-1mydb-2。当使用了多实例模板特性时,instanceID 的生成规则将进一步扩展为 $(template.name)-$(ordinal),详细说明可参考实例模板说明文档。

为了提供固定的网络标识,每个 InstanceSet 会生成一个 Headless Service 对象,该 Service 名字的生成模式(Pattern)为 $(instanceSet.name)-headless。在该示例中,最终生成的 Headless Service 的名字为:mydb-headless。通过这样的方式,该 InstanceSet 下的 3 个实例获得了三个固定的网络标识,即:mydb-0.mydb-headless.default.localmydb-1.mydb-headless.default.localmydb-2.mydb-headless.default.local

因为 InstanceSet 名字会成为固定网络标识的组成部分,所以要求该名字必须符合 DNS Label 规范。

如何获取 InstanceSet 下的实例

InstanceSet 在生成二级资源时,会为它们添加两个 Label:workloads.kubeblocks.io/managed-by=InstanceSetworkloads.kubeblocks.io/instance=<instanceSet.name>。可通过这两个 label 获取某个 InstanceSet 下的所有二级资源,包括 Pod 和 PVC。

在上面的示例中,获取相应 Pod 的 Label 为:

workloads.kubeblocks.io/managed-by=InstanceSet

workloads.kubeblocks.io/instance=mydb

如果想自定义获取 InstanceSet 下的 Pod 的 Label,可通过设置 spec.selector 字段实现。例如:

apiVersion: workloads.kubeblocks.io/v1alpha1
kind: InstanceSet
metadata:
  name: mydb
spec:
  selector:
    matchLabels:
      db: mydb

通过 spec.selector 设置的 MatchLabels 将被自动添加到 InstanceSet 所生成的 Pod 上。

实例创建与销毁

默认情况下,InstanceSet 会按照 Ordinal 从小到大的顺序依次生成实例。在创建一个新的实例时,会先等前一个实例中的 Pod 处于 Ready 状态。

实例销毁时,会按照相反的顺序进行。在销毁一个实例前,会先等该实例中的 Pod 处于 Ready 状态,这里主要的考虑是,如果一个 Pod 没有处于 Ready 状态,其所挂载的 PVC 中的数据可能已经存在问题,在确保数据修复前,InstanceSet 不会做进一步动作。

InstanceSet 新建和水平扩容时,会采用上述实例创建逻辑,水平缩容时,会采用上述实例销毁逻辑。

同时 InstanceSet 支持通过 spec.podManagementPolicy 设置实例创建和销毁策略,目前支持 Ordered (即默认策略)和 Parallel 两种策略。Parallel 是指会采取并行的方式进行实例创建或销毁。

指定实例缩容

有些场景下,需要在缩容时销毁特定实例。

比如,某个 Node 因所在物理机故障需要下线,该 Node 上所有的实例(Pod)需要销毁。此时可通过指定实例缩容特性,实现销毁该 Node 上的实例的目的。

以前面名字为 mydb 的 InstanceSet 为例,可通过如下方式,实现缩容 Ordinal 为 1 的实例,并保留 Ordinal 为 02 的实例:

apiVersion: workloads.kubeblocks.io/v1alpha1
kind: InstanceSet
metadata:
  name: mydb
spec:
  replicas: 2
  offlineInstances: ["mydb-1"]
# ...

详细介绍可参考指定实例缩容特性介绍章节。

实例更新

当对实例模板中的字段进行了更新后,InstanceSet 下的所有实例会进行更新操作。

默认情况下,InstanceSet 会按照 Ordinal 从大到小的顺序依次更新每个实例,在更新一个实例前,会先等前序实例已经更新并达到 Ready 状态。

如果是有角色(下面章节会讲)的实例,InstanceSet 会按照角色权重从低到高进行更新,如果实例角色权重相同,则进一步按照 Ordinal 从大到小顺序进行更新。

InstanceSet 支持通过 spec.updateStrategy 配置更多的更新行为,比如通过 spec.UpdateStrategy.rollingUpdate.partition 控制更新的实例总数量,通过 spec.UpdateStrategy.rollingUpdate.maxUnavailable 控制更新期间最大不可用实例数量。详细说明可参考 spec.updateStrategy API 描述。

原地更新(In-place update)

应用系统通常对数据库有很高的可用性要求,通常情况下,Pod 更新实际采取的动作是重建(Recreate),重建 Pod 需要一定的时间,这会导致数据库服务有一段时间不可用。

为了降低更新对数据库服务可用性的影响,InstanceSet 支持了实例原地更新能力,在实例模板中部分字段更新时,InstanceSet 会采用原地更新 Pod 或扩容 PVC 的方式,实现实例更新。

哪些字段支持原地更新

从原理上来讲,InstanceSet 原地更新复用了 Kubernetes Pod API 原地更新能力。所以具体支持的字段如下:

  • spec.template.metadata.annotations
  • spec.template.metadata.labels
  • spec.template.spec.activeDeadlineSeconds
  • spec.template.spec.initContainers[*].image
  • spec.template.spec.containers[*].image
  • spec.template.spec.tolerations (只支持新增 Toleration)
  • spec.instances[*].annotations
  • spec.instances[*].labels
  • spec.instances[*].image

Kubernetes 从 1.27 版本开始,通过 PodInPlaceVerticalScaling 特性开关可进一步开启对 CPU 和 Memory 的原地更新支持。InstanceSet 会自动探测 Kubernetes 版本和特性开关,并进一步支持如下能力:

对于大于等于 1.27 且 PodInPlaceVerticalScaling 已开启的 Kubernetes,支持如下字段的原地更新:

  • spec.template.spec.containers[*].resources.requests["cpu"]
  • spec.template.spec.containers[*].resources.requests["memory"]
  • spec.template.spec.containers[*].resources.limits["cpu"]
  • spec.template.spec.containers[*].resources.limits["memory"]
  • spec.instances[*].resources.requests["cpu"]
  • spec.instances[*].resources.requests["memory"]
  • spec.instances[*].resources.limits["cpu"]
  • spec.instances[*].resources.limits["memory"]

对于 PVC,InstanceSet 同样复用 PVC API 的能力,仅支持 Volume 的扩容。
详细介绍可以参考原地更新特性介绍章节。

实例模板

默认情况下,InstanceSet 通过同一个模板生成所有的实例

部分场景下,同一个 InstanceSet 中,需要有不同设置的实例,比如不同的资源配置或环境变量。InstanceSet 支持在默认实例模板基础上,定义更多实例模板,以便满足此类需求。

仍以前文中名称为 mydb 的 InstanceSet 为例,如果要将其配置为一个大规格主实例、两个小规格从实例,可通过如下方式实现:

apiVersion: workloads.kubeblocks.io/v1alpha1
kind: InstanceSet
metadata:
  name: mydb
spec:
  replicas: 3
  template:
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: mydb
        image: registry.kubeblocks.io/mydb:15.1
        ports:
        - containerPort: 5123
          name: db
        volumeMounts:
        - name: data
          mountPath: /var/mydb/
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 10Gi
  instances:
  - name: primary
    replicas: 1
    resources:
      limits:
        cpu: 8
        memory: 16Gi
  - name: secondary
    replicas: 2
      resources:
        limits:
          cpu: 4
          memory: 8Gi

详细介绍可以参考实例模板特性介绍章节。

角色

大部分数据库系统都支持多实例部署,同时每个实例承担不同的角色,这个角色通常由它们内在的数据复制关系决定。比如 PostgreSQL 中有 Primary、Secondary 角色,etcd 中有 leader、follower、learner等角色。

在一个数据库系统中,不同角色的实例会存在差异。比如在对外提供的服务能力上,通常主节点可以提供读写能力,其它节点提供只读能力。在运维时,按照数据库运维最佳实践,通常先逐个升级备实例,最后升级主实例,在升级主实例前,需要先做一次 switchover,以保证数据的完整性并降低服务不可用时间。

针对这些特点,InstanceSet 中设计了若干与数据库角色相关的特性。

围绕角色相关的功能特性包括角色定义角色探测基于角色的服务基于角色的更新策略等。

角色定义用来描述系统中有几个角色、分别有哪些属性。

角色探测根据配置的探测方法去周期性探测每个实例中的角色,并及时更新到对应实例的 Label 上。

基于每个实例的角色 Label,在 Service 中可以筛选出特定的角色,以便提供相应的服务能力,同时基于实例的角色,在做实例更新时,可基于角色优先级确定实例更新顺序。

角色定义

InstanceSet 可通过 spec.roles 定义所有的角色信息,包括角色名称、读写能力、是否参与选举、是否 Leader 等。

比如 PostgreSQL 数据库可配置如下:

spec:
  roles:
  - name: "primary"
    accessMode: ReadWrite
    isLeader: true
  - name: "secondary"
    accessMode: Readonly

角色探测

InstanceSet 中会预制一个角色探测 Sidecar,该 Sidecar 会根据周期性的执行配置的角色探测脚本,并配合 InstanceSet Controller 最终将角色名称更新到对应的实例 Label 上。

角色探测脚本可通过如下方式配置:

spec:
  roleProbe:
    customHandler:
    - image: probe.kubeblocks.io/sample-probe:1.0
      cmd: ["probe"]
      args: ["redis"]
    periodSeconds: 5
    roleUpdateMechanism: DirectAPIServerEventUpdate

该示例中,通过这配置,角色探测 Sidecar 会每隔 5 秒执行一次 sample-probe 镜像中的 probe 命令,并将探测结果封装在 K8s Event 中发给 InstanceSet Controller。InstanceSet Controller 在收到该事件后,会解析出每个实例的角色信息,并更新到到每个实例的角色 Label 上。角色 Label 的格式为:kubeblocks.io/role=<role.name>。同时 InstanceSet Controller 会进一步将角色读写能力也更新到实例 Label 上,格式为:workloads.kubeblocks.io/access-mode=<role.accessMode>

基于角色的服务

通过配置 Service 中的 Selector,以匹配实例上不同的角色 Label 和读写能力 Label,可以使得该 Service 具备不同的服务能力。

比如 PostgreSQL 的读写服务可配置如下:

apiVersion: v1
kind: Service
metadata:
  name: pg-readwrite-svc
spec:
  selector:
    workloads.kubeblocks.io/managed-by: InstanceSet
    workloads.kubeblocks.io/instance: mydb
    kubeblocks.io/role: primary

基于角色的更新策略

前文中讲述实例更新时提到,当配置了角色后,InstanceSet 在做更新时会进一步考虑角色的优先级。

具体来说,InstanceSet 通过 spec.memberUpdateStrategy 支持三种角色更新策略:SerialParallelBestEffortParallel

Serial 即按照角色优先级从低到高依次更新实例。如果两个实例角色优先级相同,则进一步按照 Ordinal 从大到小进行更新。

Parallel 即所有实例并行进行更新,同时遵循 spec.updateStrategy 中的更新策略。

BestEffortParallel 即在保证系统可用的前提下,按照角色优先级从小到大分批进行。更新时同时遵循 spec.updateStrategy 中的更新策略。

大规模实例管理

InstanceSet 最高可管理 10,000 实例,当管理实例数量较多时,可通过 KUBEBLOCKS_RECONCILE_WORKERS 环境变量配置 InstanceSet Controller 的并发工作节点数量,以提高处理速度。

End

KubeBlocks 已发布 v0.9.0!KubeBlocks v0.9.0 全面升级了 API,构建一个 Cluster 更像是在用 Component “搭积木”!新增 topologies 字段,支持多种部署形态。InstanceSet 代替了 StatefulSet 来管理 Pods,支持将指定的 Pod 下线、Pod 原地更新,同时也支持数据库主从架构里主库和从库采用不同的 Pod spec。v0.9.0 还新增了 Reids 集群模式(分片模式),系统的容量、性能以及可用性显著提升!还支持了 MySQL 主备,资源的要求更少,数据复制的开销也更小!快来试试看!

小猿姐诚邀各位体验 KubeBlocks,也欢迎您成为产品的使用者和项目的贡献者。跟我们一起构建云原生数据基础设施吧!

💻 官网: www.kubeblocks.io

🌟 GitHub: https://github.com/apecloud/kubeblocks

🚀 Get started: https://cn.kubeblocks.io/docs/preview/user-docs/try-out-on-playground/try-kubeblocks-on-local-host

关注小猿姐,一起学习更多云原生技术干货。

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

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

相关文章

python-进度条和计时器

from tqdm import tqdm import time# 设置任务的总步骤数 total_steps 100# 使用tqdm创建进度条 with tqdm(totaltotal_steps, unitstep) as pbar:# 开始计时start_time time.time()# 模拟任务步骤for i in range(total_steps):# 模拟每一步的工作负载time.sleep(0.1) # 假设…

C语言:自定义类型进阶(结构体、联合体、枚举)

自定义类型&#xff08;结构体、联合体、枚举&#xff09; 一、结构体&#xff08;一&#xff09;结构体的内存对齐1、结构体内存对齐规则&#xff08;1&#xff09;引子&#xff08;2&#xff09;offsetof 宏函数&#xff08;3&#xff09;内存对齐原理&#xff08;4&#xff…

【HM】DevEco Studio提供Hot Reload(热重载)能力确实好用!帮助开发者更快速进行调试。但要注意以下几点?

​​ 仅支持开发者在真机上运行/调试运行&#xff1a; 1、运行时&#xff0c;选择带H标识的entry&#xff1b; 2、运行设备选择已连接的真机&#xff1b; 3、运行中修改了文件后&#xff0c;点击H标识&#xff0c;在真机即刻可见效果。 注意约束条件&#xff1a; 只支持真…

硬盘信息,电脑硬盘查看工具

硬盘信息&#xff0c;电脑硬盘查看工具 硬盘信息&#xff0c;电脑硬盘查看工具

FPGA开发——状态机的使用

一、概述 我们在使用FPGA进行开发的过程当中&#xff0c;实现一个东西用得最多的实现方法就是状态机的实现方法&#xff0c;用一句话总结就是万物皆可状态机&#xff0c;这和我们在学习Linux时常说的在Linux中万物都是文件差不多&#xff0c;这里就主要就是突出状态机的应用范…

Moretl 文件同步工具 1.1.0.3

永久免费: 前往Gitee最新版本 更新内容 Winform全部切换到.Net Framework 4.0. 更符合大部分的自动化设备. Web提供.Net Framework 4.0的运行时环境安装包 Web打开时,若当前IP为设备,直接显示设备信息 介绍 用途: 定时全量或增量 采集工控机,办公电脑文件以及日志.(SCADA,I…

Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件

​​ jmeter性能测试 1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 本文为JMeter…

进口不锈钢309S螺栓的应用优势

进口不锈钢309S螺栓因其优异的性能和广泛的应用范围而在许多行业中备受青睐。309S不锈钢是一种含硫的易切削不锈钢&#xff0c;具有良好的耐高温和耐腐蚀性能&#xff0c;使其成为高温环境下理想的选择。下面我们就来详细探讨一下进口不锈钢309S螺栓的应用优势。 一、309S不锈钢…

请你谈谈:spring拦截器的应用-preHandle postHandle afterCompletion执行顺序问题的讨论?

首先我们&#xff0c;给出一个demo来看下拦截器方法执行顺序&#xff1a; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.…

第一百八十五节 Java XML教程 - Java DOM简介

Java XML教程 - Java DOM简介 DOM是标准的树结构&#xff0c;其中每个节点包含来自XML结构的一个组件。 XML文档中两种最常见的节点类型是元素节点和文本节点。 使用Java DOM API&#xff0c;我们可以创建节点&#xff0c;删除节点&#xff0c;更改其内容&#xff0c;并遍历节…

TypeScript 定义不同的类型(详细示例)

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

抖音评论爬虫数据采集|抖音评论抓取工具|代码|源码

抖音评论提取软件使用说明 抖音视频评论提取到的内容&#xff1a;1&#xff1a;视频名称 2&#xff1a;视频作者 3&#xff1a;作者地址 4&#xff1a;视频地址 5&#xff1a;评论人昵称。6&#xff1a;评论人主页地址。7&#xff1a;评论内容 8&#xff1a;评论日期 软件支持…

我是客服新手,打字很慢,怎么办?

作为客服新手&#xff0c;打字速度缓慢可能影响工作效率&#xff0c;本文介绍了提高打字速度&#xff0c;以及使用聊天宝快捷回复工具等提效的诀窍 前言 我是客服新手&#xff0c;打字速度缓慢可能影响工作效率。本文将分享如何提高客服打字速度&#xff0c;包括使用聊天宝快捷…

协助我们进行论文写作的ChatGPT们究竟是如何工作的?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 大型语言模型&#xff08;LLMs&#xff09;正在彻底改变我们与人工智能的互动方式&#xff0c;特别是在写作和创作领域。这些先进的人工智能系统不仅在改变作家和创作者的格局&#xff…

<数据集>遥感航拍飞机识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2398张 标注数量(xml文件个数)&#xff1a;2398 标注数量(txt文件个数)&#xff1a;2398 标注类别数&#xff1a;1 标注类别名称&#xff1a;[plane] 序号类别名称图片数框数1plane239815178 使用标注工具&#…

多微信管理不再难:聚合聊天神器助你轻松应对!

在当今社交媒体高度发达的时代&#xff0c;很多人都在使用多个微信账号来管理个人与工作联系。面对如此众多的信息沟通&#xff0c;如何高效管理成了一个难题。 幸运的是&#xff0c;聚合聊天神器的出现&#xff0c;彻底改变了这一局面&#xff0c;让我们轻松应对多微信账号的…

Flutter+Android/ios 桌面小组件

FlutterAndroid/ios 桌面组件 总结&#xff1a; Android和iOS 桌面小组件 需要原生去绘制小组件和更新数据&#xff0c;Flutter层 可以使用 MethodChannel 与原生 通信 来控制 更新数据&#xff0c;app无法主动控制 小组件的添加 和 删除&#xff0c; 只能是用户手动操作 。小…

利率虽降,贷款依旧难?政策暖风下的融资冷思考

​朋友们&#xff0c;最近听到不少人在吐槽贷款难的问题&#xff0c;咱们就来聊聊这背后的故事。你们知道吗&#xff1f;深圳的朱先生可是为这事儿头疼不已。他的公司急需一笔钱来结清货物尾款&#xff0c;可前一年的经营状况不佳&#xff0c;备用金早就见底了。朱先生四处求人…

随机化快速排序 python C C++ 图解 代码 及解析

一&#xff0c;概念及其介绍 快速排序由 C. A. R. Hoare 在 1960 年提出。 随机化快速排序基本思想&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别…

真假公主:一场容貌相似引发的宫廷阴谋

真假公主&#xff1a;一场容貌相似引发的宫廷阴谋 从古至今&#xff0c;每个人的心思都不相同&#xff0c;正如他们的面貌各不相同一样。即使人们的外貌没有明显的差异&#xff0c;但他们的内心和性格却是难以改变的。 话说人的面貌是最为独特的&#xff0c;因为每个人都是由不…