Обновляем k8s без слез
Часть 2
Продолжаем говорить про обновление k8s, и сегодня разберём другую проблему, с которой можно столкнуться.
К сожалению в базе правил нет многих сторонних инструментов. Например, правил для istio, где большая часть CRD перешла в стабильную стадию.
Конкретно для istio есть это.
И есть в документации одна замечательная строка
Прекрасно, разбирайтесь сами, что поддерживается, копаясь в коде 😂
Например, для определения deprecated APIs и полей можно посмотреть это или запустить
По итогу со всей этой гонкой апдейтов получаем большой operational toil: добавляем сотни разных CRD в кластер и затем нужно отслеживать, а не сломаются ли они при релизе новой версии стороннего контроллера/оператора. А сбоку появляются и дополнительные приколы, связанные не просто с deprecation, а с полной миграцией настроек одного API на другой API.
Да, речь про gateway API.
Мы вам создали ресурсы ingress, но поняли, что сделали плохо, поэтому теперь точно сделаем хорошо, пострадайте всего лишь еще один раз, переписывая манифесты под новый формат (и попутно создавая новые баги, с которыми еще не встречались). При этом gateway API, на мой взгляд, очень сильно напоминает ресурсы istio.
На самом деле, конечно же, это не так, ingress обещают поддерживать условно бесконечно.
Про gateway API и почему его создали расскажу в другой раз.
И напоследок: альтернативный инструмент. Он уже, кажется, поддерживает побольше deprecated APIs из коробки. Посмотреть можно здесь.
Часть 2
Продолжаем говорить про обновление k8s, и сегодня разберём другую проблему, с которой можно столкнуться.
К сожалению в базе правил нет многих сторонних инструментов. Например, правил для istio, где большая часть CRD перешла в стабильную стадию.
Конкретно для istio есть это.
И есть в документации одна замечательная строка
What analyzers are supported today?
We’re still working to documenting the analyzers. In the meantime, you can see all the analyzers in the Istio source.
Прекрасно, разбирайтесь сами, что поддерживается, копаясь в коде 😂
Например, для определения deprecated APIs и полей можно посмотреть это или запустить
istioctl analyze
на вашем кластере.По итогу со всей этой гонкой апдейтов получаем большой operational toil: добавляем сотни разных CRD в кластер и затем нужно отслеживать, а не сломаются ли они при релизе новой версии стороннего контроллера/оператора. А сбоку появляются и дополнительные приколы, связанные не просто с deprecation, а с полной миграцией настроек одного API на другой API.
Да, речь про gateway API.
Мы вам создали ресурсы ingress, но поняли, что сделали плохо, поэтому теперь точно сделаем хорошо, пострадайте всего лишь еще один раз, переписывая манифесты под новый формат (и попутно создавая новые баги, с которыми еще не встречались). При этом gateway API, на мой взгляд, очень сильно напоминает ресурсы istio.
На самом деле, конечно же, это не так, ingress обещают поддерживать условно бесконечно.
Про gateway API и почему его создали расскажу в другой раз.
И напоследок: альтернативный инструмент. Он уже, кажется, поддерживает побольше deprecated APIs из коробки. Посмотреть можно здесь.
🔥4👍3
Ностальгии пост
Если вам далеко за 30 и вы давно в IT, то велика вероятность, что вы когда-то (может и сейчас) работали сисадмином (или программистом-админом-эникеем-заправлятелем принтеров).
Это были те времена, когда «войти в IT» никому не было нужно, и сильно больших перспектив в отрасли вряд ли можно было достичь. Обычная обслуживающая работа: починить, настроить, поставить, автоматизировать.
Ключевые слова для олдов: башорг, итхэппенс, лор, ирка, домовые сети.
Я сам начинал админствовать помаленьку с линуксовыми серверами, поднимал IP телефонию поверх openvpn между филиалами одной конторы (о, эти часы копания с tcpdump с поисками, где теряется голосовой трафик), переносил почтовый сервер с полумертвого железа с сохранением всех почтовых ящиков, автоматизировал раскатывание новых машин через PXE boot, внедрял zabbix там, где о мониторинге и не думали, и многое другое.
И, что самое главное, все это стало возможным благодаря развитию сетей. Без нормальной сетевой связности с низкой latency и с высоким throughput не было бы ни кубернетиса, ни прочих распределенных систем.
Скажем за все спасибо ETHERNET!
Итак, сегодня, 22 мая, день рождения ethernet. Считается, что технология была изобретена аж в 1973 году.
Все началось с коаксиальных кабелей. У них была куча проблем: малая гибкость, скорость, стоимость.
Все изменилось, когда витая пара пошла в массы. О, сколько кабелей было обжато кримпером.
А схема обжима заучена наизусть. Вот шпаргалка по порядку выбора проводов:
Развели тут кубернетисы и прочие прометеусы.
Вот в наше время сервера были настоящие, их можно было потрогать и еще они могли прикольно делать пшшш, если внутри что-то сгорало, а не эти ваши бездушные облака, в которых и железо не потрогаешь.
Эх, где мои патч-корды!
Если вам далеко за 30 и вы давно в IT, то велика вероятность, что вы когда-то (может и сейчас) работали сисадмином (или программистом-админом-эникеем-заправлятелем принтеров).
Это были те времена, когда «войти в IT» никому не было нужно, и сильно больших перспектив в отрасли вряд ли можно было достичь. Обычная обслуживающая работа: починить, настроить, поставить, автоматизировать.
Ключевые слова для олдов: башорг, итхэппенс, лор, ирка, домовые сети.
Я сам начинал админствовать помаленьку с линуксовыми серверами, поднимал IP телефонию поверх openvpn между филиалами одной конторы (о, эти часы копания с tcpdump с поисками, где теряется голосовой трафик), переносил почтовый сервер с полумертвого железа с сохранением всех почтовых ящиков, автоматизировал раскатывание новых машин через PXE boot, внедрял zabbix там, где о мониторинге и не думали, и многое другое.
И, что самое главное, все это стало возможным благодаря развитию сетей. Без нормальной сетевой связности с низкой latency и с высоким throughput не было бы ни кубернетиса, ни прочих распределенных систем.
Скажем за все спасибо ETHERNET!
Итак, сегодня, 22 мая, день рождения ethernet. Считается, что технология была изобретена аж в 1973 году.
Все началось с коаксиальных кабелей. У них была куча проблем: малая гибкость, скорость, стоимость.
Все изменилось, когда витая пара пошла в массы. О, сколько кабелей было обжато кримпером.
А схема обжима заучена наизусть. Вот шпаргалка по порядку выбора проводов:
😁12👍8❤1
Вопрос для тех, кто помнит разницу между хабами и свитчами. Популярный вопрос был в свое время на собеседовании на сисадмина.
Что произойдет, если взять один патч-корд и воткнуть оба его конца в один и тот же неуправляемый коммутатор?
Что произойдет, если взять один патч-корд и воткнуть оба его конца в один и тот же неуправляемый коммутатор?
Anonymous Quiz
18%
Ничего не произойдет. Коммутатор просто будет передавать данные сам себе.
3%
Коммутатор начнет работать в режиме повторителя, усиливая сигнал и передавая его на все порты.
78%
Коммутатор создаст петлю, и в сети возникнет широковещательный шторм, способный парализовать ее.
2%
Коммутатор перегорит.
👍3💔1
Правильный ответ: 3
Пояснение: Если на коммутаторе нет работающего протокола STP, то он не умеет обнаруживать и предотвращать петли. Он просто тупо передает все пакеты на все порты. В результате, когда ты создашь петлю, пакеты начнут бесконечно циркулировать по сети, создавая широковещательный шторм, который очень быстро забьет всю полосу пропускания и сделает сеть неработоспособной.
Наверняка такую ошибку допускали многие, перепутав порты на патч-панели. Для тех, кто никогда не работал с физическими сетями, патч-панели — на фото.
В реальности все часто было не так красиво, как на первой фотографии — скорее, как на второй. И не потому, что админ негодяй, а потому, что все это нарастает годами, а времени плотно заняться рефакторингом сети никогда нет. Да и есть риск сломать сеть так, что потом будешь долго искать, какой из сотен кабелей воткнул не в тот vlan, к примеру.
Пояснение: Если на коммутаторе нет работающего протокола STP, то он не умеет обнаруживать и предотвращать петли. Он просто тупо передает все пакеты на все порты. В результате, когда ты создашь петлю, пакеты начнут бесконечно циркулировать по сети, создавая широковещательный шторм, который очень быстро забьет всю полосу пропускания и сделает сеть неработоспособной.
Наверняка такую ошибку допускали многие, перепутав порты на патч-панели. Для тех, кто никогда не работал с физическими сетями, патч-панели — на фото.
В реальности все часто было не так красиво, как на первой фотографии — скорее, как на второй. И не потому, что админ негодяй, а потому, что все это нарастает годами, а времени плотно заняться рефакторингом сети никогда нет. Да и есть риск сломать сеть так, что потом будешь долго искать, какой из сотен кабелей воткнул не в тот vlan, к примеру.
👍7❤1
Как встроить безопасность в свои процессы?
➡️ 4 июня в 19:00 мск — бесплатный вебинар с экспертами Kaspersky и Positive Technologies.
🔹 Dev vs Sec: всё ещё не разговаривают — почему?
🔹 Что DevSecOps может, а что не может?
🔹 Где DevSecOps реально помогает бизнесу, а где мешает?
🔹 Time to market — вечная басня, которая не про DevSecOps
🔹 Где в DevSecOps сейчас Ops, если DevSecOps это AppSec?
Ссылка на трансляцию придёт в бота в день вебинара. Занимайте места в первом ряду!
А пока ждёте — пройдите короткий тест из 5 вопросов и узнайте, насколько ваша команда готова к DevSecOps.
➡️ Подробности — в боте.
Ссылка на трансляцию придёт в бота в день вебинара. Занимайте места в первом ряду!
А пока ждёте — пройдите короткий тест из 5 вопросов и узнайте, насколько ваша команда готова к DevSecOps.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
«Kubernetes для разработчиков» стартовал!🐈
Ближайшие 7 недель мы с коллегами будем учить студентов:
➡️ создавать и настраивать CronJob в Kubernetes, контролировать частоту выполнения задач;
➡️ устанавливать ограничения на перезапуск подов и задавать тайм-ауты на выполнение задач;
➡️ создавать и конфигурировать Service и Ingress для различных Deployment;
➡️ деплоить в Kubernetes, управлять переменными окружения контейнера и работать с логами подов, сохраняя их на указанные пути;
➡️ создавать и настраивать Helm-чарты для приложений, включая интеграцию с Redis через PersistentVolumeClaim;
➡️ настраивать CI/CD пайплайн в GitLab для автоматического билда, пуша образов и деплоя приложения в кластер Kubernetes.
В конце курса — итоговая сертификация, которая позволит закрепить весь пройденный материал и отработать полученные навыки. Вы будете на стенде приводить кластер к определённому состоянию — запускать приложения, создавать абстракции.
Присоединиться можно до конца недели. Подробности — по ссылке.
Ближайшие 7 недель мы с коллегами будем учить студентов:
В конце курса — итоговая сертификация, которая позволит закрепить весь пройденный материал и отработать полученные навыки. Вы будете на стенде приводить кластер к определённому состоянию — запускать приложения, создавать абстракции.
Присоединиться можно до конца недели. Подробности — по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
k8s и бородатая база: сеть и unix
Ситуация:
➡️ Вы развернули on-premise кластер. Никаких managed сервисов в облаке, где можно одной кнопкой нарастить ноды, если вдруг лень освоить Terraform или другие инструменты IaC.
➡️ Внезапно нода отказывается регистрироваться в кластере. В логах тишина (кстати, в каких логах? компонентов-то много, которые логи пишут), kubectl get nodes показывает, что нода «NotReady». Что делать?
Помните времена dial-up модемов и админов, рулящих правилами iptables через
Знание UNIX-like систем — это база! k8s построен поверх базовых вещей: демонов, процессов, файловой системы, сетевых взаимодействий, сертификатов и так далее. Например, kubelet, может запускаться как systemd unit, и если у вас on prem кластер, умение продебажить проблемы на уровне linux может в редких случаях пригодиться.
➡️ Возвращаясь к ситуации выше — вот, какие есть варианты решения:
Вариант 1 (без solid знаний UNIX и сети)
Панически перезапускаем все подряд, молимся, обновляем k8s до последней версии (а вдруг поможет!).
Вариант 2 (с solid знаниями UNIX и сети)
🟠 Проверяем системные логи на ноде.
🟠 Возможно, проблема с DNS, с сертификатами, с дисковым пространством, с сетью, с файрволом, с роутингом, с неожиданно сбоящей сетевой картой, в которой багованная прошивка (реальная история), да много чего еще.
🟠 Смотрим конфигурацию kubelet.
🟠 Анализируем сетевую конфигурацию ноды.
🟠 Проверяем SELinux/AppArmor. Эти системы безопасности могут блокировать доступ kubelet к необходимым ресурсам.
🟠 Не забываем про файрвол! Возможно, файрвол на ноде блокирует трафик от kubelet к kube-apiserver. Может быть вы разворачиваете ноды через ansible и где-то была внесена правка в переменных, из-за которых для всех новых настраиваемых нод файрвол неожиданно подкидывал начал подкидывать правила, которые вообще не для k8s нод предназначались.
И вот, спустя часы копания в логах вы докопались до причины.
Ситуация:
Помните времена dial-up модемов и админов, рулящих правилами iptables через
/etc/rc.local
(на или через другие init скрипты)? Но сегодня у нас есть k8s, виртуализация и прочие абстракции, призванные упростить нашу жизнь при работе at scale (или нет).Знание UNIX-like систем — это база! k8s построен поверх базовых вещей: демонов, процессов, файловой системы, сетевых взаимодействий, сертификатов и так далее. Например, kubelet, может запускаться как systemd unit, и если у вас on prem кластер, умение продебажить проблемы на уровне linux может в редких случаях пригодиться.
Вариант 1 (без solid знаний UNIX и сети)
Панически перезапускаем все подряд, молимся, обновляем k8s до последней версии (а вдруг поможет!).
Вариант 2 (с solid знаниями UNIX и сети)
journalctl -u kubelet -f
cat /var/lib/kubelet/config.yaml
. Мало что там понимаем 😂, но главное, посмотрели с умным видом.ip addr show, ip route show
, iptables -L
(или nft list ruleset
, если у вас современный дистрибутив). Убеждаемся, что сеть настроена правильно, что трафик между воркер нодой и мастер нодой не блокируется, что DNS резолвится корректно.ausearch -m AVC -ts recent
может помочь выявить проблемы.И вот, спустя часы копания в логах вы докопались до причины.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥5🤓2
Всегда виноват DNS (или сертификаты).
➡️ В продолжение вчерашнего поста — реальный кейс из практики.
Представьте, что есть внутренний DNS сервер, который автоматически регистрирует новые (и старые, конечно) серверы. Как - непринципиально. Хоть статикой через ansible, хоть через consul dns, хоть через любые другие велосипеды🚴
На новый сервер для новой k8s ноды так же через ansible все раскатили, но kubelet не хочет регистрироваться — ошибка сертификата. При этом DNS адрес API сервера правильный. Чудеса. IP адрес все равно никто не смотрел.
Long story short: в сети, без какой-то сегментации и с общим dns сервером оказалось 2 k8s кластера. Просто второй по ошибке частично раскатили «поверх» первого, подменив dns запись до API сервера (перезаписав в DNS сервере). Ну а кешировать DNS записи можно и на сутки, так что другие ноды вполне продолжали работать до поры до времени.
Все работает. Пока не перестанет.
➡️ Что почитать, чтобы получить более основательные знания сетей?
1. Таненбаум, «Компьютерные сети»
Он известен еще и тем, что создал minix — учебную ОС для изучения студентами. А так же как человек, активно споривший с Линусом Торвальдсом по поводу дизайна ядра Linux в далеком 1992, когда Торвальдс только начинал писать linux.
2. «Сети для самых маленьких»
Более простой путь, без погружения в преобразование Фурье.
Вопрос на подумать: к каким проблемам приведет mismatch MTU на api server и kubelet для on prem инфраструктуры? Пишите в комментариях⬇️
Представьте, что есть внутренний DNS сервер, который автоматически регистрирует новые (и старые, конечно) серверы. Как - непринципиально. Хоть статикой через ansible, хоть через consul dns, хоть через любые другие велосипеды🚴
На новый сервер для новой k8s ноды так же через ansible все раскатили, но kubelet не хочет регистрироваться — ошибка сертификата. При этом DNS адрес API сервера правильный. Чудеса. IP адрес все равно никто не смотрел.
Long story short: в сети, без какой-то сегментации и с общим dns сервером оказалось 2 k8s кластера. Просто второй по ошибке частично раскатили «поверх» первого, подменив dns запись до API сервера (перезаписав в DNS сервере). Ну а кешировать DNS записи можно и на сутки, так что другие ноды вполне продолжали работать до поры до времени.
Все работает. Пока не перестанет.
1. Таненбаум, «Компьютерные сети»
Он известен еще и тем, что создал minix — учебную ОС для изучения студентами. А так же как человек, активно споривший с Линусом Торвальдсом по поводу дизайна ядра Linux в далеком 1992, когда Торвальдс только начинал писать linux.
2. «Сети для самых маленьких»
Более простой путь, без погружения в преобразование Фурье.
Вопрос на подумать: к каким проблемам приведет mismatch MTU на api server и kubelet для on prem инфраструктуры? Пишите в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3
Всем тем, кто прохавал YAML с самого низа, посвящается.
Если вы имеете дело с k8s и считаете, что YAML — это простой язык, обязательно прочитайте легендарный «YAML document from hell», откроете для себя много нового.
Тем, кто уже читал — мое почтение🎩
Ещё парочка полезных советов:
🟣 YAMLLint — чтобы автоматизировать проверки и не наступать на грабли.
🟣 Kubernetes для разработчиков — чтобы научиться правильно разрабатывать приложение под k8s и запускать его в кластере. До 2 июня при покупке тарифа «видеокурс» — 6 встреч с обратной связью в подарок.
➡️ Подробности — на странице курса ⬅️
Если вы имеете дело с k8s и считаете, что YAML — это простой язык, обязательно прочитайте легендарный «YAML document from hell», откроете для себя много нового.
Тем, кто уже читал — мое почтение🎩
Ещё парочка полезных советов:
Please open Telegram to view this post
VIEW IN TELEGRAM
🤓9❤3
This media is not supported in your browser
VIEW IN TELEGRAM
Мы с котом ведем этот канал уже почти полгода 🔥
И пока Маркус преисполняется RHСP(ставьте 😻, если нужно больше постов с ним) , я собрал для вас дайджест самых мясных материалов за всю историю моего присутствия здесь. Погнали!
➡️ Как работают requests/limits изнутри
➡️ Используем Sidecar Pattern во благо.
→ Часть 1
→ Часть 2
➡️ Что лежит в основе работы service mesh, и как нам в этом поможет Linux?
➡️ План онбординга в компанию
→ Часть 1
→ Часть 2
→ Часть 3
➡️ Типичные ошибки найма
➡️ Secret injection webhook
➡️ Как изучать новое с пользой и с доставкой прямо в ваш inbox?
➡️ CRI, CSI, CNI
➡️ Align expectations: почему это ключ к успеху почти в любой задаче
➡️ Собесы с алгоритмами — это лишь входной фильтр!
→ Часть 1
→ Часть 2
➡️ Роли в технических командах: запись прямого эфира
→ YouTube
→ VK Видео
→ Rutube
→ Дзен
➡️ API, за которые не стыдно
➡️ Ностальгии пост: с днем рождения, ETHERNET!
➡️ k8s и бородатая база: сеть и unix
В комментариях к этому посту можно свободно делиться своими мыслями о контенте, который я выкладываю, и писать пожелания для будущих публикаций⬇️
И пока Маркус преисполняется RHСP
→ Часть 1
→ Часть 2
→ Часть 1
→ Часть 2
→ Часть 3
→ Часть 1
→ Часть 2
→ YouTube
→ VK Видео
→ Rutube
→ Дзен
В комментариях к этому посту можно свободно делиться своими мыслями о контенте, который я выкладываю, и писать пожелания для будущих публикаций
Please open Telegram to view this post
VIEW IN TELEGRAM
System design interview наоборот
Есть у меня очень большая задача in progress (параллельно с другими не менее важными тасками), срок выполнения которой непонятен ни одному участнику процесса.
Задача, прямо скажем, не для слабонервных, но она довольно важная с точки зрения повышения observability, reliability, maintainability и прочих ***bility. Десятки огромных сервисов, каждый из которых — отдельная вселенная со своими решениями.
Команд, которые владеют всеми этими сервисами, наберется 10+. Сервисов и того больше. Каждая команда знает про свой огород и иногда знает, какая картошка посажена у соседей 🥔
Как только data flow процессов в системе выходит за пределы их зоны ответственности, понимание общей картины сразу тускнеет. Это абсолютно нормальная ситуация в бигтехе. У всех и так навалом задач, и разбираться, что делают соседи, мало кто хочет. Кроме меня 😂
Задача простая, как скейлинг деплоймента: построить граф взаимодействий, архитектурную схему, чтобы хоть примерно понимать, что вообще происходит. System design interview наоборот. И не для гипотетической системы, а для вполне реальной, которую пилят не один год 10+ команд.
Зависимостей у каждого сервиса — вагон и маленькая тележка, асинхронных взаимодействий — и тут и там и еще сверху накинули. Трейсинг? Слышали о таком, но пока на уровне попыток внедрения.
Проблема в том, что даже когда появится этот трейсинг, он не спасет. Потому что большинство процессов живут своей жизнью, работают по много часов, и отследить полную цепочку — та еще задача. Нужно знать, где прокидывать трейсы, а в этом очень поможет развесистая архитектурная диаграмма.
Вот только ни один из этих сервисов я не писал 🤷♂️
Вся надежда на то, что расскажут команды, и на существующую документацию, которая устаревает через месяц после написания. Коммуникации — наше все. В основном асинхронные, но иногда приходится вытягивать людей в zoom, без этого не обойтись.
Зачем все это? Да чтобы видеть верхнеуровневую картину, как эти сервисы взаимодействуют. Чтобы, когда что-то начинает деградировать, мы не гадали на метриках, а какой data flow ломается. А их много. Очень много. Да и метрики не всегда показывают проблему. А если метрика ошибок в сервисе X выросла на 0.5%, как это скажется на сервисе Y, который напрямую с X не взаимодействует ни по API, ни асинхронно? И прочие подобные вопросы.
С диаграммой довольно легко приходить в команды и спрашивать, а где эта стрелочка в метриках, а покрыта ли она трейсингом (в будущем), а есть ли на нее SLO, а есть ли error budget, а есть ли run book, что делать, если эта стрелочка покажет SLO breach?
Короче, задача — как собеседование в Google, только ни я, ни интервьюер понятия не имеем, что вообще происходит.
Пожелайте мне удачи в этом непростом деле и поделитесь в комментариях, какие задачи вам предстоит затащить в ближайших спринтах — хочу знать, что не один страдаю 😅
Есть у меня очень большая задача in progress (параллельно с другими не менее важными тасками), срок выполнения которой непонятен ни одному участнику процесса.
Задача, прямо скажем, не для слабонервных, но она довольно важная с точки зрения повышения observability, reliability, maintainability и прочих ***bility. Десятки огромных сервисов, каждый из которых — отдельная вселенная со своими решениями.
Команд, которые владеют всеми этими сервисами, наберется 10+. Сервисов и того больше. Каждая команда знает про свой огород и иногда знает, какая картошка посажена у соседей 🥔
Как только data flow процессов в системе выходит за пределы их зоны ответственности, понимание общей картины сразу тускнеет. Это абсолютно нормальная ситуация в бигтехе. У всех и так навалом задач, и разбираться, что делают соседи, мало кто хочет. Кроме меня 😂
Задача простая, как скейлинг деплоймента: построить граф взаимодействий, архитектурную схему, чтобы хоть примерно понимать, что вообще происходит. System design interview наоборот. И не для гипотетической системы, а для вполне реальной, которую пилят не один год 10+ команд.
Зависимостей у каждого сервиса — вагон и маленькая тележка, асинхронных взаимодействий — и тут и там и еще сверху накинули. Трейсинг? Слышали о таком, но пока на уровне попыток внедрения.
Проблема в том, что даже когда появится этот трейсинг, он не спасет. Потому что большинство процессов живут своей жизнью, работают по много часов, и отследить полную цепочку — та еще задача. Нужно знать, где прокидывать трейсы, а в этом очень поможет развесистая архитектурная диаграмма.
Вот только ни один из этих сервисов я не писал 🤷♂️
Вся надежда на то, что расскажут команды, и на существующую документацию, которая устаревает через месяц после написания. Коммуникации — наше все. В основном асинхронные, но иногда приходится вытягивать людей в zoom, без этого не обойтись.
Зачем все это? Да чтобы видеть верхнеуровневую картину, как эти сервисы взаимодействуют. Чтобы, когда что-то начинает деградировать, мы не гадали на метриках, а какой data flow ломается. А их много. Очень много. Да и метрики не всегда показывают проблему. А если метрика ошибок в сервисе X выросла на 0.5%, как это скажется на сервисе Y, который напрямую с X не взаимодействует ни по API, ни асинхронно? И прочие подобные вопросы.
С диаграммой довольно легко приходить в команды и спрашивать, а где эта стрелочка в метриках, а покрыта ли она трейсингом (в будущем), а есть ли на нее SLO, а есть ли error budget, а есть ли run book, что делать, если эта стрелочка покажет SLO breach?
Короче, задача — как собеседование в Google, только ни я, ни интервьюер понятия не имеем, что вообще происходит.
Пожелайте мне удачи в этом непростом деле и поделитесь в комментариях, какие задачи вам предстоит затащить в ближайших спринтах — хочу знать, что не один страдаю 😅
🔥6👏4😁3❤2
Все уже слышали про вайб-кодинг
А что насчет вайб infrastructure as code? Мой опыт пока такой: модель легко создаст несуществующие опции, но если понимать, что она сгенерировала чушь, это можно легко поправить.
Гораздо опаснее, когда моделям дают доступ к инфре. Удобно, когда можно текстом описать желаемое (scale my k8s cluster by 10%), но делать так все же не стоит.
➡️ Есть другие применения AI. Например, мне довелось попользоваться komodor, и, boy, was it beautiful. Отличный инструмент, когда нужно быстро собрать логи сервисов и получать summary, что там произошло и почему все сломалось.
Он не пытается быть умнее вас (по крайней мере, пока), а довольно бесшовно интегрируется с кубом, чтобы не тратить время на перегон логов множества сервисов в модель, которая подскажет, что случилось в сервисе, который вы не писали и видите второй раз в жизни.
А какой у вас опыт интеграции такого рода помощников в повседневную работу? Наиболее интересны self hosted решения, потому что слать ваши логи в chatgpt плохая идея)
А что насчет вайб infrastructure as code? Мой опыт пока такой: модель легко создаст несуществующие опции, но если понимать, что она сгенерировала чушь, это можно легко поправить.
Гораздо опаснее, когда моделям дают доступ к инфре. Удобно, когда можно текстом описать желаемое (scale my k8s cluster by 10%), но делать так все же не стоит.
Он не пытается быть умнее вас (по крайней мере, пока), а довольно бесшовно интегрируется с кубом, чтобы не тратить время на перегон логов множества сервисов в модель, которая подскажет, что случилось в сервисе, который вы не писали и видите второй раз в жизни.
А какой у вас опыт интеграции такого рода помощников в повседневную работу? Наиболее интересны self hosted решения, потому что слать ваши логи в chatgpt плохая идея)
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4🔥2
Помните большой пост про деньги, которые вы сливаете в облако?
В нем я разбирал типичные примеры, озаглавленные общей идеей «Играл с облаками и проиграл». Если пропустили или присоединились к каналу позже — ловите ссылку.
➡️ Классная новость для тех, кто хочет лучше разобраться в вопросе — Слёрм запускает серию бесплатных встреч, на которых будут разбирать решения в области FinOps:
🟠 неверное использование облачных ресурсов из-за непонимания их специфики;
🟠 избыточную надёжность (SRE);
🟠 оverengineering — избыточное усложнение инструментов, пайплайнов, процессов.
➡️ Первый вебинар «Облачные решения: как снизить затраты и повысить эффективность?» — уже на следующей неделе.
Программа вебинара:
➡️ Типичные ошибки при работе с облачными сервисами и их влияние на бизнес.
➡️ Настройка сетевых сервисов и контроль доступа.
➡️ Как неправильный выбор ресурсов может привести к сбоям.
➡️ Почему резервное копирование — обязательная часть стратегии.
Когда: 11 июня в 17:00 мск
Занять место на вебинаре — через бота.
В нем я разбирал типичные примеры, озаглавленные общей идеей «Играл с облаками и проиграл». Если пропустили или присоединились к каналу позже — ловите ссылку.
Программа вебинара:
Когда: 11 июня в 17:00 мск
Занять место на вебинаре — через бота.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤓1
Оптимизация запуска тяжелых образов для ML
Представьте простую задачу.
Есть k8s. Есть ML модели, где веса вшиты в образ приложения. Любая выкатка или переезд контейнера — боль и нагрузка на container registry, потому что не факт, что образ был закеширован на ноде.
Вы спросите, почему не держать веса в S3? Их оттуда при старте тоже придется скачивать, либо имплементировать способ кеширования на ноде. Тоже возможны разные решения, но пойдем более простым путем, где не нужно переписывать приложения, которые ожидают файлы весов в локальной файловой системе.
➡️ Как ускорить процесс запуска многогигабайтных образов?
Конечно, кеш!
Задействуем спящий DaemonSet. Идея простая.
🟠 Создаем DaemonSet с нужным/нужными образами (может быть много разных).
🟠 В качестве команды для этих контейнеров используем, например, sleep infinity.
В результате образы будут загружены в локальный кеш каждой ноды и будут доступны мгновенно.
При выкатке приложения:
1. Сначала катим DaemonSet
2. Ожидаем в пайплайне, пока все поды в DaemonSet поднимутся
3. Деплоим приложение
Пример решения, где вместо sleep используется pause container:
Таким образом проблему долгой загрузки образов перенесли в другую плоскость и уже не будет возникать ситуаций, когда нода стала unhealthy и мы потеряли производительность из-за потери реплики модели, потому что запуск новой реплики на другой ноде будет быстрым вследствие закешированного образа.
Существуют и другие подходы к кешированию, например, такой. Но внутри он все так же создает DaemonSet 😊
Представьте простую задачу.
Есть k8s. Есть ML модели, где веса вшиты в образ приложения. Любая выкатка или переезд контейнера — боль и нагрузка на container registry, потому что не факт, что образ был закеширован на ноде.
Вы спросите, почему не держать веса в S3? Их оттуда при старте тоже придется скачивать, либо имплементировать способ кеширования на ноде. Тоже возможны разные решения, но пойдем более простым путем, где не нужно переписывать приложения, которые ожидают файлы весов в локальной файловой системе.
Конечно, кеш!
Задействуем спящий DaemonSet. Идея простая.
В результате образы будут загружены в локальный кеш каждой ноды и будут доступны мгновенно.
При выкатке приложения:
1. Сначала катим DaemonSet
2. Ожидаем в пайплайне, пока все поды в DaemonSet поднимутся
3. Деплоим приложение
Пример решения, где вместо sleep используется pause container:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: prepuller
spec:
selector:
matchLabels:
name: prepuller
template:
metadata:
labels:
name: prepuller
spec:
initContainers:
- name: prepuller-1
image: nginx # Наш образ, что подтягиваем в кеш ноды
command: ["sh", "-c", "'true'"]
# - name: prepuller-2
# image: ...
# command: ["sh", "-c", "'true'"]
containers:
- name: pause
image: gcr.io/google_containers/pause:3.2
resources:
limits:
cpu: 1m
memory: 8Mi
requests:
cpu: 1m
memory: 8Mi
Таким образом проблему долгой загрузки образов перенесли в другую плоскость и уже не будет возникать ситуаций, когда нода стала unhealthy и мы потеряли производительность из-за потери реплики модели, потому что запуск новой реплики на другой ноде будет быстрым вследствие закешированного образа.
Существуют и другие подходы к кешированию, например, такой. Но внутри он все так же создает DaemonSet 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
🤓7❤4
Какой эффект достигается использованием pause container в DaemonSet в решении выше?
Anonymous Quiz
50%
Обеспечивает постоянное присутствие образа на каждой ноде
36%
Экономит ресурсы, переводя контейнер в режим ожидания
13%
Снижает нагрузку на container registry
Привет! На связи Маркус 🐈
Столько разговоров про этот ваш кубернетес, как будто это что-то вкусное. Хочу разобраться, почему вы все с ним так носитесь, поэтому решил спросить:
➡️ Какой аспект Kubernetes (сети, хранилища, безопасность, RBAC, операторы и т.д.) вы считаете самым недооцененным, но критически важным для стабильной работы?
Поделитесь в комментариях⬇️
Столько разговоров про этот ваш кубернетес, как будто это что-то вкусное. Хочу разобраться, почему вы все с ним так носитесь, поэтому решил спросить:
Поделитесь в комментариях
Please open Telegram to view this post
VIEW IN TELEGRAM
Разгружаем etcd
Представим ситуацию: поток записи и чтения в кластере такой, что etcd еле справляется, iops дисков ушли в потолок, расти уже некуда.
➡️ Давайте просто добавим больше нод! И тут кроется подвох. Дело в том, что etcd работает на основе алгоритма RAFT. И даже чтение данных, не говоря уже о записи, происходит через лидера. Думаю, тут я ни для кого не открыл ничего нового.
Как работает запись в etcd:
🟠 API-сервер отправляет запрос на запись одной из нод etcd.
🟠 Если повезло и запрос попал на лидера, то лидер реплицирует запись на мажоритарное количество нод (например, 2 из 3 или 3 из 5). Только после этого запись считается успешной.
🟠 Если же запрос прилетел на реплику, то он все равно перенаправляется лидеру.
🟠 И только после записи на лидере и мажоритарном количестве реплик API-сервер получает подтверждение.
Теперь, зная это, давайте подумаем о масштабировании etcd.
➡️ Представьте себе кластер с 7 нодами etcd. В этом случае запись нужно реплицировать на 4 из 7 нод, что может существенно замедлить процесс (хотя все, конечно, относительно).
Оптимальным считается иметь 3-5 нод etcd. Это обеспечивает достаточную отказоустойчивость и не перегружает репликацию между нодами etcd. Однако, в таком сетапе мы все равно ограничены ресурсами одной ноды.
Но есть решение! Хотя и применять его стоит с большой осторожностью.
Можно вынести хранение events в отдельный кластер etcd (а это, как минимум, еще 3 ноды в ваш кластер). Для этого в конфиге API-сервера нужно указать следующее:
Разобраться в тонкостях работы etcd можно в гайде от Слёрма➡️ в боте.
Представим ситуацию: поток записи и чтения в кластере такой, что etcd еле справляется, iops дисков ушли в потолок, расти уже некуда.
Как работает запись в etcd:
Теперь, зная это, давайте подумаем о масштабировании etcd.
Оптимальным считается иметь 3-5 нод etcd. Это обеспечивает достаточную отказоустойчивость и не перегружает репликацию между нодами etcd. Однако, в таком сетапе мы все равно ограничены ресурсами одной ноды.
Но есть решение! Хотя и применять его стоит с большой осторожностью.
Можно вынести хранение events в отдельный кластер etcd (а это, как минимум, еще 3 ноды в ваш кластер). Для этого в конфиге API-сервера нужно указать следующее:
# /etc/kubernetes/manifests/kube-apiserver.yaml
command:
- kube-apiserver
- --etcd-servers-overrides=/events#https://etcd-events.example.com:2379
...
Разобраться в тонкостях работы etcd можно в гайде от Слёрма
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤2👍2
Rancher в продакшен: лучшие практики управления кластерами
Мы с Вячеславом Федосеевым (и Маркусом, конечно же) решили провести совместный веб и поговорить про Rancher. Будем обсуждать:
🔷 централизованное управление кластерами через единый интерфейс;
🔷 автоматизированные бэкапы и восстановление;
🔷 настройку доступа для команд и интеграцию внешней аутентификации;
🔷 встроенные мониторинг и использование магазина приложений.
Подробно покажем и расскажем, как Rancher упрощает эксплуатацию k8s и управление инфраструктурой, поделимся собственным опытом и best practices.
Когда: 16 июня в 19:00 мск
Занять место на вебинаре➡️ через бота.
Мы с Вячеславом Федосеевым (и Маркусом, конечно же) решили провести совместный веб и поговорить про Rancher. Будем обсуждать:
Подробно покажем и расскажем, как Rancher упрощает эксплуатацию k8s и управление инфраструктурой, поделимся собственным опытом и best practices.
Когда: 16 июня в 19:00 мск
Занять место на вебинаре
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Cloud native практики, которые постоянно нарушаются
Все мы знаем базовые правила.
➡️ Не храните секреты в коде, будь то код приложения или код инфры (terraform, ansible, puppet, etc.).
➡️ Разделяйте prod и dev. Лучше на разные облачные аккаунты, чтобы уменьшить blast radius.
➡️ Руководствуйтесь принципом наименьших привилегий. Да, часто хочется просто накинуть побольше прав очередной IAM роли и не разбираться, а какие права реально нужны.
Но раз за разом эти простые вещи игнорируются в силу разных причин. Ловите чек-лист, на что обратить внимание, чтобы потом не было мучительно больно:
🟠 Безопасность
➡️ Least privilege: начинать с широких прав доступа кажется удобным, но приводит к огромным проблемам безопасности в будущем.
➡️ Использование IAM ролей (или аналогов)
- Использовать IAM роли для доступа к ресурсам.
- Не использовать статические креды для доступа.
- Использовать короткоживущие ключи доступа.
- Использовать AssumeRole (или аналоги), чтобы позволить, например, EC2 инстансу, временно получить нужные права доступа.
➡️ Регулярная ротация ключей и сертификатов: своевременная ротация ключей доступа и SSL/TLS сертификатов - must have, особенно для прода. Многие подобные ротации в публичных облаках работают из коробки, а где-то нужно дополнительно это настроить.
➡️ Проверка неиспользуемых ролей (пример)
➡️ Включать MFA для всех аккаунтов, особенно для root аккаунта.
➡️ Федеративные аккаунты: должен быть ровно один аккаунт, через который можно управляться всеми остальными (пример)
➡️ Сегментация сети: изоляция различных сред (dev, staging, prod) с помощью VPC и Security Group.
➡️ Шифрование данных: шифрование данных как при хранении (at rest) так и при передаче (in transit). At rest — не опциональный момент и должен быть включен обязательно.
🟠 Infrastructure as code
➡️ Terraform: автоматизация развертывания и управления инфраструктурой. Это позволяет отслеживать изменения, автоматизировать развертывание и избежать ручных ошибок.
➡️ Версионирование IaC: хранить код инфраструктуры в git.
➡️ Автоматизированные пайплайны для развертывания IaC: Интегрировать IaC с CI/CD пайплайнами.
🟠 Мониторинг и логирование
➡️ Централизованное логирование: собирать логи со всех компонентов системы в централизованное хранилище для упрощения анализа и отладки.
➡️ Мониторинг: настройка мониторинга ключевых метрик для отслеживания производительности и выявления проблем на раннем этапе, а не когда все уже развалится.
➡️ Алерты: никто не будет постоянно смотреть в ваши метрики и логи. Без алертов они почти бесполезны для раннего выявления проблем.
🟠 CI/CD
➡️ Автоматизация всего, что возможно: автоматизация развертывания, тестирования, масштабирования и восстановления.
➡️ CI/CD: непрерывная интеграция и непрерывная доставка - основа современной разработки.
➡️ Автоматизированные тесты: писать и запускать тесты (unit, integration, end-to-end) в CI/CD пайплайне.
🟠 Стоимость
➡️ Использовать reserved instances, saving plans или аналоги для сокращения расходов
➡️ Использовать менее отказоустойчивые решения для тестовых сред. Вам не нужно тройное резервирование БД, S3 и так далее практически никогда для dev/staging.
➡️ Автоскейлинг: выключить тестовые среды на ночь — тоже вариант экономии. Увеличивать ресурсы на проде, зная заранее паттерны нагрузки — так же полезно.
➡️ Удаление неиспользуемых ресурсов: регулярно проверять и удалять неиспользуемые ресурсы.
➡️ Выбор правильного типа инстанса: использование правильного размера и типа инстанса для задач. Недоиспользование ресурсов один из ключевых факторов повышенной стоимости инфраструктуры. Но не стоит забывать про сезонные скачки нагрузки. То что сегодня кажется ненужным, в сезон распродаж приводит к нерабочему проду, потому что он не справляется с нагрузкой и приходится срочно скейлить ресурсы.
➡️ Тегирование ресурсов: правильная система тегов для отслеживания стоимости и принадлежности ресурсов командам.
Список далеко не полный, но подсвечивает все ключевые моменты, которые стоит соблюдать при работе с инфрастуктурой.
Все мы знаем базовые правила.
Но раз за разом эти простые вещи игнорируются в силу разных причин. Ловите чек-лист, на что обратить внимание, чтобы потом не было мучительно больно:
- Использовать IAM роли для доступа к ресурсам.
- Не использовать статические креды для доступа.
- Использовать короткоживущие ключи доступа.
- Использовать AssumeRole (или аналоги), чтобы позволить, например, EC2 инстансу, временно получить нужные права доступа.
Список далеко не полный, но подсвечивает все ключевые моменты, которые стоит соблюдать при работе с инфрастуктурой.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1