Есть ли способ определить, к какому хосту etcd обращается аписервер kubernetes?

Только apiserver общается напрямую с etcd. В кластере etcd много хостов. Я хотел бы видеть, к какому хосту etcd обращается аписервер. Это может отличаться для каждого ресурса API, такого как Pod или Node. Я предпочитаю видеть информацию о хосте etcd для каждого запроса.

В частности, kubernetes 1.6.13 и etcd 3.1.14 используют v3 store.

Я пытался:

  1. Включите клиент etcd и ведение журнала grpc на сервере API kubernetnes.

    Я думаю, что grpc регистрирует только непредвиденные события. Аналогично для etcd clientv3. Я не смог получить информацию о стороне соединения etcd.

  2. Включите ведение журнала отладки http2 с GODEBUG=http2debug=2 на сервере api

    К моему удивлению, журналы отладки http2 выводят много информации о каждом запросе, но я не смог найти информацию об удаленной конечной точке. Я все еще скептически отношусь к этому, возможно, мне не хватает упоминания в файлах журнала. Не совсем уверен.

  3. Журналы отладки на стороне etcd.

    При включении журналов отладки с помощью функции " Отладка журналов" распечатывается только доступ к хранилищу v2. Для магазина v3 можно использовать http://<host>2379/debug/requests конечная точка, но это не доступно в моей версии etcd 3.1.14.

  4. Я еще не пробовал использовать GODEBUG=http2debug=2 на стороне etcd. Возможно, в логах http2 на etcd есть информация, которая мне нужна.

  5. tcpdump или же tcpflow

    Соединение apiserver <-> etcd зашифровано. Покажут ли они мне URL запроса? Я думаю, что я не видел эту информацию в свалках.

  6. Человек посередине атакует соединение 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

Другие вопросы по тегам