Давайте создадим простейшее приложение 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 и предоставлен через службу.

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