kubernetes高可用集群升级的etcd错误

原创
2020/05/18 12:32
阅读数 567

使用kubeadm创建的kubernetes高可用集群升级时出现etcd访问错误,手工删除etcd中的错误节点信息后升级成功。

正常情况kubernetes升级使用下面的命令来完成:

sudo kubeadm upgrade plan

然后按照提示操作即可。

1、出现etcd访问错误

但这一次,出线了错误:

etcd.go:480] Failed to get etcd status

经检查,是etcd的第一个节点(kubenetes的master之一)无法访问。

2、从集群删除节点

删除该节点:

kubectl delete node podc01

然后问题仍然存在。经查,被删除节点的etcd服务地址仍然在集群中,而且不可访问,升级无法完成。

  • 根据网上的kubeadm说明,使用kubeadm reset将会自动删除etcd的节点信息。
  • 但是,kubeadm reset后,经查,被删除节点的etcd服务地址仍然在集群中,而且不可访问,升级无法完成。

3、手动删除etcd node

查看并手动删除 etcd node信息:

alias etcdv3="ETCDCTL_API=3 etcdctl --endpoints=https://[10.1.1.202]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key"

然后,运行:

#查看etcd集群的成员:
etcdv3 member list

#删除etcd集群的不可访问的成员:
etcdv3 member remove XXXXXXXXXX

#再次查看etcd集群的成员:
etcdv3 member list

然后,再来运行Kubernetes升级命令:

#检查升级状态。
sudo kubeadm upgrade plan

#直接升级到Kubernetes 1.18.1版本。
#!可能需要将镜像预先部署到所有节点上。
sudo kubeadm upgrade apply v1.18.2

升级成功。

4、总结

对处理过程和后续解决方法的建议:

  • 第一次出现etcd的不可访问原因未明,或许可以单独重置etcd节点信息来恢复整个集群。
  • etcd的容器中版本和宿主机版本不一致,是一个隐患。
    • 因为kubenetes安装时并未安装(甚至未检查)二者的一致性,如果以后etcd数据库格式变化,将会导致集群的崩溃。
    • 建议kubernetes安装程序,要么强制安装一致的版本,要么修改自己的数据库到别的存储路径。
  • kubectl delete 删除节点,但未删除etcd的节点信息。
    • 如果删除的是master节点,就会遗留etcd节点信息(实际上不可访问),导致后续的kubeadm upgrade等操作失败。
    • kubeadm reset是可以删除本节点的etcd信息的,但是如果已经kubectl delete删除了该节点,则不会删除etcd信息。
    • 建议不要kubectl delete 集群的master节点,如果有问题直接kubeadm reset。
  • kubeadm upgrade 应允许etcd不可访问节点存在时完成升级,并在后续过程中再去进行恢复。

更多参考

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部