基于k8s operator模式云原生数据库水平扩缩容和垂直扩缩容的详细流程
在K8s Operator模式下,云原生数据库的水平扩缩容(Horizontal) 和 垂直扩缩容(Vertical) 本质都是通过修改自定义资源(Custom Resource)的声明式配置,由Operator监听并驱动集群状态向目标状态收敛。
下面这个对比表格,清晰地展示了两种扩缩容方式的核心区别:
| 特性维度 | 水平扩缩容 (Horizontal Pod Autoscaling) | 垂直扩缩容 (Vertical Pod Autoscaling) |
|---|---|---|
| 核心目标 | 增减 Pod副本数量,应对流量变化,提高可用性。 | 调整 单个Pod的CPU/内存 资源限制,应对单Pod负载变化。 |
| Operator触发方式 | 修改CR中对应组件(如 TiKV, FE)的 replicas 字段。 |
修改CR中Pod模板的 spec.resources(requests/limits)字段。 |
| Operator核心动作 | 1. 扩容:创建新Pod,加入集群,等待数据同步/负载均衡。 2. 缩容:安全驱逐数据,删除指定Pod。 |
1. 执行滚动更新:基于新资源配置,逐个重启Pod。 2. 确保新Pod调度成功。 |
| 对服务影响 | 小。新Pod就绪后服务能力线性变化,缩容时Operator会确保数据安全。 | 较大。每个Pod重启时会有秒级中断,需应用具备重连机制。 |
| 主要耗时 | 扩容:分钟级(拉镜像、启动、数据同步)。 缩容:分钟级(数据迁移或驱逐)。 |
滚动更新:依赖Pod重启速度和健康检查,通常为分钟到十分钟。 |
| 存储考虑 | 有状态组件需依赖持久卷(PVC),缩容时Operator通常只删除Pod,保留PVC以备后用。 | 若使用本地持久卷(Local PV),新Pod可能因原节点资源不足而无法调度,导致更新失败。 |
🔍 Operator内部工作流程详解
当你修改了CR(如 TidbCluster)中的字段并应用后,Operator的Controller会开始工作:
- 监听与调和(Reconcile Loop):Operator的控制器持续监听它所管理的CR对象。一旦检测到
spec字段(如replicas或resources)发生变化,调和循环会被触发。 - 计算差异与生成动作:Operator将CR中声明的期望状态(Desired State) 与集群的实际状态(Current State) 进行比较,计算出需要执行的具体操作(如创建/删除Pod、更新Deployment)。
- 执行与状态更新:Operator调用Kubernetes API执行上述操作,并再次监听结果,更新CR的
status字段,直到实际状态与期望状态一致。
📝 详细操作步骤与最佳实践
以扩缩容一个假设的云原生数据库集群为例:
第一步:变更前检查与准备
# 1. 查看当前集群状态
kubectl get pods -l app=example-db -o wide
kubectl get crd <your-database-crd-name> -o yaml
# 2. 备份关键数据与CR配置
kubectl get <crd-kind> <cluster-name> -n <namespace> -o yaml > backup.yaml
# 3. 检查资源余量(垂直扩容时尤其重要)
kubectl describe nodes | grep -A 5 "Allocatable"
第二步:执行扩缩容操作
# 水平扩容示例(修改 replicas)
spec:
tikv:
replicas: 5 # 从3扩容到5
resources:
requests:
memory: "8Gi"
# 垂直扩容示例(修改 resources)
spec:
tidb:
replicas: 2
resources: # 增加单个Pod的资源
requests:
cpu: "1000m"
memory: "4Gi"
limits:
cpu: "2000m"
memory: "8Gi"
# 应用变更
kubectl apply -f your-cluster-cr.yaml
# 或使用patch命令直接修改
kubectl patch tidbcluster <cluster-name> --type='merge' -p '{"spec":{"tikv":{"replicas":5}}}'
第三步:监控与验证
# 1. 观察Pod状态变化
kubectl get pods -w -l app.kubernetes.io/component=tikv
# 2. 查看Operator日志
kubectl logs -f deployment/<operator-deployment-name> -n <operator-namespace>
# 3. 查看CR状态字段
kubectl get tidbcluster <cluster-name> -o jsonpath='{.status}'
# 4. 验证服务
kubectl exec -it <client-pod> -- mysql -h <db-service> -u root -e "SHOW DATABASES;"
⚠️ 关键注意事项与风险控制
- 数据安全(缩容时):对于有状态组件(如TiKV),Operator应在缩容前自动迁移或驱逐其上的数据副本。务必确认数据库自身状态显示数据副本数充足、健康,再执行缩容。
- 业务影响(垂直扩缩容):垂直扩缩容会导致Pod滚动重启。需确保:
- 在业务低峰期操作。
- 应用客户端配置了优雅重连机制。
- 使用
PodDisruptionBudget来保证最小可用副本数。
- 资源与调度:垂直扩容时,新Pod的资源请求可能超过原节点的可用资源,导致Pod无法调度(Pending)。请确保节点有足够资源,或集群有自动扩缩节点能力。
- 顺序依赖:某些数据库的扩缩容操作有顺序要求(如TiKV缩容未完成时不能扩容)。请遵循官方文档建议。
💡 高级实践与建议
- 蓝绿/金丝雀发布:对于重大垂直扩缩容(如大版本升级伴随规格变更),可考虑先创建一个新版本的数据库集群,通过流量切换来验证,而非直接滚动更新。
- 自动化与HPA/VPA:可结合Kubernetes原生HPA(根据CPU等指标自动水平扩缩)或使用数据库特定的AutoScaler(如TiDB的AutoScaler),实现自动化扩缩容。
如果需要针对特定数据库(如TiDB、MongoDB、Redis Operator等)进行更具体的流程分析,或者想了解如何结合监控指标实现自动化扩缩容,我可以提供更深入的信息。
浙公网安备 33010602011771号