Автор оригинала: 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.1338080: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.1148080/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 .