Распрацоўка 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-распрацоўкі

Традыцыйны працэс распрацоўкі ява (Мал.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 і кантэйнерамі (на схеме выдзелены чырвоным) замяняюцца goal-задачамі Eclipse JKube па змаўчанні, якія пералічаны ў Табл. 1.

Табл. 1. Задачы Eclipse JKube па змаўчанні.

Задача
этап
Апісанне

k8s:build
PRE_INTEGRATION_TEST
Зборка docker-вобразаў

k8s:push
УСТАНАВІЦЬ
Адпраўка 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-дадатак у кластары Мінікубе з дапамогай 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] Scanning for projects...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] k8s: Running in Kubernetes mode
[INFO] k8s: Building Docker image in Kubernetes mode
[INFO] k8s: Running generator spring-boot
[INFO] k8s: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] k8s: [docker.io/rohankanojia/random-generator:0.0.1] "spring-boot": Created docker-build.tar in 251 milliseconds
[INFO] k8s: [docker.io/rohankanojia/random-generator:0.0.1] "spring-boot": Built image sha256:a20e5
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.053 s
[INFO] Finished at: 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] Scanning for projects...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:push (default-cli) @ random-generator ---
[INFO] k8s: Running in Kubernetes mode
[INFO] k8s: Building Docker image in Kubernetes mode
[INFO] k8s: Running generator spring-boot
[INFO] k8s: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] k8s: The push refers to repository [docker.io/rohankanojia/random-generator]
5dcd9556710f: Layer already exists 
b7139ad07aa8: Layer already exists 
b6f081e4b2b6: Layer already exists 
d8e1f35641ac: Layer already exists 
[INFO] k8s: 0.0.1: digest: sha256:9f9eda2a13b8cab1d2c9e474248500145fc09e2922fe3735692f9bda4c76002d size: 1162
[INFO] k8s: Pushed docker.io/rohankanojia/random-generator:0.0.1 in 7 seconds 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  11.222 s
[INFO] Finished at: 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-фрэймворка (Вясновы бот, Кваркус, 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] Scanning for projects...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:resource (default-cli) @ random-generator ---
[INFO] k8s: Running generator spring-boot
[INFO] k8s: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] k8s: jkube-controller: Adding a default Deployment
[INFO] k8s: jkube-service: Adding a default service 'random-generator' with ports [8080]
[INFO] k8s: jkube-healthcheck-spring-boot: Adding readiness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 10 seconds
[INFO] k8s: jkube-healthcheck-spring-boot: Adding liveness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 180 seconds
[INFO] k8s: jkube-revision-history: Adding revision history limit to 2
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.344 s
[INFO] Finished at: 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: [email protected]: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] Scanning for projects...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- kubernetes-maven-plugin:1.0.0-rc-1:apply (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: Creating a Service from kubernetes.yml namespace default name random-generator
[INFO] k8s: Created Service: target/jkube/applyJson/default/service-random-generator.json
[INFO] k8s: Creating a Deployment from kubernetes.yml namespace default name random-generator
[INFO] k8s: Created Deployment: target/jkube/applyJson/default/deployment-random-generator.json
[INFO] k8s: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  7.306 s
[INFO] Finished at: 2020-08-10T11:40:57+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $ kubectl get pods -w
NAME                                                     READY   STATUS             RESTARTS   AGE
random-generator-58b7847d7f-9m9df                        0/1     Running            0          7s
random-generator-58b7847d7f-9m9df                        1/1     Running            0          17s
^C~/work/repos/eclipse-jkube-demo-project : $ kubectl get svc
NAME                                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
io-openliberty-sample-getting-started   NodePort    10.110.4.104    <none>        9080:30570/TCP    44h
kubernetes                              ClusterIP   10.96.0.1       <none>        443/TCP           18d
random-generator                        NodePort    10.97.172.147   <none>        8080:32186/TCP    22s
~/work/repos/eclipse-jkube-demo-project : $ curl `minikube ip`:32186/random | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
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       <none>        443/TCP          18d
service/random-generator   NodePort    10.97.172.147   <none>        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] ----------------------< meetup:random-generator >-----------------------
[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    <none>        443/TCP   18d
~/work/repos/eclipse-jkube-demo-project : $

Што яшчэ можна зрабіць з Eclipse JKube

Такім чынам, мы разгледзелі асноўныя goal-задачы Eclipse JKube і Kubernetes Maven Plugin, якія аблягчаюць распрацоўку Java-прыкладанняў для платформы Kubernetes. Калі вам не жадаецца стала ўводзіць гэтыя задачы з клавіятуры, іх можна папісаць у канфігурацыі плагіна, напрыклад, вось так:

<plugin>
     <groupId>org.eclipse.jkube</groupId>
     <artifactId>kubernetes-maven-plugin</artifactId>
     <version>${project.version}</version>
     <executions>
         <execution>
             <goals>
                  <goal>build</goal>
                  <goal>resource</goal>
                  <goal>apply</goal>
             </goals>
         </execution>
     </executions>
</plugin>

Трэба сказаць, што ў гэтым артыкуле мы разгледзелі далёка не ўсе goal-задачы, якія ёсць у Eclipse JKube і Kubernetes Maven Plugin, таму прыводзім у Табл.2 спіс дадатковых задач, якія таксама могуць вам спатрэбіцца.

Табл. 2. Дадатковыя goal-задачы Eclipse JKube.

Задача
этап
Апісанне

k8s:log
ВАЛІДАВАЦЬ
Атрыманне логаў ад прыкладання, які працуе на Kubernetes.

k8s:debug
ПАКЕТ
Адкрыццё адладкавага порта, каб выконваць адладку прыкладання, які працуе на Kubernetes, непасрэдна з IDE.

k8s:deploy
УСТАНАВІЦЬ
Стварэнне форка для Install-задачы і ўжыванне згенераваных маніфестаў да кластара Kubernetes сапраўды гэтак жа, як у выпадку apply-задачы.

k8s:watch
ПАКЕТ
Аўтаматычнае гарачае разгортванне прыкладання за кошт адсочвання яго прасторы імёнаў.

Разгортванне Java-прыкладанняў на Red Hat OpenShift з дапамогай OpenShift Maven Plugin

Для разгортвання прыкладання з нашага прыкладу на платформе Red Hat OpenShift выкарыстоўваецца ўбудова. OpenShift Maven. Адзінае адрозненне будзе ў тым, што прэфікс задач зменіцца з k8s на oc. Па змаўчанні плягін Kubernetes Maven робіць докер-зборкі, а плягін OpenShift Maven – зборкі S2I. Мы не ўносім у наш праект ніякіх змен, за выключэннем выдалення ўласцівасці jkube.generator.name, паколькі яно не патрабуецца пры адпраўцы ў рэестр (на этапе зборкі OpenShift размяшчае выяву ў сваім унутраным рэестры). І вось што з'явіцца на экране, калі мы запусцім наш прыклад, у якім мы, дарэчы, выконваем goal-задачы не па адной, а ўсё адразу:

~/work/repos/eclipse-jkube-demo-project : $ mvn oc:build oc:resource oc:apply
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------------------< meetup:random-generator >-----------------------
[INFO] Building random-generator 0.0.1
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:build (default-cli) @ random-generator ---
[INFO] oc: Using OpenShift build with strategy S2I
[INFO] oc: Running in OpenShift mode
[INFO] oc: Running generator spring-boot
[INFO] oc: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] oc: [random-generator:0.0.1] "spring-boot": Created docker source tar /home/rohaan/work/repos/eclipse-jkube-demo-project/target/docker/random-generator/0.0.1/tmp/docker-build.tar
[INFO] oc: Adding to Secret pullsecret-jkube
[INFO] oc: Using Secret pullsecret-jkube
[INFO] oc: Creating BuildServiceConfig random-generator-s2i for Source build
[INFO] oc: Creating ImageStream random-generator
[INFO] oc: Starting Build random-generator-s2i
[INFO] oc: Waiting for build random-generator-s2i-1 to complete...
[INFO] oc: Caching blobs under "/var/cache/blobs".
[INFO] oc: Getting image source signatures
[INFO] oc: Copying blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copying blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copying blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copying config sha256:52d6788fcfdd39595264d34a3959464a5dabc1d4ef0ae188802b20fc2d6a857b
[INFO] oc: Writing manifest to image destination
[INFO] oc: Storing signatures
[INFO] oc: Generating dockerfile with builder image quay.io/jkube/jkube-java-binary-s2i:0.0.7
[INFO] oc: STEP 1: FROM quay.io/jkube/jkube-java-binary-s2i:0.0.7
[INFO] oc: STEP 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: STEP 3: ENV JAVA_APP_DIR="/deployments"     OPENSHIFT_BUILD_NAME="random-generator-s2i-1"     OPENSHIFT_BUILD_NAMESPACE="default"
[INFO] oc: STEP 4: USER root
[INFO] oc: STEP 5: COPY upload/src /tmp/src
[INFO] oc: STEP 6: RUN chown -R 1000:0 /tmp/src
[INFO] oc: STEP 7: USER 1000
[INFO] oc: STEP 8: RUN /usr/local/s2i/assemble
[INFO] oc: INFO S2I source build with plain binaries detected
[INFO] oc: INFO S2I binary build from fabric8-maven-plugin detected
[INFO] oc: INFO Copying binaries from /tmp/src/deployments to /deployments ...
[INFO] oc: random-generator-0.0.1.jar
[INFO] oc: INFO Copying deployments from deployments to /deployments...
[INFO] oc: '/tmp/src/deployments/random-generator-0.0.1.jar' -> '/deployments/random-generator-0.0.1.jar'
[INFO] oc: STEP 9: CMD /usr/local/s2i/run
[INFO] oc: STEP 10: COMMIT temp.builder.openshift.io/default/random-generator-s2i-1:48795e41
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Image operating system mismatch: image uses "", expecting "linux""
[INFO] oc: time="2020-08-10T06:37:49Z" level=info msg="Image architecture mismatch: image uses "", expecting "amd64""
[INFO] oc: Getting image source signatures
[INFO] oc: Copying blob sha256:d8e1f35641acb80b562f70cf49911341dfbe8c86f4d522b18efbf3732aa74223
[INFO] oc: Copying blob sha256:b6f081e4b2b6de8be4b1dec132043d14c121e968384dd624fb69c2c07b482edb
[INFO] oc: Copying blob sha256:b7139ad07aa8ce4ed5a132f7c5cc9f1de0f5099b5e155027a23d57f7fbe78b16
[INFO] oc: Copying blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copying config sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Writing manifest to image destination
[INFO] oc: Storing signatures
[INFO] oc: --> 27aaadaf28e
[INFO] oc: 27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Getting image source signatures
[INFO] oc: 
[INFO] oc: Pushing image image-registry.openshift-image-registry.svc:5000/default/random-generator:0.0.1 ...
[INFO] oc: Copying blob sha256:f320f94d91a064281f5127d5f49954b481062c7d56cce3b09910e471cf849050
[INFO] oc: Copying blob sha256:cf0f3ebe9f536c782ab3835049cfbd9a663761ded9370791ef6ea3965c823aad
[INFO] oc: Copying blob sha256:57de4da701b511cba33bbdc424757f7f3b408bea741ca714ace265da9b59191a
[INFO] oc: Copying blob sha256:98972fc90a1108315cc5b05b2c691a0849a149727a7b81e76bc847ac2c6d9714
[INFO] oc: Copying config sha256:27aaadaf28e24856a66db962b88118b8222b61d79163dceeeed869f7289bc230
[INFO] oc: Writing manifest to image destination
[INFO] oc: Storing signatures
[INFO] oc: Successfully pushed image-registry.openshift-image-registry.svc:5000/default/random-generator@sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: Push successful
[INFO] oc: Build random-generator-s2i-1 in status Complete
[INFO] oc: Found tag on ImageStream random-generator tag: sha256:aa9e1a380c04ef9174ba56459c13d44420ebe653ebf32884d60fe4306b17306d
[INFO] oc: ImageStream random-generator written to /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: Using docker image name of namespace: default
[INFO] oc: Running generator spring-boot
[INFO] oc: spring-boot: Using Docker image quay.io/jkube/jkube-java-binary-s2i:0.0.7 as base / builder
[INFO] oc: jkube-controller: Adding a default DeploymentConfig
[INFO] oc: jkube-service: Adding a default service 'random-generator' with ports [8080]
[INFO] oc: jkube-healthcheck-spring-boot: Adding readiness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 10 seconds
[INFO] oc: jkube-healthcheck-spring-boot: Adding liveness probe on port 8080, path='/actuator/health', scheme='HTTP', with initial delay 180 seconds
[INFO] oc: jkube-revision-history: Adding revision history limit to 2
[INFO] 
[INFO] --- openshift-maven-plugin:1.0.0-rc-1:apply (default-cli) @ random-generator ---
[INFO] oc: Using OpenShift at https://api.crc.testing:6443/ in namespace default with manifest /home/rohaan/work/repos/eclipse-jkube-demo-project/target/classes/META-INF/jkube/openshift.yml 
[INFO] oc: OpenShift platform detected
[INFO] oc: Using project: default
[INFO] oc: Creating a Service from openshift.yml namespace default name random-generator
[INFO] oc: Created Service: target/jkube/applyJson/default/service-random-generator.json
[INFO] oc: Creating a DeploymentConfig from openshift.yml namespace default name random-generator
[INFO] oc: Created DeploymentConfig: target/jkube/applyJson/default/deploymentconfig-random-generator.json
[INFO] oc: Creating Route default:random-generator host: null
[INFO] oc: HINT: Use the command `oc get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:07 min
[INFO] Finished at: 2020-08-10T12:08:00+05:30
[INFO] ------------------------------------------------------------------------
~/work/repos/eclipse-jkube-demo-project : $ oc get pods -w
NAME                           READY     STATUS      RESTARTS   AGE
random-generator-1-deploy      1/1       Running     0          14s
random-generator-1-vnrm9       0/1       Running     0          11s
random-generator-s2i-1-build   0/1       Completed   0          1m
random-generator-1-vnrm9   1/1       Running   0         24s
random-generator-1-deploy   0/1       Completed   0         28s
~/work/repos/eclipse-jkube-demo-project : $ oc get routes
NAME                HOST/PORT                                    PATH      SERVICES            PORT      TERMINATION   WILDCARD
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 
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
Dload  Upload   Total   Spent    Left  Speed
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

Дадаць каментар