Давайте создадим простейшее приложение Java Spring Boot, которое будет работать как модуль в кластере Kubernetes.
Структура проекта:
├── Dockerfile
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── k8s
│ └── depl.yaml
├── settings.gradle
└── src
└── main
└── java
└── hello
├── App.java
└── HelloWorldCtrl.java
Наш App.java
- это точка входа в приложение:
Приведенный выше код содержит минимальные строки, необходимые для создания приложения Spring Boot.
HelloWorldCtrl.java
содержит простой контроллер, который отображает корневой путь (“/”)
и возвращает строку приветствия:
Сборка приложения
Я использую Gradle в качестве инструмента для сборки. Файл build.gradle
также минимален и состоит из следующих строк:
plugins {
id 'org.springframework.boot' version '2.3.3.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}
Создание ресурсов K8s
Чтобы создать развертывание K8s, нам понадобится образ Docker. Добавим в наш Dockerfile
следующие строки:
Шаги в нашем файле Docker:
- Скопируйте проект в
/app
- Создайте проект с помощью Gradle
- Запустите приложение, используя результат предыдущего шага
Теперь мы можем создать образ и отправить его в хаб:
docker build -t marounbassam/hello-spring . docker push marounbassam/hello-spring
Развертывание K8s простое. Он состоит из развёртывания и сервиса:
Развертывание определяет две реплики модуля, который будет запускать контейнер, созданный из изображения, указанного в атрибуте image.
Служба имеет тип ClusterIP
(служба Kubernetes по умолчанию). Это дает нам сервис внутри нашего кластера, к которому могут получить доступ другие приложения.
Создание ресурсов в вашем кластере:
kubectl create -f <yaml_file>
Ресурсы можно визуализировать следующим образом:
+---------------------+
| hello-world-service |
| |
| 10.15.242.210 |
+---------O-----------+
|
+-------------O--------------------------O
| |
+---------O-----------+ +---------O-----------+
| pod 1 | | pod 2 |
| | | |
| hello-world | | hello-world |
+---------------------+ +---------------------+
Внутри кластера
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-5bb87c95-6h4kh 1/1 Running 0 7h
hello-world-5bb87c95-bz64v 1/1 Running 0 7h
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world-service ClusterIP 10.15.242.210 <none> 8080/TCP 5s
kubernetes ClusterIP 10.15.240.1 <none> 443/TCP 7h
$ kubectl exec -it hello-world-5bb87c95-6h4kh bash
$ (inside the pod) curl 10.15.242.210:8080
$ (inside the pod) Greetings from Spring Boot!
Мы видим, что сервер запущен и работает внутри модулей. В зависимости от вашего облачного провайдера вы можете установить службу типа LoadBalancer
и получать доступ к приложению извне кластера.
Заключение
Мы создали простое приложение Spring Boot, обернули его в контейнер Docker и использовали контейнер в модуле K8s, который был организован развертыванием K8s и предоставлен через службу.
Сервис предоставляет простой балансировщик нагрузки для двух созданных модулей и может легко масштабироваться в соответствии с потребностями приложения.