์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

์ด ๊ฒŒ์‹œ๋ฌผ์€ ์šฐ๋ฆฌ ์ง์›์ด Kubernetes์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  OpenShift์—์„œ ๊ทธ๋Ÿฌํ•œ ๊ฐœ๋ฐœ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๊ณ ๊ฐ๊ณผ ๊ฝค ๋งŽ์€ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Kubernetes๋Š” Kubernetes์ผ ๋ฟ์ด๋ฉฐ OpenShift๋Š” ์ด๋ฏธ Microsoft AKS ๋˜๋Š” Amazon EKS์™€ ๊ฐ™์€ Kubernetes ํ”Œ๋žซํผ์ด๋ผ๋Š” ํ…Œ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ํ”Œ๋žซํผ์—๋Š” ํŠน์ • ๋Œ€์ƒ ๊ณ ๊ฐ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๊ณ ์œ ํ•œ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ดํ›„ ๋Œ€ํ™”๋Š” ์ด๋ฏธ ํŠน์ • ํ”Œ๋žซํผ์˜ ๊ฐ•์ ๊ณผ ์•ฝ์ ์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ˜๋Ÿฌ๊ฐ‘๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” "๋“ค์–ด๋ด, OpenShift ๋˜๋Š” AKS, EKS, ์ผ๋ถ€ ์‚ฌ์šฉ์ž ์ •์˜ Kubernetes, ์˜ˆ ๋ชจ๋“  Kubernetes์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ค„์—ฌ์„œ KUK๋ผ๊ณ  ๋ถ€๋ฅด์ž) "๊ฑฐ๊ธฐ๋‚˜ ์ €๊ธฐ๋‚˜ ์ •๋ง ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค."

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ "Hello World"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CMC์™€ Red Hat OpenShift Container Platform(์ดํ•˜ OCP ๋˜๋Š” ๋‹จ์ˆœํžˆ OpenShift) ๊ฐ„์˜ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ๋ณด์—ฌ์ฃผ๊ธฐ๋กœ ๊ณ„ํšํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๋Š” OpenShift ์‚ฌ์šฉ์— ๋„ˆ๋ฌด ์ต์ˆ™ํ•ด์ ธ์„œ OpenShift๊ฐ€ ์–ด๋–ป๊ฒŒ ์„ฑ์žฅํ•˜์—ฌ ๋‹จ์ˆœํ•œ Kubernetes ๋ฐฐํฌ๋ฅผ ํ›จ์”ฌ ๋›ฐ์–ด๋„˜๋Š” ๋†€๋ผ์šด ํ”Œ๋žซํผ์œผ๋กœ ๋ณ€๋ชจํ–ˆ๋Š”์ง€ ๊นจ๋‹ซ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” OpenShift์˜ ์žฅ์—„ํ•จ์„ ๊ฐ„๊ณผํ•˜๋ฉด์„œ OpenShift์˜ ์„ฑ์ˆ™ํ•จ๊ณผ ๋‹จ์ˆœํ•จ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ ๊ทน์ ์ธ ํšŒ๊ฐœ์˜ ์‹œ๊ฐ„์ด ์™”์œผ๋ฉฐ ์ด์ œ ์šฐ๋ฆฌ๋Š” KUK์™€ OpenShift์—์„œ "Hello World"์˜ ์ปค๋ฏธ์…”๋‹์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋น„๊ตํ•˜๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ๊ด€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ ํƒœ๋„). ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ˆœ์ „ํžˆ ์ฃผ๊ด€์ ์ธ ์˜๊ฒฌ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ (EN). ๊ทธ๋ฆฌ๊ณ  ์ด ํฌ์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” ์‚ฌ์‹ค๊ณผ ์‚ฌ์‹ค๋งŒ์„ ๊ณ ์ˆ˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ

๋”ฐ๋ผ์„œ "Hello World"์—๋Š” ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„, ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ๋„คํŠธ์›Œํฌ, ๋ฐ์ดํ„ฐ ์ „์†ก ๋“ฑ์— ๋Œ€ํ•œ ๋น„์šฉ์„ ์ง€๋ถˆํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์— "์•„๋‹ˆ์˜ค"๋ผ๊ณ  ๋งํ•ฉ์‹œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•œ ๋‹จ์ผ ๋…ธ๋“œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋‹ˆ์ฟ ๋ฒ  (KUK์˜ ๊ฒฝ์šฐ) ๋ฐ ์ฝ”๋“œ ๋ ˆ๋”” ์ปจํ…Œ์ด๋„ˆ (OpenShift ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ). ์ด ๋‘ ์˜ต์…˜ ๋ชจ๋‘ ์„ค์น˜๊ฐ€ ์ •๋ง ์‰ฝ์ง€๋งŒ ๋…ธํŠธ๋ถ์— ์ƒ๋‹นํžˆ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

KUK-e์—์„œ ์กฐ๋ฆฝ

์ž, ๊ฐ€์ž.

1๋‹จ๊ณ„ - ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๊ตฌ์ถ•

Minikube์— "Hello World"๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. 1. ๋„์ปค๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. 2. ํž˜๋‚ด ์„ค์น˜.
  3. 3. Maven ์„ค์น˜(์‹ค์ œ๋กœ ์ด ํ”„๋กœ์ ํŠธ๋Š” mvnw ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ Maven ์—†์ด๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)
  4. 4. ์‹ค์ œ๋กœ ์†Œ์Šค ์ž์ฒด, ์ฆ‰ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ณต์ œ github.com/gcolman/quarkus-hello-world.git

์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” Quarkus ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Quarkus.io๋ฅผ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†๋”๋ผ๋„ ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ตฌ์„ฑ ์š”์†Œ(RestEasy, Hibernate, Amazon SQS, Camel ๋“ฑ)๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ Quarkus ์ž์ฒด๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์ฐธ์—ฌ ์—†์ด maven ์›ํ˜•์„ ์„ค์ •ํ•˜๊ณ  ๋ชจ๋“  ๊ฒƒ์„ github์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ๋งˆ์šฐ์Šค๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํด๋ฆญํ•˜๋ฉด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ Quarkus๋ฅผ ์‚ฌ๋ž‘ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

"Hello World"๋ฅผ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์ด๋ฏธ์ง€๋กœ ๋นŒ๋“œํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํ•„์š”ํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Docker์šฉ quarkus-maven ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Quarkus์˜ ๋“ฑ์žฅ์œผ๋กœ ์ด ์ž‘์—…์€ ์ •๋ง ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค. container-image-docker ํ™•์žฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด maven ๋ช…๋ น์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

./mvnw quarkus:add-extension -Dextensions=โ€container-image-dockerโ€

๋งˆ์ง€๋ง‰์œผ๋กœ Maven์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์—์„œ ์ด๋ฏธ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

./mvnw -X clean package -Dquarkus.container-image.build=true

์‚ฌ์‹ค ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ์ด์ œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค๋ฅผ ํฌํŠธ 8080์— ๋งคํ•‘ํ•˜์—ฌ docker run ๋ช…๋ น์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker run -i โ€” rm -p 8080:8080 gcolman/quarkus-hello-world

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ๋‚จ์€ ๊ฒƒ์€ curl ๋ช…๋ น์œผ๋กœ ์„œ๋น„์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ–ˆ๊ณ  ์ •๋ง ์‰ฝ๊ณ  ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

2๋‹จ๊ณ„ - ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ œ์ถœ

์ง€๊ธˆ์€ ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ์ปฌ ์ปจํ…Œ์ด๋„ˆ ์Šคํ† ๋ฆฌ์ง€์— ๋กœ์ปฌ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. KUK ํ™˜๊ฒฝ์—์„œ ์ด ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Kubernetes์—๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ dockerhub๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ๋ฌด๋ฃŒ์ด๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” (๊ฑฐ์˜) ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฉฐ ์—ฌ๊ธฐ์—๋Š” dockerhub ๊ณ„์ •๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ dockerhub๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

3๋‹จ๊ณ„ - Kubernetes ์‹œ์ž‘

"Hello World"๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด kubernetes ๊ตฌ์„ฑ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ € minikube ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

minikube start

4๋‹จ๊ณ„ - ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ฐฐํฌ

์ด์ œ ์ฝ”๋“œ์™€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ kubernetes ๊ตฌ์„ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, dockerhub์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ๋“œ์™€ ๋ฐฐํฌ ์ •์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐํฌ ์ƒ์„ฑ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

kubectl create deployment hello-quarkus โ€” image =gcolman/quarkus-hello-world:1.0.0-SNAPSHOT

์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ํฌ๋“œ ์‚ฌ์–‘์„ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” ๋ฐฐํฌ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•˜๋„๋ก COOK์— ์ง€์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ ๋˜ํ•œ ์ด ๊ตฌ์„ฑ์„ Minikube ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•˜๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐฐํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

5๋‹จ๊ณ„ - ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์—ด๊ธฐ

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐฐํฌ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด์ œ ์ด Restful ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด ์„œ๋น„์Šค๋Š” ์ฝ”๋“œ์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋…ธ์ถœ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๋ฐ ์—”๋“œํฌ์ธํŠธ์™€ ๊ฐ™์€ ์ ์ ˆํ•œ Kubernetes ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ๋ฐฐํฌ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ๋…ธ์ถœ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค.

kubectl expose deployment hello-quarkus โ€” type=NodePort โ€” port=8080

์ž ์‹œ ๋…ธ์ถœ ๋ช…๋ น์˜ "-type" ์˜ต์…˜์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์ƒ์„ฑํ•  ๋•Œ ๋ฌด์—‡๋ณด๋‹ค๋„ ์†Œํ”„ํŠธ์›จ์–ด ์ •์˜ ๋„คํŠธ์›Œํฌ ๋‚ด๋ถ€์— ์žˆ๋Š” hello-quarkus ์„œ๋น„์Šค์— ์™ธ๋ถ€์—์„œ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜• ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ƒ์„ฑํ•˜๊ณ  ์—ฐ๊ฒฐํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ํ•ด๋‹น ๋„คํŠธ์›Œํฌ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์“ฐ๊ธฐ ์œ ํ˜•=๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ, Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์ด ํŠน์ • ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์— ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ๋‹ค๋ฅธ ํ™˜๊ฒฝ์˜ Kubernetes ์ธ์Šคํ„ด์Šค ๊ฐ„์— ์ „์†กํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์˜ˆ์—์„œ ์œ ํ˜•=๋…ธ๋“œํฌํŠธ์ฆ‰, ์šฐ๋ฆฌ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ์™€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์ž์ฒด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— NGINX ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

6๋‹จ๊ณ„ - ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์„ค์ •

minikube์—๋Š” ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์•ก์„ธ์Šค์— ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Minikube๋Š” Nginx ์ˆ˜์‹  ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ•จ๊ป˜ ๋ฒˆ๋“ค๋กœ ์ œ๊ณต๋˜๋ฉฐ ์ด๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

minikube addons enable ingress

์ด์ œ ๋‹จ ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ Minikube ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์ž‘๋™ํ•  Nginx ์ˆ˜์‹  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m

7๋‹จ๊ณ„ - ์ธ๊ทธ๋ ˆ์Šค ์„ค์ •

์ด์ œ hello-quarkus ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋„๋ก Nginx ์ˆ˜์‹  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ๊ตฌ์„ฑ์„ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

kubectl apply -f ingress.yml

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ž์ฒด ์‹œ์Šคํ…œ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋ฅผ /etc/hosts ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜์—ฌ minikube์— ๋Œ€ํ•œ http ์š”์ฒญ์„ NGINX ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

192.168.99.100 hello-quarkus.info

์ด์ œ Nginx ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ minikube ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

๊ธ€์Ž„์š”, ์‰ฌ์› ์ฃ ? ์•„๋‹ˆ๋ฉด ๋ณ„๋กœ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

OpenShift์—์„œ ์‹คํ–‰(์ฝ”๋“œ ์ค€๋น„ ์ปจํ…Œ์ด๋„ˆ)

์ด์ œ ์ด ๋ชจ๋“  ๊ฒƒ์ด Red Hat OpenShift Container Platform(OCP)์—์„œ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Minikube์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CRC(Code Ready Containers) ํ˜•ํƒœ์˜ ๋‹จ์ผ ๋…ธ๋“œ OpenShift ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํฌํ•จ๋œ ์ฒด๊ณ„๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์—๋Š” minishift๋ผ๊ณ  ๋ถˆ๋ ธ๊ณ  OpenShift Origin ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ–ˆ์ง€๋งŒ ์ง€๊ธˆ์€ CRC์ด๋ฉฐ Red Hat์˜ OpenShift Container Platform์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. "OpenShift๋Š” ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค!"๋ผ๊ณ  ๋งํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ์šฐ๋ฆฌ๋Š” OpenShift์—์„œ์˜ ๊ฐœ๋ฐœ์ด Kubernetes์—์„œ์˜ ๊ฐœ๋ฐœ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์šฐ๋ฆฌ๋Š” OpenShift๊ฐ€ ์—†์„ ๋•Œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ถˆํ•„์š”ํ•œ ์›€์ง์ž„์„ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”์ง€ ๊ธฐ์–ตํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ํ•œ ๋ฒˆ ์•„๋ฆ„๋‹ต์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ผ์ด ์‰ฌ์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๋ฉฐ Minikube์™€ ๋น„๊ตํ•˜์—ฌ OpenShift์—์„œ ์˜ˆ์ œ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€ ์ด ๊ฒŒ์‹œ๋ฌผ์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ minikube ์˜ˆ์ œ์—์„œ ์šฐ๋ฆฌ๋Š” Docker๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹คโ€ฆ ์ž ๊น, ๋” ์ด์ƒ ๋จธ์‹ ์— Docker๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๋กœ์ปฌ ์ž์‹์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Maven์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ˆ˜์‹  ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์„ค์น˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ˆ˜์‹ ๋„ ๊ตฌ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ดํ•ดํ–ˆ๋‚˜์š”? OpenShift์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ ค๋ฉด ์œ„์˜ ์–ด๋Š ๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค ์ž์ฒด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๋‹จ๊ณ„ โ€“ OpenShift ํด๋Ÿฌ์Šคํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ

Red Hat์˜ Code Ready Containers๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ Minikube์™€ ๋™์ผํ•˜์ง€๋งŒ ์™„์ „ํ•œ ๋‹จ์ผ ๋…ธ๋“œ Openshift ํด๋Ÿฌ์Šคํ„ฐ๋งŒ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

crc start

2๋‹จ๊ณ„ - OpenShift ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ• ๋ฐ ๋ฐฐํฌ

๋ฐ”๋กœ ์ด ๋‹จ๊ณ„์—์„œ OpenShift์˜ ๋‹จ์ˆœ์„ฑ๊ณผ ํŽธ๋ฆฌํ•จ์ด ๊ทธ ๋ชจ๋“  ์˜๊ด‘์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ๋ชจ๋“  Kubernetes ๋ฐฐํฌํŒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  KUK์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒƒ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

OpenShift๋Š” ํ•ญ์ƒ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋žซํผ์œผ๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์ถ•์€ ํ•ญ์ƒ ์ด ํ”Œ๋žซํผ์˜ ํ•„์ˆ˜์ ์ธ ๋ถ€๋ถ„์ด๋ฏ€๋กœ ํ•ด๋‹น ์ž‘์—…์„ ์œ„ํ•œ ์ถ”๊ฐ€ Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift์˜ ์†Œ์Šค 2 ์ด๋ฏธ์ง€(S2I) ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค์—๋Š” ์†Œ์Šค(์ฝ”๋“œ ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ)๋ฅผ ๊ฐ€์ ธ์™€ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์ด๋ฏธ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • git ์ €์žฅ์†Œ์˜ ์†Œ์Šค ์ฝ”๋“œ
  • ์กฐ๋ฆฝ์ด ์ˆ˜ํ–‰๋˜๋Š” ๋นŒ๋” ์ด๋ฏธ์ง€.

Red Hat๊ณผ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋งŽ์ด ์žˆ์œผ๋ฉฐ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ OpenJDK ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

OpenShift Developer ๊ทธ๋ž˜ํ”ฝ ์ฝ˜์†”๊ณผ ๋ช…๋ น์ค„ ๋ชจ๋‘์—์„œ S2I ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. new-app ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋” ์ด๋ฏธ์ง€์™€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด S2I ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค ๋นŒ๋“œ ํฌ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
  • OpenShift ๋นŒ๋“œ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋นŒ๋” ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ถ€ OpenShift ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋‹ค์šด๋กœ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.
  • "Hello World"๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋ณต์ œํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฑฐ๊ธฐ์— maven pom์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณด๊ณ  maven์œผ๋กœ ์•ฑ์„ ์ปดํŒŒ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ปดํŒŒ์ผ๋œ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํฌํ•จํ•˜๋Š” ์ƒˆ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ํฌ๋“œ, ์„œ๋น„์Šค ๋“ฑ์— ๋Œ€ํ•œ ์‚ฌ์–‘์œผ๋กœ Kubernetes ๋ฐฐํฌ๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋น„์Šค ๋นŒ๋“œ ํฌ๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ชฉ๋ก์—๋Š” ๋งŽ์€ ํ•ญ๋ชฉ์ด ์žˆ์ง€๋งŒ ์ค‘์š”ํ•œ ์ ์€ ์ „์ฒด ๋นŒ๋“œ๊ฐ€ OpenShift ๋‚ด๋ถ€์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๊ณ  ๋‚ด๋ถ€ Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ OpenShift ๋‚ด๋ถ€์— ์žˆ์œผ๋ฉฐ ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋“  Kubernetes ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฝ˜์†”์—์„œ S2I ์‹คํ–‰์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉด ๋นŒ๋“œ ์ค‘์— ๋นŒ๋“œ ํฌ๋“œ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

์ด์ œ ๋นŒ๋” ํฌ๋“œ์˜ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋จผ์ € maven์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

Maven ๋นŒ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ์ด ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๊ฐ€ ๋‚ด๋ถ€ ์ €์žฅ์†Œ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

๋ชจ๋“  ๊ฒƒ, ์กฐ๋ฆฝ ๊ณผ์ •์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํฌ๋“œ์™€ ์„œ๋น„์Šค๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

oc get service

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

๊ทธ๊ฒŒ ๋‹ค์•ผ. ๊ทธ๋ฆฌ๊ณ  ํ•œ ํŒ€๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์€ ์™ธ๋ถ€ ์•ก์„ธ์Šค๋ฅผ ์œ„ํ•ด ์ด ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

3๋‹จ๊ณ„ - ์™ธ๋ถ€์—์„œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

KUK์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ OpenShift ํ”Œ๋žซํผ์—์„œ "Hello World"๋„ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์˜ ์„œ๋น„์Šค๋กœ ์•ˆ๋‚ดํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์šฐํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. OpenShift์—์„œ๋Š” ์ด๊ฒƒ์ด ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๊ธฐ๋ณธ์ ์œผ๋กœ HAProxy ๋ผ์šฐํŒ… ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค(๋™์ผํ•œ NGINX๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ). ๋‘˜์งธ, Routes๋ผ๋Š” ํŠน๋ณ„ํ•˜๊ณ  ๊ณ ๋„๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์˜ค๋ž˜๋œ Kubernetes์˜ Ingress ๊ฐ์ฒด๋ฅผ ์—ฐ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค(์‚ฌ์‹ค OpenShift์˜ Routes๋Š” Ingress ๊ฐ์ฒด์˜ ์„ค๊ณ„์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์ณค์œผ๋ฉฐ ์ด์ œ OpenShift์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). World" ๋ฐ ๊ธฐํƒ€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์—†์ด ํ‘œ์ค€ ๊ฒฝ๋กœ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

"Hello World"์— ๋Œ€ํ•œ ๋ผ์šฐํŒ… ๊ฐ€๋Šฅํ•œ FQDN์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด(์˜ˆ, OpenShift์—๋Š” ์„œ๋น„์Šค ์ด๋ฆ„๋ณ„ ๋ผ์šฐํŒ…์„ ์œ„ํ•œ ์ž์ฒด DNS๊ฐ€ ์žˆ์Œ) ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

oc expose service quarkus-hello-world

์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฒฝ๋กœ๋ฅผ ๋ณด๋ฉด FQDN ๋ฐ ๊ธฐํƒ€ ๋ผ์šฐํŒ… ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

oc get route

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋น„์Šค์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, OpenShift, ์šฐ๋ฆฌ๋Š” ๋‹น์‹ ์—๊ฒŒ ์ถฉ๋ถ„ํžˆ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๊ณ  ๋‹น์‹ ์„ ๋‹น์—ฐํ•˜๊ฒŒ ์—ฌ๊ฒผ์Šต๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์ •๋ง ์‰ฌ์› ์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์™€ ์ด ๊ธฐ์ˆ ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ข‹์•„ํ•˜๋ฉฐ ๋‹จ์ˆœ์„ฑ๊ณผ ๊ฐ€๋ฒผ์›€๋„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. Kubernetes๋Š” ๋ถ„์‚ฐ๋˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์ง€๋งŒ ๊ทธ ๋‹จ์ˆœ์„ฑ์€ ๋” ์ด์ƒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ”„๋กœ๋•์…˜์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ ์—ฌ๊ธฐ์—์„œ OpenShift๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. OpenShift๋Š” ์‹œ๋Œ€์— ๋ฐœ๋งž์ถ”๊ณ  ์ฃผ๋กœ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ดˆ์ ์„ ๋งž์ถ˜ Kubernetes๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. S2I, ODI, ๊ฐœ๋ฐœ์ž ํฌํ„ธ, OpenShift ์šด์˜์ž ํ”„๋ ˆ์ž„์›Œํฌ, IDE ํ†ตํ•ฉ, ๊ฐœ๋ฐœ์ž ์นดํƒˆ๋กœ๊ทธ, Helm ํ†ตํ•ฉ, ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ์˜ ๋„๊ตฌ ์ƒ์„ฑ์„ ํฌํ•จํ•˜์—ฌ ํŠนํžˆ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด OpenShift ํ”Œ๋žซํผ์„ ๋งž์ถคํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ๊ฐ€ ๊ท€ํ•˜์—๊ฒŒ ํฅ๋ฏธ๋กญ๊ณ  ์œ ์šฉํ–ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋˜ํ•œ ํฌํ„ธ์˜ OpenShift ํ”Œ๋žซํผ์—์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ์ถ”๊ฐ€ ๋ฆฌ์†Œ์Šค, ์ž๋ฃŒ ๋ฐ ๊ธฐํƒ€ ํ•ญ๋ชฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ๋“œํ–‡ ๊ฐœ๋ฐœ์ž.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€