首页 > 解决方案 > 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,我做错了吗?

标签: kubernetesetcdetcdctl

解决方案


etcd 集群需要大多数节点(即仲裁)来就集群状态的更新达成一致。对于具有 n 个成员的集群,法定人数为 (n/2)+1。对于任何奇数大小的集群,添加一个节点总是会增加仲裁所需的节点数。尽管将节点添加到奇数大小的集群看起来更好,因为有更多的机器,但容错性更差,因为完全相同数量的节点可能会失败而不会丢失仲裁,但是有更多的节点可能会失败。如果集群处于不能容忍更多故障的状态,在删除节点之前添加节点是危险的,因为如果新节点无法在集群中注册(例如,地址配置错误),quorum 将永久丢失.

因此,在您的情况下,拥有两个 etcd 节点提供与一个相同的冗余,因此始终建议拥有奇数个 etcd 节点。code = DeadlineExceeded desc = context deadline exceeded表示客户端无法访问 etcd 服务器并且超时。因此,您可能会尝试连接到已关闭的 etcd 服务器,结果您会看到错误。请参阅以下文档以了解更多信息

ETDC 容错表


推荐阅读