0

只有 apiserver 直接与 etcd 对话。在 etcd 集群中有很多主机。我想看看 apiserver 正在与哪个 etcd 主机通信。对于每个 api 资源(如 Pod 或 Node),这可能会有所不同。我更喜欢查看每个请求的 etcd 主机信息。

具体来说,kubernetes 1.6.13 和 etcd 3.1.14 使用 v3 存储。

我努力了:

  1. 在 kubernetnes api 服务器上启用 etcd 客户端和 grpc 日志记录。

    我认为 grpc 只记录意外事件。同样适用于 etcd clientv3。我无法获得有关连接的 etcd 端的信息。

  2. GODEBUG=http2debug=2在 api 服务器上启用 http2 调试日志记录

    令我惊讶的是,http2 调试日志打印了有关每个请求的大量信息,但我找不到远程端点信息。我仍然对此持怀疑态度,我可能在日志文件中遗漏了提及。不完全确定。

  3. 在 etcd 端调试日志。

    使用启用调试日志启用调试日志仅打印有关 v2 存储访问的信息。对于 v3 存储,可以使用 http://<host>2379/debug/requests端点,但在我的 etcd 3.1.14 版本中不可用。

  4. 我还没有尝试GODEBUG=http2debug=2在 etcd 端使用。也许 etcd 上的 http2 日志有我需要的信息。

  5. tcpdump或者tcpflow

    apiserver <-> etcd 连接是加密的。这些会显示请求网址吗?我我没有在转储中看到该信息。

  6. 中间人使用 mitmproxy 攻击 apiserver <-> etcd连接。我认为这不应该那么复杂。

我希望,我错过了一种非常明显和简单的方法来实现这一点。


更新:

关于使用lsof基于方法:

使用lsof,我们可以一次列出带有端点信息的连接。我认为lsof输出中没有足够的信息来到达每个请求的端点信息。Apiserver 打开了很多到 etcd 的连接。查看代码,观察对我来说是合理的。看这里NewStorage_

$ sudo lsof -p 20816 | grep :2379  | wc -l
130

连接看起来像这样

$ sudo lsof -

p 20816 | grep :2379  | head -n 5
hyperkube 20816 root    3u     IPv4 58093240        0t0        TCP compute-master7001.dsv31.boxdc.net:36360->compute-etcd7001.dsv31.boxdc.net:2379 (ESTABLISHED)
hyperkube 20816 root    5u     IPv4 58085987        0t0        TCP compute-master7001.dsv31.boxdc.net:26005->compute-etcd7002.dsv31.boxdc.net:2379 (ESTABLISHED)
hyperkube 20816 root    6u     IPv4 58085988        0t0        TCP compute-master7001.dsv31.boxdc.net:55650->compute-etcd7003.dsv31.boxdc.net:2379 (ESTABLISHED)
hyperkube 20816 root    7u     IPv4 58102030        0t0        TCP compute-master7001.dsv31.boxdc.net:36366->compute-etcd7001.dsv31.boxdc.net:2379 (ESTABLISHED)
hyperkube 20816 root    8u     IPv4 58085990        0t0        TCP compute-master7001.dsv31.boxdc.net:55654->compute-etcd7003.dsv31.boxdc.net:2379 (ESTABLISHED)
........

看着这个,我不知道 apiserver 和 etcd 之间的每个请求使用了哪个 etcd。


更新:

我认为在 kubernetes 1.6.13 附带的 etcdv3 客户端代码中,该grpc.Balancer.Get函数返回用于每个 grpc 请求的端点地址。我认为可以在此处添加日志打印并让 apiserver 记录每个请求的 etcd 地址。

4

1 回答 1

0

找到apiserver的pid

ps aux | grep apiserver

然后使用lsof查看打开的socket连接

lsof -p $PID | grep :2379

于 2018-05-15T22:35:55.583 回答