Рубрики
Без рубрики

Запуск Приложений Spring Boot С Помощью Мини-Куба

Разверните приложение Spring Boot в локальной среде Kubernetes, также известной как Mini kube.

Автор оригинала: Markus Gulden.

1. Обзор

В этой предыдущей статье мы рассмотрели теоретическое введение о Кубернетесе.

В этом руководстве мы обсудим, как развернуть приложение Spring Boot в локальной среде Kubernetes, также известной как Minikube.

В рамках этой статьи мы рассмотрим:

  • Установите Minitube на нашу локальную машину
  • Разработайте пример приложения, состоящего из двух служб Spring Boot
  • Настройте приложение в кластере с одним узлом с помощью мини-куба
  • Разверните приложение с помощью файлов конфигурации

2. Установка Mini kube

Установка Mini cube в основном состоит из трех шагов: установка гипервизора (например, VirtualBox), интерфейса командной строки kubectl , а также самого Миникуба.

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

После завершения установки мы можем запустить Mini cube, установить VirtualBox в качестве гипервизора и настроить kubectl для взаимодействия с кластером под названием minikube :

$> minikube start
$> minikube config set vm-driver virtualbox
$> kubectl config use-context minikube

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

$> kubectl cluster-info

Результат должен выглядеть следующим образом:

Kubernetes master is running at https://192.168.99.100:8443
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

На этом этапе мы будем держать IP-адрес в ответе близко ( 192.168.99.100 в нашем случае). Позже мы будем ссылаться на это как на NodeIP , который необходим для вызова ресурсов из-за пределов кластера, например, из вашего браузера.

Наконец, мы можем проверить состояние нашего кластера:

$> minikube dashboard

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

4. Демонстрационное приложение

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

Для этой цели мы создадим простое приложение “Hello world”, состоящее из двух служб Spring Boot, которые мы будем называть frontend и backend .

Серверная часть предоставляет одну конечную точку REST на порту 8080, возвращая строку |, содержащую имя хоста. Интерфейс доступен на порту 8081, он просто вызовет серверную конечную точку и вернет ее ответ.

После этого мы должны создать образ Docker из каждого приложения. Все необходимые для этого файлы также доступны на GitHub .

Для получения подробных инструкций по созданию образов Docker ознакомьтесь с разделом Настройка приложения Spring Boot .

Здесь мы должны убедиться , что запускаем процесс сборки на хосте Docker кластера Mini cube , иначе Mini kube не найдет изображения позже во время развертывания. Кроме того, рабочее пространство на вашем хосте должно быть подключено к виртуальной машине Mini cube:

$> minikube ssh
$> cd /c/workspace/tutorials/spring-cloud/spring-cloud-kubernetes/demo-backend
$> docker build --file=Dockerfile \
  --tag=demo-backend:latest --rm=true .

После этого мы сможем выйти из виртуальной машины Minicube, все дальнейшие шаги будут выполнены на вашем хосте с помощью kubectl и minicube инструментов командной строки.

5. Простое Развертывание С Использованием Императивных Команд

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

5.1. Создание развертывания

Мы будем использовать kubectl , передавая все необходимые команды в качестве аргументов:

$> kubectl run demo-backend --image=demo-backend:latest \
  --port=8080 --image-pull-policy Never

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

Используя –порт , мы указываем, что развертывание открывает порт 8080 для своих модулей (поскольку наше демо-серверное приложение прослушивает порт 8080).

Флаг –политика извлечения изображений никогда не гарантирует, что Minikube не попытается извлечь изображение из реестра, а вместо этого возьмет его с локального хоста Docker.

5.2. Проверка развертывания

Теперь мы можем проверить, было ли развертывание успешным:

$> kubectl get deployments

Результат выглядит следующим образом:

NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
demo-backend   1         1         1            1           19s

Если мы хотим просмотреть журналы приложений, нам сначала нужен идентификатор модуля:

$> kubectl get pods
$> kubectl logs 

5.3. Создание службы для развертывания

Чтобы сделать доступной конечную точку REST нашего серверного приложения, нам необходимо создать службу:

$> kubectl expose deployment demo-backend --type=NodePort

–тип=Порт узла делает Службу доступной за пределами кластера. Он будет доступен по адресу узла>:<Порт узла> , т. е. служба сопоставляет любой запрос, поступающий в <Порт узла> , с портом 8080 назначенных ей модулей. узла>:<Порт узла>

Мы используем команду expose, поэтому NodePort будет установлен кластером автоматически (это техническое ограничение), диапазон по умолчанию 30000-32767. Чтобы получить порт по нашему выбору, мы можем использовать файл конфигурации, как мы увидим в следующем разделе.

Мы можем убедиться, что служба была успешно создана:

$> kubectl get services

Результат выглядит следующим образом:

NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
demo-backend   NodePort    10.106.11.133           8080:30117/TCP   11m

Как мы видим, у нас есть одна Услуга под названием демо-сервер , типа Порт узла , которая доступна на внутреннем IP-адресе кластера 10.106.11.133.

Мы должны более внимательно изучить ПОРТЫ столбцов: поскольку порт 8080 был определен в развертывании, служба перенаправляет трафик на этот порт. Однако, если мы хотим вызвать демо-серверную часть из нашего браузера, мы должны использовать порт 30117, который доступен за пределами кластера.

5.4. Вызов службы

Теперь мы можем впервые позвонить в нашу внутреннюю службу:

$> minikube service demo-backend

Эта команда запустит наш браузер по умолчанию, открыв узла>:<Порт узла>. В нашем примере это было бы http://192.168.99.100:30117 . узла>:<Порт узла>.

5.5. Очистка службы и развертывание

После этого мы можем удалить службу и развертывание:

$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend

6. Комплексное Развертывание С Использованием Файлов Конфигурации

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

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

6.1. Определение сервиса для нашего внутреннего приложения

Давайте переопределим наш сервис для серверной части, используя конфигурационный файл:

kind: Service
apiVersion: v1
metadata:
  name: demo-backend
spec:
  selector:
    app: demo-backend
  ports:
  - protocol: TCP
    port: 8080
  type: ClusterIP

Мы создаем Сервис с именем демонстрационный сервер , указанный в поле метаданные: имя .

Он нацелен на TCP-порт 8080 в любом модуле с меткой app=demo-backend .

Наконец, тип: ClusterIP указывает, что он доступен только внутри кластера (поскольку на этот раз мы хотим вызвать конечную точку из нашего демонстрационного интерфейса приложения, но больше не напрямую из браузера, как в предыдущем примере).

6.2. Определение развертывания для серверного приложения

Затем мы можем определить фактическое развертывание:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-backend
spec:
  selector:
      matchLabels:
        app: demo-backend
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-backend
    spec:
      containers:
        - name: demo-backend
          image: demo-backend:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8080

Мы создаем Развертывание с именем демонстрационный сервер , указанный в поле метаданные: имя .

Поле спецификация: селектор определяет, как развертывание определяет, какими блоками управлять. В этом случае мы просто выбираем одну метку, определенную в шаблоне модуля ( приложение: демо-серверная часть ).

Мы хотим иметь три реплицированных модуля, которые мы указываем полем реплики .

Поле шаблона определяет фактический модуль:

  • Модули помечены как приложение: демо-серверная часть
  • Поле шаблон: спецификация указывает, что каждая репликация модуля запускает один контейнер, демонстрационный сервер , с версией последней
  • Модули открывают порт 8080

6.3. Развертывание серверного приложения

Теперь мы можем запустить развертывание:

$> kubectl create -f backend-deployment.yaml

Давайте проверим, что развертывание прошло успешно:

$> kubectl get deployments

Результат выглядит следующим образом:

NAME           DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
demo-backend   3         3         3            3           25s

Мы также можем проверить, доступна ли Услуга:

$> kubectl get services

Результат выглядит следующим образом:

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
demo-backend    ClusterIP   10.102.17.114           8080/TCP         30s

Как мы видим, Служба имеет тип ClusterIP , и она не предоставляет внешний порт в диапазоне 30000-32767, в отличие от нашего предыдущего примера в разделе 5.

6.4. Развертывание и определение сервиса для нашего внешнего приложения

После этого мы можем определить обслуживание и развертывание для внешнего интерфейса:

kind: Service
apiVersion: v1
metadata:
  name: demo-frontend
spec:
  selector:
    app: demo-frontend
  ports:
  - protocol: TCP
    port: 8081
    nodePort: 30001
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-frontend
spec:
  selector:
      matchLabels:
        app: demo-frontend
  replicas: 3
  template:
    metadata:
      labels:
        app: demo-frontend
    spec:
      containers:
        - name: demo-frontend
          image: demo-frontend:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8081

Как внешний, так и внутренний интерфейс почти идентичны, единственное различие между внутренним и внешним интерфейсом заключается в спецификации сервиса :

Для интерфейса мы определяем тип как Порт узла (поскольку мы хотим сделать интерфейс доступным для внешних пользователей кластера). Серверная часть должна быть доступна только из кластера, поэтому тип был ClusterIP .

Как было сказано ранее, мы также указываем Порт узла вручную, используя поле Порт узла .

6.5. Развертывание интерфейсного приложения

Теперь мы можем запустить это развертывание таким же образом:

$> kubectl create -f frontend-deployment.yaml

Давайте быстро убедимся, что развертывание прошло успешно и Служба доступна:

$> kubectl get deployments
$> kubectl get services

После этого мы, наконец, сможем вызвать конечную точку REST переднего плана приложения:

$> minikube service demo-frontend

Эта команда снова запустит ваш браузер по умолчанию, открыв узла>:<Порт узла> , который является http://192.168.99.100:30001 для этого примера. узла>:<Порт узла>

6.6. Очистка служб и развертываний

В конце концов, мы можем навести порядок, удалив Службы и развертывания:

$> kubectl delete service demo-frontend
$> kubectl delete deployment demo-frontend
$> kubectl delete service demo-backend
$> kubectl delete deployment demo-backend

7. Заключение

В этой статье мы кратко рассмотрели, как развернуть приложение Spring Boot “Hello world” в локальном кластере Kubernetes с помощью миникуба.

Мы подробно обсудили, как:

  • Установите Minitube на нашу локальную машину
  • Разработайте и создайте пример, состоящий из двух приложений Spring Boot
  • Разверните службы в кластере с одним узлом, используя императивные команды с kubectl , а также файлы конфигурации

Как всегда, полный исходный код примеров доступен на GitHub .