跳到正文
返回

事故中反思

编辑此页

总结/var/lib/containerd 和 /var/lib/kubelet 目录迁移后服务异常, 数据丢失.

迁移数据期间, k8s 重启异常:

导火索是, 需要在现有的k8s 中部署一个MinerU 的服务, 官方提供的镜像打包出来后是40G, 而containerd 和kubelete 数据都在系统盘中, 系统盘总共100G, 在尝试部署期间触发了磁盘盘占用超过85%的警告而终止.

而我们的数据盘有1T容量, 并且余量很富足.

思考后决定: 迁移 /var/lib/containerd 和 /var/lib/kubelet 目录到数据盘.

在查阅资料后,实操步骤是:

但是, 启动就发现各项应用异常, 服务均初始化了,原有的数据都没了.

并且在部署 MinerU 后, 试图通过Ingress 向外发布时, 始终无法更新ingress, 在尝试主动结束 nginx-ingress 对应的pod后, ingress 再也无法启动, 提示80 端口占用————但本机确实端口未占用.

从某种程度上来讲, 这是不幸的, 自己亲自触发了一个顶级事故, 服务异常, 数据永久丢失.

但是呢, 又是幸运的, 和MinerU 相关的任务, 在交代的任务时间点前, 做完了(停掉containerd 和kubelet,用docker run 人工配置启动每个基础服务+应用), 同时这台服务器上没有生产数据.

但, 警钟长鸣, 实际作业中的标准/细节, 都需要改善:

回过头来, 思考一下, 这次迁移出现问题, 是为什么呢?很难回溯了, 结合AI 问答, 我能理解并接受的理由如下:

  1. /var/lib/kubelet 和 /var/lib/containerd 目录下大量包含软连接,硬链接和挂载点, 特别是我没有先驱逐节点, 这类东西格外的多.
  2. rsync 在跨磁盘(系统盘和数据盘, 数据盘挂载在/data下)复制时, 软连接、硬链接、挂载点是不能完全相同的复制出来的, 且实操时传递给rsync 的参数, 应该是应用在同磁盘的迁移,没有对应实际的场景, 两块磁盘, 导致部分数据丢失 —— 这个时候应该还可以通过对比工具检测文件一致性, 包括文件名、权限、内容等,试着通过重新建立软硬链接或者挂载点,做修复, 但因为节点没有驱逐, 所以这样的差异文件将会非常多, 难以实操.
  3. 丢失元数据(挂载点和软硬链接这类), 表现出数据丢失,可能是POD 重启发现对应文件目录结构有, 就不会触发重新挂载,导致对应目录读取都是空的。但可能只是挂载点丢失(跨磁盘了),原有数据可能还在磁盘中, 当时应该认真检查数据盘中对应路径下的数据.
  4. 之前的部分 POD 数据没有正确重回 kubelet 的管理, 导致为他生成的一些网络规则(iptables)残留, 导致新的 ingress 在尝试启动时, kubelet 检测端口冲突 —— 这个时候我应该尝试通过查看 iptables 来尝试修正启动异常, 或者应该让AI 辅助, 尝试查看kubelet 源码中, 启动pod时的端口检测逻辑, 是否存在iptabels的检测.

那, 此处该怎么正确迁移呢?

首先是需要关注关键点:

那该如何做呢?

设想的,可能的方案有三个(请谨慎参考):

  1. 第一个,原地迁移
  1. 第二个,扩展集群后迁移
  1. 第三个

编辑此页
分享这篇:

上一篇
小谈一次性能优化
下一篇
Less is More 具象化