在 Kubernetes 生产环境中更换 etcd 节点的磁盘是一个高风险操作,需谨慎执行。什么情况需要更换磁盘?
磁盘性能不足,如机械盘升级到 SSD
磁盘硬件存在问题,影响稳定性
ETCD 对磁盘性能要求非常敏感,强烈建议使用 SSD 且独立挂盘。如果有更高性能要求,可以选择分离 snapshot(快照文件)/wal(预写日志)的目录,使用两块盘分离 IO 读写。
以下是详细步骤和注意事项,以三节点 etcd 集群 (ETCD 使用 static pod 方式部署)为例:
核心原则
一次只操作一个节点:确保集群始终满足
N/2 + 1
的存活节点(3 节点集群需至少 2 节点在线)。完整备份:操作前必须备份 etcd 数据,并制定好灾备恢复计划。
业务低峰期操作:减少对集群的影响,并制定好验证方案。
演练及回滚计划:生产环境操作前务必在测试环境演练!确保团队熟悉流程并备有回滚计划。
操作步骤
1. 前置准备
备份 etcd 数据(在任一 etcd 节点执行):
ETCDCTL_API=3 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /tmp/etcd-snapshot-$(date +%Y%m%d).db
验证备份完整性:
etcdutl snapshot status /tmp/etcd-snapshot-*.db
检查集群健康状态:
ETCDCTL_API=3 etcdctl \ --endpoints=10.0.1.6:2379,10.0.1.7:2379,10.0.1.8:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint status -w table ETCDCTL_API=3 etcdctl \ --endpoints=10.0.1.6:2379,10.0.1.7:2379,10.0.1.8:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint health -w table
找到 leader 节点,换盘先从 follower 节点开始
2. 更换第一个 etcd 节点的磁盘(以 etcd-node1
为例)
步骤 2.1:停止 etcd 服务,备份 etcd 目录数据
mv /etc/kubernetes/manifests/etcd.yaml /etc/kubernetes/ # 检查 etcd 进程是否已经退出 ps -ef | grep etcd kubectl get po -n kube-system | grep etcd # 备份 etcd 目录数据 cp -rp {etcd 数据目录} {备份目录}
步骤 2.2:更换物理磁盘
卸载旧磁盘(如
umount -l dev/sdb
)。安装新磁盘并格式化(例如
mkfs.xfs /dev/sdc
)。挂载到原目录(如
/var/lib/etcd
):# 可将新盘做成lvm挂载,方便后续的运维和扩容等 pvcreate /dev/sdc vgcreate vg_etcd /dev/sdc lvcreate -l +100%FREE -n lv_etcd vg_etcd mkfs.xfs /dev/vg_etcd/lv_etcd # 配置挂载信息,防止机器重启后丢失 echo "/dev/vg_etcd/lv_etcd /var/lib/etcd xfs defaults 0 0" >> /etc/fstab mount -a
步骤 2.3:恢复数据(可选)
通常新节点会从集群同步数据,但若需快速恢复,可从备份还原:
cp -r {备份目录} {etcd 新盘挂载的数据目录}
步骤 2.4:重启 etcd 服务
mv /etc/kubernetes/etcd.yaml /etc/kubernetes/manifests/ # 确认etcd启动 kubectl get po -n kube-system | grep etcd
步骤 2.5:验证节点恢复
ETCDCTL_API=3 etcdctl \ --endpoints=10.0.1.6:2379,10.0.1.7:2379,10.0.1.8:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint status -w table ETCDCTL_API=3 etcdctl \ --endpoints=10.0.1.6:2379,10.0.1.7:2379,10.0.1.8:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint health -w table watch "etcdctl member list" # 观察节点状态变为 started
3. 重复操作其他节点
按相同流程操作
etcd-node2
→etcd-node3
。每次间隔至少 10 分钟,确保集群完全稳定,中间间隔可做集群验证。
4. 最终验证
集群状态:
ETCDCTL_API=3 etcdctl \ --endpoints=10.0.1.6:2379,10.0.1.7:2379,10.0.1.8:2379 \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ endpoint status --cluster -w table
Kubernetes 功能测试:
kubectl get nodes --v=7 kubectl create deployment test --image=nginx && kubectl delete deployment test
关键注意事项
磁盘挂载配置:
更新
/etc/fstab
确保重启后自动挂载:echo "/dev/sdc /var/lib/etcd xfs defaults 0 0" >> /etc/fstab
使用
lsblk
确认磁盘路径。etcd 参数检查:
确保
etcd.yaml
中的data-dir
指向新磁盘路径(如/var/lib/etcd
)。如果选择分离 snapshot/wal 以达到提升性能的目的, 需在启动前,需修改 etcd.yaml文件,增加 wal-dir 配置:
验证证书路径和参数正确。
灾难恢复预案:
若操作中集群崩溃(如意外停机两个节点):
从备份恢复整个集群:
etcdutl snapshot restore ...
重置 Kubernetes 控制平面组件。
性能优化建议:
使用 SSD 磁盘(etcd 对 I/O 延迟敏感)。
分离 etcd 数据目录与操作系统磁盘。
调整
etcd
的--quota-backend-bytes
限制磁盘用量(默认 2GB)。如果选择分离 snapshot/wal 以达到提升性能的目的,可以使用使用两块新盘挂载到不同的目录,如 /var/lib/etcd/data 与 /var/lib/etcd/wal 。
--data-dir=/var/lib/etcd/data --wal-dir=/var/lib/etcd/wal
常见问题处理
节点无法加入集群:
检查网络防火墙(端口
2379/2380
)。确保证书未过期且 CN/SAN 匹配。
查看 etcd 日志:
journalctl -u etcd
或kubectl logs -n kube-system etcd-node1
数据不一致:
使用
etcdctl check perf
测试性能。若数据损坏,从备份恢复受影响节点。
参考: