k8s有状态利器-KubeBlocks

一. KubeBlocks是什么?

kubeBlocks 是一个开源的 Kubernetes 数据库 operator,能够帮助用户在 Kubernetes 上运行和管理多种类型的数据库。据我们所知,大多数数据库 operator 通常只能管理某种特定类型的数据库,例如:

  • CloudNativePG、Zalando、CrunchyData、StackGres operator 用于管理 PostgreSQL。
  • Strimzi 用于管理 Kafka。
  • Oracle 和 Percona MySQL operator 用于管理 MySQL。

而 KubeBlocks 是一个通用的数据库 operator。这意味着在设计 KubeBlocks API 时,我们并没有将其与某种特定类型的数据库绑定。恰恰相反,我们抽象了各种数据库的通用特性,最终得到了一个通用的、与数据库引擎无关的 API。因此,围绕这个抽象 API 开发的 operator 实现也与具体的数据库引擎无关。

二. 使用KubeBlocks示例

以下是使用 KubeBlocks Cluster API 编写 YAML 文件并创建一个 MySQL 三副本集群的示例。

apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
  name: test-mysql
  namespace: default
spec:
  terminationPolicy: Delete
  componentSpecs:
  - name: mysql
    componentDef: apecloud-mysql
    replicas: 3
    resources:
      limits:
        cpu: '0.5'
        memory: 0.5Gi
      requests:
        cpu: '0.5'
        memory: 0.5Gi
    volumeClaimTemplates:
    - name: data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi

仅需要修改componentDef字段即可切换数据库引擎,创建一个Redis。下面是Redis YAML 文件稍长一些,因为它创建了两个组件:redis-server 和 sentinel。而且这种方法可以适用于多种引擎。

apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
  name: test-redis
  namespace: default
spec:
  terminationPolicy: Delete
  componentSpecs:
  - name: redis
    componentDef: redis-7
    replicas: 2
    resources:
      limits:
        cpu: '0.5'
        memory: 0.5Gi
      requests:
        cpu: '0.5'
        memory: 0.5Gi
    volumeClaimTemplates:
    - name: data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
  - name: redis-sentinel
    componentDef: redis-sentinel
    replicas: 3
    resources:
      limits:
        cpu: '0.5'
        memory: 0.5Gi
      requests:
        cpu: '0.5'
        memory: 0.5Gi
    volumeClaimTemplates:
      - name: data
        spec:
          accessModes:
            - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi

三. KubeBlocks关键特性

  • 创建和销毁数据库集群。
  • 启动、停止和重启数据库集群。
  • 创建集群时,支持选择引擎插件提供的部署拓扑结构,例如,Redis 提供了基于 Sentinel 的读写分离或 Redis 集群拓扑;MySQL 提供了 Proxy 拓扑,可实现读写分离和高可用解决方案,如内置的 Raft 共识插件、外部 etcd 作为协调器,或 Orchestrator。
  • 支持在单个数据库集群中为多个副本分别配置不同的资源。例如,在一个 MySQL 集群中,主实例使用 8 个 CPU,而读副本使用 4 个 CPU。反观 Kubernetes 的 StatefulSet 则不支持这一能力。
  • 灵活的网络管理:
    • 以动态的方式将数据库访问端点暴露为服务(ClusterIP、LoadBalancer、NodePort)。
    • 支持 HostNetwork。
    • 部分数据库支持通过 Smart Client 进行访问,该客户端会根据服务器返回的节点地址,将请求重新定向到其他节点或支持处理读写分离。Redis、MongoDB 及 Kafka 支持 Smart Client 访问模式。此外,部分数据库还支持实现副本间自动故障转移的客户端,如 etcd。对于这些数据库,KubeBlocks 还支持为每个 Pod (Pod Service)分配服务地址。
  • 支持丰富的 Day-2 运维操作:
    • 水平伸缩(增加和减少副本数量)
    • 变配(调整每个副本的 CPU 和内存资源)
    • PVC 卷容量扩展
    • 备份和恢复功能
    • 配置变更(如果技术上存在可能,也支持热加载)
    • 参数修改
    • 主备切换
    • 滚动升级
    • 指定副本下线
    • 小版本升级
  • 除了声明式 API 之外,KubeBlocks 还提供了 Ops API,用于在数据库集群上执行一次性运维任务。Ops API 还支持其他功能,如排队、并发控制、进度跟踪和操作回滚。
  • 可观测性:支持与 Prometheus 和 Grafana 集成。
  • KubeBlocks 提供了功能强大且直观的命令行工具 kbcli,使得在 Kubernetes 上操作 KubeBlocks CRs 更加简单,减少输入命令行的次数。对于熟悉 Kubernetes 的用户,也可以搭配 kubectl 使用 kbcli,用更简单的方式执行运维操作。

四. KubeBlocks设计动机

在 KubeBlocks 中,为了通过统一 API 支持各种数据库的管理,我们需要抽象不同数据库的拓扑结构和特性。

我们观察到,生产环境中部署的数据库系统通常采用由多个组件组成的拓扑结构。例如,一个生产环境中的 MySQL 集群可能包括多个代理节点(如 ProxySQL、MaxScale、Vitess、WeScale 等)和多个 MySQL 服务器节点(如 MySQL 社区版、Percona、MariaDB、ApeCloud MySQL 等),以实现高可用性和读写分离。类似地,Redis 部署通常由一个主节点和多个只读副本组成,并通过 Sentinel 管理以确保高可用性。一些用户甚至使用 twemproxy 进行水平分片,以实现更大的容量和吞吐量。

这种模块化方法在分布式数据库系统中尤为常见,整个系统被划分为职责明确的独立组件,如数据存储、查询处理、事务管理、日志记录和元数据管理等。这些组件通过网络进行交互,确保系统能够像单节点数据库一样提供强一致性和事务保障,并实现负载均衡、分布式事务以及具备故障切换能力的灾难恢复等复杂操作。

因此,KubeBlocks 采用了分层 API(即 CRD)的设计,由 Cluster(集群)Component(组件) 组成,以适应数据库系统的多组件、高度可变的部署拓扑结构。这些抽象允许我们灵活地表达和管理部署在 Kubernetes 上的各种数据库系统拓扑,并根据所需拓扑轻松地将组件组装成集群。

分层抽象模型

             User
              │
              ▼
       [ Cluster API ] ← 用户定义集群整体属性
              │
              ▼
  [ Component API ] ← 定义数据库子组件(如主节点、代理层)
              │
              ▼
[ ClusterDefinition ] ← 开发者定义组件组合规则

设计要点

  1. 拓扑抽象:通过 ClusterDefinition 预定义多种部署拓扑(如 Redis 的 standalone/replication 模式)
  2. 组件化架构:将数据库拆分为可组合的积木块(Component),支持灵活组装
  3. 引擎无关性:通过标准接口实现新数据库的快速接入

五. 了解KubeBlocks API

分层 API

API 层级 核心资源 目标用户 典型操作
用户层 Cluster 运维人员 创建/删除集群、扩缩容
Backup/Restore 数据备份与恢复
组件层 Component 运维人员 调整组件参数、查看状态
引擎扩展层 ClusterDefinition 开发者 定义新数据库引擎的部署规则
ComponentDefinition 配置组件行为(如健康检查)
运维层 OpsRequest 自动化工具 执行升级、配置变更等操作

六. 普通用户需要了解KubeBlocks什么API

普通用户(运维人员)只需关注高层抽象 API,用于日常操作:

  1. Cluster
    • 创建/删除集群、调整副本数、修改资源配置。
  2. Component
    • 查看组件状态、调整单个组件的参数。
  3. Backup/Restore
    • 触发手动备份、恢复数据到新集群。
  4. Policy(如 BackupPolicyRestorePolicy
    • 配置自动备份策略、定义保留周期。

七. 开发者需要了解什么API

开发者(二次开发)需深入底层 API 和扩展机制:

  1. ClusterDefinition
    • 定义新数据库引擎的模板,如容器镜像、启动命令、持久化配置
  2. ComponentDefinition
    • 细化组件的角色(如主节点、只读副本),配置健康检查规则
  3. OpsRequest
    • 实现自定义运维操作(如数据迁移、版本升级)
  4. PodDisruptionBudget
    • 控制维护期间的最小可用副本数,确保业务连续性
  5. CRD扩展机制
    • 通过自定义 CRD 添加新功能(如集成监控系统)
posted @ 2025-03-11 23:48  rxg456  阅读(327)  评论(0)    收藏  举报