В предыдущих статьях мы создали несколько микро-сервисов (Сервис заказов, Сервис продуктов, Сервис клиентов) для системы управления заказами с использованием 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:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.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 /v1 kind: Deployment metadata: name: product-service-deployment spec: 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: v1 kind: Service metadata: name: product-service spec: 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, являются их собственными. |