• Aiden's Lab แ„‚แ…ฒแ„‰แ…ณแ„…แ…ฆแ„แ…ฅ
  • Posts
  • ๐Ÿ”ญKubernetes แ„€แ…ตแ„‚แ…ณแ†ผแ„‹แ…ณแ†ฏ แ„Œแ…ฆแ„ƒแ…ขแ„…แ…ฉ แ„‹แ…ตแ†จแ„’แ…ตแ„€แ…ฉ แ„‰แ…ตแ‡แ„ƒแ…กแ„†แ…งแ†ซ minikubeแ„…แ…ฉ! - minikube แ„’แ…ชแ†ซแ„€แ…งแ†ผแ„‹แ…ฆแ„‰แ…ฅ แ„„แ…กแ„…แ…กแ„’แ…ขแ„‡แ…ฉแ„‚แ…ณแ†ซ Kubernetes Ingress แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ

๐Ÿ”ญKubernetes แ„€แ…ตแ„‚แ…ณแ†ผแ„‹แ…ณแ†ฏ แ„Œแ…ฆแ„ƒแ…ขแ„…แ…ฉ แ„‹แ…ตแ†จแ„’แ…ตแ„€แ…ฉ แ„‰แ…ตแ‡แ„ƒแ…กแ„†แ…งแ†ซ minikubeแ„…แ…ฉ! - minikube แ„’แ…ชแ†ซแ„€แ…งแ†ผแ„‹แ…ฆแ„‰แ…ฅ แ„„แ…กแ„…แ…กแ„’แ…ขแ„‡แ…ฉแ„‚แ…ณแ†ซ Kubernetes Ingress แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธ

Kubernetesแ„‹แ…ด Ingress แ„€แ…ตแ„‚แ…ณแ†ผแ„‹แ…ณแ†ฏ minikube แ„’แ…ชแ†ซแ„€แ…งแ†ผแ„‹แ…ฆแ„‰แ…ฅ แ„‰แ…ตแ†ฏแ„‰แ…ณแ†ธแ„’แ…กแ„€แ…ฉ แ„แ…ฆแ„‰แ…ณแ„แ…ณแ„’แ…กแ„‚แ…ณแ†ซ แ„€แ…กแ„‹แ…ตแ„ƒแ…ณแ„…แ…ณแ†ฏ แ„Œแ…ฆแ„€แ…ฉแ†ผแ„’แ…กแ†ธแ„‚แ…ตแ„ƒแ…ก.

์•ˆ๋…•ํ•˜์„ธ์š”, Aidenโ€™s Lab ๋‰ด์Šค๋ ˆํ„ฐ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ๊ธ€์—์„œ minikube์— ๋Œ€ํ•ด ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.

minikube๋ฅผ ์™œ ์จ์•ผ ํ•˜๋Š”์ง€, minikube๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „ ์œ ์˜ํ•ด์•ผ ํ•  ์ , ๊ทธ๋ฆฌ๊ณ  minikube๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๊ฐ™์ด ํ•ด๋ดค๋Š”๋ฐ์š”.

minikube๋ฅผ ์„ค์น˜๋งŒ ํ•˜๊ณ  ๋๋‚ด๊ธฐ๋Š” ๋„ˆ๋ฌด ์•„์‰ฝ์ฃ ? ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—” minikube๋กœ ์ƒ์„ฑํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ Ingress๋ฅผ ํ™œ์šฉํ•œ Nginx ์•ฑ ๋ฐฐํฌ ๋ฐ ๋…ธ์ถœ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ฐ€์ด๋“œ๋ฅผ ํ†ตํ•ด Kubernetes์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ด์ž ์š”์ฆ˜ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์žˆ๋Š” Ingress๋ฅผ ๋กœ์ปฌ minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉฐ ์ž‘๋™ ๋ฐฉ์‹๊นŒ์ง€ ์ตํžˆ์‹ค ์ˆ˜ ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค.

์–ด๋ ต์ง€ ์•Š๊ฒŒ ๋”ฐ๋ผํ•˜์‹ค ์ˆ˜ ์žˆ๋„๋ก ์ตœ๋Œ€ํ•œ ์ง๊ด€์ ์ธ ๊ตฌ์„ฑ์œผ๋กœ ์ค€๋น„ํ•œ ๊ฐ€์ด๋“œ์ด๋‹ˆ, ๊ผญ ํ™•์ธํ•ด๋ณด์„ธ์š”!

๐Ÿ”€minikube์—์„œ Ingress ํ™œ์šฉํ•œ Nginx ์•ฑ ๋ฐฐํฌ ๊ฐ€์ด๋“œ

๋จผ์ € minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ๊ธฐ๋ณธ์ ์ด์ง€๋งŒ ํ•„์ˆ˜๋กœ ์•Œ์•„์•ผ ํ•  Ingress ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

"Ingress์— ๋Œ€ํ•ด ๋งŽ์ด๋Š” ๋“ค์–ด๋ดค์ง€๋งŒ ์•„์ง ์™œ ์“ฐ์ด๊ณ  ์–ธ์ œ ์จ์•ผ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”..."

๊ทธ๋ ‡๋‹ค๋ฉด ๋”์šฑ ์ข‹์Šต๋‹ˆ๋‹ค! ์ œ๊ฐ€ minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ๋ฐฐํฌํ•œ ๊ฐ„๋‹จํ•œ ์•ฑ์„ Ingress๋กœ ๋…ธ์ถœํ•˜๋ฉด์„œ Ingress๊ฐ€ ์–ด๋–จ ๋•Œ ์“ฐ์ด๋Š”์ง€๋„ ์ปดํŒฉํŠธํ•˜๊ฒŒ ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”.

Ingress๋Š” ์™ธ๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” HTTP ๋˜๋Š” HTTPS ์š”์ฒญ์„ ์ˆ˜์‹ ํ•œ ๋‹ค์Œ, ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ ˆํ•œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ ์„œ๋น„์Šค(Pod)์— ํ•ด๋‹น ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ Ingress๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹จ์ผ IP ์ฃผ์†Œ์™€ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ๋„ URL์˜ ๊ฒฝ๋กœ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.

๊ฐ ์„œ๋น„์Šค๋Š” ๊ณ ์œ ํ•œ URL ๊ฒฝ๋กœ๋ฅผ ํ• ๋‹น๋ฐ›์•„ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์™ธ๋ถ€ ์ ‘๊ทผ ์ง€์  ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

minikube๋กœ ์‰ฝ๊ฒŒ ์˜ˆ๋ฅผ ๋“ค๋ฉด, minikube ํด๋Ÿฌ์Šคํ„ฐ IP์˜ 80 ํฌํŠธ๋กœ ๋“ค์–ด์˜ค๋Š” HTTP ์š”์ฒญ ์ค‘ ์•„๋ž˜์™€ ๊ฐ™์€ ์š”์ฒญ์€ ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ทœ์น™์— ๋”ฐ๋ผ ๊ฐ๊ฐ ์ ์ ˆํ•œ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • /app1 -> ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์„œ๋น„์Šค A

  • /app2 -> ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์„œ๋น„์Šค B

์‚ฌ์‹ค Kubernetes์˜ Ingress ๋ฆฌ์†Œ์Šค ์ž์ฒด๋Š” ์™ธ๋ถ€ ์š”์ฒญ์„ ์–ด๋–ป๊ฒŒ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋กœ ์—ฐ๊ฒฐํ• ์ง€์— ๋Œ€ํ•œ '๋ผ์šฐํŒ… ๊ทœ์น™ ์„ค๋ช…์„œ'์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

ํŠน์ • URL ๊ฒฝ๋กœ๋กœ ์š”์ฒญ์ด ์˜ฌ ๊ฒฝ์šฐ ์–ด๋–ค ์„œ๋น„์Šค๋กœ ์ „๋‹ฌํ• ์ง€๋ฅผ Ingress YAML ํŒŒ์ผ์— ์„ ์–ธ์ ์œผ๋กœ ๋ช…์‹œํ•˜๊ฑฐ๋“ ์š”.

๊ทธ๋Ÿผ Ingress ๋ฆฌ์†Œ์Šค์— ์ •์˜๋œ ๊ทœ์น™์„ ์ฐธ๊ณ ํ•ด์„œ ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌ์€ ๋ˆ„๊ฐ€ ํ•˜๋ƒ๊ณ ์š”?

๋ฐ”๋กœ, Ingress Controller์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Ingress ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Ingress Contoller๋ฅผ ๋ณ„๋„๋กœ ์„ค์น˜ํ•˜๊ณ , Ingress ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ minikube์—์„œ๋Š” ๋‹ค์–‘ํ•œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์• ๋“œ์˜จ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•˜๋Š”๋ฐ์š”. Ingress Controller๋„ ์• ๋“œ์˜จ ํ˜•ํƒœ๋กœ ์‰ฝ๊ฒŒ ์„ค์น˜ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Ingress ์‹ค์Šต์„ ์œ„ํ•ด minikube์— Ingress ์• ๋“œ์˜จ์„ ๋จผ์ € ์„ค์น˜ํ•ด๋ณผ๊ฒŒ์š”.

1๏ธโƒฃminikube์—์„œ Ingress ์• ๋“œ์˜จ ์„ค์น˜ํ•˜๊ธฐ

์ง€๋‚œ ๊ธ€์—์„œ ์ƒ์„ฑํ–ˆ๋˜ minikube ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ minikube start ๋ช…๋ น์–ด๋กœ ์ž‘๋™์‹œํ‚จ ๋’ค, minikube addons {minikube ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„} list ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ minikube์— ์„ค์น˜๋œ ์• ๋“œ์˜จ๊ณผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์• ๋“œ์˜จ ๋ชฉ๋ก์„ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ, ํ˜„์žฌ minikube ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” Ingress ์• ๋“œ์˜จ์ด ์•„์ง ๋น„ํ™œ์„ฑํ™”(disabled) ์ƒํƒœ์ธ๋ฐ์š”. ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ Ingress ์• ๋“œ์˜จ์„ ํ™œ์„ฑํ™”ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

minikube addons -p {minikube ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„} enable ingress

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Ingress ์• ๋“œ์˜จ ์„ค์น˜๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. (์„ค์น˜ํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„์ด ์•ฝ๊ฐ„ ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์„ค์น˜๊ฐ€ ๋๋‚˜๊ณ  minikube addons {minikube ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„} list ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด...

Ingress๊ฐ€ ํ™œ์„ฑํ™”(enabledโœ…)๋˜์—ˆ๋‹ค๊ณ  ๋œจ๋„ค์š”!

๊ทธ๋Ÿผ ์ด์ œ Ingress๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•  ์„œ๋น„์Šค๋ฅผ Kubernetes์˜ Deployment์™€ Service ๋ฆฌ์†Œ์Šค๋กœ ์ƒ์„ฑํ•˜๊ณ , ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๊ทœ์น™์„ ๋ช…์‹œํ•˜๋Š” Ingress ๋ฆฌ์†Œ์Šค๋„ ์ƒ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃDeployment, Service, Ingress ๋ฆฌ์†Œ์Šค ์ž‘์„ฑํ•˜๊ธฐ

์ง๊ด€์ ์ธ ์‹ค์Šต์„ ์œ„ํ•ด, ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›์„ ๊ฐ ์„œ๋น„์Šค๋ฅผ Nginx ์„œ๋ฒ„๋กœ ๊ตฌ์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฒˆ ์‹ค์Šต์—์„œ ๋ฐฐํฌํ•  ํ…Œ์ŠคํŠธ์šฉ ์„œ๋น„์Šค๋Š” ์•„๋ž˜ 2๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • user-nginx: /user๋กœ ๋๋‚˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๋Š” Nginx ์„œ๋ฒ„

  • product-nginx: /product๋กœ ๋๋‚˜๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ฐ›๋Š” Nginx ์„œ๋ฒ„

๊ฐ Deployment์—์„œ ์œ ์˜ํ•ด์„œ ๋ณผ ์ ์€, user ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Nginx ์ด๋ฏธ์ง€ ๋ฒ„์ „(1.23)๊ณผ product ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” Nginx ์ด๋ฏธ์ง€ ๋ฒ„์ „(1.25)์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฑด ๋ชจ๋“  ๋ฐฐํฌ๊ฐ€ ๋๋‚˜๊ณ  ํ…Œ์ŠคํŠธํ•  ๋•Œ ํŠธ๋ž˜ํ”ฝ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ „๋‹ฌ๋˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ user-nginx ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•œ Kubernetes ๋ฆฌ์†Œ์Šค ๋ช…์„ธ์„œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (user-nginx.yaml)

# 1. user-nginx ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user-nginx
  template:
    metadata:
      labels:
        app: user-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.23 # Ingress ํ…Œ์ŠคํŠธ ์‹œ ๊ตฌ๋ถ„์„ ์œ„ํ•ด product ์„œ๋น„์Šค์™€ ๋‹ค๋ฅธ ๋ฒ„์ „ ์‚ฌ์šฉ
        ports:
        - containerPort: 80

---
# 2. user-nginx ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Service
apiVersion: v1
kind: Service
metadata:
  name: user-nginx-service
spec:
  selector:
    app: user-nginx
  ports:
  - protocol: TCP
    port: 80 # Service๊ฐ€ ๋…ธ์ถœํ•  ํฌํŠธ
    targetPort: 80 # Pod์˜ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ

# Ingress๊ฐ€ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ minikube ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€ Service๋กœ ์ „๋‹ฌํ•˜๋ฏ€๋กœ, Service์˜ Type์€ ClusterIP๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
# Kubernetes Service์˜ ๊ธฐ๋ณธ Type์ด ClusterIP์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์„ธ์„œ์— Type์„ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ product-nginx ์„œ๋น„์Šค ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Kuberentes ๋ฆฌ์†Œ์Šค ๋ช…์„ธ์„œ์ž…๋‹ˆ๋‹ค. (product-nginx.yaml)

# 1. product-nginx ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: product-nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: product-nginx
  template:
    metadata:
      labels:
        app: product-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25 # Ingress ํ…Œ์ŠคํŠธ ์‹œ ๊ตฌ๋ถ„์„ ์œ„ํ•ด user ์„œ๋น„์Šค์™€ ๋‹ค๋ฅธ ๋ฒ„์ „ ์‚ฌ์šฉ
        ports:
        - containerPort: 80

---
# 2. product-nginx ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Service
apiVersion: v1
kind: Service
metadata:
  name: product-nginx-service
spec:
  selector:
    app: product-nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

๋งˆ์ง€๋ง‰์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•  Ingress ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค. (example-ingress.yaml)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  # ์‚ฌ์šฉํ•  Ingress์˜ Class๋ช… (minikube์˜ Ingress ์• ๋“œ์˜จ ์‚ฌ์šฉ ์‹œ 'nginx'๋กœ ์ง€์ •)
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /user # ๋ผ์šฐํŒ… ๊ทœ์น™์ด ์ ์šฉ๋  ๊ฒฝ๋กœ
        pathType: Prefix # URI๊ฐ€ path ๊ฐ’์œผ๋กœ ์‹œ์ž‘(Prefix)ํ•˜๋ฉด ๋ผ์šฐํŒ…ํ•˜๋„๋ก ์„ค์ •
        backend:
          service:
            name: user-nginx-service # user-nginx์˜ Service ์ด๋ฆ„
            port:
              number: 80 # ํ•ด๋‹น Service๊ฐ€ ๋…ธ์ถœ ์ค‘์ธ ํฌํŠธ ๋ฒˆํ˜ธ
      - path: /product
        pathType: Prefix
        backend:
          service:
            name: product-nginx-service # product-nginx์˜ Service ์ด๋ฆ„
            port:
              number: 80

์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž„์˜์˜ ํด๋”(ingress-test)๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“  ๋‹ค์Œ ๊ฐ ๋ช…์„ธ์„œ(Manifest)๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

Manifest๋ฅผ ๋ชจ๋‘ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด, ์ด์ œ minikube ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•ด๋ณผ ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค.

3๏ธโƒฃminikube ํด๋Ÿฌ์Šคํ„ฐ์— ์ž‘์„ฑํ•œ Kubernetes ๋ฆฌ์†Œ์Šค ๋ฐฐํฌํ•˜๊ธฐ

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐฐํฌํ•  ๋•Œ kubectl์„ ์‚ฌ์šฉํ•˜์ฃ . minikube ํด๋Ÿฌ์Šคํ„ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ kubectl apply -f {ํŒŒ์ผ๋ช… ๋˜๋Š” ํด๋”๋ช…} ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์—ฌ๋Ÿฌ Manifest๋„ ํ•œ ๋ฒˆ์— ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ๋ฐ์š”. ์ œ ๊ฒฝ์šฐ์—” ์•„๋ž˜์™€ ๊ฐ™์ด Manifest๊ฐ€ ํฌํ•จ๋œ ํด๋”๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ์‹ค์Šต์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl apply -f ingress-test

์‹ค์ œ ํ„ฐ๋ฏธ๋„์—์„œ ingress-test ํด๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•œ ๋‹ค์Œ, ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด Manifest์—์„œ ์ •์˜ํ•œ ๋ชจ๋“  Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ Manifest๋ฅผ ์ž‘์„ฑํ•  ๋•Œ Namespace๋ฅผ ๋”ฐ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—, default Namespace์— ์œ„ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ๋ฐฐํฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฐฐํฌ๋œ ๋ฆฌ์†Œ์Šค๋“ค์€ kubectl get all ๋ช…๋ น์–ด๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Ingress ์‹ค์Šต์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ชจ๋‘ ๋ฐฐํฌ๋˜์—ˆ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ๋กœ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…์ด ์ž˜ ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

4๏ธโƒฃIngress๋กœ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋™์ž‘ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ๊นŒ์ง€ Ingress Controller ์• ๋“œ์˜จ์„ ํ™œ์„ฑํ™”ํ–ˆ๊ณ , Ingress ๋ฆฌ์†Œ์Šค๋ฅผ ๋น„๋กฏํ•ด ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ชจ๋“  Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ–ˆ์Šต๋‹ˆ๋‹ค.

Ingress๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ ‘๊ทผํ•˜๋Š” ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์˜ ๋ผ์šฐํŒ…์„ ๋‹ด๋‹นํ•œ๋‹ค๊ณ  ํ–ˆ์—ˆ์ฃ . ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์€ minikube ํด๋Ÿฌ์Šคํ„ฐ์˜ IP๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ ‘๊ทผํ•˜๋Š” HTTP/HTTPS ์š”์ฒญ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์Šต ์ค‘์ธ minikube ํด๋Ÿฌ์Šคํ„ฐ์˜ IP๋ฅผ ์•Œ์•„์•ผ Ingress ํ…Œ์ŠคํŠธ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. minikube ํด๋Ÿฌ์Šคํ„ฐ์˜ IP๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

minikube -p {minikube ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„} ip

ํ„ฐ๋ฏธ๋„์— ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ minikube ํด๋Ÿฌ์Šคํ„ฐ์˜ IP๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜์ฃ ? ๊ทธ๋Ÿผ ์ด์ œ ํ„ฐ๋ฏธ๋„์—์„œ minikube ํด๋Ÿฌ์Šคํ„ฐ IP์™€ ์šฐ๋ฆฌ๊ฐ€ Ingress ๋ฆฌ์†Œ์Šค์—์„œ ์ •์˜ํ•œ path๋ฅผ ํ•ฉ์นœ URL์— ์ ‘๊ทผํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • URL์— ์ ‘๊ทผํ•˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ์š”. ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์„œ๋น„์Šค์— ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด์„œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ๊ฐ๊ฐ ์ž…๋ ฅํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • curl http://{minikube_ip}/user

  • curl http://{minikube_ip}/product

์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ฒƒ์€ 404 Not Found ์—๋Ÿฌ ์•„๋ž˜์˜ ๊ฐ Nginx์˜ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ Deployment์—์„œ ๋‹ค๋ฅด๊ฒŒ ๋ช…์‹œํ•œ Nginx ๋ฒ„์ „์ด ํ‘œ์‹œ๋˜๊ณ  ์žˆ์ฃ ?

  • user ์„œ๋น„์Šค์˜ Nginx ์ด๋ฏธ์ง€ ๋ฒ„์ „: 1.23

  • product ์„œ๋น„์Šค์˜ Nginx ์ด๋ฏธ์ง€ ๋ฒ„์ „: 1.25

์œ„์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ๋‹ค๋ฉด, ๋ณธ ์‹ค์Šต์˜ ์˜๋„๋Œ€๋กœ Ingress Controller๊ฐ€ URI์— ๋”ฐ๋ผ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๊ทœ์น™์— ๋งž๋Š” Service๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ Nginx ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์„ ๋ฐ›์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๊ฐ Deployment์— ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ Nginx ์„œ๋ฒ„ ๋‚ด์—๋Š” ๊ฐ๊ฐ /user ๊ฒฝ๋กœ์™€ /product ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ํŽ˜์ด์ง€๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— 404 Not Found ์—๋Ÿฌ๊ฐ€ ํ‘œ์‹œ๋œ ๊ฒƒ์ธ๋ฐ, ์ปดํŒฉํŠธํ•˜๋ฉด์„œ๋„ Ingress์˜ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์„ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์‹ค์Šต์„ ์œ„ํ•ด ๊ฐ ํŽ˜์ด์ง€๋Š” ๋งŒ๋“ค์ง€ ์•Š์•˜๊ฑฐ๋“ ์š”.

๐Ÿ”ญ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ์‹ค์Šต์œผ๋กœ ์šฐ๋ฆฌ๋Š” minikube ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์—์„œ Ingress๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•ด๋ดค๋Š”๋ฐ์š”.

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

์ด๋ ‡๊ฒŒ minikube๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋„ ์†์‰ฝ๊ฒŒ Kubernetes ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ค์Šตํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

๋‹ค์Œ ๊ธ€์—์„œ๋Š” minikube ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์—์„œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํˆด์„ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ˆ˜๋งŽ์€ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํˆด์ด ์žˆ์ง€๋งŒ, ๊ทธ ์ค‘์—์„œ๋„ Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒด๊ณ„์ ์ด๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Kustomize๋ฅผ minikube ํด๋Ÿฌ์Šคํ„ฐ ์œ„์—์„œ ์‚ฌ์šฉํ•ด๋ณผ ์˜ˆ์ •์ธ๋ฐ์š”.

๊ทธ๋Ÿฌ๋‹ˆ ๋‹ค์Œ ๊ธ€๋„ ๊ธฐ๋Œ€ํ•ด ์ฃผ์„ธ์š”!

โœจ์ด๋ฒˆ ๋‰ด์Šค๋ ˆํ„ฐ๋Š” ์–ด๋– ์…จ๋‚˜์š”?

์ด๋ฒˆ ๊ธ€์—์„œ ๋‹ค๋ฃฌ ์ฃผ์ œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”! ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ํผ์—์„œ ์งง์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์žˆ์–ด์š”.

๐Ÿ‘‰ ํ”ผ๋“œ๋ฐฑ ๋ณด๋‚ด๊ธฐ (1~2๋ถ„ ์†Œ์š”)

์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์†Œ์ค‘ํ•œ ์˜๊ฒฌ์€ Aidenโ€™s Lab ๋‰ด์Šค๋ ˆํ„ฐ์—๊ฒŒ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค!

๐Ÿ”ญAidenโ€™s Lab์—์„œ ๋” ๋งŽ์€ ์•„ํ‹ฐํด์„ ๋งŒ๋‚˜๋ณด์„ธ์š”

๋ฐœํ–‰๋œ ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ์•„์นด์ด๋น™ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ ์ค‘์ž…๋‹ˆ๋‹ค.