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

有没有办法确定kubernetes apiserver正在与哪个etcd主机通信?,kubernetes,etcd,etcd3,Kubernetes,Etcd,Etcd3,只有apiserver直接与etcd对话。在etcd集群中有许多主机。我想查看apiserver正在与哪个etcd主机通信。对于每个api资源(如Pod或节点),这可能是不同的。我更喜欢查看每个请求的etcd主机信息 具体来说,kubernetes 1.6.13和etcd 3.1.14使用v3存储 我试过: 在kubernetnes api服务器上启用etcd客户端和grpc日志记录 我认为grpc只记录意外事件。etcd也是如此 客户3。我无法获得有关etcd方面的信息 连接 使用api服务器

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

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

我试过:

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

    我认为grpc只记录意外事件。etcd也是如此 客户3。我无法获得有关etcd方面的信息 连接

  • 使用api服务器上的
    GODEBUG=http2debug=2
    启用http2调试日志记录

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

  • 调试etcd端的日志

    启用仅打印v2存储访问的调试日志。对于v3存储
    http://2379/debug/requests
    endpoint,但这在我的etcd 3.1.14版本中不可用

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

  • tcpdump
    tcpflow

    apiserver etcd连接已加密。这些会显示请求url吗?我想我没有在垃圾堆里看到这些信息

  • <> >中间人攻击ApServer与ETCD的连接。我认为这不应该那么复杂

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


    更新:

    关于使用基于
    lsof
    的方法:


    使用
    lsof
    ,我们可以一次列出具有端点信息的连接。我认为
    lsof
    输出中没有足够的信息来获取每个请求的端点信息。Apiserver打开了许多到etcd的连接。看看代码,我觉得这个观察很合理。请参见中的
    NewStorage

    连接看起来像这样

    $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地址

    查找apiserver的pid

    ps aux|grep apiserver

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


    lsof-p$PID | grep:2379

    我认为
    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)
    ........