云原生存储与数据库治理:K8s Operator + TiDB 实战指南(建议收藏)
前言
在上一期服务网格的探讨中,我们触及了云原生流量的精细治理。然而,有状态应用(尤其是数据库)的容器化一直被视为“最后的堡垒”。随着Operator模式的成熟和云原生存储的发展,如今在K8s上运行生产级数据库已成为常态。本文将系统讲解K8s存储生态(CSI、PV/PVC、Rook、Longhorn),并深入TiDB Operator的架构与实战,同时介绍MySQL Operator(如RadonDB MySQL)、备份恢复(Velero、Dump)以及数据库网格(Database Mesh)的前沿理念。全文包含大量YAML示例和运维命令,助你驾驭有状态工作负载。
一、Kubernetes存储基础回顾
1. 持久卷(PV)与持久卷声明(PVC)
-
PV:集群资源,由管理员提供或动态创建。
-
PVC:用户请求存储,匹配PV后绑定。
-
StorageClass:定义存储类型(fast、ssd、hdd)和回收策略,支持动态供给。
yaml
# StorageClass 示例(使用本地SSD)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-ssd
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
# PVC 申请
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-data
spec:
storageClassName: local-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
2. CSI(容器存储接口)
-
CSI 是K8s对接外部存储的标准(如AWS EBS、GCE PD、Ceph RBD、NFS)。
-
主流CSI驱动:
csi-hostpath-driver(测试)、ceph-csi、rook-ceph、longhorn、vsphere-csi。
3. 本地存储的局限性
-
Pod重新调度后无法访问原节点数据。
-
需要手动管理亲和性(
nodeSelector、local PV static provisioner)。
二、云原生存储方案:Rook 与 Longhorn
1. Rook + Ceph(生产级推荐)
Rook 是云原生存储编排器,将Ceph分布式存储以Operator模式运行在K8s上。
部署Rook Ceph:
git clone https://github.com/rook/rook.git
cd rook/deploy/examples
kubectl create -f crds.yaml -f common.yaml -f operator.yaml
kubectl create -f cluster.yaml # 创建Ceph集群
# 验证
kubectl -n rook-ceph get pods
创建StorageClass:
yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
replicated:
size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
reclaimPolicy: Delete
优点:成熟、高性能、支持块/文件/对象存储。
缺点:运维复杂,资源占用较大。
2. Longhorn(轻量级、易用)
Longhorn 是CNCF孵化项目,基于微服务架构,使用引擎+副本实现分布式块存储。
安装Longhorn:
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.5.3/deploy/longhorn.yaml
创建StorageClass:
yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: longhorn
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
numberOfReplicas: "3"
staleReplicaTimeout: "30"
fromBackup: ""
优势:Web UI管理、快照/备份、增量复制、支持磁盘空间监控。
三、Operator模式:有状态应用自动化
1. 什么是Operator?
Operator 是自定义控制器,利用K8s CRD(自定义资源)来封装运维知识(部署、扩缩容、备份、升级、故障恢复)。
核心思想:以“期望状态”驱动自动化操作,类似网站可靠性工程师(SRE)的代码化。
2. 常用数据库Operator
| 数据库 | Operator | 特点 |
|---|---|---|
| TiDB | TiDB Operator | 分布式HTAP,水平扩展,MySQL协议 |
| MySQL | RadonDB MySQL / Oracle MySQL Operator | 支持主从、组复制 |
| PostgreSQL | CloudNativePG / Zalando Postgres Operator | 高可用、备份、克隆 |
| MongoDB | MongoDB Community Kubernetes Operator | 副本集、分片集群 |
| Redis | Redis Operator | 集群模式、哨兵模式 |
| Kafka | Strimzi | 声明式部署、滚动升级、认证 |
四、TiDB Operator 深度实战
TiDB 是开源的分布式NewSQL数据库,兼容MySQL协议,天然支持水平扩展和强一致性。TiDB Operator 是专为K8s设计的自动化运维系统。
1. 安装TiDB Operator
# 安装CRD和Operator
kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.5.1/manifests/crd.yaml
kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.5.1/manifests/operator.yaml
# 验证
kubectl -n tidb-admin get pods
2. 部署TiDB集群
yaml
# tidb-cluster.yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
name: basic
spec:
version: v7.5.0
timezone: UTC
pvReclaimPolicy: Retain
discovery: {}
pd:
baseImage: pingcap/pd
replicas: 3
requests:
storage: "10Gi"
config: {}
tidb:
baseImage: pingcap/tidb
replicas: 2
service:
type: ClusterIP
config: {}
tikv:
baseImage: pingcap/tikv
replicas: 3
requests:
storage: "100Gi"
config: {}
---
# tidb-dashboard 可选
apiVersion: pingcap.com/v1alpha1
kind: TidbDashboard
metadata:
name: basic
spec:
clusters:
- name: basic
image: pingcap/tidb-dashboard:latest
kubectl apply -f tidb-cluster.yaml -n tidb-cluster
kubectl -n tidb-cluster get pods -l app.kubernetes.io/instance=basic
3. 访问TiDB
# 端口转发
kubectl port-forward -n tidb-cluster svc/basic-tidb 4000:4000
mysql -h 127.0.0.1 -P 4000 -u root
4. 水平伸缩
# 扩展TiKV节点数到5
kubectl patch tc basic -n tidb-cluster --type='json' -p='[{"op": "replace", "path": "/spec/tikv/replicas", "value": 5}]'
5. 备份与恢复(使用BR工具)
yaml
# Backup CR
apiVersion: pingcap.com/v1alpha1
kind: Backup
metadata:
name: demo-backup
spec:
backupType: full
br:
cluster: basic
clusterNamespace: tidb-cluster
sendCredToTikv: true
s3:
provider: aws
region: us-west-2
bucket: my-bucket
prefix: tidb-demo
secretName: s3-secret
kubectl apply -f backup.yaml
kubectl get backup -n tidb-cluster
6. 升级集群
kubectl edit tc basic -n tidb-cluster
# 修改 spec.version 为 v7.6.0
# Operator 自动滚动升级(PD→TiKV→TiDB)
7. 配置TiDB集群监控
TiDB Operator 内置集成了Prometheus和Grafana:
kubectl port-forward -n tidb-cluster svc/basic-grafana 3000:3000
# 默认账号 admin/admin
五、MySQL Operator:RadonDB MySQL 实战
RadonDB MySQL 基于MySQL Group Replication,提供高可用、备份、监控等能力。
1. 安装Operator
kubectl apply -f https://raw.githubusercontent.com/radondb/radondb-mysql-kubernetes/main/mysql-operator.yaml
2. 部署MySQL集群(3节点)
yaml
apiVersion: mysql.radondb.com/v1
kind: MysqlCluster
metadata:
name: sample-mysql
spec:
replicas: 3
mysqlVersion: "8.0"
persistence:
enabled: true
size: 50Gi
resources:
requests:
memory: 1Gi
cpu: 500m
backup:
enabled: true
schedule: "0 2 * * *"
maxRetain: 7
storage:
size: 100Gi
kubectl apply -f mysql-cluster.yaml
kubectl get mysqlcluster sample-mysql
3. 高可用测试
# 删除主Pod
kubectl delete pod sample-mysql-master-0
# 观察选举和恢复
kubectl logs -f sample-mysql-master-0 --container mysql
六、备份与恢复:Velero + Restic
Velero 是K8s资源的灾备工具,支持备份PV数据(通过Restic或CSI快照)。
1. 安装Velero(以AWS S3为例)
velero install \
--provider aws \
--bucket my-bucket \
--backup-location-config region=us-east-1 \
--snapshot-location-config region=us-east-1 \
--plugins velero/velero-plugin-for-aws:v1.9.0 \
--secret-file ./credentials-velero
2. 备份整个命名空间
velero backup create my-app-backup --include-namespaces myapp
velero backup describe my-app-backup
velero backup logs my-app-backup
3. 定时备份
velero schedule create daily-backup --schedule="0 2 * * *" --include-namespaces myapp
4. 恢复
velero restore create --from-backup my-app-backup
七、数据库治理:Database Mesh 与 Pisanix
Database Mesh(数据库网格)是服务网格理念在数据库层的延伸,用于解决:
-
多数据库类型(MySQL、PG、Redis)的统一接入。
-
读写分离、分库分表、影子表(压测)。
-
数据库连接池管理、SQL审计、动态限流。
Pisanix(OpenAtom基金会项目)是Database Mesh的实现,通过Sidecar代理数据库流量。
核心能力
-
SQL解析:识别SQL类型、表名、条件,进行路由或改写。
-
故障注入:模拟数据库延迟或错误,验证容错能力。
-
审计与脱敏:动态脱敏敏感数据。
yaml
# 示例:读写分离配置
apiVersion: core.database-mesh.io/v1alpha1
kind: DatabaseEndpoint
metadata:
name: mysql-cluster
spec:
selector:
matchLabels:
app: mysql
type: MySQL
hosts:
- host: mysql-master
role: WRITER
- host: mysql-slave
role: READER
weight: 100
注意:Database Mesh尚属早期,生产使用需谨慎,但理念值得关注。
八、生产最佳实践
1. 存储选型建议
| 场景 | 推荐存储 | 理由 |
|---|---|---|
| 生产数据库 | Rook-Ceph / 云厂商块存储(EBS) | 高可靠、快照支持 |
| 测试/开发 | Longhorn / Local PV | 简单、资源占用低 |
| 高吞吐日志 | 共享文件系统(NFS) | 不适合数据库,适合附件、日志 |
2. 数据库Pod调度策略
-
使用PodAntiAffinity将数据库实例分散到不同节点。
-
为数据库Pod预留资源并设置PriorityClass防止驱逐。
yaml
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: tidb-tikv
topologyKey: kubernetes.io/hostname
3. 备份策略
-
全量备份:每周一次,保留4周。
-
增量备份:每日一次(TiDB BR支持增量)。
-
Binlog备份:实时(TiDB Pump/Drainer)。
-
定期演练恢复:至少每季度在测试集群恢复备份。
4. 监控告警
-
使用Operator自带的Grafana面板(TiDB、MySQL Operator)。
-
配置告警规则:复制延迟、内存/磁盘使用率、备份失败。
5. 升级与变更
-
先升级Operator,再升级数据库集群。
-
使用
canary模式:先升级1个副本观察。 -
升级前备份数据。
九、常见问题与排查
1. PVC 无法绑定
-
检查StorageClass是否存在且支持动态供给。
-
检查节点是否有足够存储(
kubectl describe node)。
2. TiKV 频繁重启
-
内存限制不足,TiKV需要至少8GB内存(推荐16GB+)。
-
磁盘IO争抢:使用本地SSD,避免同节点多个TiKV实例。
3. Operator 无法创建集群
-
检查CRD是否安装:
kubectl get crd | grep tidbcluster -
查看Operator日志:
kubectl logs -n tidb-admin deployment/tidb-operator
4. 数据损坏恢复
-
使用全量备份+增量binlog恢复到最近时间点。
-
如果未配置备份,尝试从卷快照恢复(需存储支持)。
十、未来趋势
-
K8s原生数据库:如CockroachDB、YugabyteDB天生为云设计。
-
Serverless数据库:如TiDB Cloud Serverless,不再感知底层。
-
数据联邦:通过类似Vitess的中间件,统一访问多个数据库。
-
FinOps:在K8s上精细化数据库资源成本,使用动态伸缩。
结语
在K8s上运行有状态工作负载已经从“试验”走向“生产标配”。Operator模式大大降低了数据库运维的复杂性,而云原生存储提供了灵活的持久化选项。掌握这些技术,你将能够构建健壮、弹性、自动化的数据基础设施。
学习建议:
-
在虚拟机或云上搭建三节点K8s集群,部署Longhorn作为存储。
-
使用TiDB Operator部署一套测试集群,练习扩缩容和备份恢复。
-
尝试用Velero备份并恢复一个完整应用(包括数据库)。
-
阅读TiDB Operator源码,理解Reconcile循环。
本系列后续预告:云原生安全与合规(OPA Gatekeeper、Kyverno、Trivy)。
如果本文对你有帮助,欢迎点赞、收藏、转发!
更多推荐

所有评论(0)