Только apiserver общается напрямую с etcd.В кластере etcd много хостов.Я хотел бы видеть, к какому хосту etcd обращается аписервер.Это может отличаться для каждого ресурса API, такого как Pod или Node.Я предпочитаю видеть информацию о хосте etcd для каждого запроса.
В частности, kubernetes 1.6.13 и etcd 3.1.14 с использованием магазина v3.
Я пробовал:
Включить клиент etcd и вход в систему grpcсервер api kubernetnes.
Я думаю, что grpc регистрирует только непредвиденные события.Аналогично для etcd clientv3.Мне не удалось получить информацию о стороне соединения etcd.
Включить ведение журнала отладки http2 с помощью GODEBUG=http2debug=2
на сервере api
К моему удивлению, журналы отладки http2напечатать много информации о каждом запросе, но я не смог найти информацию об удаленной конечной точке.Я все еще скептически отношусь к этому, я могу пропустить упоминание в файлах журнала.Не совсем уверен.
Отладка журналов на стороне etcd.
Включение журналов отладки с помощью Включение ведения журнала отладки печатает только о доступах к хранилищу v2.Для v3 store можно использовать конечную точку http://<host>2379/debug/requests
, но это не доступно в моей версии etcd 3.1.14.
Я еще не пробовал использовать GODEBUG=http2debug=2
на стороне etcd.Может быть, в логах http2 на etcd есть информация, которая мне нужна.
tcpdump
или tcpflow
Подключение apiserver <-> etcd зашифровано.Покажут ли они мне URL запроса?Я думаю Я не видел эту информацию в дампах.
Человек в середине атакует соединение apiserver <-> etcd с mitmproxy ,Я не думаю, что это должно быть так сложно.
Надеюсь, я упустил супер очевидный и простой способ сделать это.
Обновление:
Об использовании 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)
........
Глядя на это, яне может знать, какой etcd используется для каждого запроса между apiserver и etcd.
Обновление:
Я думаю, что в коде клиента etcdv3, который поставляется с kubernetes 1.6.13, функция grpc.Balancer.Get
возвращает адрес конечной точки, используемый для каждогозапрос GRCP.Я думаю можно добавить распечатку журнала здесь и сделать так, чтобы apiserver регистрировал адрес etcd для каждого запроса.