Есть ли способ определить, к какому хосту etcd обращается аписервер kubernetes?
Только apiserver общается напрямую с etcd. В кластере etcd много хостов. Я хотел бы видеть, к какому хосту etcd обращается аписервер. Это может отличаться для каждого ресурса API, такого как Pod или Node. Я предпочитаю видеть информацию о хосте etcd для каждого запроса.
В частности, kubernetes 1.6.13 и etcd 3.1.14 используют v3 store.
Я пытался:
Включите клиент etcd и ведение журнала grpc на сервере API kubernetnes.
Я думаю, что grpc регистрирует только непредвиденные события. Аналогично для etcd clientv3. Я не смог получить информацию о стороне соединения etcd.
Включите ведение журнала отладки http2 с
GODEBUG=http2debug=2
на сервере apiК моему удивлению, журналы отладки http2 выводят много информации о каждом запросе, но я не смог найти информацию об удаленной конечной точке. Я все еще скептически отношусь к этому, возможно, мне не хватает упоминания в файлах журнала. Не совсем уверен.
Журналы отладки на стороне etcd.
При включении журналов отладки с помощью функции " Отладка журналов" распечатывается только доступ к хранилищу v2. Для магазина v3 можно использовать
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
Функция возвращает адрес конечной точки, используемый для каждого запроса grpc. Я думаю, что здесь можно добавить распечатку журнала и сделать так, чтобы apiserver регистрировал адрес etcd для каждого запроса.
1 ответ
Найти пид аписервер
ps aux | grep apiserver
Тогда используйте lsof
чтобы увидеть открытые разъемы
lsof -p $PID | grep :2379