Как и у многих других разработчиков, у меня тоже есть приложения, готовые к тестированию в производственной среде, и для этой цели я использовал облачных провайдеров, таких как GCP или AWS. Несмотря на то, что облачные провайдеры просты в настройке и использовании, я понял, что они не так хороши, особенно для целей тестирования. Потому что даже если я не пользуюсь серверами, с меня все равно берут деньги, и я просто не хотел платить за то, чем редко пользуюсь. Поэтому я решил установить свой собственный сервер k8s и выставить его в интернет.

При этом я расскажу о своем опыте и постараюсь объяснить каждый шаг. Прежде чем мы начнем, нам нужно иметь некоторые предварительные условия, такие как:

  • По крайней мере, 1 сервер с оперативной памятью не менее 2 ГБ (я использую Raspberry Pi 4B, но вы можете использовать все, что хотите).
  • Статический IP (вы можете купить его у своего интернет-провайдера)
  • Действительный домен (да, вы знаете, что вам нужно его купить)
  • Монокл, Кубектл, Шлем установлен
  • Немного знаний о Linux и Kubernetes‍

Подготовка серверов

Я предполагаю, что у вас есть серверы Raspberry Pi, и объясню все, помня об этом. Во-первых, нам нужно установить операционную систему Linux на машины. Я предпочитаю сервер Ubuntu 21.10.

Затем мы продолжим установку microk8s на машины. Чтобы установить microk8s, нам нужно подключиться к серверам по ssh и запустить:

sudo snap install microk8s — classic

После того, как эта команда успешно завершена. Мы можем проверить статус microk8s, выполнив эту команду;

microk8s status — wait-ready

Если все в порядке, вы можете установить microk8s на другие серверы. Вы можете установить столько узлов, сколько хотите, повторяя те же шаги.

Затем нам нужно выбрать один сервер в качестве нашего главного сервера. Вы можете решить, как красиво это выглядит, я выбрал это таким образом 😁 Итак, SSH к нашему новому главному серверу и запуск: ‍

microk8s enable dashboard dns

Эта команда включит панель мониторинга и DNS на нашем узле k8s. И теперь мы можем посетить и увидеть панель инструментов k8s, запустив:

microk8s dashboard-proxy

Вот и все, теперь у нас установлен главный узел. Давайте добавим другие узлы в качестве подчиненных узлов к главному. Во-первых, нам нужно запустить эту команду на узле master:

microk8s add-node

Эта команда выведет некоторые инструкции, которые вам нужно выполнить на подчиненных узлах, например

microk8s join 192.168.1.200:25000/92b2db237428470dc4fcfc4ebbd9dc81/2c0cb3284b05

Запустите эту команду на всех ведомых устройствах, и у нас будет полностью работающий кластер k8s с N многими узлами. Вы можете подтвердить это, выполнив приведенную ниже команду на своем персональном компьютере.

kubectl get nodes

Развертывание примера приложения

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

Теперь, когда мы откроем Monokle, мы увидим такой экран:

Нам нужно создать проект для развертывания нашего приложения в нашем кластере k8s. Для этого у нас есть 3 варианта (см. выше). Я выберу вариант Начать с шаблона, так как не хочу тратить много времени на создание ресурсов. Я дал своему проекту название Приложение для вычислений и выбрал шаблон Basic Service Deployment.

Когда я выбираю шаблон, появляется модальное окно ниже. Я заполнил форму следующим образом:

Name: calculation-api
Namespace: calculation-app
Image: erdkse/calculation-api:v1.0.0
Service port: 8080
Target port: 8080

После того, как вы нажмете кнопку «Создать», ваш проект будет создан Monokle, и вы увидите сгенерированные ресурсы. Я хочу внести некоторые дополнительные изменения в сгенерированные ресурсы.

Давайте выберем ресурс развертывания «calculation-api» на панели «Навигатор» и выберем раздел «Форма» на панели «Редактор». И, пожалуйста, найдите раздел «Политика извлечения изображений» и выберите «Всегда». А также я хочу изменить тип нашего сервиса на ClusterIP. Давайте выберем наш служебный ресурс и снова выберем раздел «Форма» в панели «Редактор». И, пожалуйста, найдите раздел Type и выберите ClusterIP.

Теперь мы можем сохранить наши 2 ресурса.

И да!! Мы готовы обслуживать наше приложение без написания ни строчки YAML 😁

Все, что нам нужно сделать, это нажать кнопку Развернуть (в правом верхнем углу панели Редактор). И все готово! Теперь мы можем протестировать наш сервис и развертывание с помощью переадресации портов.

Давайте запустим эту команду и перейдем к localhost:8080, чтобы просмотреть наше приложение:

kubectl port-forward service/calculation-api 8080:8080

Настройка Ingress и MetalLB

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

Начнем с установки ingress-nginx. Вам нужно запустить эти команды:

helm upgrade 
 — install ingress-nginx ingress-nginx 
 — repo https://kubernetes.github.io/ingress-nginx 
 — namespace ingress-nginx 
 — create-namespace

После того, как вы установите ingress-nginx в наш кластер, вы сможете обслуживать наше приложение через доменный адрес.


Теперь нам нужно создать ресурс. Щелкните правой кнопкой мыши корневую папку проекта на панели Проводник и выберите Новый ресурс. Вы увидите модальное окно, как показано ниже — я заполнил форму следующими значениями:

Теперь мы создали наш ресурс Ingress после некоторых дополнений к моему ресурсу Ingress, который будет выглядеть так:

После развертывания этого ресурса Вуаля! Теперь мы можем видеть приложение при посещении:

kubernetes.docker.internal/

Теперь нам нужно установить MetalLB в качестве нашего внешнего LoadBalancer для прослушивания трафика от нашего маршрутизатора к нашей хост-машине. Мы близки к тому, чтобы представить наш кластер миру! 🎉

Давайте установим MetalLB с помощью Helm и Monokle. Сначала добавьте MetalLB в репозитории Helm, выполнив эту команду:

helm repo add metallb https://metallb.github.io/metallb

И перетащите metallb в наш каталог, выполнив эту команду:

cd PROJECT_DIR
helm pull metallb/metallb — untar

Теперь снова откройте Monokle и в левом меню мы увидим раздел Helm. Давайте изменим файл values.yaml для обработки входящего трафика от нашего маршрутизатора:

Измените раздел configInline в файле values.yaml следующим образом:

‍Пожалуйста, измените CLUSTER_IP на частный IP-адрес вашего хост-компьютера, полученный от маршрутизатора. Установите metallb в свой кластер.

Теперь все готово, и вы сможете получать трафик от маршрутизатора. У нас осталось всего несколько дополнительных шагов.

  • Направьте свое доменное имя, которое вы приобрели у поставщика, на общедоступный IP-адрес, который вы приобрели у своего интернет-провайдера.
  • Направьте порты 80 и 443 вашего маршрутизатора на порты 80 и 443 вашего хост-компьютера, на котором установлен кластер.
  • Обновите доменный адрес входа на ваш действительный домен. И снова развернуть.

И МАГИЯ! Вы выставили свой сервер k8s на всеобщее обозрение. Поздравляем!

Применение SSL-сертификата шифрования к домену (необязательно)

Теперь мы выставили наш сервер на всеобщее обозрение, но было бы неплохо, если бы у нас также был действующий SSL? Это довольно легко и просто сделать.

Сначала нам нужно создать и эмитировать. Вы можете создать свой ресурс с помощью Monokle и отредактировать ресурс следующим образом:‍

‍И обновите свой ресурс Ingress следующим образом:

‍И после развертывания этих обновленных ресурсов вы сможете выпустить SSL-сертификат для своего домена/доменов.

Надеюсь, вам понравилось читать этот пост в блоге. Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь спрашивать!

Первоначально опубликовано на https://kubeshop.io.