只有 apiserver 直接与 etcd 对话。在 etcd 集群中有很多主机。我想看看 apiserver 正在与哪个 etcd 主机通信。对于每个 api 资源(如 Pod 或 Node),这可能会有所不同。我更喜欢查看每个请求的 etcd 主机信息。
具体来说,kubernetes 1.6.13 和 etcd 3.1.14 使用 v3 存储。
我努力了:
在 kubernetnes api 服务器上启用 etcd 客户端和 grpc 日志记录。
我认为 grpc 只记录意外事件。同样适用于 etcd clientv3。我无法获得有关连接的 etcd 端的信息。
GODEBUG=http2debug=2
在 api 服务器上启用 http2 调试日志记录令我惊讶的是,http2 调试日志打印了有关每个请求的大量信息,但我找不到远程端点信息。我仍然对此持怀疑态度,我可能在日志文件中遗漏了提及。不完全确定。
在 etcd 端调试日志。
使用启用调试日志启用调试日志仅打印有关 v2 存储访问的信息。对于 v3 存储,可以使用
http://<host>2379/debug/requests
端点,但在我的 etcd 3.1.14 版本中不可用。我还没有尝试
GODEBUG=http2debug=2
在 etcd 端使用。也许 etcd 上的 http2 日志有我需要的信息。tcpdump
或者tcpflow
apiserver <-> etcd 连接是加密的。这些会显示请求网址吗?我想我没有在转储中看到该信息。
中间人使用 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 地址。