暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

TiDB x KubeBlocks 集成案例

原创 严少安 2024-05-12
397

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 事务,对于一些有强一致需求的场景友好,例如:银行转账
  • 具有丰富的工具链生态,覆盖数据迁移、同步、备份等多种场景

KubeBlocks 介绍

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

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

主要功能有:

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

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

KubeBlocks 环境准备

1. 操作系统

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

[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

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

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

[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 集群。

kind create cluster kubectl cluster-info

输出:

[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。

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

输出:

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 增加自动补全功能:

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 集群。

kbcli playground init

输出:

[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 插件
kbcli addon search tidb kbcli addon install tidb kbcli addon list | egrep 'NAME|tidb' kbcli addon enable tidb

输出:

[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 集群,并查看集群列表。

[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

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

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

[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

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

[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 信息:

[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 数据库的版本。

[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 –

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论