Как создать локальную среду разработки для Kubernetes?

115

Кажется, что Kubernetes занимается развертыванием контейнеров в облаке кластеров. Чего он, похоже, не касается, так это среды разработки и постановки (или чего-то подобного).

Во время разработки вы хотите быть как можно ближе к производственной среде с некоторыми важными изменениями:

  • Развернуты локально (или, по крайней мере, где-нибудь, где только вы можете получить доступ )
  • Используйте последний исходный код при обновлении страницы (предположим, что это веб-сайт; в идеале автоматическое обновление страницы при сохранении локального файла, что можно сделать, если вы смонтируете исходный код и используете что-то вроде Yeoman ).

Точно так же может потребоваться непубличная среда для непрерывной интеграции .

Поддерживает ли Kubernetes такую ​​среду разработки или это нужно создавать, надеясь, что во время производства она все еще будет работать?

Wernight
источник
Взгляните на Openshift Origin. Это следующая версия Openshift, построенная на базе Kubernetes. Работает автономно в контейнере Docker.
Марк О'Коннор,
@ MarkO'Connor Я больше хотел развернуть и в Google Cloud, но это скорее решения для развертывания. Если у вас есть решение с OpenShift Origin, которое позволяет локальную разработку (в основном, перезагрузить последний локальный файл), поделитесь, пожалуйста, в качестве ответа, мне было бы интересно.
Wernight
Вы нашли решение этого? У меня есть кубернеты, работающие поверх мезо в моем локальном кластере разработки. Я планирую создать микросервисы в go, которые будут развертываться в контейнерах на кубернетах. Я хотел бы иметь возможность сохранить свои изменения и автоматически построить двоичный файл и перезапустить модули. На самом деле не было изменений, чтобы проверить это, но я думаю, что сборка двоичного кода на vms и последующий перезапуск модуля может быть немного медленным.
F21
2
@ F21 Прошло больше года с тех пор, как это было опубликовано. Есть ли хороший рабочий процесс локальной разработки с кубернетами?
Jatin
Вы можете посмотреть microk8s, это легкая установка k8s для вашего локального компьютера. Я отправил ответ на то же самое, как его установить. Установка займет около минуты.
Prafull Ladha

Ответы:

67

Обновление (2016-07-15)

С выпуском Kubernetes 1.3 Minikube теперь является рекомендуемым способом запуска Kubernetes на вашем локальном компьютере для разработки.


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

Роберт Бейли
источник
3
Документы говорят, что это больше не рекомендуемый метод и что «Minikube - это рекомендуемый метод запуска Kubernetes на вашем локальном компьютере».
Jatin
Я не думаю, что minikube подходит для разработки самого k8s, верно?
harryz 01
Это зависит от того, что вы разрабатываете. Есть много частей k8s, где разумно использовать minikube для разработки. Если вы работаете над политиками сетевой безопасности модуля или над плагинами CNI, это не имеет особого смысла.
Роберт Бейли
1
Ссылка «Kubernetes локально через Docker» не работает. У кого-нибудь есть обновление?
Pwnosaurus
1
Некоторое время назад Minikube заменил установку локального докера, и впоследствии документация для локальной версии докера была удалена. Подходит ли Minikube для ваших нужд? Вы также можете использовать kubeadm внутри виртуальной машины для создания экземпляра локального одноузлового кластера.
Роберт Бейли
9

Мы работали над инструментом для этого. Основная идея заключается в том, что у вас есть удаленный кластер Kubernetes, по сути, промежуточная среда, а затем вы запускаете код локально, и он передается через прокси в удаленный кластер. Вы получаете прозрачный доступ к сети, копирование переменных среды, доступ к томам ... как можно ближе к удаленной среде, но при этом ваш код работает локально и под вашим полным контролем.

Так что, скажем, вы можете заниматься живым развитием. Документы на http://telepresence.io

Итамар
источник
5

Мы планируем добавить что-то вроде «горячей перезагрузки», но это не так просто, как сегодня. Однако, если вы любите приключения, вы можете использовать rsync с docker exec, kubectl exec или osc exec (все примерно одинаково), чтобы синхронизировать локальный каталог с контейнером при каждом изменении. Вы можете использовать rsync с kubectl или osc exec следующим образом:

# rsync using osc as netcat
$ rsync -av -e 'osc exec -ip test -- /bin/bash' mylocalfolder/ /tmp/remote/folder
Clayton
источник
Сама по себе горячая перезагрузка есть и должна обрабатываться веб-фреймворком, который вы используете, здесь йомен обычно это настраивает. Не хватает только того, как его включить. Требуется смонтировать локальный том. Если ответчик @ Robert работает, это должно быть правильное решение.
Wernight
4

Еще одна отличная отправная точка - это установка Vagrant , особенно. если ваша ОС - Windows. Очевидные преимущества

  • быстрая и безболезненная настройка
  • легко уничтожить / воссоздать машину
  • неявный лимит ресурсов
  • возможность тестирования горизонтального масштабирования путем создания нескольких узлов

Минусы - нужно много оперативной памяти, а VirtualBox - это VirtualBox ... лучше или хуже.

Смешанное преимущество / недостаток - отображение файлов через NFS. В нашей настройке мы создали два набора определений RC - один, который просто загружает образ докера наших серверов приложений; другой с 7 дополнительными строками, которые настраивают отображение файлов из HostOS -> Vagrant -> VirtualBox -> CoreOS -> Kubernetes pod; перезапись исходного кода из образа Docker.

Обратной стороной является файловый кеш NFS - с ним проблематично, без него проблемно медленно. Даже настройка mount_options: 'nolock,vers=3,udp,noac'не избавляет полностью от проблем с кешированием, но в большинстве случаев работает. Некоторые задачи Gulp, выполняемые в контейнере, могут занимать 5 минут, тогда как в ОС хоста они занимают 8 секунд. Кажется, хороший компромисс mount_options: 'nolock,vers=3,udp,ac,hard,noatime,nodiratime,acregmin=2,acdirmin=5,acregmax=15,acdirmax=15'.

Что касается автоматической перезагрузки кода, это зависит от языка, но мы довольны сервером разработки Django для Python и Nodemon для Node.js. Для внешних проектов вы, конечно, можете многое сделать с помощью чего-то вроде gulp + browserSync + watch, но для многих разработчиков нетрудно работать с Apache и просто выполнять традиционное жесткое обновление.

Мы храним 4 набора файлов yaml для Kubernetes. Dev, "devstable", stage, prod. Различия между ними

  • переменные env, явно устанавливающие среду (dev / stage / prod)
  • количество реплик
  • devstable, stage, prod использует образы докеров
  • dev использует образы докеров и отображает папку NFS с исходным кодом поверх них.

Очень полезно создавать множество псевдонимов и автозаполнения bash - я могу просто набрать текст, rec usersи он подойдет kubectl delete -f ... ; kubectl create -f .... Если я хочу, чтобы вся настройка была запущена, я набираю текст recfo, и он воссоздает дюжину служб, извлекая последние образы докеров, импортируя последний дамп db из Staging env и очищая старые файлы Docker для экономии места.

аналитик
источник
4

Я только начал со скаффолд

Действительно полезно автоматически применять изменения в коде к локальному кластеру.

Для развертывания локального кластера лучше всего использовать Minikube или просто Docker для Mac и Windows, оба включают интерфейс Kubernetes.

Игнасио Миллан
источник
2

Наличие хорошей обратной связи на местном уровне - одна из основных тем в экосистеме Kubernetes.

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

Докер для Mac Kubernetes

Docker для Mac Kubernetes ( Docker Desktop - это общее название кроссплатформенности) предоставляет отличный вариант для локальной разработки. Для виртуализации он использует HyperKit, который построен на собственной структуре гипервизора в macOS вместо VirtualBox.

Функция Kubernetes была впервые выпущена в виде бета-версии на пограничном канале в январе 2018 года и с тех пор прошла долгий путь, став сертифицированным Kubernetes в апреле 2018 года и перейдя на стабильный канал в июле 2018 года .

По моему опыту, работать с ним намного проще, чем с Minikube, особенно на macOS, и особенно когда дело касается таких проблем, как RBAC, Helm, гипервизор, частный реестр и т. Д.

Шлем

Что касается распространения вашего кода и получения обновлений локально, Helm - один из самых популярных вариантов. Вы можете публиковать свои приложения через CI / CD в виде диаграмм Helm (а также базовых образов Docker, на которые они ссылаются). Затем вы можете извлечь эти диаграммы из реестра диаграмм Helm локально и обновить их в локальном кластере.

Лазурный осадок

Вы также можете использовать такой инструмент, как Azure Draft, для простого локального развертывания и создания базовых диаграмм Helm из общеязыковых шаблонов, вроде пакетов сборки, чтобы автоматизировать эту часть головоломки.

Скаффолд

Skaffold похож на Azure Draft, но более зрелый, более широкий по своему охвату и создан Google. У него очень гибкая архитектура. Я думаю, что в будущем больше людей будут использовать его для разработки локальных приложений для Kubernetes.

Если вы использовали React, я думаю о Skaffold как о « Create React App for Kubernetes».

Сочинять или сочинять в Kubernetes

Docker Compose , хотя и не имеющий отношения к Kubernetes, является альтернативой, которую некоторые компании используют для предоставления простой, легкой и переносимой локальной среды разработки, аналогичной среде Kubernetes, которую они запускают в производственной среде. Однако идти по этому пути означает расходиться с настройками производства и локальной разработки.

Kompose - это конвертер Docker Compose в Kubernetes. Это может быть полезным путем для тех, кто уже запускает свои приложения в виде коллекций контейнеров локально.

Compose on Kubernetes - это недавно выпущенное (декабрь 2018 г.) предложение от Docker с открытым исходным кодом, которое позволяет развертывать файлы Docker Compose непосредственно в кластере Kubernetes через настраиваемый контроллер.

Тейлор Эдмистон
источник
1

Кубеспары помогает создавать локальные кластеры. В основном я использовал кластер на основе бродяг на локальной машине.

Конфигурация Kubespray Вы можете настроить эти переменные, чтобы получить желаемую версию Kubernetes.

ПЕА
источник
1

Недостатком использования minkubeявляется то, что он создает другую виртуальную машину поверх вашей. Кроме того, для последней minikubeверсии требуется минимум 2 процессора и 2 ГБ оперативной памяти от вашей системы, что делает ее довольно тяжелой, если у вас нет системы с достаточным количеством ресурсов.

Это причина, по которой я перешел microk8sна разработку кубернетов, и мне это нравится. microk8sподдерживает DNS, локальное хранилище, панель мониторинга, istio, ingress и многое другое, все, что вам нужно для тестирования ваших микросервисов.

Он предназначен для быстрой и легкой установки Kubernetes вверх по течению, изолированной от вашей локальной среды. Эта изоляция достигается за счет упаковки всех двоичных файлов для Kubernetes, Docker.io, iptables и CNI в один пакет snap.

Кластер Kubernetes с одним узлом можно установить за минуту с помощью одной команды:

snap install microk8s --classic

Убедитесь, что в вашей системе не запущены докеры или службы kubelet. Microk8sавтоматически установит все необходимые службы.

Перейдите по следующей ссылке, чтобы включить другие надстройки microk8s.

https://github.com/ubuntu/microk8s

Вы можете проверить статус, используя:

velotio@velotio-ThinkPad-E470:~/PycharmProjects/k8sClient$ microk8s.status
microk8s is running
addons:
ingress: disabled
dns: disabled
metrics-server: disabled
istio: disabled
gpu: disabled
storage: disabled
dashboard: disabled
registry: disabled
Прафул Ладха
источник
> Убедитесь, что в вашей системе не запущены докеры или службы kubelet. Но у меня уже установлен Docker локально, и я использую контейнеры отдельно от Kubernetes. Означает ли это, что я не могу установить microk8s локально?
Аттила Шереми,
1

Взгляните на https://github.com/okteto/okteto и Okteto Cloud . Ценностное предложение состоит в том, чтобы иметь классический опыт разработки, чем локальная работа до докера, где у вас могут быть горячие перезагрузки, инкрементные сборки, отладчики ... но все ваши локальные изменения немедленно синхронизируются с удаленным контейнером. Удаленные контейнеры дают вам доступ к скорости облака, обеспечивают новый уровень сотрудничества и интегрируют разработку в производственную среду. Кроме того, это устраняет нагрузку на местные установки.

Пабло Чико де Гусман
источник
0

Как ранее указывал Роберт, миникубе - это лучший способ.

Вот краткое руководство по началу работы с minikube. Общие шаги:

  • Установить minikube

  • Создайте кластер minikube (на виртуальной машине, которая может быть VirtualBox или Docker для Mac или HyperV в случае Windows)

  • Создайте Docker-образ вашего файла приложения (используя Dockerfile)

  • Запустите образ, создав развертывание

  • Создайте службу, которая предоставляет ваше приложение, чтобы вы могли получить к нему доступ.

Saty
источник
0

Вот как я сделал локальную настройку Kubernetes в Windows 10:

  • Используйте Docker Desktop

  • Включите Kubernetes в настройках Docker Desktop

  • В Docker Desktop по умолчанию для памяти выделяется ресурс 2 ГБ, поэтому для использования Kubernetes с Docker Desktop увеличьте объем памяти.

  • Установите kubectl в качестве клиента, чтобы общаться с кластером Kubernetes

  • Запустите команду kubectl config get-context, чтобы получить доступный кластер.

  • Выполните команду kubectl config use-context docker-desktop, чтобы использовать рабочий стол докера.

  • Создайте образ докера вашего приложения

  • Напишите файл YAML (описательный метод создания развертывания в Kubernetes), указывающий на образ, созданный в кластере вышеупомянутого шага.

  • Предоставьте службу типа node port для каждого развертывания, чтобы сделать ее доступной для внешнего мира.

Шивани
источник