使用petset创建的etcd集群在kubernetes中运行失败

Tags: kubernetes_problem  etcd 

目录

现象

使用petset启动的etcd集群,运行一端时间后,其中一个pod一直处于crash状态。

日志显示:

2017-11-29 21:17:42.029570 I | etcdserver: starting server... [version: 3.2.4, cluster version: to_be_decided]
2017-11-29 21:17:42.029827 I | rafthttp: started streaming with peer 884a01715a22a5b4 (stream Message reader)
2017-11-29 21:17:42.036748 I | rafthttp: peer 884a01715a22a5b4 became active
2017-11-29 21:17:42.036772 I | rafthttp: established a TCP streaming connection with peer 884a01715a22a5b4 (stream MsgApp v2 writer)
2017-11-29 21:17:42.036779 I | rafthttp: peer 31b2a8e8060a1b5a became active
2017-11-29 21:17:42.036784 I | rafthttp: established a TCP streaming connection with peer 31b2a8e8060a1b5a (stream Message writer)
2017-11-29 21:17:42.036791 I | rafthttp: established a TCP streaming connection with peer 31b2a8e8060a1b5a (stream MsgApp v2 writer)
2017-11-29 21:17:42.036944 I | rafthttp: established a TCP streaming connection with peer 884a01715a22a5b4 (stream Message writer)
2017-11-29 21:17:42.097197 I | rafthttp: established a TCP streaming connection with peer 31b2a8e8060a1b5a (stream Message reader)
2017-11-29 21:17:42.101341 I | rafthttp: established a TCP streaming connection with peer 31b2a8e8060a1b5a (stream MsgApp v2 reader)
2017-11-29 21:17:42.101568 I | raft: b4514e3a7bba4b13 [term: 1] received a MsgHeartbeat message with higher term from 31b2a8e8060a1b5a [term: 2]
2017-11-29 21:17:42.101582 I | raft: b4514e3a7bba4b13 became follower at term 2
2017-11-29 21:17:42.101653 C | raft: tocommit(37) is out of range [lastIndex(0)]. Was the raft log corrupted, truncated, or lost?
panic: tocommit(37) is out of range [lastIndex(0)]. Was the raft log corrupted, truncated, or lost?

goroutine 106 [running]:
github.com/coreos/etcd/cmd/vendor/github.com/coreos/pkg/capnslog.(*PackageLogger).Panicf(0xc4201a8120, 0xf44521, 0x5d, 0xc421b5c0a0, 0x2, 0x2)
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/pkg/capnslog/pkg_logger.go:75 +0x15c
github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft.(*raftLog).commitTo(0xc4202a00e0, 0x25)
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft/log.go:191 +0x15c
github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft.(*raft).handleHeartbeat(0xc420042000, 0x8, 0xb4514e3a7bba4b13, 0x31b2a8e8060a1b5a, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft/raft.go:1100 +0x54
github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft.stepFollower(0xc420042000, 0x8, 0xb4514e3a7bba4b13, 0x31b2a8e8060a1b5a, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft/raft.go:1046 +0x2b3
github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft.(*raft).Step(0xc420042000, 0x8, 0xb4514e3a7bba4b13, 0x31b2a8e8060a1b5a, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft/raft.go:778 +0x10f7
github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft.(*node).run(0xc420172240, 0xc420042000)
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft/node.go:323 +0x67b
created by github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft.StartNode
        /home/gyuho/go/src/github.com/coreos/etcd/release/etcd/gopath/src/github.com/coreos/etcd/cmd/vendor/github.com/coreos/etcd/raft/node.go:210 +0x6b3

调查

调查过程比较繁琐,且依赖于具体的实现方法,因此这里直接给出结论。

petset中的三个etcd是按照这样的顺序启动的:

1. 第一个pod启动,创建一个新的cluster,2379端口启动后,认为成功
2. 第二个pod启动,加入已有的cluster,2379端口启动后,认为成功
3. 第三个pod启动,加入已有的cluster,2379端口启动后,认为成功

所有pod使用云硬盘存放etcd数据。

可能是因为pod频繁地删除、迁移,petset重建pod的时候,因为使用了云硬盘,重建的pod还会使用之前的etcd数据。

重建的pod会根据保存的数据去连接原先的peer,但是原先的peer的IP已经变化,导致重建的etcd迟迟不能启动成功。

有时候,会有两个pod同时被重建,前一个pod会去连接尚未重建的下一个pod,而下一个pod又要等前一个pod创建成功。

因此,做了修改,每次重建pod都会清除已有的数据。

但是这样做,又引发了新的问题,当pod在原地快速重启时,还没有被从etcd中删除时,就重启完成。

这时候它会和其它的pod进行同步,但是却发现etcd数据丢失了,因此panic。

最后做了修改,只有迁移到其它node上,才会清除数据。

事实上,这和不用云硬盘是相同的效果。

需要一个更好的方式实现etcd集群。


kubernetes_problem

  1. kubernetes ingress-nginx 启用 upstream 长连接,需要注意,否则容易 502
  2. kubernetes ingress-nginx 的 canary 影响指向同一个 service 的所有 ingress
  3. ingress-nginx 启用 tls 加密,配置了不存在的证书,导致 unable to get local issuer certificate
  4. https 协议访问,误用 http 端口,CONNECT_CR_SRVR_HELLO: wrong version number
  5. Kubernetes ingress-nginx 4 层 tcp 代理,无限重试不存在的地址,高达百万次
  6. Kubernetes 集群中个别 Pod 的 CPU 使用率异常高的问题调查
  7. Kubernetes 集群 Node 间歇性变为 NotReady 状态: IO 负载高,延迟严重
  8. Kubernetes的nginx-ingress-controller刷新nginx的配置滞后十分钟导致504
  9. Kubernetes的Nginx Ingress 0.20之前的版本,upstream的keep-alive不生效
  10. Kubernetes node 的 xfs文件系统损坏,kubelet主动退出且重启失败,恢复后无法创建pod
  11. Kubernetes的Pod无法删除,glusterfs导致docker无响应,集群雪崩
  12. Kubernetes集群node无法访问service: kube-proxy没有正确设置cluster-cidr
  13. Kubernetes集群node上的容器无法ping通外网: iptables snat规则缺失导致
  14. Kubernetes问题调查: failed to get cgroup stats for /systemd/system.slice
  15. Kubelet1.7.16使用kubeconfig时,没有设置--require-kubeconfig,导致node不能注册
  16. Kubelet从1.7.16升级到1.9.11,Sandbox以外的容器都被重建的问题调查
  17. Kubernetes: 内核参数rp_filter设置为Strict RPF,导致Service不通
  18. Kubernetes使用过程中遇到的一些问题与解决方法
  19. Kubernetes集群节点被入侵挖矿,CPU被占满
  20. kubernetes的node上的重启linux网络服务后,pod无法联通
  21. kubernetes的pod因为同名Sandbox的存在,一直无法删除
  22. kubelet升级,导致calico中存在多余的workloadendpoint,node上存在多余的veth设备
  23. 使用petset创建的etcd集群在kubernetes中运行失败
  24. Kubernetes 容器启动失败: unable to create nf_conn slab cache
  25. 未在calico中创建hostendpoint,导致开启隔离后,在kubernetes的node上无法访问pod
  26. calico分配的ip冲突,pod内部arp记录丢失,pod无法访问外部服务
  27. kubernetes的dnsmasq缓存查询结果,导致pod偶尔无法访问域名
  28. k8s: rbd image is locked by other nodes
  29. kuberntes的node无法通过物理机网卡访问Service

etcd

  1. etcd 的 go sdk 的使用方法: etcd/clientv3,选举 leader 的方法
  2. 使用petset创建的etcd集群在kubernetes中运行失败

推荐阅读

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  李佶澳的博客  系统软件  程序语言  运营经验  关注方向  水库文集  网文收藏  网络课程  发现知识星球  百度搜索 谷歌搜索