В предыдущих статьях мы создали несколько микро-сервисов (Сервис заказов, Сервис продуктов, Сервис клиентов) для системы управления заказами с использованием Docker и Spring Boot. Мы использовали библиотеки Netflix для управления, обнаружения и балансировки нагрузки микро сервисов.
Управление этими микро сервисами и их несколькими контейнерами может быть немного сложнее; особенно с точки зрения масштабируемости, наблюдаемости, безопасности, мониторинга и управления ресурсами. Следовательно, мы будем использовать Kubernetes для нашей контейнерной оркестровки. Нажмите здесь, чтобы прочитать больше о Kubernetes.
Для начала мы могли бы использовать локальный кластер Kube на ноутбуке или использовать облачного провайдера, такого как AWS / Azure / GCP.
Локальный кластер Kube:
Мы можем использовать Minikube или Docker for Desktop для настройки локального кластера кубов. Следуйте их документации, чтобы установить их на свой ноутбук / компьютер. В этом руководстве мы будем использовать Docker for Desktop на Mac, поэтому, если вы используете то же самое, следуйте этой документации для его настройки.
Используйте сервис Amazon Elastic Kubernetes (EKS) :
Вы также можете настроить кластер на EKS для развертывания приложений, для этого вам потребуется учетная запись на AWS ( https://aws.amazon.com/ ).
После входа в AWS перейдите в EKS и создайте кластер. Прочтите эту документацию для настройки кластера.
Кубектл:
KubeCtl — это интерфейс командной строки для запуска команд в кластерах Kubernetes. Если вы используете Docker for Desktop, он уже включен и настроен для подключения к локальному серверу Kubernetes, в противном случае настройте KubeCtl на своем ноутбуке, используя эту документацию.
Чтобы kubectl мог найти и получить доступ к кластеру Kubernetes, ему нужен файл kubeconfig. По умолчанию конфигурация kubectl находится по адресу:
|
1
|
~/.kube/config. |
Убедитесь, что kubectl правильно настроен, получив состояние кластера:
|
1
|
kubectl cluster-info |
для управления кластером в EKS используйте эту документацию для настройки kubeconfig.
Развертывание приложений в кластере Kube:

Теперь, когда мы успешно создали кластер kube и настроили kubectl для управления и развертывания в этом кластере, мы готовы к развертыванию на нем наших приложений.
В предыдущих блогах мы создали 3 микросервиса, работающих в контейнерах Docker. Мы можем использовать образ любого из этих микросервисов для развертывания в кластере kube. Если мы используем локальный кластер куба (Docker для настольного компьютера или MiniKube), мы можем использовать образ локального докера для развертывания в кластере.
(Чтобы локальные изображения работали, нам нужно установить для свойства «imagePullPolicy» значение «Никогда» в нашем определении развертывания.)
Для EKS нам нужно, чтобы изображение было в реестре, сейчас мы можем использовать публичный репозиторий Docker Hub, поэтому нам не нужно беспокоиться об аутентификации с помощью реестра. Если нам нужно использовать ECR (Amazon Elastic Container Registry), нам нужно будет дать права на получение ECR экземплярам, запускающим узлы в кластере, для простоты мы пока обойдем эту часть.
Создать местный образ
Чтобы развернуть приложение в локальном кластере kube, мы создадим его образ докера на нашем ноутбуке.
Итак, если у вас есть исходный код для любой из услуг, которые мы использовали в предыдущих блогах, мы будем их использовать.
— Перейдите в корневую папку productService и выполните команду сборки docker:
|
1
|
docker build -t productservice . |
Это создаст локальное изображение с тегом «productservice». Проверьте, хорошо ли работает это изображение, запустив его.
|
1
|
docker run -p 8001:8001 productservice:latest |
Эта служба требует доступа к локальному серверу базы данных Postgres, поэтому она не запускается. Для простоты давайте сделаем быстрое изменение в приложении и используем БД в памяти (H2).
Внесите следующие изменения в build.gradle : (замените зависимость postgres от H2)
|
1
2
3
4
5
6
7
8
|
dependencies { implementation('org.springframework.boot:spring-boot-starter-data-jpa') implementation('org.springframework.boot:spring-boot-starter-web') implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client') runtime("com.h2database:h2:1.3.176") compileOnly 'org.projectlombok:lombok:1.18.4' testImplementation('org.springframework.boot:spring-boot-starter-test')} |
И замените источник данных Spring, чтобы использовать H2 в application.properties :
|
1
2
3
4
5
|
spring.datasource.url=jdbc:h2:mem:testdbspring.datasource.driverClassName=org.h2.Driverspring.datasource.username=saspring.datasource.password=spring.h2.console.enabled=false |
Как только эти 2 изменения будут сделаны, приложение будет хорошо запущено и работает. На этот раз пересоберите образ (обязательно очистите старый тег) и запустите его. Используйте предыдущий блог, чтобы проверить конечные точки. (создавать и получать продукты @ / products)
Создание deploy.yaml
Для развертывания образов в kube нам нужно определение развертывания (или определение модуля, если мы просто хотим установить модуль).
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
apiVersion: apps/v1kind: Deploymentmetadata: name: product-service-deploymentspec: selector: matchLabels: app: product-service replicas: 1 template: metadata: labels: app: product-service spec: containers: - name: product-app image: productservice:latest imagePullPolicy: Never ports: - containerPort: 8001 |
Обязательно используйте тег локального изображения, созданного в «name».
Сохраните указанный выше файл как product-service-deploy.yaml и выполните следующую команду, из которой сохранен файл.
|
1
|
kubectl apply -f product-service-deployment.yaml |
Это создаст Pod в кластере, выполняющем приложение внутри контейнера. Теперь это приложение работает внутри модуля в кластере kube, и ему был присвоен IP-адрес, который доступен только внутри кластера. Мы можем получить доступ к этому модулю изнутри кластера, используя этот IP-адрес, но поскольку модули являются нестабильными (их можно масштабировать и уменьшать, воссоздавать и уничтожать), нам потребуется интерфейс или служба для доступа к ним по «имени службы». который не изменится, когда стручки воссозданы. Этот «сервис» также будет выполнять роль балансировщика нагрузки при распределении запросов к модулям.
Создать сервис Kubernetes:
Теперь мы создадим сервис в Kubernetes, который можно использовать для доступа к модулю. Узнайте больше об услугах Kubernetes здесь . Для этого блога мы создадим сервис типа «ClusterIP», который будет доступен из кластера.
Создайте файл в той же корневой папке с именем product-service.yaml со следующим содержимым:
|
01
02
03
04
05
06
07
08
09
10
|
apiVersion: v1kind: Servicemetadata: name: product-servicespec: selector: app: product-service ports: - port: 8001 targetPort: 8001 |
Чтобы создать этот сервис, выполните следующую команду:
|
1
|
kubectl apply -f product-service.yaml |
Запустите команду kubectl get services, чтобы увидеть, успешно ли создан сервис:
|
1
|
kubectl get svc |
Там вы должны увидеть услугу «продукт-сервис» с назначенным ClusterIP.
Доступ к услуге с вашего ноутбука.
Чтобы получить доступ к этой услуге с нашего ноутбука, мы будем использовать то, что называется «переадресация портов kube», и запустим следующую команду:
|
1
|
kubectl port-forward svc/product-service 8001:8001 |
Теперь мы можем получить доступ к сервису, используя http: // localhost: 8001 / products .
Вы можете протестировать продуктовый сервис, создав несколько продуктов и получив их, как упоминалось в предыдущем блоге.
Итак, теперь у нас есть приложение, работающее в локальном кластере kube.
В следующей серии блогов мы развернем еще несколько приложений в кластере с внешней базой данных и получим полнофункциональное приложение для микросервисов. Мы также узнаем, как внутренние службы взаимодействуют друг с другом и как мы можем представить их внешнему миру с помощью Ingress Controller.
| Опубликовано на Java Code Geeks с разрешения Анирудх Бхатнагар, партнера нашей программы JCG. Смотреть оригинальную статью здесь: Spring Boot Microservices, Docker и Kubernetes мастерская — часть 3
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |