如何确定Kubernetes APIServer所连接的etcd主机(v1.6.13+etcd3.1.14)
追踪Kubernetes APIServer到etcd的请求对应节点方案
针对你在Kubernetes 1.6.13(搭配etcd 3.1.14 v3存储)环境下,想要查看APIServer连接的etcd主机,尤其是每个API请求对应具体etcd节点的需求,我整理了相关尝试和可行方案:
已验证的无效/局限方法
先梳理你尝试过的方法及它们的问题:
- APIServer的etcd client/grpc日志:仅在异常事件触发时记录,无法获取常规请求的etcd端点关联信息。
- APIServer的
GODEBUG=http2debug=2日志:日志量极大,但未包含远程etcd端点的对应数据。 - etcd端调试日志:按官方文档开启后仅输出v2存储的访问记录;v3存储的
/debug/requests端点在3.1.14版本中不存在。 tcpdump/tcpflow抓包:APIServer与etcd的连接已加密,无法从抓包结果中解析请求对应的etcd节点。- mitmproxy中间人方案:实现复杂度太高,不推荐作为常规方案。
补充:lsof方法的局限
你提到用lsof可以列出APIServer与etcd的所有连接,这确实能看到当前建立的连接端点,但无法关联到单个API请求。这是因为APIServer会和etcd集群建立大量长连接(查看NewStorage逻辑可知这是设计层面的正常现象)。
示例命令及输出:
# 查看PID为20816的APIServer与etcd的连接数 $ 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)
但这些信息只能看到连接存在,没法对应到具体的Pod/Node类请求。
可行的解决方案:修改etcd clientv3代码添加日志
在Kubernetes 1.6.13自带的etcdv3客户端代码中,grpc.Balancer.Get函数会返回每个grpc请求实际使用的etcd端点地址。我们可以在该函数中添加日志打印逻辑,让APIServer记录下每个请求对应的etcd节点信息。
具体来说,找到客户端代码里的balancer.go文件,在Get函数返回端点的位置,添加日志语句,把选中的etcd端点地址输出到APIServer的日志中。这样每个API请求处理时,都会附带对应的etcd节点信息,完美满足你的追踪需求。
内容的提问来源于stack exchange,提问作者Hakan Baba
相关产品推荐
相关产品推荐

