Разработка на Java приложения за Kubernetes с помощта на Eclipse JKube

Преди 25 години Java стана широко достъпна за програмистите и впоследствие се утвърди като един от основните стълбове, около които се изграждат стековете на приложенията. Въпреки това днес много хора и организации, които дълги години бяха верни на Java, преминават или обмислят прехода към платформи Kubernetes или нейни производни, като Red Hat OpenShift или Amazon EKS.

Разработка на Java приложения за Kubernetes с помощта на Eclipse JKube

За съжаление, Kubernetes има стръмна крива на обучение и добавя още един оперативен слой в познатия на Java програмистите процес на разработка. Днес ще разгледаме как да използваме Eclipse JKube, за да опростим тези допълнителни операции, свързани с Kubernetes и контейнери, и да осигурим безболезнена миграция към облачна платформа, запазвайки познатата екосистема на Java. Освен това ще покажем как да разгръщаме Java приложения на платформата OpenShift с помощта на плъгина OpenShift Maven.

Традиционният процес на Java разработка

Традиционният процес на разработка Java (Рис.1) предполага, че разработчикът пише код, след което създава единици за разгръщане под формата на JAR или WAR файлове и след това ги разгръща и стартира на уеб сървър или сървър за приложения. Основно за това се използва Maven от командния ред или се използват IDE, като IntelliJ или Eclipse, за да се кодира и опакова приложенията. Разработчиците са свикнали да правят промени в кода и да тестуват старателно преди да фиксират кода и да го изпратят в системата за управление на версиите.

Разработка на Java приложения за Kubernetes с помощта на Eclipse JKube

Рис. 1. Традиционният процес на Java разработка.

Процес на Java разработка за облака

При преминаване към облачни приложения, в описаната по-горе схема се добавят Kubernetes и контейнери. Затова сега разработчикът трябва да опакова Java приложенията в контейнерни образи и да създаде Kubernetes манифести, описващи тези образи. След това тези манифести се прилагат към продукционния сървър, на който работи Kubernetes. От своя страна, Kubernetes взима тези образи от регистъра и разгръща приложенията според конфигурациите, указани в манифестите, които обикновено представляват YAML файлове.

Метаморфозата на традиционния процес на Java разработка при преминаване към облака е показана на Рис. 2.

Разработка на Java приложения за Kubernetes с помощта на Eclipse JKube

Рис. 2. Процес на Java разработка за облака.

Eclipse JKube

Преминаването към Kubernetes добавя още един оперативен слой в процеса на разработка, което може да притесни много разработчици, тъй като те искат да се фокусират върху основната си работа – логиката на приложенията, а не върху начина на разгръщането им. И тук на сцената идва Eclipse JKube, който позволява на разработчиците да използват своите библиотеки и плъгини (JKube Kit вместо Kubernetes Maven Plugin или OpenShift Maven Plugin), за да извършват операции, свързани с контейнери и Kubernetes, без излишни усилия, следвайки схемата на Рис. 2.

В останалата част от тази статия ще покажем как да опростим процеса на Java разработка в среда на Kubernetes, използвайки Eclipse JKube с плъгина Kubernetes Maven Plugin.

Процесът на разработка за облака с Eclipse JKube

Нека разгледаме леко модифицирана схема на Java разработка за облака от Рис. 2, като включим Eclipse JKube и Kubernetes Maven Plugin, както е показано на Рис. 3.

Разработка на Java приложения за Kubernetes с помощта на Eclipse JKube

Рис. 3. Процес на Java разработка за облака с Eclipse JKube.

Както виждаме, тук всички операции за взаимодействие с Kubernetes и контейнерите (извежда се в червено на схемата) са заменени с целевите задачи на Eclipse JKube по подразбиране, изброени в Табл. 1.

Табл. 1. Стандартни задачи на Eclipse JKube.

Задача
Етап
Описание

k8s:build
PRE_INTEGRATION_TEST
Създаване на docker образи

k8s:push
INSTALL
Изпращане на docker образи в регистра

k8s:resource
PROCESS_RESOURCES
Генериране на K8s манифести

k8s:apply
COMPILE
Прилагане на генерираните манифести към K8s

k8s:undeploy
UNDEPLOY
Премахване на K8s ресурси, които са били разгръщани чрез k8s:apply и k8s:deploy

Бележка: Ако не искате задачите да използват тези предварително зададени опции (opinionated defaults), можете ръчно да конфигурирате Eclipse JKube, тъй като той поддържа конфигуриране чрез XML и ресурси.

Сега да разгледаме примери за използването на Eclipse JKube и Kubernetes Maven Plugin при работа с приложения.

Разгръщане на Java приложение в Kubernetes с Eclipse JKube

В този пример ще разгръщаме просто Java приложение в клъстера Minikube с помощта на Eclipse JKube. Използвайки Kubernetes Maven Plugin, можем да зададем параметри за разгръщане, без да е необходимо да пишем каквато и да е конфигурация.

Като пример за приложение, ние използваме прост генератор на случайни числа, който предоставя JSON-output на endpoint’а /random:

~work/repos/eclipse-jkube-demo-project : $ curl localhost:8080/random | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45    0    45    0     0    818      0 --:--:-- --:--:-- --:--:--   818
{
  "id": "e80a4d10-c79b-4b9a-aaac-7c286cb37f3c"
}

Стъпка 1. Изтегляме Kubernetes Maven Plugin

Kubernetes Maven Plugin се намира в репозитория Maven Central Repository. За да използвате Eclipse JKube, трябва да добавите Kubernetes Maven Plugin в своя pom.xml като зависимост:

<plugin>
     <groupId>org.eclipse.jkube</groupId>
     <artifactId>kubernetes-maven-plugin</artifactId>
     <version>${jkube.version}</version>
 </plugin>

Ако вместо чист Kubernetes се използва OpenShift, pom.xml се модифицира по следния начин:

<plugin>
     <groupId>org.eclipse.jkube</groupId>
     <artifactId>openshift-maven-plugin</artifactId>
     <version>${jkube.version}</version>
 </plugin>

Стъпка 2. Събиране на docker-образ

JAR файла на приложението може да бъде събран с командата mvn package и след това може да се използва goal задачата mvn k8s:build, за да се събере docker-образа на това приложение. Обърнете внимание, че променихме името на образа по подразбиране с помощта на това свойство:

<jkube.generator.name>docker.io/rohankanojia/random-generator:${project.version}</jkube.generator.name>

Преди да съберем образа, уверете се, че docker демонът е правилно експониран. Това може да се направи с следната команда:

$ eval $(minikube docker-env)

След това въвеждаме командата mvn k8s:build и ето какво ще видим на екрана при събиране на docker-образа с помощта на build задачата на Eclipse JKube:

~/work/repos/eclipse-jkube-demo-project : $ mvn k8s:build
[INFO] Сканиране на проекти...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Събиране на random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] k8s: Работи в Kubernetes режим
[INFO] k8s: Събиране на Docker образ в Kubernetes режим
[INFO] k8s: Работи генератор spring-boot
[INFO] k8s: spring-boot: Използва Docker образ quay.io/jkube/jkube-java-binary-s2i:0.0.7 като основен / строител
[INFO] k8s: [docker.io/rohankanojia/random-generator:0.0.1] "spring-boot": Създаден docker-build.tar за 251 милисекунди
[INFO] k8s: [docker.io/rohankanojia/random-generator:0.0.1] "spring-boot": Изграден образ sha256:a20e5
[INFO] ------------------------------------------------------------------------
[INFO] УСПЕШНО СЪБИРАНЕ
[INFO] ------------------------------------------------------------------------
[INFO] Общо време:  5.053 s
[INFO] Завършено на: 2020-08-10T11:28:23+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $

Стъпка 3. Изпращане на образа в docker регистър

След като събрахме docker-образа при настроен push регистър (в нашия случай това е docker.io), можем да изпратим този образ в регистъра. Ето какво ще се появи на екрана след като поискаме от Eclipse JKube да изпълни push задачата mvn k8s:push:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:push
[INFO] Сканиране на проекти...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Сглобяване на random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:push (default-cli) @ random-generator ---
[INFO] k8s: Работи в режим на Kubernetes
[INFO] k8s: Сглобяване на Docker образ в режим на Kubernetes
[INFO] k8s: Изпълняване на генератор spring-boot
[INFO] k8s: spring-boot: Използване на Docker образ quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 като базов\/билдер
[INFO] k8s: Изпращането се отнася за хранилище [docker.io\/rohankanojia\/random-generator]
5dcd9556710f: Слой вече съществува 
b7139ad07aa8: Слой вече съществува 
b6f081e4b2b6: Слой вече съществува 
d8e1f35641ac: Слой вече съществува 
[INFO] k8s: 0.0.1: дайджест: sha256:9f9eda2a13b8cab1d2c9e474248500145fc09e2922fe3735692f9bda4c76002d размер: 1162
[INFO] k8s: Изпратен docker.io\/rohankanojia\/random-generator:0.0.1 за 7 секунди 
[INFO] ------------------------------------------------------------------------
[INFO] УСПЕХ на СГЛОБЯВАНЕ
[INFO] ------------------------------------------------------------------------
[INFO] Общо време:  11.222 s
[INFO] Завършено на: 2020-08-10T11:35:37+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ 

След изпращането на образа, трябва да проверим дали е стигнал до хранилището. В нашия случай можем просто да го видим в Docker Hub, както е показано на Рис. 4.

Разработка на Java приложения за Kubernetes с помощта на Eclipse JKube

Рис. 4. Изпратеният образ в хранилището се появи в Docker Hub.

Стъпка 4. Генерираме манифести на Kubernetes ресурси за приложението

И така, образът на приложението е сглобен, сега трябва да напишем манифести за Kubernetes. За това в Eclipse JKube има задача, която генерира статични манифести на ресурсите, базирани на задължителния Java фреймворк (Spring Boot, Quarkus, Vert.x или някой друг). Също така, можете да настроите манифеста, използвайки конфигурационен XML файл и поставяйки raw фрагменти (фрагменти от необходимия манифест на ресурсите) в папката на приложението src\/main\/jkube. В такъв случай вашата конфигурация ще бъде внедрена в генерираните манифести.

В нашия пример оставяме всичко такова, каквото е, и следователно Eclipse JKube генерира манифест за дефолтно разгръщане и за услуга с тип ClusterIP. А впоследствие модифицираме манифеста на услугата, за да променим типа на услугата на NodePort. Можете да пренапишете дефолтното поведение с помощта на следното свойство:

<jkube.enricher.jkube-service.type>NodePort<\/jkube.enricher.jkube-service.type>

Ето как изглежда изходът на екрана след като поискаме от Eclipse JKube да изпълни resource задачата mvn k8s:resource.

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:resource
[INFO] Сканиране на проекти...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Изграждане на random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:resource (default-cli) @ random-generator ---
[INFO] k8s: Стартиране на генератора spring-boot
[INFO] k8s: spring-boot: Използване на Docker изображение quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 като основа \/ строител
[INFO] k8s: jkube-controller: Добавяне на подразбираемо разгръщане
[INFO] k8s: jkube-service: Добавяне на подразбираема услуга 'random-generator' с портове [8080]
[INFO] k8s: jkube-healthcheck-spring-boot: Добавяне на проба за готовност на порт 8080, път='\/actuator\/health', схема='HTTP', с начално забавяне от 10 секунди
[INFO] k8s: jkube-healthcheck-spring-boot: Добавяне на проба за жизненост на порт 8080, път='\/actuator\/health', схема='HTTP', с начално забавяне от 180 секунди
[INFO] k8s: jkube-revision-history: Добавяне на лимит за история на ревизиите от 2
[INFO] ------------------------------------------------------------------------
[INFO] УСПЕШНО ИЗГРАЖДАНЕ
[INFO] ------------------------------------------------------------------------
[INFO] Общо време:  3.344 s
[INFO] Завършено на: 2020-08-10T11:38:11+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ ls target\/classes\/META-INF\/jkube\/kubernetes
random-generator-deployment.yml  random-generator-service.yml
~\/work\/repos\/eclipse-jkube-demo-project : $ cat target\/classes\/META-INF\/jkube\/kubernetes\/random-generator-deployment.yml | head -n10
---
apiVersion: apps\/v1
kind: Deployment
metadata:
  annotations:
    jkube.io\/git-url: git@github.com:rohanKanojia\/eclipse-jkube-demo-project.git
    jkube.io\/git-commit: 1ef9ef2ef7a6fcbf8eb64c293f26f9c42d026512
    jkube.io\/git-branch: master
    jkube.io\/scm-url: https:\/\/github.com\/spring-projects\/spring-boot\/spring-boot-starter-parent\/random-generator
    jkube.io\/scm-tag: HEAD
~\/work\/repos\/eclipse-jkube-demo-project : $

Стъпка 5. Разгъване на приложението в кластера Kubernetes

И така, всичко е готово да стартираме разгъването на приложението: генерирахме неговия образ и след това автоматично сгенерирахме ресурсни манифести. Сега остава само да приложим всичко това към кластера Kubernetes. За разгръщането на приложението, разбира се, можем да използваме командата kubectl apply -f, но плъгинът може да направи и това вместо нас. Ето какво ще се появи на екрана, след като поискаме от Eclipse JKube да изпълни задачата apply mvn k8s:apply:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:apply
[INFO] Сканируем проекты...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Сборка random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] k8s: Используем Kubernetes по адресу https:\/\/192.168.39.145:8443\/ в пространстве имен default с манифестом \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/classes\/META-INF\/jkube\/kubernetes.yml 
[INFO] k8s: Используем пространство имен: default
[INFO] k8s: Создание сервиса из kubernetes.yml в пространстве имен default с именем random-generator
[INFO] k8s: Создан сервис: target\/jkube\/applyJson\/default\/service-random-generator.json
[INFO] k8s: Создание деплоймента из kubernetes.yml в пространстве имен default с именем random-generator
[INFO] k8s: Создан деплоймент: target\/jkube\/applyJson\/default\/deployment-random-generator.json
[INFO] k8s: ПОДСКАЗКА: Используйте команду `kubectl get pods -w`, чтобы наблюдать за запуском ваших подов
[INFO] ------------------------------------------------------------------------
[INFO] СТРОИТЬ УСПЕШНО
[INFO] ------------------------------------------------------------------------
[INFO] Общее время:  7.306 с
[INFO] Завершено в: 2020-08-10T11:40:57+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get pods -w
ИМЯ                                                     ГОТОВ   СТАТУС             ПЕРЗАГРУЗКИ   ВРЕМЯ
random-generator-58b7847d7f-9m9df                        0\/1     Запускается            0          7с
random-generator-58b7847d7f-9m9df                        1\/1     Запускается            0          17с
^C~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get svc
ИМЯ                                    ТИП        CLUSTER-IP      EXTERNAL-IP   ПОРТ(Ы)           ВРЕМЯ
io-openliberty-sample-getting-started   NodePort    10.110.4.104    <none>        9080:30570\/TCP    44ч
kubernetes                              ClusterIP   10.96.0.1       <none>        443\/TCP           18д
random-generator                        NodePort    10.97.172.147   <none>        8080:32186\/TCP    22с
~\/work\/repos\/eclipse-jkube-demo-project : $ curl `minikube ip`:32186\/random | jq .
  % Всего    % Получено % Передано  Средняя Скорость   Время    Время     Время  Текущая
                                 Загрузка  Загрузка   Всего   Потрачено   Осталось  Скорость
100    45    0    45    0     0   1800      0 --:--:-- --:--:-- --:--:--  1875
{
  "id": "42e5571f-a20f-44b3-8184-370356581d10"
}

Стъпка 6. Извършваме undeploy на приложението от кластер Kubernetes

За целта се използва задача undeploy, която просто премахва всички ресурси, които бяха приложени на предишната стъпка, тоест при изпълнението на задачата apply. Ето какво ще видим на екрана, след като поискате от Eclipse JKube да извърши undeploy задачата mvn k8s:undeploy:

~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get all
NAME                                    READY   STATUS    RESTARTS   AGE
pod\/random-generator-58b7847d7f-9m9df   1\/1     Running   0          5m21s

NAME                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service\/kubernetes         ClusterIP   10.96.0.1               443\/TCP          18d
service\/random-generator   NodePort    10.97.172.147           8080:32186\/TCP   5m21s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps\/random-generator   1\/1     1            1           5m21s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps\/random-generator-58b7847d7f   1         1         1       5m21s
~\/work\/repos\/eclipse-jkube-demo-project : $ mvn k8s:undeploy
[INFO] Scanning for projects...
[INFO] 
[INFO] ---------------------------------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:undeploy (default-cli) @ random-generator ---
[INFO] k8s: Using Kubernetes at https:\/\/192.168.39.145:8443\/ in namespace default with manifest \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/classes\/META-INF\/jkube\/kubernetes.yml 
[INFO] k8s: Using namespace: default
[INFO] k8s: Deleting resource Deployment default\/random-generator
[INFO] k8s: Deleting resource Service default\/random-generator
[INFO] k8s: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.412 s
[INFO] Finished at: 2020-08-10T11:46:22+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get pods -w
^C~\/work\/repos\/eclipse-jkube-demo-project : $ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service\/kubernetes   ClusterIP   10.96.0.1            443\/TCP   18d
~\/work\/repos\/eclipse-jkube-demo-project : $

Какво друго може да се направи с Eclipse JKube

И така, разгледахме основните цели на Eclipse JKube и Kubernetes Maven Plugin, които улесняват разработката на Java приложения за платформата Kubernetes. Ако не желаете постоянно да въвеждате тези цели с клавиатура, можете да ги запишете в конфигурацията на плъгина, например, така:

org.eclipse.jkube
     kubernetes-maven-plugin
     ${project.version}
     
         
             
                  build
                  resource
                  apply

Трябва да се каже, че в тази статия разгледахме далеко не всички цели, които съществуват в Eclipse JKube и Kubernetes Maven Plugin, затова представяме в Табл.2 списък с допълнителни цели, които също може да са ви полезни.

Табл. 2. Допълнителни цели на Eclipse JKube.

Задача
Етап
Описание

k8s:log
VALIDATE
Получаване на логове от приложение, работещо на Kubernetes.

k8s:debug
PACKAGE
Отваряне на отладъчния порт за извършване на отстраняване на грешки на приложение, работещо на Kubernetes, директно от IDE.

k8s:deploy
INSTALL
Създаване на клон за Install-задачата и прилагане на генерираните манифести в Kubernetes кластера по същия начин, както с apply-задачата.

k8s:watch
PACKAGE
Автоматично горещо разгръщане на приложението чрез проследяване на неговото пространство от имена.

Разгръщане на Java приложения на Red Hat OpenShift с помощта на OpenShift Maven Plugin

За разгръщане на приложението от нашия пример на платформата Red Hat OpenShift ще приложим плъгина OpenShift Maven. Единствената разлика ще бъде в това, че префиксът на задачите ще се промени от k8s на oc. По подразбиране плъгинът Kubernetes Maven прави docker-сборки, а плъгинът OpenShift Maven – сборки S2I. Ние не правим никакви промени в нашия проект, освен за премахване на свойството jkube.generator.name, тъй като то не е необходимо при изпращане до хранилище (в етапа на изграждане OpenShift поставя образа в своето вътрешно хранилище). А ето какво ще се появи на екрана, когато стартираме нашия пример, в който, между другото, изпълняваме goal-задачите не по една, а всички наведнъж:

~\/work\/repos\/eclipse-jkube-demo-project : $ mvn oc:build oc:resource oc:apply
[INFO] Сканираме за проекти...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Изграждане на random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] oc: Използване на OpenShift строеж с стратегия S2I
[INFO] oc: Работим в режим OpenShift
[INFO] oc: Работим с генератора spring-boot
[INFO] oc: spring-boot: Използване на Docker изображение quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 като основа \/ строител
[INFO] oc: [random-generator:0.0.1] "spring-boot": Създадено Docker source tar \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/docker\/random-generator\/0.0.1\/tmp\/docker-build.tar
[INFO] oc: Добавяне към Secret pullsecret-jkube
[INFO] oc: Използване на Secret pullsecret-jkube
[INFO] oc: Създаване на BuildServiceConfig random-generator-s2i за Source build
[INFO] oc: Създаване на ImageStream random-generator
[INFO] oc: Стартиране на Build random-generator-s2i
[INFO] oc: Изчакване на завършване на build random-generator-s2i-1...
[INFO] oc: Кеширане на blobs под "\/var\/cache\/blobs".
[INFO] oc: Получаване на изображения източници подписи
[INFO] oc: Копиране на blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Копиране на blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Копиране на blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Копиране на конфиг sha256:52d6788fcfdd39595264d34a3959464a5dabc1d4ef0ae188802b20fc2d6a857b
[INFO] oc: Записване на манифест до местоназначение на изображението
[INFO] oc: Съхраняване на подписи
[INFO] oc: Генериране на dockerfile с образ строителя quay.io\/jkube\/jkube-java-binary-s2i:0.0.7
[INFO] oc: STEPS 1: ОТ quay.io\/jkube\/jkube-java-binary-s2i:0.0.7
[INFO] oc: STEPS 2: LABEL "io.openshift.build.source-location"="\/tmp\/build\/inputs"       "io.openshift.build.image"="quay.io\/jkube\/jkube-java-binary-s2i:0.0.7"
[INFO] oc: STEPS 3: ENV JAVA_APP_DIR="\/deployments"     OPENSHIFT_BUILD_NAME="random-generator-s2i-1"     OPENSHIFT_BUILD_NAMESPACE="default"
[INFO] oc: STEPS 4: USER root
[INFO] oc: STEPS 5: COPY upload\/src \/tmp\/src
[INFO] oc: STEPS 6: RUN chown -R 1000:0 \/tmp\/src
[INFO] oc: STEPS 7: USER 1000
[INFO] oc: STEPS 8: RUN \/usr\/local\/s2i\/assemble
[INFO] oc: INFO S2I source build с чисти бинарници открито
[INFO] oc: INFO S2I binary build от fabric8-maven-plugin открито
[INFO] oc: INFO Копиране на бинарници от \/tmp\/src\/deployments до \/deployments ...
[INFO] oc: random-generator-0.0.1.jar
[INFO] oc: INFO Копиране на разполагания от deployments в \/deployments...
[INFO] oc: '\/tmp\/src\/deployments\/random-generator-0.0.1.jar' -> '\/deployments\/random-generator-0.0.1.jar'
[INFO] oc: STEPS 9: CMD \/usr\/local\/s2i\/run
[INFO] oc: STEPS 10: COMMIT temp.builder.openshift.io\/default\/random-generator-s2i-1:48795e41
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Несъответствие на операционната система на изображението: изображението използва "", очаквайки "linux""
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Несъответствие на архитектурата на изображението: изображението използва "", очаквайки "amd64""
[INFO] oc: Получаване на изображения източници подписи
[INFO] oc: Копиране на blob sha256:d8e1f35641acb80b562f70cf49911341dfbe8c86f4d522b18efbf3732aa74223
[INFO] oc: Копиране на blob sha256:b6f081e4b2b6de8be4b1dec132043d14c121e968384dd624fb69c2c07b482edb
[INFO] oc: Копиране на blob sha256:b7139ad07aa8ce4ed5a132f7c5cc9f1de0f5099b5e155027a23d57f7fbe78b16
[INFO] oc: Копиране на blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Копиране на конфиг sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Записване на манифест до местоназначение на изображението
[INFO] oc: Съхраняване на подписи
[INFO] oc: --> 27aaadaf28e
[INFO] oc: 27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Получаване на изображения източници подписи
[INFO] oc: 
[INFO] oc: Изпращане на изображение image-registry.openshift-image-registry.svc:5000\/default\/random-generator:0.0.1 ...
[INFO] oc: Копиране на blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Копиране на blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Копиране на blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Копиране на blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Копиране на конфиг sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Записване на манифест до местоназначение на изображението
[INFO] oc: Съхраняване на подписи
[INFO] oc: Успешно изпратено image-registry.openshift-image-registry.svc:5000\/default\/random-generator@sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: Успешно изпращане
[INFO] oc: Build random-generator-s2i-1 в статус Завършен
[INFO] oc: Намерена таг на ImageStream random-generator таг: sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: ImageStream random-generator записан в \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/random-generator-is.yml
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:resource (default-cli) @ random-generator ---
[INFO] oc: Използване на име на docker изображение на пространство: default
[INFO] oc: Работим с генератора spring-boot
[INFO] oc: spring-boot: Използване на Docker изображение quay.io\/jkube\/jkube-java-binary-s2i:0.0.7 като основа \/ строител
[INFO] oc: jkube-controller: Добавяне на дефолтен DeploymentConfig
[INFO] oc: jkube-service: Добавяне на дефолтна услуга 'random-generator' с портове [8080]
[INFO] oc: jkube-healthcheck-spring-boot: Добавяне на проверка за готовност на порт 8080, път='\/actuator\/health', схема='HTTP', с начално закъснение 10 секунди
[INFO] oc: jkube-healthcheck-spring-boot: Добавяне на проверка за работоспособност на порт 8080, път='\/actuator\/health', схема='HTTP', с начално закъснение 180 секунди
[INFO] oc: jkube-revision-history: Добавяне на ограничение на историята на ревизията до 2
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] oc: Използване на OpenShift на https:\/\/api.crc.testing:6443\/ в пространство по подразбиране с манифест \/home\/rohaan\/work\/repos\/eclipse-jkube-demo-project\/target\/classes\/META-INF\/jkube\/openshift.yml 
[INFO] oc: Открита платформа OpenShift
[INFO] oc: Използване на проект: default
[INFO] oc: Създаване на услуга от openshift.yml пространство по подразбиране име random-generator
[INFO] oc: Създадена услуга: target\/jkube\/applyJson\/default\/service-random-generator.json
[INFO] oc: Създаване на DeploymentConfig от openshift.yml пространство по подразбиране име random-generator
[INFO] oc: Създадена DeploymentConfig: target\/jkube\/applyJson\/default\/deploymentconfig-random-generator.json
[INFO] oc: Създаване на Route default:random-generator хост: null
[INFO] oc: СЪВЕТ: Използвайте командата `oc get pods -w`, за да наблюдавате как стартират вашите pods
[INFO] ------------------------------------------------------------------------
[INFO] СТРОИТЕ УСПЕШНО
[INFO] ------------------------------------------------------------------------
[INFO] Общо време:  01:07 мин
[INFO] Завършено в: 2020-08-10T12:08:00+05:30
[INFO] ------------------------------------------------------------------------
~\/work\/repos\/eclipse-jkube-demo-project : $ oc get pods -w
ИМЕ                           ГОТОВО     СТАТУС      ПРЕЗАРЕЖДАНИЯ   ВЪЗРАСТ
random-generator-1-deploy      1\/1       Работи     0          14s
random-generator-1-vnrm9       0\/1       Работи     0          11s
random-generator-s2i-1-build   0\/1       Завършен   0          1m
random-generator-1-vnrm9   1\/1       Работи   0         24s
random-generator-1-deploy   0\/1       Завършен   0         28s
~\/work\/repos\/eclipse-jkube-demo-project : $ oc get routes
ИМЕ                ХОСТ\/ПОРТ                                    ПЪТ      УСЛУГИ            ПОРТ      ЗАВЪРШВАНЕ   ДИВ
random-generator    random-generator-default.apps-crc.testing              random-generator    8080                    None
~\/work\/repos\/eclipse-jkube-demo-project : $ curl random-generator-default.apps-crc.testing\/random 
  % Общо    % Получени % Xferd  Средна Скорост   Време    Време     Време  Текуща
                                 Dload  Upload   Общо   Прекарано   Остава  Скорост
100    45    0    45    0     0   1666      0 --:--:-- --:--:-- --:--:--  1730
{
  "id": "d80052d9-2f92-43cb-b9eb-d7cffb879798"
}
~\/work\/repos\/eclipse-jkube-demo-project : $

Видеоурок

За да научите повече за това как да опростите разработката с Kubernetes чрез Eclipse JKube, вижте видеото за бързо внедряване на просто приложение Spring Boot на Minikube:

Възпроизведи видео

Заключение

В тази статия показахме как Eclipse JKube улеснява живота на Java разработчиците при работа с Kubernetes. Допълнителна информация за Eclipse JKube можете да намерите на сайта на проекта и на GitHub.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster