ETCD 中损坏的文件导致 kubernetes 无法启动

Corrupted file in ETCD causes kubernetes not to start

节点(和主节点)重启后,etcd 中的文件损坏:

my_node: ~ # cd /var/lib/etcd/member/snap/
my_node: snap # ls -lsa
ls: could not access 0000000000000005-00000000008cb33c.snap: input/output error
totale 5040
   4 drwx------ 2 root root     4096  3 apr 11.20 .
   4 drwx------ 4 root root     4096  3 apr 11.20 ..
   8 -rw-r--r-- 1 root root     8177  2 apr 14.14 0000000000000005-00000000008c3e09.snap
   8 -rw-r--r-- 1 root root     8177  2 apr 16.31 0000000000000005-00000000008c651a.snap
   8 -rw-r--r-- 1 root root     8177  2 apr 18.48 0000000000000005-00000000008c8c2b.snap
   ? -????????? ? ?    ?           ?            ? 0000000000000005-00000000008cb33c.snap
   8 -rw-r--r-- 1 root root     8177  1 apr 20.01 0000000000000005-00000000008cda4d.snap.broken
5000 -rw------- 1 root root 16805888  2 apr 07.20 db

带有 ETCD 的容器显示紧急错误:

2018-04-03 09:20:23.578267 W | snap: cannot rename broken snapshot file /var/lib/etcd/member/snap/0000000000000005-00000000008cb33c.snap to /var/lib/etcd/member/snap/0000000000000005-00000000008cb33c.snap.broken: rename /var/lib/etcd/member/snap/0000000000000005-00000000008cb33c.snap /var/lib/etcd/member/snap/0000000000000005-00000000008cb33c.snap.broken: input/output error
2018-04-03 09:20:23.579220 I | etcdserver: recovered store from snapshot at index 9210923
2018-04-03 09:20:23.579250 I | etcdserver: name = default
2018-04-03 09:20:23.579257 I | etcdserver: data dir = /var/lib/etcd
2018-04-03 09:20:23.579263 I | etcdserver: member dir = /var/lib/etcd/member
2018-04-03 09:20:23.579269 I | etcdserver: heartbeat = 100ms
2018-04-03 09:20:23.579273 I | etcdserver: election = 1000ms
2018-04-03 09:20:23.579278 I | etcdserver: snapshot count = 10000
2018-04-03 09:20:23.579294 I | etcdserver: advertise client URLs = http://127.0.0.1:2379
2018-04-03 09:20:23.579714 I | etcdserver: restarting member 0 in cluster 0 at commit index 0
panic: cannot use none as id

goroutine 1 [running]: ...

我是运行单节点集群

面对这个问题的最佳策略是什么? 欢迎任何建议。

这不是 Kubernetes 或 etcd 本身的问题,任何应用程序在服务器重新启动时尝试写入文件都可能发生。

问题的根本原因是文件系统中的文件损坏。我不知道你使用的是哪个 FS,但在大多数情况下,这种错误应该在下次启动时由系统修复,但如果不能 - 那意味着问题很严重。

我能给你的建议:

  1. 在停止所有重要软件之前,不要重新启动 VM 或服务器。特别是像 EtcD 这样需要强数据一致性的东西。如果你需要重启类似 "single node" Kubernetes 集群的东西——先停止节点,然后停止主节点。并且不要强迫它,给他们时间关闭。当您重新启动服务器时,所有应用程序都有有限的关闭时间。如果他们不这样做,OS 将杀死他们,这可能是您问题的根源。

  2. 使用日志文件系统,如 ext4 或 ReiserFS,它们可以自动恢复一些损坏的文件和元数据。

  3. 如果可能,请在集群模式下使用应用程序。比如有3个节点的etcd,一个节点出问题,你的数据不会丢失。