#docker #troubleshooting #одинденьизжизни
"Тревога-тревога, волк унёс зайчат!"
"Алекс, не работает VPN"
И сразу от нескольких человек.
Ну не работает, ну ладно.
Чего хоть не работает? Спрашиваем.
Ага, с ресолвами.
Ага, с доступом до ресурсов. Снова днс.
Пробую сам сделать коннект - ошибка.
Захожу в аминку впн - ошибка в UI.
Ладно.
Хер знает как у нас работает впн, сам никогда не лез.
Сам только тыкал мышкой в "коннект" на клиенте и всё.
Заходим в репозиторий с VPN/infra.
Ага, виртуальная машина, внутри докеры-полупокеры, юзердата шелл скрипт и tailscale админка.
Ну в целом понятно.
Всё на виртуалке, никаких кубернетисов.
Логи вряд ли мне, несведущему, чему-то помогут, пойдём сперва попроще.
Что может быть? Может диск заполнился.
Графана, дашборд node exporter - всё ок. Ни скачков по диску, ни по IOPS, ни по сети.
Эм, ну ок.
Может ажур поднасрал? Ни автоапдейтов, ни ивентов, ничего по ажуру.
Жаль, а так хотелось поху*сосить ажур снова.
Ну чо, впн это блокер для команды, нет времени разбираться.
Семь бед - один ресет.
Захожу в ажур, выбираю VM, делаю рестарт.
Помогло, но лишь частично - админка UI заработала и начали работать коннекты, но проблема с днс осталась.
Копаем дальше.
Дальше нырнув в код, вижу есть и пара других VM в инфре для впн.
У них так же явный трабл с DNS.
Ну я же синёр - повторяем семь бед - один ресет обеих тачек.
После рестарта всё заработало, клиенты довольны, команда больше не в блокере, днс ресолвит.
Теперь можно налить чай и дебажить "а чо было", да и надо куда-то часы трекера списать.
На час окунулся в логи приложения - ничего особо не понял, я половины терминов и компонентов даже не знаю, ну так же про днс что-то.
Пошли на виртуалки. Джампхост, ссш, шелл.
Смотрим какие у нас services есть, доступны ли все.
Все есть, все доступны.
Однако логи докера(компоуз) дали наводку.
И так по кругу на миллион сообщений.
Значит проблема не со стороны аппликейшна в докере(компоузе), а с сетью - уровень докер лейера или операционной системы(скорее всего).
Ладно, а чо у нас с остальными логами.
Видим, что утром начался авто апдейт (
То есть авто апдейт не на уровне ажура, а самой операционке.
И.. и всё, компонент
"Алекс, не работает VPN"
И сразу от нескольких человек.
Ну не работает, ну ладно.
Чего хоть не работает? Спрашиваем.
Ага, с ресолвами.
Ага, с доступом до ресурсов. Снова днс.
Пробую сам сделать коннект - ошибка.
Захожу в аминку впн - ошибка в UI.
Ладно.
Хер знает как у нас работает впн, сам никогда не лез.
Сам только тыкал мышкой в "коннект" на клиенте и всё.
Заходим в репозиторий с VPN/infra.
Ага, виртуальная машина, внутри докеры-полупокеры, юзердата шелл скрипт и tailscale админка.
Ну в целом понятно.
Всё на виртуалке, никаких кубернетисов.
Логи вряд ли мне, несведущему, чему-то помогут, пойдём сперва попроще.
Что может быть? Может диск заполнился.
Графана, дашборд node exporter - всё ок. Ни скачков по диску, ни по IOPS, ни по сети.
Эм, ну ок.
Может ажур поднасрал? Ни автоапдейтов, ни ивентов, ничего по ажуру.
Жаль, а так хотелось поху*сосить ажур снова.
Ну чо, впн это блокер для команды, нет времени разбираться.
Семь бед - один ресет.
Захожу в ажур, выбираю VM, делаю рестарт.
Помогло, но лишь частично - админка UI заработала и начали работать коннекты, но проблема с днс осталась.
Копаем дальше.
Дальше нырнув в код, вижу есть и пара других VM в инфре для впн.
У них так же явный трабл с DNS.
Ну я же синёр - повторяем семь бед - один ресет обеих тачек.
После рестарта всё заработало, клиенты довольны, команда больше не в блокере, днс ресолвит.
Теперь можно налить чай и дебажить "а чо было", да и надо куда-то часы трекера списать.
На час окунулся в логи приложения - ничего особо не понял, я половины терминов и компонентов даже не знаю, ну так же про днс что-то.
Пошли на виртуалки. Джампхост, ссш, шелл.
Смотрим какие у нас services есть, доступны ли все.
Все есть, все доступны.
Однако логи докера(компоуз) дали наводку.
~$ sudo journalctl -u docker
...
****** 02 14:41:32 ******-vm-us-3 dockerd[1989830]: time="20**-06-02T14:41:32.495924354Z" level=error msg="[resolver] failed to query external DNS server" client-addr="udp:127.0.0.1:57484" dns-server="udp:12>
****** 05 05:43:42 ******-vm-us-3 dockerd[1989830]: time="20**-06-05T05:43:42.432809963Z" level=error msg="[resolver] failed to query external DNS server" client-addr="udp:127.0.0.1:60244" dns-server="udp:12>
И так по кругу на миллион сообщений.
Значит проблема не со стороны аппликейшна в докере(компоузе), а с сетью - уровень докер лейера или операционной системы(скорее всего).
Ладно, а чо у нас с остальными логами.
Видим, что утром начался авто апдейт (
unattended-upgrades в убунту).То есть авто апдейт не на уровне ажура, а самой операционке.
******-06-10 06:17:03,994 INFO Starting unattended upgrades script
******-06-10 06:17:03,995 INFO Allowed origins are: o=Ubuntu,a=jammy, o=Ubuntu,a=jammy-security, o=Docker,a=jammy, o=UbuntuESMApps,a=jammy-apps-security, o=UbuntuESM,a=jammy-infra-security
******-06-10 06:17:03,995 INFO Initial blacklist:
******-06-10 06:17:03,995 INFO Initial whitelist (not strict):
******-06-10 06:17:09,777 INFO Packages that will be upgraded: apport libnss-systemd libpam-systemd libsystemd0 libudev1 python3-apport python3-problem-report systemd systemd-sysv udev
******-06-10 06:17:09,777 INFO Writing dpkg log to /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
******-06-10 06:18:00,563 INFO All upgrades installed
И.. и всё, компонент
systemd-resolved не захотел подниматься после апдейта.****** 10 06:17:24 ******-vm-us-3 systemd-resolved[2663737]: Positive Trust Anchors:
****** 10 06:17:24 ******-vm-us-3 systemd-resolved[2663737]: . IN DS 20326 8 2 e06d44b80b8f1d3457104237c7f8ec8d
****** 10 06:17:24 ******-vm-us-3 systemd-resolved[2663737]: Negative trust anchors: home.arpa *.in-addr.arpa *.172.in-addr.arpa ***.192.in-addr.arpa d.f.ip6.arpa corp home internal intranet lan local private test
****** 10 06:17:24 ******-vm-us-3 systemd-resolved[2663737]: Using system hostname '******-vm-us-3'.
****** 10 06:17:24 ******-vm-us-3 systemd-resolved[2663737]: Failed to connect to system bus: Permission denied
****** 10 06:17:24 ******-vm-us-3 systemd-resolved
🔥8👍3👀3😨2❤1😁1
#docker #troubleshooting #одинденьизжизни
Иногда нам всем нужна Лицензия наУбийство Костыль.
Как в одном из фильмов про Бонда.
Ситуация: резко к вам прибегают и говорят "У НАС ПРОБЛЕЕЕМА".
Нырнув внутрь "проблемы", понимаю, что 19 из 20 разных микросервисов на разных стеках начали ругаться на один из веб-сайтов партнёров. Что-то не так с сертификатом.
Проверяем изнутри пода
Проверяю локально - всё ок с сайтом(он не наш).
Ладно.
Лезем в гугл спрашиваем в чате девопс_ру чего есть ныне для анализа SSL.
Дали рекомендацию - https://www.ssllabs.com/
Проверяю сайт - ранг B, в целом всё ок, но есть вопросики.
Они обновили новый серт, у нового серта новый УЦ(я так понял).
Созвон с коллегами, говорю так и так, сайт чужой, проблема с ним, у нас вроде всё ок.
Однако бизнес не согласен со мной(и, наверное, прав на 100%).
Говорят "да, мы знаем, что проблема скорее всего не у нас. Да, мы поняли, что это надо им писать. Но у нас бизнес и денежки, Пока они(владельцы сайта-партнёра) отреагируют, у нас не ок работает НАШ бизнес.
А где НАШ бизнес - там проблема у нас. Возможно ли быстро решить нашими средствами эту проблему?"
Чуток поэкспериментировал локально, за пять минут нашёл пару очевидных решений.
Спрашиваю лицензию на костыль, мне дают карт-бланш.
Ну ок, лицензия получена, пилим фиксы.
В одном имадже (где старые from имаджи)
В другом имадже залепить, если ещё нет, и пересобрать
(показываю одним слоём, но вообще он был добавлен к один длинный run).
Да, было добавление ca-certificates, но не было команды на апдейт 🐒
И так далее.
Пересобираем, деплоим, проблема ушла.
Ура, бизнес ликует.
Выводы:
А кто тут виноват? Я не знаю.
Владелец сайта и новый УЦ?
Наши "устаревшие сервисы" со старым списком со старыми сертами?
Отсутствие регулярных пересборок имаджей и скачивание всех новых сертов?
Чёрт его знает.
Иногда нам всем нужна Лицензия на
Как в одном из фильмов про Бонда.
Ситуация: резко к вам прибегают и говорят "У НАС ПРОБЛЕЕЕМА".
Нырнув внутрь "проблемы", понимаю, что 19 из 20 разных микросервисов на разных стеках начали ругаться на один из веб-сайтов партнёров. Что-то не так с сертификатом.
Проверяем изнутри пода
> curl https://*******.com/
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
Проверяю локально - всё ок с сайтом(он не наш).
Ладно.
Дали рекомендацию - https://www.ssllabs.com/
Проверяю сайт - ранг B, в целом всё ок, но есть вопросики.
Они обновили новый серт, у нового серта новый УЦ(я так понял).
Созвон с коллегами, говорю так и так, сайт чужой, проблема с ним, у нас вроде всё ок.
Однако бизнес не согласен со мной(и, наверное, прав на 100%).
Говорят "да, мы знаем, что проблема скорее всего не у нас. Да, мы поняли, что это надо им писать. Но у нас бизнес и денежки, Пока они(владельцы сайта-партнёра) отреагируют, у нас не ок работает НАШ бизнес.
А где НАШ бизнес - там проблема у нас. Возможно ли быстро решить нашими средствами эту проблему?"
Чуток поэкспериментировал локально, за пять минут нашёл пару очевидных решений.
Спрашиваю лицензию на костыль, мне дают карт-бланш.
Ну ок, лицензия получена, пилим фиксы.
В одном имадже (где старые from имаджи)
FROM node:*****
...
# temporary fix for https://*****.com/
RUN wget https://sectigo.tbs-certificats.com/SectigoPublicServerAuthenticationRootR46.crt -O /usr/local/share/ca-certificates/sectigo-root.crt && update-ca-certificates
...
В другом имадже залепить, если ещё нет, и пересобрать
...
RUN update-ca-certificates
...
(показываю одним слоём, но вообще он был добавлен к один длинный run).
И так далее.
Пересобираем, деплоим, проблема ушла.
Ура, бизнес ликует.
Выводы:
А кто тут виноват? Я не знаю.
Владелец сайта и новый УЦ?
Наши "устаревшие сервисы" со старым списком со старыми сертами?
Отсутствие регулярных пересборок имаджей и скачивание всех новых сертов?
Чёрт его знает.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1🤡1
#troubleshooting #одинденьизжизни
Процесс мышления трабшутинга. Опять.
Часть 1 из 2.
Прилетает алёрт "рестарт пода с опенсёрч".
Потом 2 пода, тут же все 5 мастер подов".
Бегу смотреть.
Захожу в кластер, переключаюсь в неймспейс, где опенсёрч (он у нас в куберентисах).
Смотрю
Да, есть рестарты.
Есть 5 подов master, 5 подов warm nodes, 5 cold nodes, 2 dashboards.
Рестарты у всех 5 мастеров, у остальных рестартов нет.
Ок, а какая причина? ООМ? Ошибка приложения? Конфигурация?
Показывает, что exit code 1, то есть ошибка внутри приложения, не со стороны самого кубернетиса.
Смотрю логи одного из мастеров опенсёрча
Внутри весёлые и любимые всем портянки java stacktrace.
Переворачиваю свой ультравайд монитор вертикально и читаю что же за причина.
Ага, ругается на какой-то сертификат TLS, который протух.
Переворачиваем монитор обратно в горизонтальное положение.
Смотрим какие есть сертификаты
Много сертров, часть с 365 дней(как бы намекает), часть 728, часть 180 дней.
Так, проблема в серте для опенсёрча, опенсерч мастер не стартует, сертификат надо обновить.
Не, ну а вдруг рестарт подов даст нам пересоздание сертов и секретов - делаем рестарт подов по лейблу.
Семь бед - один ресет.
После рестарта, снова рестарты пода есть. Ок, не помогло, ладно.
У меня очень слабый опыт с опенсёрч, а с опенсёрч в кубернетисах ещё меньше, да и ставил его не я.
Сперва разбираемся, как нам обновить серт:
- руками и чтобы быстро всё заработало
- что-то поправим в конфигах и оператор(если он есть) должен пересоздать серт
Смотрю все аннотации, название, даты и прочие атрибуты у сертификатов и secrets - нигде, ска, нет упоминания кто генерировал сертификат.
Пробовал даже нейронку спросить, он мне генерировал команды типа
на один из сертификатов, но они не особо помогли понять ишшуера/эмитента.
Ладно, смотрим в IaC и самом кластере какие у нас сущности есть в кубере:
- есть опенсерч кластер (чарт хелма)
- есть опенсёрч оператор
Смотрим а вообще должен/умеет ли оператор в этой версии генерировать/перегенерировать при протухщести сертификат?
Читаем дефолт вэльюс + наши вэльюс файлы(из git репозитория)
Ни слова про
Ок, а что у нас в самом чарте опенсёрч кластера?
Уже в самом гите опенсёрч кластера в гите вижу вэльюс файл с
Идём в гитхаб, читаем документацию по нашей версии - да, сертификат должен
- генерироваться
- перегенерироваться при протухшести
Но этого нет👎
Смотрим issues на github - находим несколько про то, что сущности certificate/secrets НЕ удаляются при протухшести.
Воркэраунд солюшн - удаление и секретов и сертификатов.
Процесс мышления трабшутинга. Опять.
Часть 1 из 2.
Прилетает алёрт "рестарт пода с опенсёрч".
Потом 2 пода, тут же все 5 мастер подов".
Бегу смотреть.
Захожу в кластер, переключаюсь в неймспейс, где опенсёрч (он у нас в куберентисах).
Смотрю
kubectl get pods |grep opensearch
Да, есть рестарты.
Есть 5 подов master, 5 подов warm nodes, 5 cold nodes, 2 dashboards.
Рестарты у всех 5 мастеров, у остальных рестартов нет.
Ок, а какая причина? ООМ? Ошибка приложения? Конфигурация?
kubectl get pod PODNAME -o yaml | grep -A4 -i reason
Показывает, что exit code 1, то есть ошибка внутри приложения, не со стороны самого кубернетиса.
Смотрю логи одного из мастеров опенсёрча
kubectl logs PODNAMEMASTER
Внутри весёлые и любимые всем портянки java stacktrace.
Переворачиваю свой ультравайд монитор вертикально и читаю что же за причина.
Ага, ругается на какой-то сертификат TLS, который протух.
notBefore=J***l 8 06:58:13 2024 GMT
notAfter=*** 8 06:58:13 2025 GMT
Переворачиваем монитор обратно в горизонтальное положение.
Смотрим какие есть сертификаты
kubectl get certificates | grep opensearch
Много сертров, часть с 365 дней(как бы намекает), часть 728, часть 180 дней.
Так, проблема в серте для опенсёрча, опенсерч мастер не стартует, сертификат надо обновить.
Не, ну а вдруг рестарт подов даст нам пересоздание сертов и секретов - делаем рестарт подов по лейблу.
Семь бед - один ресет.
kubectl get pod PODNAME -o yaml | grep -A8 -i labels
kubectl delete pod -l=opensearch.role=cluster_manager
После рестарта, снова рестарты пода есть. Ок, не помогло, ладно.
У меня очень слабый опыт с опенсёрч, а с опенсёрч в кубернетисах ещё меньше, да и ставил его не я.
Сперва разбираемся, как нам обновить серт:
- руками и чтобы быстро всё заработало
- что-то поправим в конфигах и оператор(если он есть) должен пересоздать серт
Смотрю все аннотации, название, даты и прочие атрибуты у сертификатов и secrets - нигде, ска, нет упоминания кто генерировал сертификат.
Пробовал даже нейронку спросить, он мне генерировал команды типа
kubectl get secret opensearch-cluster-http-cert -o jsonpath='{.data.tls\.crt}' -n service | base64 -d | openssl x509 -noout -issuer
issuer=CN = opensearch-clusterна один из сертификатов, но они не особо помогли понять ишшуера/эмитента.
Ладно, смотрим в IaC и самом кластере какие у нас сущности есть в кубере:
- есть опенсерч кластер (чарт хелма)
- есть опенсёрч оператор
Смотрим а вообще должен/умеет ли оператор в этой версии генерировать/перегенерировать при протухщести сертификат?
Читаем дефолт вэльюс + наши вэльюс файлы(из git репозитория)
helm show values opensearch-operator --version 2.7.0 --repo https://opensearch-project.github.io/opensearch-k8s-operator
Ни слова про
cert, ни слова про tls. Поиском нет ничего.Ок, а что у нас в самом чарте опенсёрч кластера?
Уже в самом гите опенсёрч кластера в гите вижу вэльюс файл с
security:
tls:
transport:
generate: true
perNode: true
http:
generate: true
Идём в гитхаб, читаем документацию по нашей версии - да, сертификат должен
- генерироваться
- перегенерироваться при протухшести
Но этого нет
Смотрим issues на github - находим несколько про то, что сущности certificate/secrets НЕ удаляются при протухшести.
Воркэраунд солюшн - удаление и секретов и сертификатов.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🤯3
#troubleshooting #одинденьизжизни
Часть 2 из 2.
Собираемся удалять сертификаты..
Так, стоп-стоп, а почему у нас был алёрт по рестартам пода, но не было по протухшести сертификата?
Значит мы почему-то это не мониторим.
Пока время есть давайте настроим хоть какой мониторинг/алертинг, а то через года снова траблы будут постфактум.
Гуглим, читаем про метрики, но по факту для быстроты я просто добавил 1 endpoint в blackbox exporter
Смотрим появился ли этот хост и проверяем в Grafana explore
Супер. Метрика пошла, мы видим за что зацепиться, пилим алёрт (а у нас его и не было, блллл🐒 )
Алерт прилетает, всё ок, возвращаемся к сертификатам.
Не глядя удаляем все сертификаты, на которые была ошибка.
Видим новые пересоздались(оператором, которые прочитал про пересоздания наш конфиг кластера).
Делаем рестарт подов мастеров
и.. и ничего - та же ошибка.
Ладно, удаляем все серты, которые TLS и которые для опенсёрча.
Удалили, рестарт подов мастера и.. и та же ошибка TLS.
Ладно, мы же уже опытные инженеры, смотрим а что у нас с secrets?
и видим, что секрет не был пересоздан.
Ну, скорее всего баг - удаляем и
и снова та же ошибка.
Смотрим внутри мастер пода
- да, серт новый монтируется.
Чего мы имеем:
- у нас НЕТ сертификатов со старым сертом
- у нас НЕТ секретов со старым сертификатом
- в под мастеров монтируется новый серт
- у нас уже есть алерт❤️
- НО у нас есть ошибка TLS при старте мастеров
Ну ведь магии не бывает, может быть эээммммээ может соседние поды - warm + cold +dashboards имеют проблемы с сертом?
Смотрим на рестарты - рестартов у них нет.
Смотрим в логи, блл, стактрейс, java и снова переворачиваем монитор вертикально🐒 - та же ошибка с сертом, но рестартов уже нет.
Странная фигня, но ладно, публикуем в slack канале ЩА ЛОГИ БУДУТ НЕДОСТУПНЫ ПАДАЖИТЕ
и рестартим ВСЕ поды всего опенсёрча по общему лейблу
Происходит рестарт всех 17 POD-ов и.. и проблема ушла.
Итог:
- у нас появился алерт по протухшести на будущее (есть другие, на nginx контроллеры, но тут, внутренний ресурс по 9200 не было🤡 )
- опенсёрч сволочь такая на java, у него под капотом какая-то магия, с протухшим сертом мастера делают рестарт, а остальные нет и серт нужен всем (я хз для чего, да мне и не интересно) и рестарт всем для перемонтирования
- мы разобрались чуток и можно списать время в трекер джиры
- научились мастерски крутить монитором как рулём авто
Часть 2 из 2.
Собираемся удалять сертификаты..
Так, стоп-стоп, а почему у нас был алёрт по рестартам пода, но не было по протухшести сертификата?
Значит мы почему-то это не мониторим.
Пока время есть давайте настроим хоть какой мониторинг/алертинг, а то через года снова траблы будут постфактум.
Гуглим, читаем про метрики, но по факту для быстроты я просто добавил 1 endpoint в blackbox exporter
---
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMProbe
...
spec:
...
targets:
staticConfig:
targets:
......
- https://opensearch-cluster.NAMESPACE.svc:9200
Смотрим появился ли этот хост и проверяем в Grafana explore
probe_ssl_earliest_cert_expiry{} < time() + 30 * 24 * 60 * 60Супер. Метрика пошла, мы видим за что зацепиться, пилим алёрт (а у нас его и не было, блллл
- alert: SSLBlackBoxExporter
expr: probe_ssl_earliest_cert_expiry{} < time() + 30 * 24 * 60 * 60
...
annotations:
summary: "SSL `{{ labels.instance }}` is expiring in {{ .Value | humanizeDuration }}"
Алерт прилетает, всё ок, возвращаемся к сертификатам.
Не глядя удаляем все сертификаты, на которые была ошибка.
kubectl delete certificate CERTNAME1 CERTNAME2
Видим новые пересоздались(оператором, которые прочитал про пересоздания наш конфиг кластера).
Делаем рестарт подов мастеров
kubectl delete pod -l=opensearch.role=cluster_manager
и.. и ничего - та же ошибка.
Ладно, удаляем все серты, которые TLS и которые для опенсёрча.
Удалили, рестарт подов мастера и.. и та же ошибка TLS.
Ладно, мы же уже опытные инженеры, смотрим а что у нас с secrets?
kubectl get secrets
и видим, что секрет не был пересоздан.
Ну, скорее всего баг - удаляем и
secrets и certificates( естественно только те, что связаны с TLS, другие секреты мы не удаляем), серты пересоздаются, секреты пересоздаются, делаем рестарт подов мастера и..и снова та же ошибка.
Смотрим внутри мастер пода
kubectl exec -it -- bash
- да, серт новый монтируется.
Чего мы имеем:
- у нас НЕТ сертификатов со старым сертом
- у нас НЕТ секретов со старым сертификатом
- в под мастеров монтируется новый серт
- у нас уже есть алерт
- НО у нас есть ошибка TLS при старте мастеров
Ну ведь магии не бывает, может быть эээммммээ может соседние поды - warm + cold +dashboards имеют проблемы с сертом?
Смотрим на рестарты - рестартов у них нет.
Смотрим в логи, блл, стактрейс, java и снова переворачиваем монитор вертикально
Странная фигня, но ладно, публикуем в slack канале ЩА ЛОГИ БУДУТ НЕДОСТУПНЫ ПАДАЖИТЕ
и рестартим ВСЕ поды всего опенсёрча по общему лейблу
kubectl delete pod -l opster.io/opensearch-cluster=opensearch-cluster
Происходит рестарт всех 17 POD-ов и.. и проблема ушла.
Итог:
- у нас появился алерт по протухшести на будущее (есть другие, на nginx контроллеры, но тут, внутренний ресурс по 9200 не было
- опенсёрч сволочь такая на java, у него под капотом какая-то магия, с протухшим сертом мастера делают рестарт, а остальные нет и серт нужен всем (я хз для чего, да мне и не интересно) и рестарт всем для перемонтирования
- мы разобрались чуток и можно списать время в трекер джиры
- научились мастерски крутить монитором как рулём авто
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26
#azure #всратость #troubleshooting
Утро, вторник, кофе, трёп.
Прилетает ишшуя от кастомера - не работает %фигнянейм%.
Лог приложений говорит о каких-то несовместимых полях и параметров с API MS Teams/Azure.
Традиционно проверка:
- не менялись ли переменные в коде аппликейшна
- зафиксирована ли версия base имаджа в Dockerfile
- зафиксированы ли версии библиотек
Всё ок.
Ладно. Гугл, реддит, QA Azure, нейронки.
Внезапно(!) обнаружили, что с 31 июля 2025 года multitenancy bot депрекейтед.🤡
Ни уведомлений, ни анонса, ни писем, ни RSS, ни уведомлений в Azure console.
Ни-че-го ни-как и ни-где.
Есть несколько упоминаний: в официальной документации в сноске и community нытинг-форуме:
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration?view=azure-bot-service-4.0&tabs=multitenant#bot-identity-information
- https://techcommunity.microsoft.com/discussions/teamsdeveloper/what-is-the-recommended-bot-type-for-multi-tenant-bots/4420239
Как так-то?? В чём сложность уведомить клиентов, что функционал будет скоро депрекейтед??
Подписке 4 года, боты уже 3 года.
Всратое облако, конечно.
Даже у AWS все предупреждения через почту, всплывающие окошки, куча нотификаций, слак и бьющиеся в окно голуби с инфой, что пора обновить EKS.
А, ну да - почему так произошло, почему только 5 числа?
Да просто это редкий функционал(интеграции), в пятницу 1 числа никто не использовал это, два дня выходные, в понедельник никто не раскачался, а во вторник отстрелило коленные чашечки функционалу фичи, который создавал ажур ботов.
Ну и всё, фича не работает.
Аригато, ажур штопанный.
Утро, вторник, кофе, трёп.
Прилетает ишшуя от кастомера - не работает %фигнянейм%.
Лог приложений говорит о каких-то несовместимых полях и параметров с API MS Teams/Azure.
Традиционно проверка:
- не менялись ли переменные в коде аппликейшна
- зафиксирована ли версия base имаджа в Dockerfile
- зафиксированы ли версии библиотек
Всё ок.
Ладно. Гугл, реддит, QA Azure, нейронки.
Внезапно(!) обнаружили, что с 31 июля 2025 года multitenancy bot депрекейтед.
Ни уведомлений, ни анонса, ни писем, ни RSS, ни уведомлений в Azure console.
Ни-че-го ни-как и ни-где.
Есть несколько упоминаний: в официальной документации в сноске и community нытинг-форуме:
- https://learn.microsoft.com/en-us/azure/bot-service/bot-service-quickstart-registration?view=azure-bot-service-4.0&tabs=multitenant#bot-identity-information
- https://techcommunity.microsoft.com/discussions/teamsdeveloper/what-is-the-recommended-bot-type-for-multi-tenant-bots/4420239
Как так-то?? В чём сложность уведомить клиентов, что функционал будет скоро депрекейтед??
Подписке 4 года, боты уже 3 года.
Всратое облако, конечно.
Даже у AWS все предупреждения через почту, всплывающие окошки, куча нотификаций, слак и бьющиеся в окно голуби с инфой, что пора обновить EKS.
А, ну да - почему так произошло, почему только 5 числа?
Да просто это редкий функционал(интеграции), в пятницу 1 числа никто не использовал это, два дня выходные, в понедельник никто не раскачался, а во вторник отстрелило коленные чашечки функционалу фичи, который создавал ажур ботов.
Ну и всё, фича не работает.
Аригато, ажур штопанный.
Please open Telegram to view this post
VIEW IN TELEGRAM
😭9😁3💯2
#zalando #kubernetes #troubleshooting
"Алекс, у нас там проблемы с БД, которая у вас в кубере - приложение не подключается к нему, пишет всякое".
Не в первой диагностировать что-либо, но сперва вводные:
все базы у нас в кубернетисе, всё через оператора. в аргосиди репо в приложениях мы просто клеймим бд/юзера и приложением забирает адрес, логин и пароль из секретов кубера. Всё достаточно просто.
Лезу в тикет джиры, тред в слаке - коллеги разработчики жалуются, что в случайное время бизнес приложением не может писать в базу. Где-то ошибка, что не возможно подключится, где-то пишет, что база данных находится в ридонли.
Читаю поверхностно логи приложения, оператора, кластера БД - всё вроде ок.
Через разрешение рестартую приложение - проблема уходит.
Закрываю тикет, с лицом Дукалиса-солнышко объясняю деткам-разработчикам, что магии не бывает - у вас приложение говно, раз рестарт POD-a с бизнесовым приложением помогает. БД я не трогаю вообще.
Спустя несколько дней ситуация повторяется, но я, как умный синёр самоуверенный помидор, делаю рестарт пода приложения и снова снисходительно поясняю неразумным коллегам - проблема на вашей стороне.
Не, ну правда - если я вообще не трогаю БД и рестарт бизнес апп помогает - как я мог решить, что виновата инфра?
И потом ситуация ещё пару раз.
А при повторе на другом стеке, другого бизнес приложения подобной ошибки, у нас в команде начинают появляться подозрения, что мы не такие уж и синёры, а обычные мартышки.
В команде всего двое, кто любит нырять глубоко в траблшутинг, ныряю я.
Логи логи логи. Не буду тратить время на описание, но я бессмысленно потратил несколько дней - и ничего не нашёл. Не зная, что искать - ничего и не находишь.
Жалобы время от времени всё поступали и мы совсем сникли.
Для помощи самому себе так же подняли, не моими силами, сбор метрик не только PostgreSQL, но и Patroni.
Однако метрики ничем не помогли.
Просветление было однажды, когда я поймал и саму проблему и сумел увидеть в логе
Это была первая зацепка, и следом начал цепляться за всякое типа
Зацепка, отписываем промежуточное мнение:
кластер делает свичовер но НЕ переключает на реплику(мы это видим по IP при ресолвинге)
наши бизнес приложения продолжают сидеть в том же пуле, их не выкидывает и не переключают на мастера
появляются новые пиды, у которых лайфсайкл времени идёт от времени свичовера.
Складывая в пул все найденные логи, какие-то новые для себя слова, я прихожу к
https://patroni.readthedocs.io/en/master/dcs_failsafe_mode.html
О, как это было похоже на то, что у нас происходило.
Не буду пояснять тут, в документации отлично всё расписано.
Проверяем: а есть ли у нас эта алупа:
Бл, а оно у нас и не включено.
Иду у чарт
https://github.com/zalando/postgres-operator/blob/master/docs/reference/operator_parameters.md#patroni-options
https://github.com/zalando/postgres-operator/blob/master/manifests/configmap.yaml#L52
В общем обосратушки, в операторе это выключено.
Для теста включаю в чарте в отдельном теге.
Затем в dev контуре перевожу все аппликейшны на новый чарт.
Проверяем применилось ли это:
и
Где не применилось, там спасибо оператору, пилим костыль
Пару недель тестов - ошибка больше не повторялось. Ура, победа!
"Алекс, у нас там проблемы с БД, которая у вас в кубере - приложение не подключается к нему, пишет всякое".
Не в первой диагностировать что-либо, но сперва вводные:
все базы у нас в кубернетисе, всё через оператора. в аргосиди репо в приложениях мы просто клеймим бд/юзера и приложением забирает адрес, логин и пароль из секретов кубера. Всё достаточно просто.
Лезу в тикет джиры, тред в слаке - коллеги разработчики жалуются, что в случайное время бизнес приложением не может писать в базу. Где-то ошибка, что не возможно подключится, где-то пишет, что база данных находится в ридонли.
Читаю поверхностно логи приложения, оператора, кластера БД - всё вроде ок.
Через разрешение рестартую приложение - проблема уходит.
Закрываю тикет, с лицом Дукалиса-солнышко объясняю деткам-разработчикам, что магии не бывает - у вас приложение говно, раз рестарт POD-a с бизнесовым приложением помогает. БД я не трогаю вообще.
Спустя несколько дней ситуация повторяется, но я, как умный синёр самоуверенный помидор, делаю рестарт пода приложения и снова снисходительно поясняю неразумным коллегам - проблема на вашей стороне.
Не, ну правда - если я вообще не трогаю БД и рестарт бизнес апп помогает - как я мог решить, что виновата инфра?
И потом ситуация ещё пару раз.
А при повторе на другом стеке, другого бизнес приложения подобной ошибки, у нас в команде начинают появляться подозрения, что мы не такие уж и синёры, а обычные мартышки.
В команде всего двое, кто любит нырять глубоко в траблшутинг, ныряю я.
Логи логи логи. Не буду тратить время на описание, но я бессмысленно потратил несколько дней - и ничего не нашёл. Не зная, что искать - ничего и не находишь.
Жалобы время от времени всё поступали и мы совсем сникли.
Для помощи самому себе так же подняли, не моими силами, сбор метрик не только PostgreSQL, но и Patroni.
Однако метрики ничем не помогли.
Просветление было однажды, когда я поймал и саму проблему и сумел увидеть в логе
demoting self because DCS is not accessible and I was a leader
Это была первая зацепка, и следом начал цепляться за всякое типа
20**/12/06 11:30:18 main.go:127: Connection stats - max: 200, used: 12, available: 185 (6.0% used)
20**/12/06 11:30:18 main.go:130: Connection states - active: 3, idle: 6, idle in transaction: 0
20**/12/06 11:30:18 main.go:274: Database in recovery mode: true
Зацепка, отписываем промежуточное мнение:
кластер делает свичовер но НЕ переключает на реплику(мы это видим по IP при ресолвинге)
наши бизнес приложения продолжают сидеть в том же пуле, их не выкидывает и не переключают на мастера
появляются новые пиды, у которых лайфсайкл времени идёт от времени свичовера.
Складывая в пул все найденные логи, какие-то новые для себя слова, я прихожу к
https://patroni.readthedocs.io/en/master/dcs_failsafe_mode.html
О, как это было похоже на то, что у нас происходило.
Не буду пояснять тут, в документации отлично всё расписано.
Проверяем: а есть ли у нас эта алупа:
root@test-db-2:/home/postgres# curl http://localhost:8008/config | jq
...
{
"failsafe_mode": false,
...
Бл, а оно у нас и не включено.
Иду у чарт
https://github.com/zalando/postgres-operator/blob/master/docs/reference/operator_parameters.md#patroni-options
https://github.com/zalando/postgres-operator/blob/master/manifests/configmap.yaml#L52
В общем обосратушки, в операторе это выключено.
Для теста включаю в чарте в отдельном теге.
Затем в dev контуре перевожу все аппликейшны на новый чарт.
Проверяем применилось ли это:
kubectl exec -it test-db-0 -- curl http://localhost:8008/config | jq .failsafe_mode
true
и
kubectl get postgresql test-db -o yaml | grep -A 2 patroni
patroni:
failsafe_mode: true
Где не применилось, там спасибо оператору, пилим костыль
kubectl rollout restart statefulset test-db
Пару недель тестов - ошибка больше не повторялось. Ура, победа!
1👍14👎1
#kubernetes #azure #aks #troubleshooting #argo #dapr #api
Ныряем в Azure AKS API.
Часть 1 из 2.
У нас болел кубернетис апи.
Болел долго, со вкусом.
Словно мужчина 30+ лет с температурой 37.2, с опекой рядом кудахтающей супруги.
Мы честно хотели его вылечить, но у меня лично никогда не было глубокого опыта дебага апи, часть команды было просто пофиг. Вроде работает? Хорошо. Бизнес, само собой, такими вещами и не интересуется.
Это вызывало массу сайд эффектов: 4 или 5 из моих историй это следствие загрузки K8S API.
Работа операторов, работа кеды и dcs демоушн.
Однажды мненадо было списать много времени по трекеру интересно разобраться с причиной.
Путь первый. Невежественность.
В кластере много компонентов, которые работают с кубернетес апи.
ArgoCD, Kyverno, десятки операторов. Много всего.
Первый мой шаг - поэтапно вырубать контроллеры
То есть я тупо один за одним вырубал какие-то компоненты.
и ждал. 30-60 минут, есть ли эффект.
Конечно же предупреждая коллег, и в случае необходимости тут же скейлил вверх.
Эта идея была тупая, я убил несколько часов/дней.
Никакого результата.
Путь второй. Наивность.
Дальше я выбрал путь наивности - ходил по приложениям, операторам и где мог, подкручивал параметры, чтобы обращения к АПИ был реже. Всякие реконсилейшн у арго, демоушн патрони, частота запросов кеда оператора и так далее.
Помогло ли это? Нет. Стало ли лучше? Глобально - да, ведь я просто оттюнил к лучшему.
К пункту наивности я бы добавил все мои попытки разобраться "что не так с апи по метрикам".
Метрики никак и никогда не дают информации кто же даёт основную нагрузку.
Путь третий. Просветление.
Очевидно предыдущие попытки были унылы и тупы.
Почитал интернет, нейронки, документацию.
Первым делом включаю аудит-лог.
Azure-Kubernetes-Monitoring-Diagnostic settings.
Дальше включаю для Kubernetes API и сохранение в Log Analytics workspace.
Сохраняю, иду в
Там выбираю Logs и ищу сперва все ошибки.
Вижу кучу ошибок.
Ок, начнем с рандом частой ошибки:
Не заостряю внимание на продукте, мне он знаком (можно почитать на https://github.com/dapr/dapr/).
По ошибке проблема сервиса(хоть и странный адрес), а есть ли он?
Он есть.
Почему возникает эта ошибка?Сперва смотрю валуес
Нет ничего интересно, как и в нашем values файле.
Иду в чарт и качаю его к себе https://github.com/dapr/helm-charts/blob/master/dapr-1.14.2.tgz
Вижу кучу темплейтов, хелперсов, CRD.
В CRD указано, что сам оператор реплейсит CRD.
То есть оператор время от времени должен реплейсить неймспейс внутри CRD с
А он не реплейсит. Хорошо, меняю сам руками, смотрю результат.
Радуюсь, иду в логи - а там снова ошибка.
Непонятно. Возвращаюсь обратно а там
Да камон.
Ныряем в Azure AKS API.
Часть 1 из 2.
У нас болел кубернетис апи.
Болел долго, со вкусом.
Словно мужчина 30+ лет с температурой 37.2, с опекой рядом кудахтающей супруги.
Мы честно хотели его вылечить, но у меня лично никогда не было глубокого опыта дебага апи, часть команды было просто пофиг. Вроде работает? Хорошо. Бизнес, само собой, такими вещами и не интересуется.
Это вызывало массу сайд эффектов: 4 или 5 из моих историй это следствие загрузки K8S API.
Работа операторов, работа кеды и dcs демоушн.
Однажды мне
Путь первый. Невежественность.
В кластере много компонентов, которые работают с кубернетес апи.
ArgoCD, Kyverno, десятки операторов. Много всего.
Первый мой шаг - поэтапно вырубать контроллеры
То есть я тупо один за одним вырубал какие-то компоненты.
kubectl scale --replicas 0 sts/name
kubectl scale --replicas 0 deploy/name
и ждал. 30-60 минут, есть ли эффект.
Конечно же предупреждая коллег, и в случае необходимости тут же скейлил вверх.
Эта идея была тупая, я убил несколько часов/дней.
Никакого результата.
Путь второй. Наивность.
Дальше я выбрал путь наивности - ходил по приложениям, операторам и где мог, подкручивал параметры, чтобы обращения к АПИ был реже. Всякие реконсилейшн у арго, демоушн патрони, частота запросов кеда оператора и так далее.
Помогло ли это? Нет. Стало ли лучше? Глобально - да, ведь я просто оттюнил к лучшему.
К пункту наивности я бы добавил все мои попытки разобраться "что не так с апи по метрикам".
Метрики никак и никогда не дают информации кто же даёт основную нагрузку.
Путь третий. Просветление.
Очевидно предыдущие попытки были унылы и тупы.
Почитал интернет, нейронки, документацию.
Первым делом включаю аудит-лог.
Azure-Kubernetes-Monitoring-Diagnostic settings.
Дальше включаю для Kubernetes API и сохранение в Log Analytics workspace.
Сохраняю, иду в
Log Analytics workspace.Там выбираю Logs и ищу сперва все ошибки.
AKSControlPlane
| where Category == "kube-apiserver" and Level == "ERROR"
| limit 40
| project TimeGenerated, Level, Message
Вижу кучу ошибок.
Ок, начнем с рандом частой ошибки:
cacher (subscriptions.dapr.io): unexpected ListAndWatch error: failed to list dapr.io/v1alpha1, Kind=Subscription: conversion webhook for dapr.io/v2alpha1, Kind=Subscription failed: Post "https://dapr-webhook.replaceme.svc:443/convert?timeout=30s": service "dapr-webhook" not found; reinitializing...
Не заостряю внимание на продукте, мне он знаком (можно почитать на https://github.com/dapr/dapr/).
По ошибке проблема сервиса(хоть и странный адрес), а есть ли он?
kubectl get svc -n dapr-system | grep webhook
dapr-webhook ClusterIP 10.0.12.141 <none> 443/TCP
Он есть.
Почему возникает эта ошибка?Сперва смотрю валуес
helm show values dapr/dapr --version 1.14.2
Нет ничего интересно, как и в нашем values файле.
Иду в чарт и качаю его к себе https://github.com/dapr/helm-charts/blob/master/dapr-1.14.2.tgz
Вижу кучу темплейтов, хелперсов, CRD.
В CRD указано, что сам оператор реплейсит CRD.
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
...
spec:
group: dapr.io
conversion:
strategy: Webhook
webhook:
clientConfig:
service:
namespace: replaceme # Patched by post-install webhook
То есть оператор время от времени должен реплейсить неймспейс внутри CRD с
replaceme на реальный dapr-system.А он не реплейсит. Хорошо, меняю сам руками, смотрю результат.
kubectl edit crd subscriptions.dapr.io
customresourcedefinition.apiextensions.k8s.io/subscriptions.dapr.io edited
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: dapr-system
Радуюсь, иду в логи - а там снова ошибка.
Непонятно. Возвращаюсь обратно а там
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: replaceme
Да камон.
👍8
#kubernetes #azure #aks #troubleshooting #argo #dapr #api
Часть 2 из 2.
Думаю ну может я дурак, Меняю снова, уже не иду в логи, А проверяю на месте.
И картина там такая:
Бррр, как такое возможно.
Иду в гугл, нейронку, мне говорят "а ты посмотри - кто последний то меняет объект?".
Смотрю
Пффф, а арго то тут причем?
Снова меняю, снова смотрю - да, арго меняет обратно неймспейс на дефолт.
Иду в репозиторий арго, но там просто
Ну и
А больше мы ничего не меняем.
Снова документация, гугл.
Оказалось вот что:
- арго выкачивает ВЕСЬ чарт, внутри есть директория CRD и там внутри дефолт(путь к чарту был выше, внутри есть CRD директория с манифестами).
Промежуточное описание проблемы:
каждый N период времени оператор DAPR меняет namespace в CRD, тут же сам applicationset DAPR переходит в OutOfSync, арго начинает резко синкать, подтягивает весь чарт, видит, что поменялся CRD и меняет на дефолт. И так по кругу. Насилие ради насилия.
Я и коллега начали фиксить это несколькими вариантами через
Затем снова руками меняю неймспейс, смотрю - ура.
Неймспейс больше не ревратится, в аудит логе АПИ ошибки(этой) больше нет.
Да, арго больше не меняет.
Нагрузку снизили на ... на 4%. Мало, но уже что-то.
Выключаю аудит лог(он оооооооооочень дорогой), закрываю одну из саб-тасок касательно АПИ.
Ещё раз описание ишшуи:
- задеплоили арго аппликейшнсет через сторонний чарт с DAPR
- арго создаёт все сущности через хелмп темплейт (даже те, о которых мы в явном виде не знали)
- затем вебхук от оператора дапр переписывает CRD
- арго при синке видит дифф по CRD и переписывыает его снова
- и так по кругу
Пока не глянешь в кишки и не добавишь в игнор - насилие над апи кубера, так как весь функционал арго и дапра - через кубер апи.
Итог:
- я научился смотреть в логи аудита по Azure AKS API
- сгорел от дурости DAPR оператора и ArgoCD оператора в попытках переписать друг за другом CRD
- узнал про игноры в арго (вообще есть и иные решения для проблемы, но игнор самый простой)
- снизил нагрузку на 4% лишь с одним фиксом
Впереди ещё несколько подходов к апи, есть десятки других ошибок, буду с каждой разбираться отдельно.
Это оказалось интересно.
Часть 2 из 2.
Думаю ну может я дурак, Меняю снова, уже не иду в логи, А проверяю на месте.
И картина там такая:
kubectl edit crd subscriptions.dapr.io
customresourcedefinition.apiextensions.k8s.io/subscriptions.dapr.io edited
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: dapr-system
kubectl get crd subscriptions.dapr.io -o yaml | grep namespace
namespace: replaceme
Бррр, как такое возможно.
Иду в гугл, нейронку, мне говорят "а ты посмотри - кто последний то меняет объект?".
Смотрю
kubectl get crd subscriptions.dapr.io -o jsonpath='{.metadata.managedFields[*].manager}' | tr ' ' '\n' | sort | uniq -c
1 argocd-controller
1 kube-apiserver
1 kubectl-edit
1 operatorПффф, а арго то тут причем?
Снова меняю, снова смотрю - да, арго меняет обратно неймспейс на дефолт.
Иду в репозиторий арго, но там просто
---
name: dapr
namespace: dapr-system
repoURL: https://dapr.github.io/helm-charts/
targetRevision: 1.14.2
chart: dapr
Ну и
applicationset есть.А больше мы ничего не меняем.
Снова документация, гугл.
Оказалось вот что:
- арго выкачивает ВЕСЬ чарт, внутри есть директория CRD и там внутри дефолт(путь к чарту был выше, внутри есть CRD директория с манифестами).
Промежуточное описание проблемы:
каждый N период времени оператор DAPR меняет namespace в CRD, тут же сам applicationset DAPR переходит в OutOfSync, арго начинает резко синкать, подтягивает весь чарт, видит, что поменялся CRD и меняет на дефолт. И так по кругу. Насилие ради насилия.
Я и коллега начали фиксить это несколькими вариантами через
applicationset, типа---
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
...
template:
...
spec:
...
ignoreDifferences:
...
- group: apiextensions.k8s.io
kind: CustomResourceDefinition
name: subscriptions.dapr.io
jqPathExpressions:
- .spec.conversion.webhook.clientConfig.service.namespace
Затем снова руками меняю неймспейс, смотрю - ура.
Неймспейс больше не ревратится, в аудит логе АПИ ошибки(этой) больше нет.
Да, арго больше не меняет.
Нагрузку снизили на ... на 4%. Мало, но уже что-то.
Выключаю аудит лог(он оооооооооочень дорогой), закрываю одну из саб-тасок касательно АПИ.
Ещё раз описание ишшуи:
- задеплоили арго аппликейшнсет через сторонний чарт с DAPR
- арго создаёт все сущности через хелмп темплейт (даже те, о которых мы в явном виде не знали)
- затем вебхук от оператора дапр переписывает CRD
- арго при синке видит дифф по CRD и переписывыает его снова
- и так по кругу
Пока не глянешь в кишки и не добавишь в игнор - насилие над апи кубера, так как весь функционал арго и дапра - через кубер апи.
Итог:
- я научился смотреть в логи аудита по Azure AKS API
- сгорел от дурости DAPR оператора и ArgoCD оператора в попытках переписать друг за другом CRD
- узнал про игноры в арго (вообще есть и иные решения для проблемы, но игнор самый простой)
- снизил нагрузку на 4% лишь с одним фиксом
Впереди ещё несколько подходов к апи, есть десятки других ошибок, буду с каждой разбираться отдельно.
Это оказалось интересно.
1❤10👍7🔥5
#пятница #байки #troubleshooting
Задолго до работы в айти я был простым советским инженером спутниковой связи.
Тарелки, антенны, модемы, кабели, бесконечные командировки. В то время случалось масса странных историй.
Мы разрабатывали спутниковое оборудование - модем.
Ну, типа коробочка: в один конец втыкается ethernet, в другой - кабель для спутниковой антенны. Если объяснять совсем упрощённо.
Однажды поступил сигнал, что в одном месте, куда мы поставляли железо, периодически перестаёт работать связь. Там уже меняли всё: и внешнее оборудование (LNB, передатчик), и кабели, и внутреннее - модемы и блоки питания. Не помогало.
Основная гипотеза была: враги, конкуренты или радиолюбители мешают на спутнике.
Короче, время от времени канал тупил.
Худшая гипотеза - наше оборудование овно, а это тревожный звонок для бизнеса.
Сначала я пытался разобраться удалённо.
Соорудил наспех snmp-monitoring-схему, даже просил людей записывать на бумажке время, когда "глючит". Получилось, что срывы происходят утром, днём и вечером - плюс-минус в одно и то же время.
Но удалённо разобраться не вышло.
А это клиенты, так что надо было срочно решать проблему.
В итоге меня отправили в командировку на три дня.
Меня поселили в гостинице рядом, но на саму территорию связи просто так не пускали.
Утром провели внутрь для диагностики.
Я весь день таскался со своим измерительным оборудованием (два ящика, кстати!), слонялся туда‑сюда, выглядел, наверное, как идиот-“следящий”. Но одного дня мне хватило.
К концу первого дня я понял, в чём дело.
За стеной пункта связи оказалось другое помещение - кухня.
Там сотрудники по утрам грели еду, потому что дома не успевали.
Включали самую паршивую китайскую микроволновку, которая фонит во всех, бл… диапазонах - даже в L band!
Излучение пробивало стену и било прямо по стойке с оборудованием.
Влиял не только наш модем, но и соседнее железо, просто про это никто даже не догадывался.
Днём они грели обед, вечером - кофе.
Я поставил анализаторы, показал сотрудникам и начальнику графики и реальные замеры.
Для чистоты эксперимента включал микроволновку и демонстрировал, как ровно в этот момент садится спутниковый сигнал.
После этого микроволновку перестали включать - и все проблемы исчезли.
Я добавил, что если все они не хотят получить рак через полгода, то пусть заменят это дерьмо на нормальное оборудование.
Народ так перепугался, что рванул на кухню и выкинул микроволновку ещё до того, как я закончил проверку и вышел из кабинета.
Оставшееся время командировки я гулял по местному лесу и думал о том, сколько таких дешевых микроволновок по всему миру, и как редко рядом оказывается человек с анализатором.
Задолго до работы в айти я был простым советским инженером спутниковой связи.
Тарелки, антенны, модемы, кабели, бесконечные командировки. В то время случалось масса странных историй.
Мы разрабатывали спутниковое оборудование - модем.
Ну, типа коробочка: в один конец втыкается ethernet, в другой - кабель для спутниковой антенны. Если объяснять совсем упрощённо.
Однажды поступил сигнал, что в одном месте, куда мы поставляли железо, периодически перестаёт работать связь. Там уже меняли всё: и внешнее оборудование (LNB, передатчик), и кабели, и внутреннее - модемы и блоки питания. Не помогало.
Основная гипотеза была: враги, конкуренты или радиолюбители мешают на спутнике.
Короче, время от времени канал тупил.
Худшая гипотеза - наше оборудование овно, а это тревожный звонок для бизнеса.
Сначала я пытался разобраться удалённо.
Соорудил наспех snmp-monitoring-схему, даже просил людей записывать на бумажке время, когда "глючит". Получилось, что срывы происходят утром, днём и вечером - плюс-минус в одно и то же время.
Но удалённо разобраться не вышло.
А это клиенты, так что надо было срочно решать проблему.
В итоге меня отправили в командировку на три дня.
Меня поселили в гостинице рядом, но на саму территорию связи просто так не пускали.
Утром провели внутрь для диагностики.
Я весь день таскался со своим измерительным оборудованием (два ящика, кстати!), слонялся туда‑сюда, выглядел, наверное, как идиот-“следящий”. Но одного дня мне хватило.
К концу первого дня я понял, в чём дело.
За стеной пункта связи оказалось другое помещение - кухня.
Там сотрудники по утрам грели еду, потому что дома не успевали.
Включали самую паршивую китайскую микроволновку, которая фонит во всех, бл… диапазонах - даже в L band!
Излучение пробивало стену и било прямо по стойке с оборудованием.
Влиял не только наш модем, но и соседнее железо, просто про это никто даже не догадывался.
Днём они грели обед, вечером - кофе.
Я поставил анализаторы, показал сотрудникам и начальнику графики и реальные замеры.
Для чистоты эксперимента включал микроволновку и демонстрировал, как ровно в этот момент садится спутниковый сигнал.
После этого микроволновку перестали включать - и все проблемы исчезли.
Я добавил, что если все они не хотят получить рак через полгода, то пусть заменят это дерьмо на нормальное оборудование.
Народ так перепугался, что рванул на кухню и выкинул микроволновку ещё до того, как я закончил проверку и вышел из кабинета.
Оставшееся время командировки я гулял по местному лесу и думал о том, сколько таких дешевых микроволновок по всему миру, и как редко рядом оказывается человек с анализатором.
1🔥31😁3👍2
#aws #eks #kubernetes #bottlerocket #troubleshooting
Case:
AWS EKS, Bottlerocket AMI. Случайно уронили коллектор логов, сбора не было несколько часов, но логи нужны прям сейчас. Если коллектор починить, то ждать долго(кстати какого фига долго я хз).
Нужных логов в поде нет, в ArgoCD их тоже нет(логично же).
Как быть?
Можно слить с EKS node(s), но этот путь не очевидный, ведь у нас
Для начала нужно быть уверен, что вы включали админ доступ в TOML конфиге.
Ок, админ доступ включён.
Смотрим на какой ноде запущен наш под.
Узнаем айди инстанса.
Подключаемся к инстансу через SSM
Сейчас нет никаких прав, переходим в админа.
Ок, мы стали админами(через контейнер), теперь нам нужен шелл - шелти.
Дальше просто смотрим в
Ну и смотрим логи
"но Алекс, нам нужны все логи, как их слить к себе локально?"
Ок, запускаем сборку логов в шелти
После коллекции у нас логи хранятся на ноде в
Теперь со своей локальной машины дёргаем их к себе через k8s API (да-да, я тоже не знал)
У нас локально теперь все логи в
Задача решена.
Case:
AWS EKS, Bottlerocket AMI. Случайно уронили коллектор логов, сбора не было несколько часов, но логи нужны прям сейчас. Если коллектор починить, то ждать долго(кстати какого фига долго я хз).
Нужных логов в поде нет, в ArgoCD их тоже нет(логично же).
Как быть?
Можно слить с EKS node(s), но этот путь не очевидный, ведь у нас
Bottlerocket.Для начала нужно быть уверен, что вы включали админ доступ в TOML конфиге.
*# Доступ к системным логам, получению root-оболочки (sheltie), запуску journalctl, logdog и пр.
[settings.host-containers.admin]
enabled = true
# Доступ к Bottlerocket API для настроек и диагностики, но без глубокого доступа к логам и файловой системе ноды.
[settings.host-containers.control]
enabled = true
Ок, админ доступ включён.
Смотрим на какой ноде запущен наш под.
kubectl get pods -o wide | grep podname
... ip-10-1-114-226.ec2.internal ...
Узнаем айди инстанса.
kubectl get node -o yaml ip-10-1-114-226.ec2.internal | grep -A4 -i "nodeid"
... "i-09cd72826bee50209" ...
Подключаемся к инстансу через SSM
aws ssm start-session --target i-09cd72826bee50209
Сейчас нет никаких прав, переходим в админа.
enter-admin-container
Ок, мы стали админами(через контейнер), теперь нам нужен шелл - шелти.
[root@admin]# sudo sheltie
Дальше просто смотрим в
/var/log/ls /var/log/containers/
argo-cd-argocd-application-controller-0_argo-cd_application-controller-dfb4d12f601e71ac373b30bfaad8d02b56141218e7bcc5f1358f3a7d8f7df7f7.log
...
Ну и смотрим логи
cat argo-cd-argocd-application-controller-0_argo-cd_application-controller-dfb4d12f601e71ac373b30bfaad8d02b56141218e7bcc5f1358f3a7d8f7df7f7.log
"но Алекс, нам нужны все логи, как их слить к себе локально?"
Ок, запускаем сборку логов в шелти
bash-5.1# logdog
После коллекции у нас логи хранятся на ноде в
logs are at: /var/log/support/bottlerocket-logs.tar.gz
Теперь со своей локальной машины дёргаем их к себе через k8s API (да-да, я тоже не знал)
kubectl get --raw "/api/v1/nodes/ip-10-1-114-226.ec2.internal/proxy/logs/support/bottlerocket-logs.tar.gz" > ./bottlerocket-logs.tar.gz
У нас локально теперь все логи в
bottlerocket-logs.tar.gzЗадача решена.
*** Если изначально админ доступ не включён, то всё не ок. По идее если его включаешь в момент задачи, то ноды пересоздаются и старые логи с нод исчезают в пучине небытия и бездны. Тогда уж лучше ждать окончания работы починенного коллектора логов.** При необходимости повторить для других нод, если исторически старый под был запущен на других нодах.👍8❤5🔥3
#байки #troubleshooting #kubernetes #openshift
В далёком уже 2020-2021 я пилил обучающие онлайн видео для компании, где работал.
Ну типа внутренние онлайн видео встречи "что такое кубернетес/опеншифт" на минималках для ВНЕШНЕЙ компании-партнёра из другой страны. От моей компании передача знаний другой компании-партнёру.
Ничего интересного там не было, общий концепт куба, общие уровни абстракции и так далее.
Помимо этого были куски про CICD и так далее от коллег по компании.
В общем "DevOps онлайн уроки на минималках", галопам поевропам skill-опам.
Одна из частей уроков была подготовка стенда во внутренней сети компании для студентов, чтобы они вживую всё это потыкали и сделали ДЗ.
Этим занимались системные администраторы(крутые ребята, между прочим!) внутри компании.
Установили GitLab, OpenShift, TeamCity, Nexus OSS etc.
Мы, "преподаватели", лишь дали указания, что нам надо, количество нод, версии и всё.
Когда админы всё подготовили, нам дали лишь эндпойнты и креды.
Нам лишь надо было подготовить домашки и всё проверить самостоятельно.
Без проблемных историй не обошлось.
Прибегает ко мне второй преподаватель(часть обучения по контейнеризации), говорит стенд не работает, не понятно почему.
Пилит локально имадж, пушит в реджистри - всё ок.
Делает деплоймент в опеншифте, а он не может пулить (я честно не помню точный текст ошибки, да и байка это, зачем точности тут).
Проверяю - да, пуллинга нет.
Пишу админам - проверьте сетку между нодами кубера и реджистри - пишут всё ок, сеть ок.
Но у нас всё ещё не работает. Спрашиваю у них за файрвол и прочее - всё ок, говорят они.
Сидим, оба "преподавателя" и хлопаем глазами🤡 .
Признаться над своей некомпетентностью стыдно. Даже самому себе.
Потом, меня, внезапно, осеняет. Говорю:
- "а как ты проверял от себя локально? Какие команды вводил?"
- "ну докер билд, докер пуш, докер пулл для проверки"
- "а какой рантайм у опеншифта?"
- "ну cri-o вроде"
Ага, проверяли-то мы по-разному.
Иду к админам, тихонечко спрашиваю:
- "а случаем нет ли какого балансёра перед реджистри?
- "ну как нет, конечно же есть, у нас по регламенту должен быть балансёр"
Бегу в github, качаю нужные бинари крио, канико, докера, подмана и так далее.
Запускаю пулл с каждой из них, в фоне гоню
У всех разный🐒 . Сука.
Снова бегу на поклон к админам, снова общение "а что за конфиг балансёра, дайте плиз часть с фильтрацией по юзер агенту".
Дают конфиг, вижу регулярку для докера, браузеров и контейнерд(точный список не помню).
Пишу новый кусок конфига для всех типов инструментов для работы с имаджами и контейнерами(чтобы другие преподаватели или участники не споткнулись снова об это), отправляю админам.
Они применяют, я проверяю со всех агентов - всё работает.
Пишу второму преподавателю "я починил всё, он проверяет - всё ок".
Радостно урча продолжаем подготовку стенда и материалов для студентов..
Зачем нужен был балансёр перед реджистри внутри закрытой корпоративной сети, с фильтрацией по юзер агенту, я так и не узнал, сперва забыл спросить, а потом и вовсе тот админ покинул компанию, а спустя год и я ушёл.🤷🏽♂️
Ради лишнего гроша участвуешь и не в такой активности компании😭 .
В далёком уже 2020-2021 я пилил обучающие онлайн видео для компании, где работал.
Ну типа внутренние онлайн видео встречи "что такое кубернетес/опеншифт" на минималках для ВНЕШНЕЙ компании-партнёра из другой страны. От моей компании передача знаний другой компании-партнёру.
Ничего интересного там не было, общий концепт куба, общие уровни абстракции и так далее.
Помимо этого были куски про CICD и так далее от коллег по компании.
В общем "DevOps онлайн уроки на минималках", галопам по
Одна из частей уроков была подготовка стенда во внутренней сети компании для студентов, чтобы они вживую всё это потыкали и сделали ДЗ.
Этим занимались системные администраторы(крутые ребята, между прочим!) внутри компании.
Установили GitLab, OpenShift, TeamCity, Nexus OSS etc.
Мы, "преподаватели", лишь дали указания, что нам надо, количество нод, версии и всё.
Когда админы всё подготовили, нам дали лишь эндпойнты и креды.
Нам лишь надо было подготовить домашки и всё проверить самостоятельно.
Без проблемных историй не обошлось.
Прибегает ко мне второй преподаватель(часть обучения по контейнеризации), говорит стенд не работает, не понятно почему.
Пилит локально имадж, пушит в реджистри - всё ок.
Делает деплоймент в опеншифте, а он не может пулить (я честно не помню точный текст ошибки, да и байка это, зачем точности тут).
Проверяю - да, пуллинга нет.
Пишу админам - проверьте сетку между нодами кубера и реджистри - пишут всё ок, сеть ок.
Но у нас всё ещё не работает. Спрашиваю у них за файрвол и прочее - всё ок, говорят они.
Сидим, оба "преподавателя" и хлопаем глазами
*, как сельские дурачкиПризнаться над своей некомпетентностью стыдно. Даже самому себе.
Потом, меня, внезапно, осеняет. Говорю:
- "а как ты проверял от себя локально? Какие команды вводил?"
- "ну докер билд, докер пуш, докер пулл для проверки"
- "а какой рантайм у опеншифта?"
- "ну cri-o вроде"
Ага, проверяли-то мы по-разному.
Иду к админам, тихонечко спрашиваю:
- "а случаем нет ли какого балансёра перед реджистри?
- "ну как нет, конечно же есть, у нас по регламенту должен быть балансёр"
Бегу в github, качаю нужные бинари крио, канико, докера, подмана и так далее.
Запускаю пулл с каждой из них, в фоне гоню
tcpdump.У всех разный
user-agent Снова бегу на поклон к админам, снова общение "а что за конфиг балансёра, дайте плиз часть с фильтрацией по юзер агенту".
Дают конфиг, вижу регулярку для докера, браузеров и контейнерд(точный список не помню).
Пишу новый кусок конфига для всех типов инструментов для работы с имаджами и контейнерами(чтобы другие преподаватели или участники не споткнулись снова об это), отправляю админам.
Они применяют, я проверяю со всех агентов - всё работает.
Пишу второму преподавателю "я починил всё, он проверяет - всё ок".
Радостно урча продолжаем подготовку стенда и материалов для студентов..
Зачем нужен был балансёр перед реджистри внутри закрытой корпоративной сети, с фильтрацией по юзер агенту, я так и не узнал, сперва забыл спросить, а потом и вовсе тот админ покинул компанию, а спустя год и я ушёл.🤷🏽♂️
* да, вот такие "преподаватели" порой участвуют в преподавании.Ради лишнего гроша участвуешь и не в такой активности компании
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13👍1
#troubleshooting #aws #ssh #retool #paranoia #linux
Есть такая штука, называется
Какая-то платформа для менеджеров, я ей не пользовался никогда в бизнес уровне.
В UI интерфейсе мышкой подключаются
Это всё, что надо знать для начала, идём дальше.
В основном
Первый случай я не знаю для кого, у меня пока не было опыта публичных БД, второй способ мне не нравится, да и не пройти с ним SOC2 аудит, так что у нас только третий вариант - через ssh tunnel.
У них есть вполне годный гайд https://docs.retool.com/data-sources/guides/connections/ssh-tunnels, который подойдёт для 99% случаев.
Создаётся пользователь на бастион хосте(например через
При подключении ресурса вы в UI указываете ваш bastion хост, порт и прожимаете test connection.
Если всё ок- ошибки нет. Не ок - ошибка.
Ошибка чаще всего дурацкая, потому что открывается какой-то аналог developer tool и показывает длинный стактрейс.
С
В то время в качестве бастион хоста была убунту 18 вроде и мне пришлось промучить весь стакоферфлоу, чтобы найти решение для себя при ошибке, мне не хватало
Ровно после этого в официальной документации и появился этот совет, если коннекта нет.
Написал им в поддержку, чтобы поправили мануал для глупеньких я.
Тогда подключили какие-то бд, я сидел дальше ковырялся с конфигами, безопасностью, со временем обложил всё секьюрити группами типа
Потом добавились секюрити группы по MySQL/PostgreSQL типа
Так же сразу сделал отдельного пользователя в БД с чётко обрезанными правами.
Делал что-то ещё, и в целом был удовлетворён, что тварь какая-то ходит в мои сети.
Прошло много лет.
Ко мне приходят ребята инженеры, говорят хотят добавить новую БД для retool.
Уже подключена монга, mysql и всякое, а теперь надо и PostgreSQL.
Ок, говорю, ну там всё уже настроено - все ssh ключи, секьюрити группы и прочее - всё должно работать - другие то ресурсы(БД) работает до сих пор.
Берите креды и сами настраиваете, мы же договорились, что не должно быть боттлнека -девопса.
Они высылают скрин, что ошибка подключения. Я само собой не верю (бл, когда я научусь думать, что другие люди не глупее меня🐒 , баран самоуверенный).
Иду сам в retool, копирую все креды, создаю ресурс, но у меня тоже ошибка.
Извиняюсь перед ребятами, пилю тикет, начинаю разбираться.😭
Есть такая штука, называется
retool https://retool.com/Какая-то платформа для менеджеров, я ей не пользовался никогда в бизнес уровне.
В UI интерфейсе мышкой подключаются
resource и на их базе могут строятся какие-то таблички, панели и прочая не интересная мне информация для менеджеров и сейлзов(наверное).Resources чаще всего это база данных. Например MySQL или PostgreSQL. У retool тысячи их для любых интеграций.Это всё, что надо знать для начала, идём дальше.
В основном
Retool из интернета подключается к вашим ресурсам либо напрямую по hostname, либо к AWS через IAM credentials, либо через SSH bastion host.Первый случай я не знаю для кого, у меня пока не было опыта публичных БД, второй способ мне не нравится, да и не пройти с ним SOC2 аудит, так что у нас только третий вариант - через ssh tunnel.
У них есть вполне годный гайд https://docs.retool.com/data-sources/guides/connections/ssh-tunnels, который подойдёт для 99% случаев.
Создаётся пользователь на бастион хосте(например через
ansible или руками), добавляется их ssh public key, раскидываются права - всё готово. В общем всё по инструкции.При подключении ресурса вы в UI указываете ваш bastion хост, порт и прожимаете test connection.
Если всё ок- ошибки нет. Не ок - ошибка.
Ошибка чаще всего дурацкая, потому что открывается какой-то аналог developer tool и показывает длинный стактрейс.
С
retool я уже работал, подключал на проект много лет назад. В то время в качестве бастион хоста была убунту 18 вроде и мне пришлось промучить весь стакоферфлоу, чтобы найти решение для себя при ошибке, мне не хватало
PubkeyAcceptedKeyTypes +ssh-rsa
Ровно после этого в официальной документации и появился этот совет, если коннекта нет.
Написал им в поддержку, чтобы поправили мануал для глупеньких я.
Тогда подключили какие-то бд, я сидел дальше ковырялся с конфигами, безопасностью, со временем обложил всё секьюрити группами типа
resource "aws_security_group" "bastion" {
...
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
# https://docs.retool.com/data-sources/reference/ip-allowlist-cloud-orgs
# retool ip ranges only
# tfsec:ignore:aws-ec2-no-public-ingress-sgr
cidr_blocks = [
"35.90.103.132/30",
"44.208.168.68/30",
"3.77.79.248/30"
]
description = "SSH access from allowed IP ranges"
}
...Потом добавились секюрити группы по MySQL/PostgreSQL типа
resource "aws_security_group_rule" "this" {
type = "ingress"
from_port = 5432
to_port = 5432
protocol = "tcp"
cidr_blocks = ["*********"]
security_group_id = aws_security_group.rds.id
description = "Allow PostgreSQL access from ***** VPC"
}Так же сразу сделал отдельного пользователя в БД с чётко обрезанными правами.
Делал что-то ещё, и в целом был удовлетворён, что тварь какая-то ходит в мои сети.
Прошло много лет.
Ко мне приходят ребята инженеры, говорят хотят добавить новую БД для retool.
Уже подключена монга, mysql и всякое, а теперь надо и PostgreSQL.
Ок, говорю, ну там всё уже настроено - все ssh ключи, секьюрити группы и прочее - всё должно работать - другие то ресурсы(БД) работает до сих пор.
Берите креды и сами настраиваете, мы же договорились, что не должно быть боттлнека -девопса.
Они высылают скрин, что ошибка подключения. Я само собой не верю (бл, когда я научусь думать, что другие люди не глупее меня
Иду сам в retool, копирую все креды, создаю ресурс, но у меня тоже ошибка.
Извиняюсь перед ребятами, пилю тикет, начинаю разбираться.
Please open Telegram to view this post
VIEW IN TELEGRAM
😱3
#troubleshooting #aws #ssh #retool #paranoia #linux
Ок, что же говорит ошибка. Текст типа
и дальше огромная простыня трейса.
А ничего она не говорит, и так понятно, ясно понятно, нет подключения.
Прохожу снова по инструкции - всё ок.
Проверяю не менялся ли паблик ключ? Не менялся.
Не менялся ли пул публичных адресов? Не менялся.
Блин, ну я же не дурак.
Добавляю руками свой IP на секьюрити группу, подключаюсь на бастион хост и оттуда делаю телнет и подключение через cli к PostgreSQL.
Сетевая связность есть, коннект.
Проверяю ещё раз все секьюрити группы, поиск по коммитам, всё отлично.
Так, стоп, а предыдущие то ресурсы работают?
Захожу в
Чешу репу, гуглю решения, закидываю в 3 нейронки - решения нет.
Общие предположения, да и только.
В общем в траблшутинге и логах я просидел долго.
Чтобы не было стыдно, не буду говорить сколько, но много.
В итоге я просто начал смотреть все журналы, все конфиги и даже трейсы, мне было очень интересно.
Очевидно же, что у меня что-то не так, иначе бы ранее добавленные ресурсы не работали.
Спустя время дошёл до конца файла
А там паранойя, ну прям рили паранойя.
Я даже сам забыл про эту паранойю!
В общем добавляю очевидное
Перезапускаю
и Voilà! - коннект от
Описываюсь ребятам, они подтверждают, закрываю задачу.
Какая же мораль? Как обычно:
- не думай, что остальные глупее тебя, если пишут ошибка есть - значит она есть!
- вспоминай о своих параноидальных привычках, прежде, чем тратить время
- держи конфиг sshd в IaC (
* адреса endpoints к БД само собой должны быть полными и длинными, короткие URL лишь для примера
Ок, что же говорит ошибка. Текст типа
Test connection failed (120.327s):(SSH) Channel open failure: open failed
{query: "Connect Request", error: Object}
query: "Connect Request"
error: Object
message: "(SSH) Channel open failure: open failed"
data: Object
reason: 1
name: "Error"
message: "(SSH) Channel open failure: open failed"
и дальше огромная простыня трейса.
А ничего она не говорит, и так понятно, ясно понятно, нет подключения.
Прохожу снова по инструкции - всё ок.
Проверяю не менялся ли паблик ключ? Не менялся.
Не менялся ли пул публичных адресов? Не менялся.
Блин, ну я же не дурак.
Добавляю руками свой IP на секьюрити группу, подключаюсь на бастион хост и оттуда делаю телнет и подключение через cli к PostgreSQL.
Сетевая связность есть, коннект.
Проверяю ещё раз все секьюрити группы, поиск по коммитам, всё отлично.
Так, стоп, а предыдущие то ресурсы работают?
Захожу в
retool, в давно созданные ресурсы - тест проходит ок.Чешу репу, гуглю решения, закидываю в 3 нейронки - решения нет.
Общие предположения, да и только.
В общем в траблшутинге и логах я просидел долго.
Чтобы не было стыдно, не буду говорить сколько, но много.
В итоге я просто начал смотреть все журналы, все конфиги и даже трейсы, мне было очень интересно.
Очевидно же, что у меня что-то не так, иначе бы ранее добавленные ресурсы не работали.
Спустя время дошёл до конца файла
/etc/ssh/sshd_config перебирая по одному все включённые параметры, а там.... а там парам-пам-пам!А там паранойя, ну прям рили паранойя.
# bastion host 1.2.3.4
cat /etc/ssh/sshd_config |grep -v "^#"
...
Match User retool
PermitTTY no
AllowTcpForwarding yes
PermitOpen mysql.amazonaws.com:3306 docdb.amazonaws.com:27017
ForceCommand /bin/echo "Shell disabled!"
Я даже сам забыл про эту паранойю!
В общем добавляю очевидное
...
PermitOpen mysql.amazonaws.com:3306 docdb.amazonaws.com:27017 postgresql.amazonaws.com:5432
...
Перезапускаю
sudo systemctl restart ssh
и Voilà! - коннект от
retool есть.Описываюсь ребятам, они подтверждают, закрываю задачу.
Какая же мораль? Как обычно:
- не думай, что остальные глупее тебя, если пишут ошибка есть - значит она есть!
- вспоминай о своих параноидальных привычках, прежде, чем тратить время
- держи конфиг sshd в IaC (
ansible например), а не руками заполняй, баран. Поиском по iac я быстро увидел бы причину* адреса endpoints к БД само собой должны быть полными и длинными, короткие URL лишь для примера
2🔥10
#troubleshooting #billing #CostOptimization #newrelic
Внезапно вырос ценник на
Заметили не сразу, не было настроены алерты по биллингу.
Увидели лишь в начале месяца, при выставлении счёта.
Я не сильно тогда был знаком с
Поковырявшись в интерфейсе и немного документации, обнаружил, что деньги начали списываться в раздел логирования.
А ведь это странно, все логи у нас пишутся в ELK стек в самом кубе, зачем ещё и в
Первым делом смотрю в ньюрелике кто именно пишет логи - ага, одно единственное приложение.
Иду в git, захожу в раздел PR, вижу там миллиард PR, закрываю, ибо даже с поиском ничего не найти.
Клонирую репозиторий, смотрю локально.
Ага, у нас агент newrelic ставится через Dockerfile
Дальше ковыряюсь в конфигах самого приложения, но там ничего интересного.
Нет в явном виде "логирование енаблед тру" или подобного. Странно.
Ладно, ну поехали, смотрим через git кто когда вносил изменения в докерфайлэ, всё равно другой зацепки нет.
И буквально через несколько коммитов вижу зацепку - коллега разработчик обновил версию
Само собой нашёл и его PR и того, кто его аппрувил.
Но была обновлена только версия, больше ничего не менялось.
Херня какая.
Ладно, иду в POD, смотрю конфиг, а что внутри
и поиском вижу там нечто типа
Пилю себе ветку, в этой ветке делаю даунгрейд до старой версии
Да бл.
Бегу в документацию и нахожу
https://docs.newrelic.com/docs/apm/agents/php-agent/configuration/php-agent-configuration/
От суки, ладно, пилю быстрофикс (не удивлюсь, если он до сих пор там в докерфайле, лол).
Качу PR, аппрув, мерж, логи перестали идти в newrelic, прайс не растёт.
Ну а дальше как обычно: оповещение коллегам, ата-та так не делайте плиз, читайте доки перед апдейтом(да ладно, кому я вру, я бы тоже не читал), вот рут коз, вот фикс, вот ссылки, вот пруфы.
Все виновато покивали и сделали вид, что запомнили и не повторят ошибок. Да.
Потеря денег всего $460 за пару недель.
Идём работать дальше.
Внезапно вырос ценник на
newrelic.Заметили не сразу, не было настроены алерты по биллингу.
Увидели лишь в начале месяца, при выставлении счёта.
Я не сильно тогда был знаком с
newrelic, этой штукой обычно пользовались коллеги-разработчики, я больше по инфре и стеку с VM/Prometheus/Grafana, но деньги есть деньги, надо разбираться.Поковырявшись в интерфейсе и немного документации, обнаружил, что деньги начали списываться в раздел логирования.
А ведь это странно, все логи у нас пишутся в ELK стек в самом кубе, зачем ещё и в
newrelic писать, а там за каждый чих деньги просят.Первым делом смотрю в ньюрелике кто именно пишет логи - ага, одно единственное приложение.
Иду в git, захожу в раздел PR, вижу там миллиард PR, закрываю, ибо даже с поиском ничего не найти.
Клонирую репозиторий, смотрю локально.
Ага, у нас агент newrelic ставится через Dockerfile
ENV NEWRELIC_VERSION 11.6.0.19
...
ADD https://download.newrelic.com/php_agent/archive/${NEWRELIC_VERSION}/newrelic-php5-${NEWRELIC_VERSION}-linux.tar.gz /tmp/
RUN export NR_INSTALL_USE_CP_NOT_LN=1 NR_INSTALL_SILENT=1 \
&& tar -xf /tmp/newrelic-php5-${NEWRELIC_VERSION}-linux.tar.gz -C /tmp \
&& /tmp/newrelic-php5-*/newrelic-install install \
&& rm -rf /tmp/*
...
Дальше ковыряюсь в конфигах самого приложения, но там ничего интересного.
Нет в явном виде "логирование енаблед тру" или подобного. Странно.
Ладно, ну поехали, смотрим через git кто когда вносил изменения в докерфайлэ, всё равно другой зацепки нет.
git log Dockerfile
И буквально через несколько коммитов вижу зацепку - коллега разработчик обновил версию
newrelic.Само собой нашёл и его PR и того, кто его аппрувил.
Но была обновлена только версия, больше ничего не менялось.
Херня какая.
Ладно, иду в POD, смотрю конфиг, а что внутри
cat /usr/local/etc/php/conf.d/newrelic.ini
и поиском вижу там нечто типа
newrelic.application_logging.enabled = true
Пилю себе ветку, в этой ветке делаю даунгрейд до старой версии
newrelic, собираю имадж, смотрю в нём конфигnewrelic.application_logging.enabled = false
Да бл.
Бегу в документацию и нахожу
https://docs.newrelic.com/docs/apm/agents/php-agent/configuration/php-agent-configuration/
PHP agent version 10.1.0 lets you forward your PHP logs with APM logs in context. As of version 10.3.0, the logging metrics and agent log forwarding features are enabled by default. The value newrelic.application_logging.enabled controls whether or not the logs in context feature is active or inactive.
От суки, ладно, пилю быстрофикс (не удивлюсь, если он до сих пор там в докерфайле, лол).
RUN sed "s/^.*;newrelic.application_logging.enabled.*/newrelic.application_logging.enabled = false/" \
-i /usr/local/etc/php/conf.d/newrelic.ini
Качу PR, аппрув, мерж, логи перестали идти в newrelic, прайс не растёт.
Ну а дальше как обычно: оповещение коллегам, ата-та так не делайте плиз, читайте доки перед апдейтом(да ладно, кому я вру, я бы тоже не читал), вот рут коз, вот фикс, вот ссылки, вот пруфы.
Все виновато покивали и сделали вид, что запомнили и не повторят ошибок. Да.
Потеря денег всего $460 за пару недель.
Идём работать дальше.
5👍19❤1