K8s集群etcd磁盘更换

在 Kubernetes 生产环境中更换 etcd 节点的磁盘是一个高风险操作,需谨慎执行。什么情况需要更换磁盘?

  • 磁盘性能不足,如机械盘升级到 SSD

  • 磁盘硬件存在问题,影响稳定性

ETCD 对磁盘性能要求非常敏感,强烈建议使用 SSD 且独立挂盘。如果有更高性能要求,可以选择分离 snapshot(快照文件)/wal(预写日志)的目录,使用两块盘分离 IO 读写。

以下是详细步骤和注意事项,以三节点 etcd 集群 (ETCD 使用 static pod 方式部署)为例:

核心原则

  1. 一次只操作一个节点:确保集群始终满足 N/2 + 1 的存活节点(3 节点集群需至少 2 节点在线)。

  2. 完整备份:操作前必须备份 etcd 数据,并制定好灾备恢复计划。

  3. 业务低峰期操作:减少对集群的影响,并制定好验证方案。

  4. 演练及回滚计划:生产环境操作前务必在测试环境演练!确保团队熟悉流程并备有回滚计划。

操作步骤

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:更换物理磁盘

    1. 卸载旧磁盘(如 umount -l dev/sdb)。

    2. 安装新磁盘并格式化(例如 mkfs.xfs /dev/sdc)。

    3. 挂载到原目录(如 /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

关键注意事项

  1. 磁盘挂载配置

    • 更新 /etc/fstab 确保重启后自动挂载:

      echo "/dev/sdc /var/lib/etcd xfs defaults 0 0" >> /etc/fstab
    • 使用 lsblk 确认磁盘路径。

  2. etcd 参数检查

    • 确保 etcd.yaml 中的 data-dir 指向新磁盘路径(如 /var/lib/etcd)。

    • 如果选择分离 snapshot/wal 以达到提升性能的目的, 需在启动前,需修改 etcd.yaml文件,增加 wal-dir 配置:

    --data-dir=/var/lib/etcd/data
    --wal-dir=/var/lib/etcd/wal
    • 验证证书路径和参数正确。

  3. 灾难恢复预案

    • 若操作中集群崩溃(如意外停机两个节点):

      • 从备份恢复整个集群:etcdutl snapshot restore ...

      • 重置 Kubernetes 控制平面组件。

  4. 性能优化建议

    • 使用 SSD 磁盘(etcd 对 I/O 延迟敏感)。

    • 分离 etcd 数据目录与操作系统磁盘

    • 调整 etcd 的 --quota-backend-bytes 限制磁盘用量(默认 2GB)。

    • 如果选择分离 snapshot/wal 以达到提升性能的目的,可以使用使用两块新盘挂载到不同的目录,如 /var/lib/etcd/data 与 /var/lib/etcd/wal 

常见问题处理

  • 节点无法加入集群

    • 检查网络防火墙(端口 2379/2380)。

    • 确保证书未过期且 CN/SAN 匹配。

    • 查看 etcd 日志:journalctl -u etcd 或 kubectl logs -n kube-system etcd-node1

  • 数据不一致

    • 使用 etcdctl check perf 测试性能。

    • 若数据损坏,从备份恢复受影响节点。


参考:


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6408.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注