kubernetes - ETCD 集群收到 rpc 错误:代码 = DeadlineExceeded desc = 超出上下文期限
问题描述
只是在这里寻找一些澄清,我有一个 2 节点 etcd 集群:
master01=http://10.1.1.21:2379,master02=http://10.1.1.22:2379
一切正常。如果我登录到 master01 并执行以下操作:
etcdctl --cluster=true endpoint health
我得到了很好的回应:
http://10.1.1.21:2379 is healthy: successfully committed proposal: took = 25.628392ms
http://10.1.1.22:2379 is healthy: successfully committed proposal: took = 42.98645ms
所有操作 get、put 都按预期运行。
ETCDCTL_API=3 etcdctl --endpoints=http://10.1.1.21:2379,http://10.1.1.22:2379 get date
当我删除其中一个节点时问题就开始了,所以如果我杀死一个节点,我现在会收到错误而不是结果,例如:
ETCDCTL_API=3 etcdctl --endpoints=http://10.1.1.21:2379,http://10.1.1.22:2379 get date
{"level":"warn","ts":"2021-09-09T08:58:22.175Z","logger":"etcd-client","caller":"v3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc0000e0a80/#initially=[http://10.1.1.21:2379;http://10.1.1.22:2379]","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = context deadline exceeded"}
Error: context deadline exceeded
在这种情况下,我杀死了master01,我做错了吗?
解决方案
etcd 集群需要大多数节点(即仲裁)来就集群状态的更新达成一致。对于具有 n 个成员的集群,法定人数为 (n/2)+1。对于任何奇数大小的集群,添加一个节点总是会增加仲裁所需的节点数。尽管将节点添加到奇数大小的集群看起来更好,因为有更多的机器,但容错性更差,因为完全相同数量的节点可能会失败而不会丢失仲裁,但是有更多的节点可能会失败。如果集群处于不能容忍更多故障的状态,在删除节点之前添加节点是危险的,因为如果新节点无法在集群中注册(例如,地址配置错误),quorum 将永久丢失.
因此,在您的情况下,拥有两个 etcd 节点提供与一个相同的冗余,因此始终建议拥有奇数个 etcd 节点。code = DeadlineExceeded desc = context deadline exceeded
表示客户端无法访问 etcd 服务器并且超时。因此,您可能会尝试连接到已关闭的 etcd 服务器,结果您会看到错误。请参阅以下文档以了解更多信息
推荐阅读
- apache-flink - 即使我没有在 flink 中处理任何内容,我是否需要发出水印?
- java - 使用@ContextConfiguration(loader=MyLoader.class) 时如何只使用一个spring测试上下文
- objective-c - 在 Objective-c 块中,我是否需要将弱/强自我传递给助手?
- c - C - 当我从文件中读取时,它从管道中读取
- c++ - (C++11) 可变参数模板序列打印
- css - 我无法覆盖 DialogActions 的 material-ui 根样式
- r - Geom_bar + geom_line 在长格式数据集中具有多个变量
- javascript - 在 node.js 中实现 Puppeteer
- wordpress - 让 Chrome 扩展程序检测用户是否在我的 Wordpress 网站上登录
- c# - C# 使用接口查找 Connect 4 的获胜者