Давно не было постов, так как занималась съемками и монтажом первого подкаста-интервью 😳 Готовьтесь к новым порциям интересного контента, не зря же в названии канала http status 4️⃣1️⃣3️⃣

🛠 Дебаг веб сервиса Проблема: nginx не отдает метрики по эндпоинту. Пререквизиты: есть под с nginx в кубере, есть сервис, который слушает на порту 9000, по этому порту должны быть доступны прометеус метрики по эндпоинту /metrics. Симптомы: curl отдает Connection refused. В данном случае refused отдает ингресс контроллер.

Перед началом диагностики важно в голове иметь общую схему зоны, в рамках которой мы можем определить проблему. В данном случае это кубернетис кластер, сеть за пределами кластера, само приложение. В процессе траблшутинга я всегда иду от общего к частному, последовательно деля зону поиска на блоки — что-то вроде бинарного поиска в программировании.

Первое, что я проверила, основываясь на опыте, — слушается ли приложением порт. В манифесте пода порт объявлен: kubectl get po pod -o yaml | grep 9000

#containerPort: 9000

Я решила проверить доступность порта внутри контейнера, и curl вернул 404. Тут важно понимать, что если вебсервер (в данном случае nginx) вернул 404, это значит, что он получил запрос, но не смог его обработать, потому что для него нет правила. И здесь это ключевое: значит, что порт слушается, но по этому эндпоинту приложение ничего не отдает, потому что не сконфигурировано. Дальше стоит идти в настройки вебсервера. 🔍

💥 Сломанный helm релиз Проблема: невозможно установить релиз командой helm upgrade. Пререквизиты: разработчик сообщил, что он отменил в гитлабе джоб на раскатку релиза helm upgrade в самый разгар выполнения, чуть позже снова запустил деплой, но теперь helm upgrade каждый раз отдает: Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progress

Для тех, кто работает с кубом, это знакомая ситуация, и я сразу знала, в чем причина. Но мой коллега инженер столкнулся с таким впервые. Сразу вопрос: что вы знаете о финалайзерах? 🙂

Проще говоря, это специальные метки, которые означают ожидание дополнительных событий при удалении ресурса. Если у ресурса есть финалайзер, контроллеры отслеживают такие объекты и выполняют очистку зависимостей, и только потом финалайзер удаляется. Пока на ресурсе есть финалайзер, он не будет удален. ⏳

В нашем случае процесс установки релиза был прерван и не завершился корректно, так как операция была атомарной и при прерывании операции ресурсы новой версии должны были быть удалены, но этот процесс не завершился корректно. Поэтому остались ресурс(ы) с финалайзерами, ожидающие удаления.

Чтобы быстро найти тот самый ресурс, я написала простенький однострочный bash-скрипт: for i in $(kubectl -n ns get all | awk '{print $1}' | grep -v NAME); do if kubectl -n ns get $i -o yaml | grep -q final; then echo $i; fi; done

Команда kubectl -n ns get all даст нам список всех ресурсов в неймспейсе, среди которых мы и будем искать. Это удобно, когда ищешь иголку в стоге 🙂 В результате выполнения скрипт вернет список ресурсов, в которых нашел финалайзеры.

Ну и как последний шаг — удаляем финалайзер: kubectl -n ns patch resource --type='json' -p='[{"op": "remove", "path": "/metadata/finalizers"}]'

#вместо resource тут указываете вывод из предыдущей команды

Обычно изучая инструменты и технологии мы узнаем как они должны работать, но не как их чинить. Процесс траблшутинга это то, что развивается только на практике и делает специалиста ценным кадром в команде, к которому идут все за помощью ;)