【问题标题】:ETCD kubeadm getsockopt: connection refusedETCD kubeadm getsockopt:连接被拒绝
【发布时间】:2019-01-06 14:22:06
【问题描述】:

我想从我的 kurnetes 集群中使用我的 etcd pod 的 etcdctl 功能,但我不能。我已经从 kubeadm 安装了我的 kubernetes,并且我有 1 个主节点和 1 个节点。

当我从我的 etcd pod 内部尝试命令 etcdctl 时,我得到了这些错误:

客户端:etcd集群不可用或配置错误;
错误 #0:HTTP 响应格式错误“\x15\x03\x01\x00\x02\x02”;
错误 #1:拨打 tcp 127.0.0.1:4001:getsockopt:连接被拒绝

但是当我检查我的 etcd pod 日志时,它看起来很健康:

【问题讨论】:

  • 您是否从 kubernetes 公开了您的 ETCD?因为它在集群内部,它可能不会监听 localhost 上的 4001 端口。?

标签: kubernetes etcd kubeadm


【解决方案1】:

看起来您有etcdhttps://127.0.0.1:2379 上侦听客户端连接,并且据我所知,您启用了客户端证书身份验证。然后您应该能够运行以下命令来连接到etcd

ETCDCTL_API=3 etcdctl member list \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

基本上etcd 期望您使用客户端证书进行身份验证。

此外,由于您运行的是 etcd 的 3.x 版,因此您必须通过提供 ETCDCTL_API 环境变量来告诉 etcdctl

编辑:

供参考:

在测试上述命令时,我使用的是 kubeadm 版本 1.11.1,它在运行 Ubuntu 18.04 的服务器上安装了 etcd 的 3.2.18 版本。

【讨论】:

  • 它看起来更好但仍然有问题我有这个错误消息:warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated Error: grpc: timed out when dialing
  • @Yummel 很高兴你至少向前迈出了一步!这可能是 TLS 身份验证问题.. 使用我在答案中使用的证书可能我错了。 AFAIK kubeadm 生成具有正确 SAN(主题备用名称)的证书,其中包含 127.0.0.1。检查 SAN:openssl x509 -in /etc/kubernetes/pki/etcd/server.crt -text -noout,在 x509v2 扩展部分中查找它们。在 kubeadm 为 etcd 生成的清单文件 (yaml) 中,配置了一个活性探针,使用该 etcdctl 命令测试一次。那里使用的证书可能有效。
  • @Yummel 我尝试使用以kubeadm init 初始化的 Ubuntu 18.04 主节点来重现您的错误但没有成功,这样我就可以访问etcd 容器。我在etcd 3.2.18 版本上一切正常,他们在大约 5 个月前将kubeadmetcd 的默认版本从 3.1.12 提高到了 3.2.18,也许升级kubeadm 会更好到最新版本(我得到 1.11.1)并重新运行您的集群。此外,关于ServerName 的警告在最新版本的etcd 中消失了,据我了解,他们已将其删除。
  • 好的,谢谢您的回答!我检查了 SAN,它是 localhost,但我只有 v3 版本而不是 v2。然后我检查了清单并尝试运行相同的命令但没有成功
  • @Yummel 我认为看起来不错,如果您使用member list 而不是get foo 发出etcdctl 命令,那么您将看到etcd 集群成员的列表正确的?在etcd 3.2.18 中,我的答案中的命令可以完美地使用 server.key 和 server.crt 文件进行身份验证,但对你来说,它最终会出现timed out when dialing 错误。
【解决方案2】:

ETCDCTL_API=3 etcdctl --endpoints=localhost:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client .key 成员列表

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 2020-04-30
    相关资源
    最近更新 更多