前言

        在上一期服务网格的探讨中,我们触及了云原生流量的精细治理。然而,有状态应用(尤其是数据库)的容器化一直被视为“最后的堡垒”。随着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-csirook-cephlonghornvsphere-csi

3. 本地存储的局限性

  • Pod重新调度后无法访问原节点数据。

  • 需要手动管理亲和性(nodeSelectorlocal 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模式大大降低了数据库运维的复杂性,而云原生存储提供了灵活的持久化选项。掌握这些技术,你将能够构建健壮、弹性、自动化的数据基础设施。

学习建议

  1. 在虚拟机或云上搭建三节点K8s集群,部署Longhorn作为存储。

  2. 使用TiDB Operator部署一套测试集群,练习扩缩容和备份恢复。

  3. 尝试用Velero备份并恢复一个完整应用(包括数据库)。

  4. 阅读TiDB Operator源码,理解Reconcile循环。

本系列后续预告:云原生安全与合规(OPA Gatekeeper、Kyverno、Trivy)。
如果本文对你有帮助,欢迎点赞、收藏、转发

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐