Комментарии 55
Или есть таки разработчики, которые это осилили в одиночку?
Сам кластер kubernetes очень легко и просто собирает Rancher, но вот дальше…
У меня примерно следующее мнение:
— Если работаешь в одиночку, используй k8s, который кто-то другой поддерживает (GKE)
— Если нельзя иметь внешний k8s — обязательно нужно иметь команду, которая умеет его настраивать и отлаживать. Это необходимо, чтобы минимизировать время простоя когда что-то «пойдет не так».
— Если бизнес не требователен к SLA — можно и самому в одиночку настраивать и разбираться.
UPD: я — автор доклада.
1. Для ускорения получения контейнеров можно использовать Dragonfly. Это P2P система хранения с поддержкой Docker Registry протокола.
2. Kubernetes уже 1.11 вышел. Secret давно стабильны. Плюс еще много чего появилось, но думаю вы вкурсе.
3. Для локальной разработки можно (и возможно нужно) использовать Skaffold. Очень интересная утилитка, поддерживает Helm.
4. Для роутинга между подами и сервисами, ингресов, трейсов и еще кое-чего можно использовать Istio.
5. Споты в Kops тоже конечно же давно есть. Но это опять же, просто презентация старая.
6. На счет глобального роутинга — тут federation конечно поможет, но очень зависит от инфраструктуры под ногами.
7. На счет нескольких кластеров… тут важен объем. В ином случае Labels, Taints, NodeSelectors, Limits и Affinity решают вопросы разделения ресурсов и уплотнения. Но можно и несколько кластеров, конечно. Хотя без всех этих штук все равно сложно обойтись.
8. Автоскейлингом занимается Pod Autoscaler, он platform-agnostic. А вот Node Autoscaler в режиме AWS действительно скелит ноды.
9. У Helm, хоть я его не очень и люблю, есть свои dependency между чартами и hooks, что позволяет деплоить и обновлять продукт вместе со всеми зависимостями в правильном порядке, храня только 1 (ну или сколько удобно) конфигурационный файл для stage. Не очень понятно зачем нужны еще какие-то инструменты поверх него (или рядом).
Да, докладу почти год уже, поэтому много что устарело (показатель активного развития k8s)
Про Helm и все окружение вокруг (Skaffold) я на РИТ++ делал доклад.
rootconf.ru/moscow-rit/2018/abstracts/3539
Видео пока нет, но слайды доступны.
Проблем у Helm много, когда проекты сильно взаимосвязаны, и есть транзитивные зависимости. Их сложно конфигурировать, тестировать (да и разрабатывать).
Может по слайдам просто непонятно, но я не очень согласен со «Сквозное конфигурирование? Нет». Оно там есть, при установке базового чарта можно передать конфигурацию зависимым. Но, возможно, оно не про это. Если не про это — скажите про что, интересно:)
На счет транзитивных зависимостей — да, их можно сказать что нет, точнее есть, но ломаются часто из-за кросс зависимостей.
В целом, я стараюсь вообще их избегать и деплоить в несколько шагов то, что можно деплоить в несколько шагов, но если очень надо — попробуйте Degasolv. Он универсальный, но тут тоже сгодится, заменяет requirement.yaml, но правда добавляет один шаг на собственно сборку зависимостей. Лечит дубликаты зависимостей и подобные штуки.
Но тут я согласен, да. Helm далеко не идеален.
— где вы запускаетесь (железо/облака)
— подойдет ли вам попробовать GKE или аналоги
— что значит «пощупала»? Какие-то сервисы для staging попускала?
— какая цена ошибки? Возможен ли простой в несколько часов, пока инженеры пытаются восстановить сломанную во время «щупания» систему?
— насколько много инженеров понимают инфраструктуру k8s, чтобы сделать правильный выбор конфигурационных параметров?
— насколько много долгоживущих монолитов с внутренним стейтом, которые довольно сложно перетащить на k8s?
— если запускать часть сервисов в k8s рядом с работающей системой, насколько критично возрастание latency?
И таких вопросов еще много, я просто написал самое очевидное.
Если хочется потрогать, что это вообще такое — запустите где-нибудь k8s, это сейчас реально делается в пару кликов:
kubernetes.io/docs/setup/pick-right-solution
Самое сложное — что придется менять привычки разработчиков (пресловутый docker-way)
Пока основная цель — чтобы команда захотела перейти (вернее первая — разобраться настолько чтобы самому захотеть), то есть основные ожидания от k8s — упростить работу без снижения скорости доставки и надежности. Как это «продать» бизнесу — это следующий этап.
Преимущество, он же недостаток — гибкость. Очень широкий спект применения, отсюда очень много моментов, где можно споткнуться и сделать не так. Но решаемо.
BGP и IP-in-IP по началу не нужен совсем. Большинство CNI просто работают при условии соблюдения инструкции по установке.
В общем не все так страшно.
Всё-таки пришлось плотно в это ввязаться. С одной стороны, немного не так страшно, как казалось. С другой, возможности которые считал базовыми отсуствуют и приходится городить bash скрипты или типа того для оркестрации оркестратором.
Kubernetes — один кубик, а таких кубиков должно быть 100.
Kubernetes — это не кубик, он скорее каркас для кубиков или даже конструктор)
Разработчиков пишуших софт, работающий только на побитовых копиях их систем нужно бить плеткой.
— Docker полезен исключительно для воссоздания кривых окружений кривых программ (непременно stateless)
— В подавляющем большинстве случаев люди пытаются внедрением Docker компенсировать изначально кривую архитектуру своих приложенияй. Когда это не помогает начинаются разговоры о том, что Kubernetes поможет решить проблемы, но это приводит лишь к новым сложностям
— Docker вводит лишний уровень абстракции, зачастую там где она не нужна
— Содержимое Docker контейнера крайне плохо поддается аудиту
— Docker крайне не прост в настройке и поддержке. Большинство людей которые все же используют докер редко уходят дальше «Just use the docker image»
— Корректная настройка Docker требует найма дополнительного персонала с очень специфическими навыками. Уметь правильно настраивать сесть != уметь правильно настраивать сесть в Docker
— Docker никогда не бывает один и тянет за собой огромную экосистему. Этим он похож на NodeJS, когда очень скоро оказывается, что ваше Hello World приложение зависит от 300 разных библиотек и плагинов.
— Большинство проблем с масштабированием проще\надежнее решить без использования Docker
источник
Каждая новая абстракция это лишняя точка отказа. Уверен, скоро хайп около докера спадет и куча компаний ужаснется от того, что они наворотили. Перенимая «лучшие практики от Google» люди почему то забывают, что они не Google и даже не Amazon.
Да, у докера есть минусы, но большинство перечисленного — это просто перегретая параноя :)
Приведу примеры, когда он полезен:
1) Быстрое развертывание больших проектов для девелоперов. Абстракция ОС позволяет практически одинаково работать девелоперам в различных ОС — Windows/*nix/OS X и поднимать проект под разработку за минуты, а не часы и не волноваться про зависимости.
2) Как единый инструмент, объединяющий developers и devops. Например, посмотрев на содержимое docker-compose.yml devops смогут корректно настроить stage, prod, бакапы, мониторинг и прочее. Причем для prod оно может быть и не в docker. Версионирование также помогает быстро понять, какие изменения между версиями в сервисах и настройках.
3) Возможность удобного развертывания различных сценариев тестирования проекта(нагрузочные, разные версии ПО и т.д.) в разных конфигурациях сервисов и железа.
И это только про Docker. Для Kubernetes нужны свои, весьма крупные причины для развертывания, поддержания корректной работы и разруливания нештатных ситуаций. А учитывая активную разработку k8s и постоянное появление новых возможностей, эта технология еще и дорогая в обслуживании.
Если не облака или нет нужно базы — можно внутри, главное чтобы стораджи позволяли динамическое монтирование и имели достаточную скорость.
Что интересно?
* насколько большие базы(ну и тип указать желательно);
* Нет ли проблем с latency / просадок по скорости;
* Насколько стабильно работают
1. EBS/Compute Engine PD в зависимости от облака. На своем — либо то, что предоставляет OpenStack, допустим, либо iSCSI/CephFS. Хотя последний я недолюбливаю, если честно:)
В целом по эксплуатационной части результат примерно один. Есть еще варианты с локальными стораджами.
2. Базы не очень большие, в пределах десятков ГБ. Postgres, Mongo, Elastic.
3. Проблемы есть ровно те же, как и просто с базами на виртуальных машинах. Исключение — сетевой сторадж, он дает задержки, хотя он и на виртуалках бывает. Но тут решается вариантом мультимастер + локальные стораджи с пересозданием при перезапуске. При условии достаточно стабильной инфраструктуры может быть не очень накладным выходом из ситуации.
4. Принципиальных отличий в стабильности от просто баз, развернутых на виртуалках, не находил.
В целом, Kubernetes позволяет повторить практичечески ту же самую конфигурацию БД, что была бы без него, так что каких-то ограничений (как и больших преимуществ) в переносе баз в него я привести не могу.
а Lazada/Alibaba Group Postgres: github.com/paunin/PostDock.
В целом, вопрос то только в целесообразности в конкретном случае.
Error Budget в целом высчитвывается статистически на основании требований бизнеса и текущей реальности.
Все ошибаются. Иногда что-то идет не так. Это факт. Допустим, мы волевым решением и на основании статистики принимаем решение что 3 релиза из 100 могут пойти не так. То есть для нас Error Budget — 3% (это достаточно высоко, в реальности бюджет не должен превышать 1, максимум 2 процентов).
После этого мы просто начинаем учитывать это в выкатке релизов, т.к. это является аггрегированным показателем качества.
Если ребята катят и не выходят за пределы бюджета, значит в целом качество кода хорошее и можно не боясь катиться практически в любое время.
Если команда начинает выходить за пределы бюджета, то процесс релизов приостанавливается до принятия мер, так как превышение бюджета явно свидетельствует о том, что что-то идет на так в команде, качество когда упало, возникла нестабильность и непонятно где оно стрельнет в следующий раз.
А обоснование для бизнеса простое — мы наблюдаем проблемы с качеством новых версий приложения. Или мы притормаживаем, разбираем инциденты, выясняем проблему и решаем ее, чтобы все было хорошо, или рано или поздно и скорее всего в ближайшее время у нас будут большие проблемы, которые дестабилизируют продукт с непредсказуемыми последствиями. Обычно такого объяснения для бизнеса достаточно, т.к. факты и статистика в наличии и однозначны в трактовке.
Сперва, конечно, надо заручиться поддержкой бизнеса, но это достаточно легко аргументировать, потому что Error Budget вводится ради стабильности :)
Но мы считаем не проценты «хороших релизов», а просто считаем SLA в наших бизнес метриках (простейшее решение для API: кол-во 5xx / общее кол-во запросов). Все плохие релизы сильно снижают этот SLA.
Далее, мы выбираем, ниже какого SLA мы не разрешаем опускаться, и с помощью метода «пристального взгляда» вычисляем, на каких уровнях мы перестаем разрешать релизить новые фичи.
Лично у нас пока не сложилось до конца понимание, как сделать правильно, все до сих пор в стадии становления.
А вот с 404 нужно быть аккуратнее, ее можно получить и без проблем в коде, лучше мониторить отдельно и эмперически добавлять к основной именно тогда, когда она вызвана именно продуктом.
Я работаю на MacOS, у меня Mac, соответственно, чтобы запускать локальный апп, мне нужно запускать локально докер. Это сделать никак нельзя
Вопрос — в чем тут проблема? Если у меня на макбуке стоит докер я не могу использовать minicube?
P.S. докер использую активно, до k8s никак руки не дойдут, хотел поставить minicube — поиграться.
Ну и да, никаких проблем в этом нет.
2. Я сейчас не использую minikube совсем, мне он кажется не очень удобным. Поэтому я не большой знаток.
3. Если я не ошибаюсь, когда вы устанавливаете minikube, у вас используется один из гипервизоров, установленных на машине (VirtualBox, xhyve, VMWare Fusion), и не использует дефолтный докер. Т.е. у вас будет два разных докера на машине :)
Но я не эксперт в этом, могу и ошибаться
minikube start --vm-driver=hyperkit
minikube start
Kubernetes без ELK, Prometheus, Grafana, какой-нибуь CI сегодня — ничто.
А для обычных серверов или ВМ это всё не нужно?
Нужно конечно. Просто в случае kubernetes, с ELK к примеру, вам понадобится: как минимум настроить провайдер PersistentVolume для самого elasticsearch (я настраивал для Vsphere, та ещё задачка, особенно когда документация безбожно устарела), discovery модуль для filebeat (который будет парсить k8s теги автоматом) В случае Prometheus — это как минимум kube-prometheus и оператор оттуда же. И вот куда не плюнь, везде понадобится нетривиальная настройка для kubernetes. А вот если все это хорошо заведется — профит огромный, все становится очень красиво.
То же могу сказать про docker swarm mode + docker flow proxy. И в целом почти никаких новых концепций для людей знакомых с docker-compose
Вот ссылка на проект, где реализован пайплайн gitlab.com/drim-consulting/public/devops/git-flow-ci-cd. Это проект для тренинга, который я на текущий момент готовлю. Там реализован автоматический деплой в рамках git flow, включая, как раз, динамический деплой review apps. Проект еще не полностью отполирован (в частности, не проработано версионирование), но он работает и демонстрирует связку технологий, примененную для CI/CD.
Если концептуально, то каждое окружение деплоится из helm chart в отдельный k8s namespace. Для формирования имен используется
$CI_COMMIT_REF_SLUG
— очищенное имя ветки, предоставляемое GitLab CI. Оно же используется для создания ingress с правилом роутинга по поддомену типа feature1.myapp.com. В каждом пространстве имен создается отдельный ingress, который потом используется для формирования общего набора правил nginx для роутинга по поддоменам.Плюс используется концепция dynamic environments, позволяющая интегрировать развернутые окружения в GitLab UI. К примеру, можно прям со страницы с деталями merge request перейти на развернутое приложение. Также настроено автоматическое удаление приложения после удаления environment, которое автоматически происходит после удаления ветки.
Для выполнения jobs я использую shell executor. Изначально пробовал Docker executors, но потом наткнулся на проблему переиспользования слоев при сборке образов, и отложил эту задачу, чтобы не усложнять процесс на первом этапе. Образы собираются на машине с executors, потом пушатся в GitLab Container Registry. Креды для логина GitLab CI предоставляет в виде переменных окружения.
Если после изучения проекта останутся вопросы, пишите или здесь, или в личку, с удовольствием отвечу на них.
Стоит ли пытаться как-то иначе пытаться ставить новейшую версию k8s или в этом плане kops стараются довольно быстро их догнать?
Аутентификация у Вас работает через dex, он крутится также в кубере или это отдельный инстанс где-то?
В каком случае нужно будет начинать заботиться о сети, если кластер просто предназначен для того, чтобы сайтики хостить со всякими деплоями и обычным nginx-ingress?
10 причин [не] использовать k8s