Andrei
такой вопрос по тому, как Rolling updates работает. вот, если ты фронтенд обновляешь, то тут понятно, если хотя бы 1 под с новой версией уже работает, то часть юзеров увидит обновленную версию. а что насчет бекенда? у нас rails-app и если ты сделал какие-то изменения в схеме БД и при деплое загнал db:migrate, то старая версия (те контейнеры, которые пока не успели обновиться), возможно, не сможет адекватно работать на новой схеме (если ты вдруг решил полностью избавиться от таблицы users, lol). разве что дожидаться, пока деплой пройдет полностью и все старые поды удалятся, и затем только запустить db:migrate. но чет хз, как это автоматизировать
Не правильный подход к работе с данными в процессе миграции: надо дробить твое обновление на несколько более мелких, например, 1. создать новую таблицу и наполнить ее нужными данными, учтя в логике кода работу со старыми и новыми данными, 2. удалить не нужную логику работы со старыми данными из кода, 3. удалить не нужную таблицу из БД
Andrei
тогда и мигрировать и откатываться будет проще
Timur
а вообще стоит ли запускать db:migrate в докерфайле?
Timur
просто тогда при каждом чихе и перезапуске контейнера будет запускаться миграция и чет ну кто его знает
Andrei
а вообще стоит ли запускать db:migrate в докерфайле?
только если отдельной задачей стартуешь этот контейнер
Timur
спасибо всем!
🦠
Можно развязать миграции и деплой
🦠
И делать обратносовместимые миграции, не удаляя поля, создавая новое рядом
Etki
иногда это невозможно
Это просто называется backward compatibility. Если вам надо грохнуть таблицу users, то в новом релизе вы перестаете ею пользоваться, а грохаете только через один релиз
🦠
Фике про то же)
Etki
Если у вас появляются breaking changes в самой таблице, то вы выпускаете релиз, который делают вторую идентичную, льете данные сразу в обе и фоном переливает из старой в новую
🦠
У перконы богатый инструментарий для обновления гигантских баз
Timur
я просто так подумал - 1) зароллить апдейт. 2) когда старых контейнеров не осталось, просто внутри любого контейнера запустить db:migrate и обновить БД. или задеплоить это скриптом после того, опять же, как все новые контейнеры уже в деле. это ведь не нужно делать каждый раз в пределах одной версии.
🦠
Проблема откатить?
Timur
просто бесшовно обновить
Timur
ну и необходимо, чтобы новая версия была способна какое-то время работать на старой схеме.
🦠
Опасно выкатывать все сразу
🦠
Обычно плохо заканчивается)
Timur
😅
🦠
Есть же blue/green
Timur
blue/green?
🦠
Выкатываешь на половину инстансов новую версию, сервишь новых залогиненных там
🦠
Старая висит пока старые не отвалятся
Etki
Есть же blue/green
к базе данных это не очень применимо
yolkov
выкатываешь новую весию с новым лейблом, потом изменяешь у сервиса матч лейблов
🦠
При обратной совместимости проблем не должно быть
yolkov
блю\грина еще нет, только в фичах вроде
🦠
Лоадбалансер?
Etki
блю\грина еще нет, только в фичах вроде
vamp.io может подпилили уже (полгода-год назад было в планах)
yolkov
лоадбалансер смотрит на сервис, а сервис можно вроде на лету подредактировать
yolkov
вот пример скиптов для блю/грина https://github.com/pasientskyhosting/kubernetes-blue-green-deploy
🦠
Спасиб
Bogdan (SirEdvin)
Хм, может кто подсказать, если ли возможность как-то просто поднять кубы на убунте 16.04?
Logan
kubeadm
Logan
или minicube
Etki
если попробовать на локалке что это такое, то миникуб
Logan
это очень быстро, но только для дев-кит
Aleksey
если попробовать на локалке что это такое, то миникуб
да лучше сразу с изучения ingress начинать
Bogdan (SirEdvin)
Миникуб уже пробовал, но как я понял, при помощи него нормальный кластер не развернуть, так, чисто потыкать
Bogdan (SirEdvin)
В целом, спасибо большое, попробуем
Sergej
1 мастер + миньоны -> kubeadmin
Sergej
несколько мастеров -> карго
Bogdan (SirEdvin)
Такой тогда еще вопрос. Когда мастер падает, миньоны дохнут или просто кластер перестает работать как кластер до старта мастера?
Bogdan (SirEdvin)
Всмысле, может ли кластер нормально работать без мастера или будут какие-то проблемы?
Sergej
Работает
Logan
https://github.com/kubernetes-incubator/kargo
кстати, я так и не понял, можно ли использовать его на своих машинах, или облако ему нужно обязательно
Aleksey
да - можно
a1ch3m
Всем привет, не так давно с k8s работаю, подскажите как лучше всего деплоить CI? - kubectl apply -f .k8s/stage —context k8s.blabla.com - kubectl rolling-update $K8S_RC_NAME —image=$PROJECT_IMAGE:$CI_BUILD_REF —namespace=stage —image-pull-policy=IfNotPresent —update-period=0s —context k8s.blabla.com Мне кажется что я какую-то ерунду сделал, но она работает норм, просто кажется что есть более элегантные решения..
Etki
Если это выкладка тестовой версии приложения, то зачем роллинг апдейт? Оно у тебя должно каждый раз с нуля создаваться, иначе есть риск некоторого разветвления историй.
Etki
image-pull-policy тоже тогда должен быть Always, иначе есть вариант тестировать предыдущие выкладки, если версия не поменялась
a1ch3m
А кроме роллинг апдейт какие варианты? Насчет image-pull-policy - согласен, но проблем небыло, тк каждая выкладка новый тег имеет в образе
a1ch3m
вот я что-то вообще все через RC сделал а не через деплоймент, вот это видимо то, что мне и нужно переделать
Logan
а разве в rc не указывается версия? по-моему должна
a1ch3m
указывается, я ее через роллинг и меняю. Или ты имеешь ввиду, что если я просто обновлю RC - то он сам пересоздаст pod?
yolkov
я вообще не понимаю для чего использовать RC, я все переделыывал на деплойменты
a1ch3m
ну вот я тоже к этому пришел, хоть и не сразу
Denis
А кто сталкивался с настройкой Public-Key-Pins в HTTP заголовках? Побеждали как-нибудь?
Sn00part
темплейт ингресса поменять надо
Sn00part
это обычный
Sn00part
nginx
Sn00part
add_header Public-Key-Pins
Sn00part
это уже работает? раньше только хром умел и то с багами
Sn00part
если нужно что то более мощное то надо ставить openresty и в конфиге кодить на LUA
a1ch3m
А кто-нибудь делал bacis_http_auth на сервис без nginx? Вроде же k8s умеет хранить пароли, он же делает такую авторизацию для apiserver.
a1ch3m
Чтобы после деплоя микросервис был доступен только для команды а не для мира. Поднимать для этого vpn не подходит. В итоге вариант либо делать прослойку nginx, либо делать http auth средствами k8s если возможно
Vladimir
Если сервис отдавать через ingress, то в ingress есть basic auth
a1ch3m
ingress видимо то что нужно. Спасибо всем, теперь понятно куда двигаться
Maksim
В принципе есть вариант запустить разработчиков в виртуальную сеть кубера, через L3 и overley сети от кубера...
Artem
У кого была практика настройки prometheus c kubernetes кластером в gke, чем лучше экспортировать метрики? prometheus крутится там же в кубере
a1ch3m
grafana?
Artem
так она рисует графики
Artem
а метрики с ноды и подов надо чем то собрать
Anton
https://prometheus.io/docs/operating/configuration/#<gce_sd_config>