只有apiserver直接与etcd对话。在etcd集群中有许多主机。我想看看apiserver正在与哪个etcd主持人交谈。对于Pod或Node等每个api资源,这可能会有所不同。我更喜欢看每个请求的etcd主机信息。
具体来说,kubernetes 1.6.13和etcd 3.1.14使用v3存储。
我试过了:
在kubernetnes api服务器上启用etcd client和grpc登录。
我认为grpc只记录意外事件。同样适用于etcd clientv3。我无法获得有关etd方面的信息 连接。
在api服务器
上启用GODEBUG=http2debug=2
的http2调试日志记录
令我惊讶的是,http2调试日志打印了很多关于每个请求的信息,但我找不到远程端点信息。我仍然对此持怀疑态度,我可能会错过日志文件中的提及。不完全确定。
在etcd端调试日志。
启用Enabling Debug Logging的调试日志仅打印v2存储访问。对于v3商店one could use the http://<host>2379/debug/requests
端点,但在我的etcd 3.1.14版本中不可用。
我还没有尝试在etcd端使用GODEBUG=http2debug=2
。也许etcd上的http2日志有我需要的信息。
tcpdump
或tcpflow
apiserver&lt; - &gt; etcd连接已加密。这些会向我显示请求网址吗?我想我没有在转储中看到这些信息。
中间人攻击apiserver&lt; - &gt; etd与mitmproxy的连接。我不认为这应该是那么复杂。
我希望,我错过了一个超级明显而简单的方法来实现这一目标。
更新:
关于使用基于lsof
的方法:
使用lsof
,我们可以一次列出与端点信息的连接。我认为lsof
输出中没有足够的信息来获取每个请求的端点信息。 Apiserver打开了许多与etcd的连接。看一下观察对我来说合理的代码。请参阅here
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请求的端点地址。我认为可以添加日志打印here并使apiserver记录每个请求的etcd地址。
答案 0 :(得分:0)
找到apiserver的pid
ps aux | grep apiserver
然后使用lsof
查看打开的套接字连接
lsof -p $PID | grep :2379