Немножечко о факапах которые произошли со мной за последние пару дней. Хочу сразу извиниться, что в эти дни много рекламы и мало материала - к сожалению сейчас такая нагрузка и такие задачи что попадается мало интересного, а градус гемора наоборот возрос. Поэтому раз интересного нет - буду писать о гемморое.
История первая - как дрогнувшая рука может привести к падению прода на некоторый срок.
Как вы знаете, в k8s кластере существует такой параметр как реплики. Это замечательная особенность которая позволяет сказать кластеру "сделай мне N копий моего продукта". Со стороны пользователя это выглядит так просто - просто пропиши число в переменную. Со стороны кластера это естественно куда более сложный механизм. k8s посредством scheduler принимает решение о том где поднять ваши контейнеры (на какой ноде), учитывая все-все условия которые вы ему задали, например, регион, необходимое количество ресурсов, или даже свойство диска. Все это делается в k8s посредством меток, которые очень широко применяются внутри кластера буквально для всего, именно посредством них происходит связность между, например, описательной части deployment (Как запускать?) и сетевой части service (как подключаться к нашим контейнерам?). Ведь к каждой копии нужно как-то попадать, а значит ей надо настроить адрес, пробросить порт и сообщить куда надо чтобы трафик балансировался между репликами. Кстати в свое время эти две фразы произнесенные вслух коллегой помогли мне ясно осознать зачем нужны эти ресурсы - deploy, svc и надолго запомнились. Так вот, помимо решения этих вопросов, в это же время на мастере постоянно идет опрос состояния существующих контейнеров и состояния нод. Запросы идут через api - это еще один очень важный компонент в k8s, без которого вообще не будет функционировать ничего. Ну и еще etcd база данных где куб все это хранит. Все это крутится, вертится, постоянно идут опросы состояний, обработка кучи событий, итп итп. В общем бэкенд довольно мощный, писался кучей разных умных дядек в большом количестве. А для нас - удобная ручка, всего одна переменная. Теперь представьте что у вас дрогнула рука и вместо 30 реплик вы поднимаете 3330. Каждая реплика-под в моем случае состояла из 4 контейнеров. Итого почти 15000 докер-контейнеров. А дальше пошла веселуха. В первую минуту когда я понял что произошло я успел "сходить в апи" (выполнить команду) и откатил количество реплик до 30. Но, как говорится, было уже поздно. Шедулер уже принял ответственную задачу реализовать на физиках 15000 контейнеров. А это значит надо опросить каждую ноду на ее состояние, начать скачивание образа на выбранной ноде (читай на всех), начать поднимать контейнер... что? нет, контейнеры... нет, сотни контейнеров на всех нодах. И что делать? вновь и вновь опрашивать их состояния и записывать в базу. На второй минуте прилег шедулер. Он просто не заметил моей команды не делать то что он решил сделать. За ним от количества запросов прилегла апишка. LA подскочило примерно в 20 раз превышая количество ядрер, а диск был загружен под чистую. На последующих минутах ничего внятного от мастера добиться не удалось. И через 5 минут после происшествия на нодах стали в большом количестве стартовать контейнеры. Это серьезно заафектило ресурсы нод и в проде пошли падения и пятисотки.
В чем реально была проблема? Есть распространенное мнение что мастеру не нужно давать много ресурсов. И в 90% случаев это так. Но в данной ситуации мы просто не смогли вовремя прожевать команду отмены, и вместо этого начали выполнять самоубийственные действия. Во-вторых очень много времени было потрачено на то чтобы попытаться хоть как-то починить ситуацию не ребутая мастер.