Как и у многих других разработчиков, у меня тоже есть приложения, готовые к тестированию в производственной среде, и для этой цели я использовал облачных провайдеров, таких как 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.