TiDB x KubeBlocks 集成案例

TiDB x KubeBlocks 集成案例

ShawnYan Lv.6

TiDB 不止可以运行在 OP 也可以运行在各种云上,或者可以直接选择 TiDB Cloud。

但是很多企业也会选择自建云或者自建容器池,比如,Amazon EKS, Google Cloud GKE, Azure AKS 或者自托管的 Kubernetes。

今天介绍一位 TiDB 的新朋友,一款可在 k8s 上运行和管理数据库的开源控制平台:KubeBlocks

TiDB 介绍

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 协议和 MySQL 生态等重要特性。目标是为用户提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)、HTAP 解决方案。TiDB 适合高可用、强一致要求较高、数据规模较大等各种应用场景。

与传统的单机数据库相比,TiDB 具有以下优势:

  • 纯分布式架构,拥有良好的扩展性,支持弹性的扩缩容
  • 支持 SQL,对外暴露 MySQL 的网络协议,并兼容大多数 MySQL 的语法,在大多数场景下可以直接替换 MySQL
  • 默认支持高可用,在少数副本失效的情况下,数据库本身能够自动进行数据修复和故障转移,对业务透明
  • 支持 ACID 事务,对于一些有强一致需求的场景友好,例如:银行转账
  • 具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景
tidb-architecture-v6.png

KubeBlocks 介绍

KubeBlocks 是基于 Kubernetes 的云原生数据基础设施,将顶级云服务提供商的大规模生产经验与增强的可用性和稳定性改进相结合,帮助用户轻松构建容器化、声明式的关系型、NoSQL、流计算和向量型数据库服务。

KubeBlocks 的名字源自 Kubernetes(K8s)和乐高积木,致力于让 K8s 上的数据基础设施管理就像搭乐高积木一样,既高效又有趣。

主要功能有:

  • 支持多云,与 AWS、GCP、Azure、阿里云等云平台兼容。
  • 支持 MySQL、PostgreSQL、TiDB 等 32 个主流数据库和流计算引擎。
  • 提供生产级性能、弹性、可扩展性和可观察性。
  • 简化 day-2 操作,例如升级、扩展、监控、备份和恢复。
  • 包含强大且直观的命令行工具。
  • 仅需几分钟,即可建立一个适用于生产环境的完整数据基础设施。
kubeblocks-architecture.png

KubeBlocks 可以帮助用户轻松构建关系型、NoSQL、流计算和向量型数据库服务,目前已支持 30 余种数据库引擎,比如 TiDB。

KubeBlocks 环境准备

1. 操作系统

推荐在 Rocky Linux 9 操作系统进行部署测试,CentOS 7 的内核版本太低了。

1
2
3
4
[root@shawnyan ~]# cat /etc/redhat-release 
Rocky Linux release 9.3 (Blue Onyx)
[root@shawnyan ~]# uname -r
5.14.0-362.13.1.el9_3.x86_64

2. 安装 go, docker, kubectl, kind

由于篇幅原因,具体安装步骤略。

查看已安装的组件版本信息:

1
2
3
4
5
6
7
8
9
[root@shawnyan ~]# go version
go version go1.21.9 linux/amd64
[root@shawnyan ~]#
[root@shawnyan ~]# docker --version
Docker version 26.1.2, build 211e74b
[root@shawnyan ~]#
[root@shawnyan ~]# kubectl version --client
Client Version: v1.30.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3

(only can deploy kb with docker, can not launch with podman.)

3. 创建 k8s 集群

本文仅做 PoC 演示,非标准生产环境部署步骤,因此这里使用 kind 创建 k8s 集群。

1
2
kind create cluster
kubectl cluster-info

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@shawnyan ~]# kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.29.2) 🖼
✓ Preparing nodes 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"
You can now use your cluster with:

kubectl cluster-info --context kind-kind

Thanks for using kind! 😊
[root@shawnyan ~]# kubectl cluster-info --context kind-kind
Kubernetes control plane is running at https://127.0.0.1:34967
CoreDNS is running at https://127.0.0.1:34967/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

到此,Kubernetes 集群部署完成,接下来安装 KubeBlocks 。

4. 安装 kbcli

kbcli 是 KubeBlocks 的命令行界面 (CLI) 工具。

kbcli 具有以下特点:

  • 管理 KubeBlock,包括安装、卸载、查看状态、升级等。
  • 管理集群,包括创建、删除、配置更改、备份和恢复等。
  • 支持 playground 在本地或云端快速体验 KubeBlocks。

执行下面的命令安装 kbcli。

1
curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash

输出:

1
2
3
4
5
6
7
Your system is linux_amd64
Installing kbcli ...

Getting the latest kbcli ...
...
kbcli installed successfully.
kbcli: 0.8.2

(but, this cmd only can use under root user, that’s not good enough.)

5. 开启 kbcli 自动补全

kbcli 支持命令自动补全,例如在 Linux 下为 bash 增加自动补全功能:

1
2
kbcli completion bash > /etc/bash_completion.d/kbcli
source /etc/bash_completion.d/kbcli

6. 使用 kbcli 安装 KubeBlocks

标准模式下,在安装 KubeBlocks 之前,需要先安装 k8s。

这里为便于演示,启用 kbcli playground 功能搭建 demo 环境。

初始化过程中,将使用 K3d 在容器中创建 Kubernetes 集群,在 K3d 集群中部署 KubeBlocks,并创建独立的 MySQL 集群。

1
kbcli playground init

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@shawnyan ~]# kbcli playground init
Create k3d cluster: kb-playground OK
Merge kubeconfig to /root/.kube/config OK
Switch current context to k3d-kb-playground OK
Write kubeconfig to /root/.kbcli/playground/kubeconfig OK
KubeBlocks will be installed to namespace "kb-system"
Kubernetes version 1.23.8+k3s1
Kubernetes provider K3S
kbcli version 0.8.2
Create CRDs OK
Add and update repo kubeblocks OK
Install KubeBlocks 0.8.2 OK
Wait for addons to be enabled
apecloud-mysql OK
...
Create cluster mycluster (ClusterDefinition: apecloud-mysql) OK

KubeBlocks playground init SUCCESSFULLY!

Kubernetes cluster "kb-playground" has been created.
Cluster "mycluster" has been created.
Elapsed time: 5m50s
...
[root@shawnyan ~]#

使用 KubeBlocks 创建 TiDB 集群

1. 在 KubeBlocks 中启用 TiDB 插件

KubeBlocks 支持部署若干国产数据库,下面演示如何启用 TiDB 插件。

  1. 查找 tidb 插件
  2. 安装 tidb 插件
  3. 查看插件列表
  4. 启用 tidb 插件
1
2
3
4
kbcli addon search tidb
kbcli addon install tidb
kbcli addon list | egrep 'NAME|tidb'
kbcli addon enable tidb

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@shawnyan ~]# kbcli addon search tidb
ADDON VERSION INDEX
tidb 0.1.0-alpha.1 kubeblocks
[root@shawnyan ~]#
[root@shawnyan ~]# kbcli addon install tidb
Default addon index "kubeblocks" has been added.
addon tidb installed successfully
[root@shawnyan ~]#
[root@shawnyan ~]# kbcli addon list | egrep 'NAME|tidb'
NAME VERSION PROVIDER STATUS AUTO-INSTALL
tidb 0.1.0-alpha.1 community Enabled true
[root@shawnyan ~]#
[root@shawnyan ~]# kbcli addon enable tidb
addon.extensions.kubeblocks.io/tidb enabled

2. 创建 TiDB 集群

使用 kbcli cluster 命令管理集群。

创建 TiDB 集群,并查看集群列表。

1
2
3
4
5
6
7
[root@shawnyan ~]# kbcli cluster create tidb-demo --cluster-definition tidb
Info: --cluster-version is not specified, ClusterVersion tidb-v7.1.2 is applied by default
Cluster tidb-demo created
[root@shawnyan ~]#
[root@shawnyan ~]# kbcli cluster list
NAME NAMESPACE CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS CREATED-TIME
tidb-demo default tidb tidb-v7.1.2 Delete Running May 10,2024 18:57 UTC+0800

这里可以看到,集群已创建成功,并运行正常。

查看集群定义和版本信息:

1
2
3
4
5
6
7
[root@shawnyan ~]# kbcli clusterdefinition list | egrep 'NAME|tidb'
NAME MAIN-COMPONENT-NAME STATUS AGE
tidb tidb Available 41h
[root@shawnyan ~]#
[root@shawnyan ~]# kbcli clusterversion list | egrep 'NAME|tidb'
NAME CLUSTER-DEFINITION STATUS IS-DEFAULT CREATED-TIME
tidb-v7.1.2 tidb Available false May 10,2024 18:48 UTC+0800

查看集群中的组件和实例信息:

1
2
3
4
5
6
7
8
9
10
11
[root@shawnyan ~]# kbcli cluster list-components tidb-demo
NAME NAMESPACE CLUSTER TYPE IMAGE
pd default tidb-demo pd docker.io/pingcap/pd:v7.1.2
tikv default tidb-demo tikv docker.io/pingcap/tikv:v7.1.2
tidb default tidb-demo tidb docker.io/pingcap/tidb:v7.1.2
[root@shawnyan ~]#
[root@shawnyan ~]# kbcli cluster list-instances tidb-demo
NAME NAMESPACE CLUSTER COMPONENT STATUS ROLE ACCESSMODE AZ CPU(REQUEST/LIMIT) MEMORY(REQUEST/LIMIT) STORAGE NODE CREATED-TIME
tidb-demo-pd-0 default tidb-demo pd Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi k3d-kb-playground-server-0/172.19.0.2 May 12,2024 09:28 UTC+0800
tidb-demo-tikv-0 default tidb-demo tikv Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi k3d-kb-playground-server-0/172.19.0.2 May 12,2024 09:28 UTC+0800
tidb-demo-tidb-0 default tidb-demo tidb Running <none> <none> <none> 1 / 1 1Gi / 1Gi data:20Gi k3d-kb-playground-server-0/172.19.0.2 May 12,2024 09:28 UTC+0800

查看 pod 信息:

1
2
3
4
5
[root@shawnyan ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tidb-demo-pd-0 1/1 Running 0 159m
tidb-demo-tikv-0 1/1 Running 0 159m
tidb-demo-tidb-0 2/2 Running 6 (149m ago) 159m

3. 连接 TiDB 集群

在确认 TiDB 集群创建成功后,我们连接到 TiDB 集群,并查看 TiDB 数据库的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@shawnyan ~]# mysql -uroot -h127.0.0.1 -P4000
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 405
Server version: 5.7.25-TiDB-v7.1.2 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

(root@127.0.0.1) [(none)]> select tidb_version()\G
*************************** 1. row ***************************
tidb_version(): Release Version: v7.1.2
Edition: Community
Git Commit Hash: aa6ed99ae63191bc98e883fd4c369ae7482cccb7
Git Branch: heads/refs/tags/v7.1.2
UTC Build Time: 2023-10-21 07:46:04
GoVersion: go1.20.10
Race Enabled: false
TiKV Min Version: 6.2.0-alpha
Check Table Before Drop: false
Store: tikv
1 row in set (0.01 sec)

(root@127.0.0.1) [(none)]> select now();
+---------------------+
| now() |
+---------------------+
| 2024-05-12 01:16:40 |
+---------------------+
1 row in set (0.01 sec)

(root@127.0.0.1) [(none)]>

到此,我们借助 KubeBlocks 成功在 k8s 上运行一套 TiDB 集群。

总结

了解 TiDB 的同学看过本文之后或许会感慨,好产品是有共性的。

比如,TiDB 有 tiup,KubeBlocks 有 kbcli,TiDB/KB 都有 playbook,以便于开发者快速上手学习。

更多内容,请参阅官方文档:

🌻 往期精彩 ▼

– END –

foot.png

如果这篇文章为你带来了灵感或启发,就请帮忙点『赞』or『在看』or『转发』吧,感谢!(๑˃̵ᴗ˂̵)

  • Title: TiDB x KubeBlocks 集成案例
  • Author: ShawnYan
  • Created at: 2024-05-12 23:00:00
  • Updated at: 2024-05-12 23:00:00
  • Link: https://shawnyan.cn/2024/tidb/tidb-with-kubeblocks/
  • License: This work is licensed under CC BY-NC-SA 4.0.
if (hexo-config('comment.enable') == true && hexo-config('comment.system') != "") { if (hexo-config('comment.system') == "waline") { @require "./waline.styl" } else if (hexo-config('comment.system') == "gitalk") { @require "./gitalk.styl" } else if (hexo-config('comment.system') == "twikoo") { @require "./twikoo.styl" } } .comments-container display inline-block margin-top $spacing-unit width 100% #comment-anchor width 100% height 10px .comment-area-title width 100% margin 10px 0 font-size 1.38rem color var(--default-text-color) font-family 'Consolas', '宋体', sans-serif font-weight bold i color var(--default-text-color) +redefine-tablet() margin 5px 0 font-size 1.2rem