Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° 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 ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ (Π½Π° схСмС Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ красным) Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ goal-Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ 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] 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-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° (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] 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
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] 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