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

时间:2018-04-03 09:32:35

标签: kubernetes etcd

重新启动节点(和主节点)后,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]: ...

我正在运行单个节点群集。

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

1 个答案:

答案 0 :(得分:3)

这对Kubernetes或etcd本身来说不是问题,任何尝试在服务器重启时编写文件的应用程序都会发生这种情况。

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

我可以为您推荐:

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

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

  3. 如果可能,请在群集模式下使用应用程序。例如,对于etcd的3个节点,如果一个节点出现问题,您将不会丢失数据。