有没有办法确定kubernetes apiserver正在与哪个etcd主机交谈?

时间:2018-05-15 08:41:12

标签: kubernetes etcd etcd3

只有apiserver直接与etcd对话。在etcd集群中有许多主机。我想看看apiserver正在与哪个etcd主持人交谈。对于Pod或Node等每个api资源,这可能会有所不同。我更喜欢看每个请求的etcd主机信息。

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

我试过了:

  1. 在kubernetnes api服务器上启用etcd client和grpc登录。

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

  2. 在api服务器

    上启用GODEBUG=http2debug=2的http2调试日志记录

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

  3. 在etcd端调试日志。

    启用Enabling Debug Logging的调试日志仅打印v2存储访问。对于v3商店one could use the http://<host>2379/debug/requests端点,但在我的etcd 3.1.14版本中不可用。

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

  5. tcpdumptcpflow

    apiserver&lt; - &gt; etcd连接已加密。这些会向我显示请求网址吗?我我没有在转储中看到这些信息。

  6. 中间人攻击apiserver&lt; - &gt; etd与mitmproxy的连接。我不认为这应该是那么复杂。

  7. 我希望,我错过了一个超级明显而简单的方法来实现这一目标。

    更新:

    关于使用基于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地址。

1 个答案:

答案 0 :(得分:0)

找到apiserver的pid

ps aux | grep apiserver

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

lsof -p $PID | grep :2379