Рубрики
Uncategorized

Localizer: приключение в создании менеджера по обратному туннелю/туннеля для Kubernetes

Обязательно подпишитесь на мой блог за большим контентом. Прежде чем мы пойдем в подробности того, какой локализатор я … Tagged с Kubernetes, Docker, DevOps, SRE.

Обязательно подписаться на мой блог для большего содержания.

Прежде чем мы пойдем в детали того, что такое локализатор и как он стал, очень важно, чтобы мы смотрели на то, что такое среда разработчиков, и о мотивации, лежащих в основе тех, которые я создаю.

С тех пор, как я написал свой первый в истории среда разработчика Для ныне несуществующего Staymarta Я всегда сосредоточился на одном: простоте использования. Для среды разработки на основе Docker Compose это была относительно простая задача. Создайте контейнеры Docker, напишите файл Compose, объявляйте порты, и они будут доступны на моей локальной машине. Это было так же просто, как Docker-Compose Up Анкет Хотя этот подход не обязательно соответствовал тому, как выглядела производство, это был действительно лучший вариант, доступный для контейнеров в то время. Варианты, которые существуют сейчас, такие как Kubernetes, не были доступны, которые отображались Равенство между производством и разработкой мечта о работе. .

Перенесемся в 2017 год, в моем первом масштабном стартапе, Azuqua У меня была возможность переосмыслить то, как выглядела среда разработчика под совершенно новым набором ограничений. В то время как Docker Compose работает для небольших команд, он разваливается, когда вы отображаете его в производственных системах. В то время наша производственная система была основана на шеф -поваре. Docker Compose не сопоставляется с файлами конфигурации шеф-поваров на основе Ruby. Когда я присоединился к Azuqua, боль вокруг наличия отдельных инструментов для инфраструктуры стала невероятно ясной. Это не было устойчиво иметь целую команду; Напишите конфигурацию для наших услуг, общайтесь с разработчиками, почему инфраструктура не может бесконечно масштабироваться без хорошего дизайна программного обеспечения и делать все это без вины или единых точек отказа. По сути, именно поэтому я не согласен с командами DevOps и предпочитаю продвижение Google SRE MODEL вместо. Находясь в Азуква, мы начали переход к модели SRE и использовали Kubernetes как способ помочь облегчить это.

Находясь в Azuqua, я определил необходимость запуска Kubernetes, чтобы облегчить масштабируемость облачных ресурсов и улучшить опыт разработчика. В то же время это резко уменьшило опыт разработчика Анкет Хотя это может показаться противоречивым поначалу, важно учитывать многочисленные способы, которые представляет собой разработчик. Поначалу, может показаться, что это просто инструмент для тестирования/записи кода, это комбинация кода тестирования, написания кода и развертывания этого кода. С помощью Docker Compose Environment в Staymarta мы сделали цикл тестирования/сборки невероятно простым, но сместили аспекты развертывания на команду на заказ, модель DevOps. Этот подход работает для небольших команд, но по мере роста это быстро не масштабируется. Если вы не можете эффективно развернуть код, опыт разработчика разочаровывает и быстро превращается в нездоровые отношения с командой, ответственной за этот цикл.

Возвращаясь к тому, как kubernetes Улучшен опыт разработчика , что я уверяю вас, это делает. Преимущество для Kubernetes заключалась в том, что он привнес в смесь плоскость управления и сосредоточилась на том, чтобы быть просто оркестратором -контейнером. DSL, который у него есть, очень специфичен для оркестровки контейнеров и заставляет их работать. Управляющая плоскость позволяет постоянно самовосстанавливаться и строить инструменты, чтобы последовательно позволить всем различным типам использования. Несмотря на то, что ему не хватает абстракций, это приносит что -то разработчикам, которым у них никогда не было, способность развернуть код воспроизводимо. С введением minikube , Добрый И другие, теперь вы можете запустить тот же стек, который вы запускаете в производстве, но на местном уровне.

Возможность воспроизводимого развертывания помогает как доверие к развертыванию, так и количество времени, необходимое для того, чтобы добраться от ничего до работы в производстве. Однако это не без недостатков. Всякий раз, когда вы начинаете перемещать инструменты развертывания на разработчиках, вы уменьшали опыт разработчика. Это неизбежно, потому что вы представляете чистые новые материалы, DSL и многое другое, чтобы разработчики могли учиться. В то время как добрые и Minikube — отличные проекты, все они страдают от того, что нужно разработчикам, чтобы понять, как работать с Kubernetes. Вы должны иметь возможность создавать изображение Docker, вставить изображение Docker в кластер, удалить прикладную стручку, проверить, если он даже использует правильный тег, дождитесь, пока Kubernetes воссоздает контейнер и убедитесь, что вы настроили вход маршрут, чтобы получить доступ к нему вне кластера или использовать Kubectl Port-Forward Чтобы получить доступ к нему. Второе, что ломается, теперь вы должны покопаться в том, почему подключение к обслуживанию не работает, почему ваше изображение Docker не в контейнер кэш или другие не так легко решаемые области. В то время как кому -то, кто работал с Kubernetes уже много лет, это не очень сложно, это вряд ли достигает цели «простота использования», которую я имею.

Решить эти проблемы нелегко. Отладка Kubernetes затруднена и требует знаний, которые можно решить только с помощью образования, большего количества инструментов или комбинации обоих. К сожалению, это не дешево. Образование трудно сделать правильно, и имеет тенденцию к быстрому написанию, который быстро устарел от даты, который трудно поддерживать. Находясь в Азуква, мы столкнулись с этой же проблемой. Очень немногие инженеры хотели изучить Kubernetes или инвестировать время в технологии вокруг нее. Мы решили вернуться к основам и сосредоточиться на подходе, основанном на инструментах. Как получить тот же уровень опыта разработчика, как минимум, Docker Compose с Kubernetes? Наш ответ в итоге стал инструментом под названием Телеприз Анкет Телепринжение описывает себя как:

[…] Инструмент с открытым исходным кодом, который позволяет запускать одну службу локально, [sic], подключая эту услугу к удаленному кластеру Kubernetes.

https://www.telepresence.io/discussion/overview

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

В то время как Telepresence решила проблему общения с нашим локальным кластером Kubernetes, она впечатляюще не удалось предоставить услуги внутри кластера разговора с нашими местными услугами. Когда это сработало, это сработало удивительно, но девять раз из десяти, это не удалось в масштабе. Независимо от того, не удается ли это очистить после случайного сбоя или медленно снятия подключения к Интернету компьютера, это, как правило, не сработает. К счастью для нас в Azuqua, у нас была довольно четко определенная система для обнаружения услуг и несколько услуг, которые должны были поговорить друг с другом напрямую. Те немногие, которые нуждались, могли просто пройти за пределами кластера. Это позволило нам принять эти боли и добиться успеха с телеприездом. Чтобы быть ясным, это не поражение по телеприводству. Это работало очень хорошо для нас в Азуква, но это не полное решение.

Когда я начал разрабатывать новую среду разработки для Информация о охвате Я снова попытался использовать Telepresence в качестве решения, чтобы преодолеть разрыв между нашим локальным кластером и нашей локальной машиной. К сожалению, это не сработало. У нас не было четко определенного механизма обнаружения услуг, чтобы обойти это, у нас была гораздо большая инженерная команда, и почти все услуги, необходимые для общения друг с другом. Мы обнаруживали, что все больше и больше краевых случаев с телеприучением, и наш опыт разработчика страдал. Наш балл NPS для нашей среды разработчика был на низком уровне -26.

Было совершенно ясно, что Telepresence не собирается решать наши варианты использования. Пришло время изучить альтернативы.

Telepresence была интересной, так как он использовал VPN, чтобы предоставить вам доступ к вашим ресурсам. Тем не менее, для этого также потребовался хакерский компонент инжектора DNS, который, как правило, был основным источником сетевых задач. Там было не так много проектов, которые, казалось, решили это, но одним интересным был Kubefwd. Если вам не известно о порторе Kubernetes, есть команда, которая позволяет вам сбить набор портов для данной службы и предоставить их на вашей локальной машине через Kubectl Port-Forward Анкет Подумайте о -p Аргумент Docker Run , но для Kubernetes. К сожалению, это не поддерживало FQDNS ( .Svc.cluster.local ), Statefulsets или все пространства имен автоматически. Это также не поддержало обратное туннелирование. Я хотел сохранить дух телеприпасы, продолжая быть универсальным инструментом. Помимо kubefwd, казалось бы, что это не было никаких инструментов, которые могли бы сделать это. Обратное туннелирование в одно только Kubernetes было, казалось бы, нерешенным проектом. Чтобы заполнить этот пробел, я решил написать локализатор.

Локализатор это переписывание телеприезда в Голанге, но без сложной площади поверхности. Его целью является простой инструмент разработки без излишеств для разработчиков приложений, использующих Kubernetes. Его цели должны быть простыми в использовании, самопроверка и просты в отладке. Локализатор также демон. При попытке разоблачить несколько услуг, разработчикам обычно приходилось иметь много терминальных окон для запуска телеприезда или других решений в обратном туннеле. Localizer уходит от этого, если все команды отправляют сообщение GRPC в демон. Подробнее об этом позже. В основе локализатора лежит три команды.

По умолчанию: создание туннелей в Kubernetes

Когда вы бежите локализатор Без каких-либо аргументов он автоматически создает портовые возможности для всех сервисов Kubernetes (это важно), IP-адресу с питанием с питанием и добавляет их к /и т.д./хосты . Из коробки это позволяет коду общаться с службами Kubernetes, несмотря на то, что он находится за пределами кластера.

Разоблачение: создание обратного туннеля

разоблачить Команда принимает Пространство имен/сервис В качестве аргумента, который позволяет вам указать на службу Kubernetes на местный экземпляр службы вашей машины. При запуске он автоматически расширяет любые конечные точки, которые уже существуют для Сервиса. Затем Localizer создает OpenSsh Pod с селектором службы Kubernetes, который делает трафик маршрута Kubernetes в созданный капсул. Затем Localizer создает прокси-прокси-сервер SSH по сравнению с портом Kubernetes (который позволяет обходить брандмауэр для удаленных кластеров) к созданному стручке Openssh, который подвергает и направляет трафик на ваш местный сервис. По сути, это создает для вас обратный туннель SSH.

Список: перечисление статуса туннеля (ов)

Возможно, самая полезная команда, которая локализатор предоставляет список . Это позволяет разработчикам просматривать различные туннели и предоставлять понимание здоровья и статуса.

Развертывание Localizer стало огромным успехом для стабильности среды нашего разработчика в Outreach, но в конечном итоге это не полное решение. Это помогает позволить аспекту создания/тестирования разработчика, но не решает аспект сложности развертывания Kubernetes. В конечном счете, для локализатора не так, как локализатор решает эти проблемы, и это просто еще один инструмент, который помогает преодолеть разрыв между Kubernetes и локальной машиной разработчика.

Отсутствие абстракций является фундаментальной проблемой для Kubernetes прямо сейчас, и я с нетерпением жду написания инструментов, которые могут помочь разработчикам сосредоточиться на бизнес -проблемах, а не тратить время на детали.

Глядя в будущее

Localizer много запланирован на будущее! А именно правильная поддержка демона, но также попытка улучшить видимость в различных режимах отказа. Стабильность и восстановление станут постоянным направлением для этого проекта.

Вы заинтересованы в Localizer? Проверьте это на GitHub !

Особая благодарность : Марк Ли Для редактирования!

Оригинал: «https://dev.to/jaredallard/localizer-an-adventure-in-creating-a-reverse-tunnel-tunnel-manager-for-kubernetes-1kjf»