重新启动节点(和主节点)后,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]: ...
我正在运行单个节点群集。
面对这个问题的最佳策略是什么? 欢迎任何建议。
答案 0 :(得分:3)
这对Kubernetes或etcd本身来说不是问题,任何尝试在服务器重启时编写文件的应用程序都会发生这种情况。
问题的根本原因是文件系统中的文件损坏。我不知道你使用的是哪个FS,但在大多数情况下,这种错误应该由系统在下次启动时修复,但如果不能 - 这意味着问题很严重。
我可以为您推荐:
在所有重要软件停止之前,请勿重启VM或服务器。特别是像EtcD这样需要强大数据一致性的东西。如果你需要重启像“单节点”Kubernetes集群这样的东西 - 首先停止节点,然后停止Master。并且不要强迫它,给他们时间关闭。当您重新启动服务器时,所有应用程序都有有限的关闭时间。如果他们不这样做,OS就会杀死他们,这可能是你问题的根源。
使用像ext4或ReiserFS这样的日志文件系统,它们可以自动恢复一些损坏的文件和元数据。
如果可能,请在群集模式下使用应用程序。例如,对于etcd的3个节点,如果一个节点出现问题,您将不会丢失数据。