ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ‘๊ทผ

ํด๋Ÿฌ์Šคํ„ฐ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ํฌํŠธ ํฌ์›Œ๋”ฉ, ๋ฐฉํ™”๋ฒฝ ์„ค์ • ๋˜๋Š” DNS ๊ตฌ์„ฑ์„ ์„ค์ •ํ•œ๋‹ค.

1 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์ ‘์†ํ•˜๊ธฐ

์›น UI(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋Œ€์‹œ๋ณด๋“œ)๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์ ‘์†ํ•œ๋‹ค.

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

๋˜ํ•œ ๋Œ€์‹œ๋ณด๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋“ค์˜ ์ƒํƒœ์™€ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์—๋Ÿฌ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

Kubernetes Dashboard UI

๋Œ€์‹œ๋ณด๋“œ UI ๋ฐฐํฌ

๋Œ€์‹œ๋ณด๋“œ UI๋Š” ๊ธฐ๋ณธ์œผ๋กœ ๋ฐฐํฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml

๋Œ€์‹œ๋ณด๋“œ UI ์ ‘๊ทผ

ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด, ๋Œ€์‹œ๋ณด๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์†Œํ•œ์˜ RBAC ์„ค์ •์„ ์ œ๊ณตํ•œ๋‹ค. ํ˜„์žฌ, ๋Œ€์‹œ๋ณด๋“œ๋Š” Bearer ํ† ํฐ์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ๋ณธ ์‹œ์—ฐ์„ ์œ„ํ•œ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ƒ˜ํ”Œ ์‚ฌ์šฉ์ž ๋งŒ๋“ค๊ธฐ ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

์ปค๋งจ๋“œ ๋ผ์ธ ํ”„๋ก์‹œ

kubectl ์ปค๋งจ๋“œ๋ผ์ธ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๋Œ€์‹œ๋ณด๋“œ๋กœ์˜ ์ ‘์†์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl proxy

kubectl์€ http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/๋ฅผ ํ†ตํ•ด ๋Œ€์‹œ๋ณด๋“œ์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

UI๋Š” ์˜ค์ง ์ปค๋งจ๋“œ๊ฐ€ ์‹คํ–‰๋œ ๋จธ์‹ ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ƒ์„ธ ๋‚ด์šฉ์€ kubectl proxy --help ์˜ต์…˜์„ ํ™•์ธํ•œ๋‹ค.

์›ฐ์ปด ๋ทฐ

์ดˆ๊ธฐ ํด๋Ÿฌ์Šคํ„ฐ ๋Œ€์‹œ๋ณด๋“œ์— ์ ‘๊ทผํ•˜๋ฉด, ํ™˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ํŽ˜์ด์ง€๋Š” ์ฒซ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฒ„ํŠผ์ด ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ด ๋ฌธ์„œ์˜ ๋งํฌ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ด ๋™์ž‘์ค‘์ธ ์‹œ์Šคํ…œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Kubernetes Dashboard welcome page

์ปจํ…Œ์ด๋„ˆํ™” ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆํ™” ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ๊ฐ„๋‹จํ•œ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•œ ์„ ํƒ์ ์ธ ์„œ๋น„์Šค๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์„ ํฌํ•จํ•œ YAML ๋˜๋Š” JSON ๋งค๋‹ˆํŽ˜์ŠคํŠธ(manifest) ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œ์ž‘ํ•˜๋Š” ํŽ˜์ด์ง€์˜ ์ƒ์œ„ ์˜ค๋ฅธ์ชฝ ์ฝ”๋„ˆ์— ์žˆ๋Š” CREATE ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธ๋ถ€ ์ •๋ณด ์ง€์ •

๋ฐฐํฌ ๋งˆ๋ฒ•์‚ฌ๋Š” ๋‹ค์Œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

  • ์•ฑ ์ด๋ฆ„ (ํ•„์ˆ˜): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„. ๋ ˆ์ด๋ธ” ์ด๋ฆ„์€ ๋ฐฐํฌํ•  ๋ชจ๋“  ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค.

    ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์€ ์„ ํƒ๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์—์„œ ์œ ์ผํ•ด์•ผ ํ•œ๋‹ค. ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋ฉฐ, ์†Œ๋ฌธ์ž ๋˜๋Š” ์ˆซ์ž๋กœ ๋๋‚˜๊ณ , ์†Œ๋ฌธ์ž, ์ˆซ์ž ๋ฐ ๋Œ€์‰ฌ(-)๋งŒ์„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค. 24 ๋ฌธ์ž๋งŒ์„ ์ œํ•œํ•œ๋‹ค. ์ฒ˜์Œ๊ณผ ๋์˜ ์ŠคํŽ˜์ด์Šค๋Š” ๋ฌด์‹œ๋œ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ (ํ•„์ˆ˜): ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„ ํผ๋ธ”๋ฆญ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋˜๋Š” ํ”„๋ผ์ด๋น— ์ด๋ฏธ์ง€(๋Œ€์ฒด๋กœ Google Container Registry ๋˜๋Š” ๋„์ปค ํ—ˆ๋ธŒ์— ์˜ฌ๋ผ๊ฐ„)์˜ URL. ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์‚ฌ์–‘์€ ์ฝœ๋ก ์œผ๋กœ ๋๋‚œ๋‹ค.

  • ํŒŒ๋“œ์˜ ์ˆ˜ (ํ•„์ˆ˜): ๋ฐฐํฌํ•˜๊ณ  ์‹ถ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์›ํ•˜๋Š” ๋ชฉํ‘œ ํŒŒ๋“œ ๊ฐœ์ˆ˜. ๊ฐ’์€ ์–‘์˜ ์ •์ˆ˜๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

    ํด๋Ÿฌ์Šคํ„ฐ์— ์˜๋„ํ•œ ํŒŒ๋“œ์˜ ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๊ฒƒ์ด๋‹ค.

  • ์„œ๋น„์Šค (์„ ํƒ): ์ผ๋ถ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, (์˜ˆ๋ฅผ ๋“ค์–ด, ํ”„๋ก ํŠธ์—”๋“œ) ์•„๋งˆ๋„ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ”๊นฅ์˜ ํผ๋ธ”๋ฆญ IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ (์™ธ๋ถ€ ์„œ๋น„์Šค) ์™ธ๋ถ€์— ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค.

    ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์—์„œ๋งŒ ๋ณด๊ณ  ์‹ถ์€ ์–ด๋–ค ์„œ๋น„์Šค๋“ค์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๋‚ด๋ถ€ ์„œ๋น„์Šค๋ผ๊ณ  ํ•œ๋‹ค.

    ์„œ๋น„์Šค ํƒ€์ž…๊ณผ๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ, ์„œ๋น„์Šค ์ƒ์„ฑ์„ ์„ ํƒํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ์˜ (๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์˜) ํฌํŠธ๋ฅผ ๋ฆฌ์Šจํ•œ๋‹ค๋ฉด, ๋‘ ๊ฐœ์˜ ํฌํŠธ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์„œ๋น„์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ํƒ€๊ฒŸ ํฌํŠธ์™€ (๋“ค์–ด์˜ค๋Š” ํŒจํ‚ท์˜) ๋งตํ•‘ํ•˜๋Š” ํฌํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์„œ๋น„์Šค๋Š” ๋ฐฐํฌ๋œ ํŒŒ๋“œ์— ๋ผ์šฐํŒ… ๋  ๊ฒƒ์ด๋‹ค. ์ง€์›ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์€ TCP์™€ UDP์ด๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ด์šฉํ•˜๋Š” ๋‚ด๋ถ€ DNS ์ด๋ฆ„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•œ ๊ฐ’์ด ๋  ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ํ•„์š”ํ•˜๋‹ค๋ฉด, ๋” ๋งŽ์€ ์„ธํŒ…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ž์„ธํ•œ ์˜ต์…˜ ๋ณด๊ธฐ ์„น์…˜์—์„œ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์„ค๋ช…: ์ž…๋ ฅํ•˜๋Š” ํ…์ŠคํŠธ๊ฐ’์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ถ”๊ฐ€๋  ๊ฒƒ์ด๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ธ๋ถ€์‚ฌํ•ญ์— ํ‘œ์‹œ๋  ๊ฒƒ์ด๋‹ค.

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

    ์˜ˆ๋ฅผ ๋“ค๋ฉด:

    release=1.0
    tier=frontend
    environment=pod
    track=stable
    
  • ๋„ค์ž„์ŠคํŽ˜์ด์Šค: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋™์ผํ•œ ๋ฌผ๋ฆฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ƒ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ๋“ค์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋ช…๋ช…๋œ ๊ทธ๋ฃน์œผ๋กœ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ถ„ํ• ํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๋Œ€์‹œ๋ณด๋“œ๋Š” ๋“œ๋กญ๋‹ค์šด ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์€ ์ตœ๋Œ€ 63๊ฐœ์˜ ์˜์ˆซ์ž ๋‹จ์–ด์™€ ๋Œ€์‹œ(-)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋Œ€๋ฌธ์ž๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•œ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์€ ์ˆซ์ž๋กœ๋งŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. ๋งŒ์•ฝ ์ด๋ฆ„์„ 10์ด๋ผ๋Š” ์ˆซ์ž๋กœ ์„ธํŒ…ํ•œ๋‹ค๋ฉด, ํŒŒ๋“œ๋Š” ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋ฐฐ์ •ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

    ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ์ด ์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ, ์ƒ์„ฑ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์„ ํƒ๋œ๋‹ค. ๋งŒ์•ฝ ์ƒ์„ฑ์— ์‹คํŒจํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์„ ํƒ๋œ๋‹ค.

  • ์ด๋ฏธ์ง€ ํ’€(Pull) ์‹œํฌ๋ฆฟ: ํŠน์ • ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๊ฐ€ ํ”„๋ผ์ด๋น—ํ•œ ๊ฒฝ์šฐ, ํ’€(Pull) ์‹œํฌ๋ฆฟ ์ž๊ฒฉ ์ฆ๋ช…์„ ์š”๊ตฌํ•œ๋‹ค.

    ๋Œ€์‹œ๋ณด๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์‹œํฌ๋ฆฟ์„ ๋“œ๋กญ๋‹ค์šด ๋ฆฌ์ŠคํŠธ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์‹œํฌ๋ฆฟ ์ด๋ฆ„์€ ์˜ˆ๋ฅผ ๋“ค์–ด new.image-pull.secret ๊ณผ ๊ฐ™์ด DNS ๋„๋ฉ”์ธ ์ด๋ฆ„ ๊ตฌ๋ฌธ์œผ๋กœ ๋”ฐ๋ฅด๊ธฐ๋กœ ํ•œ๋‹ค. ์‹œํฌ๋ฆฟ ๋‚ด์šฉ์€ base64 ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด๋ฉฐ, .dockercfg ํŒŒ์ผ๋กœ ์ •์˜๋œ๋‹ค. ์‹œํฌ๋ฆฟ ์ด๋ฆ„์€ ์ตœ๋Œ€ 253 ๋ฌธ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ด๋ฏธ์ง€ ํ’€(Pull) ์‹œํฌ๋ฆฟ์˜ ์ƒ์„ฑ์ด ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ์œผ๋กœ ์„ ํƒ๋œ๋‹ค. ๋งŒ์•ฝ ์ƒ์„ฑ์— ์‹คํŒจํ•˜๋ฉด, ์‹œํฌ๋ฆฟ์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • CPU ์š”๊ตฌ ์‚ฌํ•ญ (cores) ์™€ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ ์‚ฌํ•ญ (MiB): ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ ์ตœ์†Œ ๋ฆฌ์†Œ์Šค ์ƒํ•œ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ, ํŒŒ๋“œ๋Š” CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์ƒํ•œ์„ ๋‘์ง€ ์•Š๊ณ  ๋™์ž‘ํ•œ๋‹ค.

  • ์ปค๋งจ๋“œ ์‹คํ–‰ ์™€ ์ปค๋งจ๋“œ ์ธ์ˆ˜ ์‹คํ–‰: ๊ธฐ๋ณธ์ ์œผ๋กœ, ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ ํƒ๋œ ๋„์ปค ์ด๋ฏธ์ง€์˜ ๊ธฐ๋ณธ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ปค๋งจ๋“œ ์˜ต์…˜๊ณผ ์ธ์ž๋ฅผ ๊ธฐ๋ณธ ์˜ต์…˜์— ์šฐ์„  ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํŠน๊ถŒ์„ ๊ฐ€์ง„(privileged) ์ƒํƒœ๋กœ ์‹คํ–‰: ๋‹ค์Œ ์„ธํŒ…์€ ํ˜ธ์ŠคํŠธ์—์„œ ๋ฃจํŠธ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋“ค์ด ํŠน๊ถŒ์„ ๊ฐ€์ง„ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๋“ค๊ณผ ๋™๋“ฑํ•œ์ง€ ์•„๋‹Œ์ง€ ์ •์˜ํ•œ๋‹ค. ํŠน๊ถŒ์„ ๊ฐ€์ง„(privileged) ์ปจํ…Œ์ด๋„ˆ๋Š” ๋„คํŠธ์›Œํฌ ์Šคํƒ๊ณผ ๋””๋ฐ”์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ์กฐ์ž‘ํ•˜๋„๋ก ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋…ธ์ถœํ•œ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋˜๋Š” ์ธ์ž๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์œผ๋กœ ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์ด ์„œ๋น„์Šค๋ฅผ ์ฐพ๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๊ฐ’๋“ค์€ $(VAR_NAME) ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋“ค๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

YAML ๋˜๋Š” JSON ํŒŒ์ผ ์—…๋กœ๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์„ ์–ธ์ ์ธ ์„ค์ •์„ ์ œ๊ณตํ•œ๋‹ค. ์ด ๋ฐฉ์‹์—์„œ๋Š” ๋ชจ๋“  ์„ค์ •์ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ(YAML ๋˜๋Š” JSON ์„ค์ • ํŒŒ์ผ)์— ์ €์žฅ๋œ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๋ฆฌ์†Œ์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐฐํฌ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ธ๋ถ€ ์‚ฌํ•ญ๋“ค์„ ์ง€์ •ํ•˜๋Š” ๋Œ€์‹ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ ์‚ฌ์šฉ

๋‹ค์Œ ์„น์…˜๋“ค์€ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋Œ€์‹œ๋ณด๋“œ UI์˜ ๋ชจ์Šต์„ ๋ณด์—ฌ์ค€๋‹ค.

ํƒ์ƒ‰

ํด๋Ÿฌ์Šคํ„ฐ์— ์ •์˜๋œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜คํ”„์ ํŠธ๊ฐ€ ์žˆ์œผ๋ฉด, ๋Œ€์‹œ๋ณด๋“œ๋Š” ์ดˆ๊ธฐํ™”๋œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์˜คํ”„์ ํŠธ๋งŒ์ด ๋ณด์ด๋Š”๋ฐ, ์ด๋Š” ํƒ์ƒ‰ ์ฐฝ์— ์œ„์น˜ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์…€๋ ‰ํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฉ”๋‰ด ์นดํ…Œ๊ณ ๋ฆฌ ์ค‘์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฅ˜์™€ ๊ทธ๋ฃน์„ ๋ณด์—ฌ์ค€๋‹ค.

์–ด๋“œ๋ฏผ ๊ฐœ์š”

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

์›Œํฌ๋กœ๋“œ

์„ ํƒ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๊ตฌ๋™๋˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด์—ฌ์ค€๋‹ค. ํ•ด๋‹น ๋ทฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์›Œํฌ๋กœ๋“œ ์ข…๋ฅ˜(์˜ˆ์‹œ: ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹(ReplicaSet), ์Šคํ…Œ์ดํŠธํ’€์…‹(StatefulSet))๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ๊ฐ๊ฐ์˜ ์›Œํฌ๋กœ๋“œ ์ข…๋ฅ˜๋Š” ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋ ˆํ”Œ๋ฆฌ์นด์…‹์—์„œ ์ค€๋น„๋œ ํŒŒ๋“œ์˜ ์ˆซ์ž ๋˜๋Š” ํŒŒ๋“œ์˜ ํ˜„์žฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ๊ฐ™์€ ์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ์‹ค์šฉ์ ์ธ ์ •๋ณด๋ฅผ ์š”์•ฝํ•œ๋‹ค.

์›Œํฌ๋กœ๋“œ์— ๋Œ€ํ•œ ์„ธ๋ถ€์ ์ธ ๊ฒƒ๋“ค์€ ์ƒํƒœ์™€ ์‚ฌ์–‘ ์ •๋ณด, ์˜คํ”„์ ํŠธ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ณด์—ฌ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ ˆํ”Œ๋ฆฌ์นด์…‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ๋“ค ๋˜๋Š” ์ƒˆ๋กœ์šด ๋ ˆํ”Œ๋ฆฌ์นด์…‹๊ณผ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์œ„ํ•œ Horizontal Pod Autoscalers ์ด๋‹ค.

์„œ๋น„์Šค

์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋Š” ์„œ๋น„์Šค๋“ค๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ๋ฐœ๊ฒฌ๋˜๋Š” ์„œ๋น„์Šค๋“ค์„ ํ—ˆ์šฉํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์„œ๋น„์Šค์™€ ์ธ๊ทธ๋ ˆ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ๋‚ด๋ถ€ ์—”๋“œํฌ์ธํŠธ๋“ค๊ณผ ์™ธ๋ถ€ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์™ธ๋ถ€ ์—”๋“œํฌ์ธํŠธ๋“ค์— ์˜ํ•ด ํƒ€๊ฒŒํŒ…๋œ ํŒŒ๋“œ๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.

์Šคํ† ๋ฆฌ์ง€

์Šคํ† ๋ฆฌ์ง€๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํผ์‹œํ„ดํŠธ๋ณผ๋ฅจํด๋ ˆ์ž„ ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.

์ปจํ”ผ๊ทธ๋งต๊ณผ ์‹œํฌ๋ฆฟ

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์ž‘ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์ด๋ธŒ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค. ์ปจํ”ผ๊ทธ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ์ˆ˜์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ˆจ๊ฒจ์ ธ ์žˆ๋Š” ์‹œํฌ๋ฆฟ๋“ค์„ ๋ณด์—ฌ์ค€๋‹ค.

๋กœ๊ทธ ๋ทฐ์–ด

ํŒŒ๋“œ ๋ชฉ๋ก๊ณผ ์„ธ๋ถ€์‚ฌํ•ญ ํŽ˜์ด์ง€๋“ค์€ ๋Œ€์‹œ๋ณด๋“œ์— ๊ตฌํ˜„๋œ ๋กœ๊ทธ ๋ทฐ์–ด์— ๋งํฌ๋œ๋‹ค. ๋ทฐ์–ด๋Š” ๋‹จ์ผ ํŒŒ๋“œ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ๋กœ๊ทธ๋“ค์„ ๋‚ด๋ ค๊ฐ€๋ฉด ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Logs viewer

๋‹ค์Œ ๋‚ด์šฉ

๋” ๋งŽ์€ ์ •๋ณด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋Œ€์‹œ๋ณด๋“œ ํ”„๋กœ์ ํŠธ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

2 - ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ

์—ฌ๊ธฐ์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ์„ ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ์ด๋ผ๋ฉด kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ

์ตœ์ดˆ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค CLI์ธ kubectl์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ์œ„์น˜์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ๋‹น์‹ ์ด Getting started guide๋ฅผ ๋‹ค ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๋‹น์‹ ์—๊ฒŒ ์ธ์ฆ์ •๋ณด์™€ ์œ„์น˜์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl์ด ์ธ์ง€ํ•˜๋Š” ์œ„์น˜์ •๋ณด์™€ ์ธ์ฆ์ •๋ณด๋Š” ๋‹ค์Œ ์ปค๋งจ๋“œ๋กœ ํ™•์ธํ•œ๋‹ค.

kubectl config view

์—ฌ๊ธฐ์—์„œ kubectl ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์™„์ „ํ•œ ๋ฌธ์„œ๋Š” kubectl ๋ ˆํผ๋Ÿฐ์Šค์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API์— ์ง์ ‘ ์ ‘๊ทผ

kubectl์€ apiserver์˜ ์œ„์น˜ ํŒŒ์•…๊ณผ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์ด curl, wget ๋˜๋Š” ์›น๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ http ํด๋ผ์ด์–ธํŠธ๋กœ REST API์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์œ„์น˜ ํŒŒ์•…๊ณผ ์ธ์ฆ์„ ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

  • kubectl์„ proxy ๋ชจ๋“œ๋กœ ์‹คํ–‰.
    • ๊ถŒ์žฅํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹.
    • ์ €์žฅ๋œ apiserver ์œ„์น˜๋ฅผ ์‚ฌ์šฉ.
    • self-signed ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ apiserver์˜ identity๋ฅผ ๊ฒ€์ฆ. MITM์€ ๋ถˆ๊ฐ€๋Šฅ.
    • apiserver ์ธ์ฆ.
    • ์•ž์œผ๋กœ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์ง€๋Šฅํ˜• load balancing๊ณผ failover๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
  • ์ง์ ‘์ ์œผ๋กœ http ํด๋ผ์ด์–ธํŠธ์— ์œ„์น˜์ •๋ณด์™€ ์ธ์ฆ์ •๋ณด๋ฅผ ์ œ๊ณต.
    • ๋Œ€์•ˆ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹.
    • proxy ์‚ฌ์šฉ๊ณผ ํ˜ผ๋™๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํƒ€์ž…์˜ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.
    • MITM๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด root ์ธ์ฆ์„œ๋ฅผ ๋‹น์‹ ์˜ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ž„ํฌํŠธํ•ด์•ผ ํ•œ๋‹ค.

kubectl proxy ์‚ฌ์šฉ

๋‹ค์Œ ์ปค๋งจ๋“œ๋Š” kubectl์„ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ(reverse proxy)์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๋ชจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด๋Š” apiserver์˜ ์œ„์น˜์ง€์ •๊ณผ ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

kubectl proxy --port=8080

์ƒ์„ธ ๋‚ด์šฉ์€ kubectl proxy๋ฅผ ์ฐธ์กฐํ•œ๋‹ค

์ดํ›„์— ๋‹น์‹ ์€ curl, wget, ์›น๋ธŒ๋ผ์šฐ์ €๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด API๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. localhost๋Š” IPv6 ์ฃผ์†Œ [::1]๋กœ๋„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

curl http://localhost:8080/api/

๊ฒฐ๊ด๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

kubectl proxy๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

kubectl apply ๋ฐ kubectl describe secret... ๋ช…๋ น๊ณผ grep/cut์„ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์„œ๋น„์Šค ์–ด์นด์šดํŠธ์˜ ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค.

๋จผ์ €, ๊ธฐ๋ณธ ์„œ๋น„์Šค์–ด์นด์šดํŠธ๋ฅผ ์œ„ํ•œ ํ† ํฐ์„ ์š”์ฒญํ•˜๋Š” ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: default-token
  annotations:
    kubernetes.io/service-account.name: default
type: kubernetes.io/service-account-token
EOF

๋‹ค์Œ์œผ๋กœ, ํ† ํฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์‹œํฌ๋ฆฟ์— ํ† ํฐ์„ ์ฑ„์šฐ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

while ! kubectl describe secret default-token | grep -E '^token' >/dev/null; do
  echo "waiting for token..." >&2
  sleep 1
done

๊ฒฐ๊ณผ๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ† ํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค.

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret default-token | grep -E '^token' | cut -f2 -d':' | tr -d " ")

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

๊ฒฐ๊ณผ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

jsonpath๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
TOKEN=$(kubectl get secret default-token -o jsonpath='{.data.token}' | base64 --decode)

curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

๊ฒฐ๊ณผ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "10.0.1.149:443"
    }
  ]
}

์œ„ ์˜ˆ์ œ์—์„œ๋Š” --insecure flag๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์ด๋Š” MITM ๊ณต๊ฒฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ๋‘๋Š” ๊ฒƒ์ด๋‹ค. kubectl๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘์†ํ•  ๋•Œ ์ €์žฅ๋œ root ์ธ์ฆ์„œ์™€ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋“ค์„ ์„œ๋ฒ„ ์ ‘์†์— ์‚ฌ์šฉํ•œ๋‹ค. (์ด๋“ค์€ ~/.kube ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์„ค์น˜๋œ๋‹ค.) ์ผ๋ฐ˜์ ์œผ๋กœ self-signed ์ธ์ฆ์„œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ์„œ๋กœ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๋‹น์‹ ์˜ http ํด๋ผ์ด์–ธํŠธ๊ฐ€ root ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์ˆ˜ํ•œ ์„ค์ •์„ ํ•„์š”๋กœ ํ•  ๊ฒƒ์ด๋‹ค.

localhost์—์„œ ์ œ๊ณต๋˜๊ฑฐ๋‚˜ ๋ฐฉํ™”๋ฒฝ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ช‡๋ช‡ ํด๋Ÿฌ์Šคํ„ฐ๋“ค์—์„œ๋Š” apiserver๊ฐ€ ์ธ์ฆ์„ ์š”๊ตฌํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋Š” ํ‘œ์ค€์ด ์•„๋‹ˆ๋‹ค. API์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œ์–ด์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค.

API์— ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๊ณต์‹์ ์œผ๋กœ Go์™€ Python ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง€์›ํ•œ๋‹ค.

Go ํด๋ผ์ด์–ธํŠธ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด go get k8s.io/client-go@kubernetes-<kubernetes-version-number> ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. INSTALL.md์—์„œ ์ƒ์„ธํ•œ ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. https://github.com/kubernetes/client-go์—์„œ ์–ด๋–ค ๋ฒ„์ ผ์ด ์ง€์›๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • client-go ํด๋ผ์ด์–ธํŠธ ์œ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜์ž. client-go๋Š” ์ž์ฒด์ ์œผ๋กœ API ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ •์˜ํ•˜๋ฏ€๋กœ ํ•„์š”ํ•˜๋‹ค๋ฉด main ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋ณด๋‹ค๋Š” client-go์—์„œ API ์ •์˜๋“ค์„ importํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ import "k8s.io/client-go/kubernetes"๋กœ importํ•˜๋Š” ๊ฒƒ์„ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Go ํด๋ผ์ด์–ธํŠธ๋Š” apiserver์˜ ์œ„์น˜์ง€์ •๊ณผ ์ธ์ฆ์— kubectl CLI์™€ ๋™์ผํ•˜๊ฒŒ kubeconfig file์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

๋งŒ์•ฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ํŒŒ๋“œ๋กœ ๋ฐฐํฌ๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ ์žฅ์„ ์ฐธ์กฐํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

Python ํด๋ผ์ด์–ธํŠธ

Python ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด pip install kubernetes ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์„ค์น˜ ์˜ต์…˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์‚ฌํ•ญ์€ Python Client Library page๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

Python ํด๋ผ์ด์–ธํŠธ๋Š” apiserver์˜ ์œ„์น˜์ง€์ •๊ณผ ์ธ์ฆ์— kubectl CLI์™€ ๋™์ผํ•˜๊ฒŒ kubeconfig file์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด

๋‹ค๋ฅธ ์–ธ์–ด์—์„œ API๋ฅผ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ์กด์žฌํ•œ๋‹ค. ์ด๋“ค์ด ์–ด๋–ป๊ฒŒ ์ธ์ฆํ•˜๋Š”์ง€๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

ํŒŒ๋“œ์—์„œ API ์ ‘๊ทผ

ํŒŒ๋“œ์—์„œ API์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ, API ์„œ๋ฒ„๋ฅผ ์ฐพ๊ณ  ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŒŒ๋“œ ๋‚ด์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์— ์ ‘๊ทผ์„ ์ฐธ์กฐํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค๋กœ ์ ‘๊ทผ

์ด์ „ ์„น์…˜์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜์˜€๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋น„์Šค์— ์ ‘๊ทผ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

redirect ์š”์ฒญํ•˜๊ธฐ

redirect ๊ธฐ๋Šฅ์€ deprecated๋˜๊ณ  ์ œ๊ฑฐ ๋˜์—ˆ๋‹ค. ๋Œ€์‹  (์•„๋ž˜์˜) ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค.

๋‹ค์–‘ํ•œ ํ”„๋ก์‹œ๋“ค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋‹น์‹ ์ด ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ํ”„๋ก์‹œ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

  1. kubectl proxy:

    • ์‚ฌ์šฉ์ž์˜ ๋ฐ์Šคํฌํƒ‘์ด๋‚˜ ํŒŒ๋“œ ๋‚ด์—์„œ ์‹คํ–‰ํ•œ๋‹ค
    • localhost ์ฃผ์†Œ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค apiserver๋กœ ํ”„๋ก์‹œํ•œ๋‹ค
    • ํ”„๋ก์‹œํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” HTTP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
    • apiserver์˜ ํ”„๋ก์‹œ๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค
    • apiserver๋ฅผ ์œ„์น˜์ง€์ •ํ•œ๋‹ค
    • ์ธ์ฆ header๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค
  2. apiserver proxy:

    • apiserver ๋‚ด์˜ ๋นŒํŠธ์ธ bastion์ด๋‹ค
    • ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ๋Š” ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์˜ ์‚ฌ์šฉ์ž๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ IP๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค
    • apiserver process๋“ค ๋‚ด์—์„œ ์‹คํ–‰๋œ๋‹ค
    • ํ”„๋ก์‹œํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค(๋˜๋Š” apiserver๊ฐ€ http๋กœ ๊ตฌ์„ฑ๋˜์—ˆ๋‹ค๋ฉด http)
    • ํƒ€๊ฒŸ์œผ๋กœ์˜ ํ”„๋ก์‹œ๋Š” ๊ฐ€์šฉ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ก์‹œ์— ์˜ํ•ด์„œ HTTP ๋˜๋Š” HTTPS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค
    • ๋…ธ๋“œ, ํŒŒ๋“œ, ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค
    • ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉด load balacingํ•œ๋‹ค
  3. kube proxy:

    • ๊ฐ ๋…ธ๋“œ ์ƒ์—์„œ ์‹คํ–‰๋œ๋‹ค
    • UDP์™€ TCP๋ฅผ ํ”„๋ก์‹œํ•œ๋‹ค
    • HTTP๋ฅผ ์ธ์ง€ํ•˜์ง€ ์•Š๋Š”๋‹ค
    • load balancing์„ ์ œ๊ณตํ•œ๋‹ค
    • ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐ์—๋งŒ ์‚ฌ์šฉ๋œ๋‹ค
  4. apiserver(s) ์ „๋ฉด์˜ Proxy/Load-balancer:

    • ์กด์žฌ๋‚ด์šฉ๊ณผ ๊ตฌํ˜„์‚ฌํ•ญ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋ณ„๋กœ ๋‹ค์–‘ํ•˜๋‹ค(์˜ˆ. nginx)
    • ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์™€ ํ•˜๋‚˜ ์ด์ƒ์˜ apiserver๋“ค์˜ ์‚ฌ์ด์— ์œ„์น˜ํ•œ๋‹ค
    • apiserver๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€ ์กด์žฌํ•œ๋‹ค๋ฉด load balancer๋กœ ๋™์ž‘ํ•œ๋‹ค
  5. ์™ธ๋ถ€ ์„œ๋น„์Šค์˜ Cloud Load Balancer๋“ค:

    • Cloud provider๋“ค์— ์˜ํ•ด์„œ ์ œ๊ณต๋œ๋‹ค(์˜ˆ. AWS ELB, Google Cloud Load Balancer)
    • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค์˜ ํƒ€์ž…์ด LoadBalancer๋ผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค
    • UDP/TCP ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค
    • cloud provider๋งˆ๋‹ค ๊ตฌํ˜„๋œ ๋‚ด์šฉ์ด ์ƒ์ดํ•˜๋‹ค

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

3 - ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ ๊ตฌ์„ฑ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์ˆ˜์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณด์—ฌ์ค€๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ, ์‚ฌ์šฉ์ž, ์ปจํ…์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜๋œ ๋‹ค์Œ kubectl config use-context ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl์ด ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด, kubectl version --client์„ ์‹คํ–‰ํ•œ๋‹ค. kubectl ๋ฒ„์ „์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ API ์„œ๋ฒ„ ๋ฒ„์ „๊ณผ ๋งˆ์ด๋„ˆ ๋ฒ„์ „ ํ•˜๋‚˜ ์ฐจ์ด ์ด๋‚ด์—ฌ์•ผ ํ•œ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ, ์‚ฌ์šฉ์ž, ์ปจํ…์ŠคํŠธ ์ •์˜

๋‹น์‹ ์ด ๊ฐœ๋ฐœ ์ž‘์—…์„ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. development ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ํ”„๋ŸฐํŠธ ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด frontend๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๊ณ , ์Šคํ† ๋ฆฌ์ง€ ๊ฐœ๋ฐœ์ž๋“ค์€ storage๋ผ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋‹ค. test ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ํ•„์š”์— ๋”ฐ๋ผ ๋ณด์กฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. development ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ธ์ฆ์„œ๋กœ ์ธ์ฆ์„ ํ•ด์•ผ ํ•˜๊ณ , test ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž๋„ค์ž„๊ณผ ํŒจ์Šค์›Œ๋“œ๋กœ ์ธ์ฆ์„ ํ•ด์•ผ ํ•œ๋‹ค.

config-exercise๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. config-exercise ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ๊ฐ€์ง„ config-demo๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

apiVersion: v1
kind: Config
preferences: {}

clusters:
- cluster:
  name: development
- cluster:
  name: test

users:
- name: developer
- name: experimenter

contexts:
- context:
  name: dev-frontend
- context:
  name: dev-storage
- context:
  name: exp-test

๊ตฌ์„ฑ ํŒŒ์ผ์€ ํด๋Ÿฌ์Šคํ„ฐ๋“ค, ์‚ฌ์šฉ์ž๋“ค, ์ปจํ…์ŠคํŠธ๋“ค์„ ๊ธฐ์ˆ ํ•œ๋‹ค. config-demo ํŒŒ์ผ์€ ๋‘ ํด๋Ÿฌ์Šคํ„ฐ๋“ค๊ณผ ๋‘ ์‚ฌ์šฉ์ž๋“ค, ์„ธ ์ปจํ…์ŠคํŠธ๋“ค์„ ๊ธฐ์ˆ ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐ€์ง„๋‹ค.

config-exercise ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ปค๋งจ๋“œ๋“ค์„ ์‹คํ–‰ํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ์— ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file
kubectl config --kubeconfig=config-demo set-cluster test --server=https://5.6.7.8 --insecure-skip-tls-verify

์‚ฌ์šฉ์ž์˜ ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์„ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile
kubectl config --kubeconfig=config-demo set-credentials experimenter --username=exp --password=some-password

์ปจํ…์ŠคํŠธ ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์„ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development --namespace=frontend --user=developer
kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=development --namespace=storage --user=developer
kubectl config --kubeconfig=config-demo set-context exp-test --cluster=test --namespace=default --user=experimenter

config-demo ํŒŒ์ผ์„ ์—ด์–ด์„œ ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์ด ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. config-demo ํŒŒ์ผ์„ ์—ด์–ด๋ณด๋Š” ๊ฒƒ ๋Œ€์‹ ์— config view ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

kubectl config --kubeconfig=config-demo view

๋‘ ํด๋Ÿฌ์Šคํ„ฐ, ๋‘ ์‚ฌ์šฉ์ž, ์„ธ ์ปจํ…์ŠคํŠธ๋“ค์ด ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ๋‹ค.

apiVersion: v1
clusters:
- cluster:
    certificate-authority: fake-ca-file
    server: https://1.2.3.4
  name: development
- cluster:
    insecure-skip-tls-verify: true
    server: https://5.6.7.8
  name: test
contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
- context:
    cluster: development
    namespace: storage
    user: developer
  name: dev-storage
- context:
    cluster: test
    namespace: default
    user: experimenter
  name: exp-test
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
  user:
    client-certificate: fake-cert-file
    client-key: fake-key-file
- name: experimenter
  user:
    # ๋ฌธ์„œ ์ฐธ๊ณ  ์‚ฌํ•ญ (์ด ์„ค๋ช…์€ ๋ช…๋ น ์ถœ๋ ฅ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋‹ค.)
    # ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋ผ์ด์–ธํŠธ ๊ตฌ์„ฑ์— ์•”ํ˜ธ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ํ•˜๋‹ค.
    # ์ž๊ฒฉ ์ฆ๋ช… ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ
    # ์ž๊ฒฉ ์ฆ๋ช…์„ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์€ ๋Œ€์•ˆ์ด๋‹ค.
    # ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์ž. https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
    password: some-password
    username: exp

์œ„ fake-ca-file, fake-cert-file, fake-key-file์€ ์ธ์ฆ์„œ ํŒŒ์ผ๋“ค์˜ ์‹ค์ œ ๊ฒฝ๋กœ ์ด๋ฆ„์„ ์œ„ํ•œ ํ”Œ๋ ˆ์ด์Šคํ™€๋”(placeholder)์ด๋‹ค. ๋‹น์‹ ์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ด๋“ค์„ ์‹ค์ œ ์ธ์ฆ์„œ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋งŒ์•ฝ ๋‹น์‹ ์ด ์ธ์ฆ์„œ ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ ๋Œ€์‹ ์— ์—ฌ๊ธฐ์— ํฌํ•จ๋œ base64๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์ด ๊ฒฝ์šฐ ํ‚ค์— -data ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด certificate-authority-data, client-certificate-data, client-key-data ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋Š” ์„ธ ๊ฐ€์ง€(ํด๋Ÿฌ์Šคํ„ฐ, ์‚ฌ์šฉ์ž, ๋„ค์ž„์ŠคํŽ˜์ด์Šค) ์š”์†Œ๋“ค๋กœ ์ด๋ค„์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด dev-frontend ์ปจํ…์ŠคํŠธ๋Š” "development ํด๋Ÿฌ์Šคํ„ฐ์˜ frontend ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ ‘๊ทผํ•˜๋Š”๋ฐ developer ์‚ฌ์šฉ์ž ์ž๊ฒฉ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ์•Œ๋ ค์ค€๋‹ค."

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo use-context dev-frontend

์ด์ œ ๋‹น์‹ ์ด kubectl ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค dev-frontend ์ปจํ…์ŠคํŠธ์— ๋ช…์‹œ๋œ ํด๋Ÿฌ์Šคํ„ฐ์™€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ƒ์—์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปค๋งจ๋“œ๋Š” dev-frontend ์ปจํ…์ŠคํŠธ ๋‚ด์— ๋ช…์‹œ๋œ ์‚ฌ์šฉ์ž ์ž๊ฒฉ์ฆ๋ช…์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์— ๊ด€๋ จ๋œ ๊ตฌ์„ฑ ์ •๋ณด๋งŒ์„ ๋ณด๋ ค๋ฉด --minify ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo view --minify

dev-frontend ์ปจํ…์ŠคํŠธ์— ๊ด€๋ จ๋œ ๊ตฌ์„ฑ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ๋  ๊ฒƒ์ด๋‹ค.

apiVersion: v1
clusters:
- cluster:
    certificate-authority: fake-ca-file
    server: https://1.2.3.4
  name: development
contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
current-context: dev-frontend
kind: Config
preferences: {}
users:
- name: developer
  user:
    client-certificate: fake-cert-file
    client-key: fake-key-file

์ด์ œ ๋‹น์‹ ์ด ์ž ์‹œ test ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘์—…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ exp-test๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo use-context exp-test

์ด์ œ ๋‹น์‹ ์ด ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“  kubectl ์ปค๋งจ๋“œ๋Š” test ํด๋Ÿฌ์Šคํ„ฐ์˜ default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ ์šฉ๋˜๋ฉฐ exp-test ์ปจํ…์ŠคํŠธ์— ๋‚˜์—ด๋œ ์‚ฌ์šฉ์ž์˜ ์ž๊ฒฉ์ฆ๋ช…์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

ํ˜„์žฌ์˜ ์ปจํ…์ŠคํŠธ์ธ exp-test์— ๊ด€๋ จ๋œ ์„ค์ •์„ ๋ณด์ž.

kubectl config --kubeconfig=config-demo view --minify

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹น์‹ ์ด development ํด๋Ÿฌ์Šคํ„ฐ์˜ storage ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ž ์‹œ ์ž‘์—…์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ๋ฅผ dev-storage๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

kubectl config --kubeconfig=config-demo use-context dev-storage

ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์ธ dev-storage์— ๊ด€๋ จ๋œ ์„ค์ •์„ ๋ณด์ž.

kubectl config --kubeconfig=config-demo view --minify

๋‘ ๋ฒˆ์งธ ๊ตฌ์„ฑ ํŒŒ์ผ ์ƒ์„ฑ

config-exercise ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ config-demo-2๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.

apiVersion: v1
kind: Config
preferences: {}

contexts:
- context:
    cluster: development
    namespace: ramp
    user: developer
  name: dev-ramp-up

์œ„ ๊ตฌ์„ฑ ํŒŒ์ผ์€ dev-ramp-up์ด๋ผ๋Š” ์‹ ๊ทœ ์ปจํ…์ŠคํŠธ๋ฅผ ์ •์˜ํ•œ๋‹ค.

KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

KUBECONFIG๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž. ๋งŒ์•ฝ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์ดํ›„์— ๋ณต์›ํ•  ์ˆ˜ ์žˆ๋„๋ก KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ํ˜„์žฌ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค. ์˜ˆ:

๋ฆฌ๋ˆ…์Šค

export KUBECONFIG_SAVED="$KUBECONFIG"

์œˆ๋„์šฐ PowerShell

$Env:KUBECONFIG_SAVED=$ENV:KUBECONFIG

KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ๋“ค์˜ ๊ฒฝ๋กœ์˜ ๋ฆฌ์ŠคํŠธ์ด๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋Š” ๋ฆฌ๋ˆ…์Šค์™€ Mac์—์„œ๋Š” ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ ์œˆ๋„์šฐ์—์„œ๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ๋“ค์— ์ต์ˆ™ํ•ด์ง€๊ธธ ๋ฐ”๋ž€๋‹ค.

๋‹ค์Œ ์˜ˆ์™€ ๊ฐ™์ด ์ž„์‹œ๋กœ KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋‘ ๊ฐœ์˜ ๊ฒฝ๋กœ๋“ค์„ ๋ง๋ถ™์—ฌ๋ณด์ž.

๋ฆฌ๋ˆ…์Šค

export KUBECONFIG="${KUBECONFIG}:config-demo:config-demo-2"

์œˆ๋„์šฐ PowerShell

$Env:KUBECONFIG=("config-demo;config-demo-2")

config-exercise ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

kubectl config view

๋‹น์‹ ์˜ KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋‚˜์—ด๋œ ๋ชจ๋“  ํŒŒ์ผ๋“ค์ด ํ•ฉ์ณ์ง„ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ๋  ๊ฒƒ์ด๋‹ค. ํŠนํžˆ, ํ•ฉ์ณ์ง„ ์ •๋ณด๊ฐ€ config-demo-2 ํŒŒ์ผ์˜ dev-ramp-up ์ปจํ…์ŠคํŠธ์™€ config-demo ํŒŒ์ผ์˜ ์„ธ ๊ฐœ์˜ ์ปจํ…์ŠคํŠธ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜๊ธธ ๋ฐ”๋ž€๋‹ค.

contexts:
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
- context:
    cluster: development
    namespace: ramp
    user: developer
  name: dev-ramp-up
- context:
    cluster: development
    namespace: storage
    user: developer
  name: dev-storage
- context:
    cluster: test
    namespace: default
    user: experimenter
  name: exp-test

kubeconfig ํŒŒ์ผ๋“ค์„ ์–ด๋–ป๊ฒŒ ๋ณ‘ํ•ฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ƒ์„ธ์ •๋ณด๋Š” kubeconfig ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ ๊ตฌ์„ฑํ•˜๊ธฐ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

$HOME/.kube ๋””๋ ‰ํ„ฐ๋ฆฌ ํƒ์ƒ‰

๋งŒ์•ฝ ๋‹น์‹ ์ด ์ด๋ฏธ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์•„๋งˆ $HOME/.kube ๋””๋ ‰ํ„ฐ๋ฆฌ์— config๋ผ๋Š” ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

$HOME/.kube๋กœ ๊ฐ€์„œ ์–ด๋–ค ํŒŒ์ผ๋“ค์ด ์กด์žฌํ•˜๋Š”์ง€ ๋ณด์ž. ๋ณดํ†ต config๋ผ๋Š” ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์—๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ํŒŒ์ผ๋“ค๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด ๋‹น์‹ ์€ ์ด ํŒŒ์ผ๋“ค์˜ ์ปจํ…์ธ ์— ์ต์ˆ™ํ•ด์ ธ์•ผ ํ•œ๋‹ค.

$HOME/.kube/config๋ฅผ KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€

๋‹น์‹ ์ด $HOME/.kube/config ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ถ”๊ฐ€ํ•ด๋ณด์ž. ์˜ˆ:

๋ฆฌ๋ˆ…์Šค

export KUBECONFIG="${KUBECONFIG}:${HOME}/.kube/config"

์œˆ๋„์šฐ Powershell

$Env:KUBECONFIG="$Env:KUBECONFIG;$HOME\.kube\config"

์ด์ œ KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋ฆฌ์ŠคํŠธ์— ํฌํ•จ๋œ ๋ชจ๋“  ํŒŒ์ผ๋“ค์ด ํ•ฉ์ณ์ง„ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ๋ณด์ž. config-exercise ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

kubectl config view

์ •๋ฆฌ

KUBECONFIG ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์›๋ž˜ ๊ฐ’์œผ๋กœ ๋˜๋Œ๋ ค ๋†“์ž. ์˜ˆ๋ฅผ ๋“ค๋ฉด:

๋ฆฌ๋ˆ…์Šค

export KUBECONFIG="$KUBECONFIG_SAVED"

์œˆ๋„์šฐ PowerShell

$Env:KUBECONFIG=$ENV:KUBECONFIG_SAVED

kubeconfig์— ์˜ํ•ด ํ‘œ์‹œ๋œ ์ œ๋ชฉ์„ ํ™•์ธํ•˜๊ธฐ

ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ ํ›„ ์–ด๋–ค ์†์„ฑ(์‚ฌ์šฉ์ž ์ด๋ฆ„, ๊ทธ๋ฃน)์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ•ญ์ƒ ๋ช…ํ™•ํ•˜์ง€๋Š” ์•Š๋‹ค. ๋™์‹œ์— ๋‘ ๊ฐœ ์ด์ƒ์˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ ํ›จ์”ฌ ๋” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

์„ ํƒ๋˜์–ด ์žˆ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํ…์ŠคํŠธ์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋“ฑ์— ๋Œ€ํ•œ, ์ฃผ์ฒด ์†์„ฑ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ 'kubectl' ์•ŒํŒŒ ํ•˜์œ„ ๋ช…๋ น kubectl alpha auth whoami์ด ์žˆ๋‹ค.

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ ์ •๋ณด์— ๋Œ€ํ•œ API ์•ก์„ธ์Šค ๋ฅผ ํ™•์ธํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

4 - ํฌํŠธ ํฌ์›Œ๋”ฉ์„ ์‚ฌ์šฉํ•ด์„œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๊ธฐ

์ด ํŽ˜์ด์ง€๋Š” kubectl port-forward ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์‹คํ–‰์ค‘์ธ MongoDB ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค. ์ด ์œ ํ˜•์˜ ์—ฐ๊ฒฐ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋””๋ฒ„๊น…์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋ฒ„์˜ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋†’์•„์•ผ ํ•จ. ๋ฒ„์ „: v1.10.

    ๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

  • MongoDB Shell์„ ์„ค์น˜ํ•œ๋‹ค.

MongoDB ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค ์ƒ์„ฑํ•˜๊ธฐ

  1. MongoDB๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-deployment.yaml
    

    ์„ฑ๊ณต์ ์ธ ๋ช…๋ น์–ด์˜ ์ถœ๋ ฅ์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ์ƒ์„ฑ๋๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์ค€๋‹ค.

    deployment.apps/mongo created
    

    ํŒŒ๋“œ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜์—ฌ ํŒŒ๋“œ๊ฐ€ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get pods
    

    ์ถœ๋ ฅ์€ ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

    NAME                     READY   STATUS    RESTARTS   AGE
    mongo-75f59d57f4-4nd6q   1/1     Running   0          2m4s
    

 ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

 ```shell
 kubectl get deployment

์ถœ๋ ฅ์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
mongo   1/1     1            1           2m21s

๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ์ž๋™์œผ๋กœ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ๊ด€๋ฆฌํ•œ๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•œ๋‹ค.

kubectl get replicaset

์ถœ๋ ฅ์€ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

NAME               DESIRED   CURRENT   READY   AGE
mongo-75f59d57f4   1         1         1       3m12s
  1. MongoDB๋ฅผ ๋„คํŠธ์›Œํฌ์— ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-service.yaml
    

    ์„ฑ๊ณต์ ์ธ ์ปค๋งจ๋“œ์˜ ์ถœ๋ ฅ์€ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์ค€๋‹ค.

    service/mongo created
    

    ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

     kubectl get service mongo
    

 ์ถœ๋ ฅ์€ ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค€๋‹ค.

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mongo ClusterIP 10.96.41.183 27017/TCP 11s


3. MongoDB ์„œ๋ฒ„๊ฐ€ ํŒŒ๋“œ ์•ˆ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๊ณ , 27017๋ฒˆ ํฌํŠธ์—์„œ ์ˆ˜์‹ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

```shell
# mongo-75f59d57f4-4nd6q ๋ฅผ ๋‹น์‹ ์˜ ํŒŒ๋“œ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
kubectl get pod mongo-75f59d57f4-4nd6q --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'

์ถœ๋ ฅ์€ ํŒŒ๋“œ ๋‚ด MongoDB ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

27017
(27017์€ ์ธํ„ฐ๋„ท ์ƒ์˜ MongoDB์— ํ• ๋‹น๋œ TCP ํฌํŠธ์ด๋‹ค.)

ํŒŒ๋“œ์˜ ํฌํŠธ๋ฅผ ๋กœ์ปฌ ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉํ•˜๊ธฐ

  1. kubectl port-forward ๋ช…๋ น์–ด๋Š” ํŒŒ๋“œ ์ด๋ฆ„๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•ด ํฌํŠธ ํฌ์›Œ๋”ฉํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค.

    # mongo-75f59d57f4-4nd6q ๋ฅผ ๋‹น์‹ ์˜ ํŒŒ๋“œ ์ด๋ฆ„์œผ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
    kubectl port-forward mongo-75f59d57f4-4nd6q 28015:27017
    

    ์ด๊ฒƒ์€

    kubectl port-forward pods/mongo-75f59d57f4-4nd6q 28015:27017
    

    ๋˜๋Š”

    kubectl port-forward deployment/mongo 28015:27017
    

    ๋˜๋Š”

    kubectl port-forward replicaset/mongo-75f59d57f4 28015:27017
    

    ๋˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    kubectl port-forward service/mongo 28015:27017
    

    ์œ„์˜ ๋ช…๋ น์–ด๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ์ด์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ถœ๋ ฅ๋œ๋‹ค.

    Forwarding from 127.0.0.1:28015 -> 27017
    Forwarding from [::1]:28015 -> 27017
    
  1. MongoDB ์ปค๋งจ๋“œ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

    mongosh --port 28015
    
  2. MongoDB ์ปค๋งจ๋“œ๋ผ์ธ ํ”„๋กฌํ”„ํŠธ์— ping ๋ช…๋ น์„ ์ž…๋ ฅํ•œ๋‹ค.

    db.runCommand( { ping: 1 } )
    

    ์„ฑ๊ณต์ ์ธ ํ•‘ ์š”์ฒญ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    { ok: 1 }
    

์„ ํƒ์ ์œผ๋กœ kubectl ์ด ๋กœ์ปฌ ํฌํŠธ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•˜๊ธฐ

๋งŒ์•ฝ ํŠน์ • ๋กœ์ปฌ ํฌํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด, kubectl ์ด ๋กœ์ปฌ ํฌํŠธ๋ฅผ ์„ ํƒ ๋ฐ ํ• ๋‹นํ•˜๊ฒŒ ํ•˜์—ฌ, ์กฐ๊ธˆ ๋” ๋‹จ์ˆœํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ๋กœ์ปฌ ํฌํŠธ ์ถฉ๋Œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

kubectl port-forward deployment/mongo :27017

kubectl ๋„๊ตฌ๋Š” ์‚ฌ์šฉ ์ค‘์ด ์•„๋‹Œ ๋กœ์ปฌ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ฐพ๋Š”๋‹ค (๋‚ฎ์€ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋ฏ€๋กœ, ๋‚ฎ์€ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํ”ผํ•ด์„œ). ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

Forwarding from 127.0.0.1:63753 -> 27017
Forwarding from [::1]:63753 -> 27017

ํ† ์˜

๋กœ์ปฌ 28015 ํฌํŠธ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์€ MongoDB ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰์ค‘์ธ ํŒŒ๋“œ์˜ 27017 ํฌํŠธ๋กœ ํฌ์›Œ๋”ฉ๋œ๋‹ค. ์ด ์—ฐ๊ฒฐ๋กœ ๋กœ์ปฌ ์›Œํฌ์Šคํ…Œ์ด์…˜์—์„œ ํŒŒ๋“œ ์•ˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋””๋ฒ„๊น…ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

kubectl port-forward์— ๋Œ€ํ•ด ๋” ์•Œ์•„๋ณธ๋‹ค.

5 - ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ์‚ฌ์šฉํ•˜๊ธฐ

์ด ๋ฌธ์„œ๋Š” ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค. ์„œ๋น„์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ–๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ชฉ์ 

  • Hello World ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ๋‘ ๊ฐœ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ๋…ธ๋“œ ํฌํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋‘ ๊ฐœ์˜ ํŒŒ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์„œ๋น„์Šค ์ƒ์„ฑํ•˜๊ธฐ

๋‹ค์Œ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment) ์„ค์ • ํŒŒ์ผ์ด๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: load-balancer-example
  replicas: 2
  template:
    metadata:
      labels:
        run: load-balancer-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/node-hello:1.0
          ports:
            - containerPort: 8080
              protocol: TCP
  1. ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด Hello World ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜์ž. ์œ„ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ž.

    kubectl apply -f https://k8s.io/examples/service/access/hello-application.yaml
    

    ์•ž์˜ ๋ช…๋ น์€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ์™€ ์—ฐ๊ด€๋œ ๋ ˆํ”Œ๋ฆฌ์นด์…‹(ReplicaSet) ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๋ ˆํ”Œ๋ฆฌ์นด์…‹์€ ๋‘ ๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ๊ฐ–๊ณ , ๊ฐ๊ฐ์€ Hello World ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ๋‹ค.

  2. ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

    kubectl get deployments hello-world
    kubectl describe deployments hello-world
    
  3. ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

    kubectl get replicasets
    kubectl describe replicasets
    
  4. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl expose deployment hello-world --type=NodePort --name=example-service
    
  5. ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

    kubectl describe services example-service
    

    ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    Name:                   example-service
    Namespace:              default
    Labels:                 run=load-balancer-example
    Annotations:            <none>
    Selector:               run=load-balancer-example
    Type:                   NodePort
    IP:                     10.32.0.16
    Port:                   <unset> 8080/TCP
    TargetPort:             8080/TCP
    NodePort:               <unset> 31496/TCP
    Endpoints:              10.200.1.4:8080,10.200.2.5:8080
    Session Affinity:       None
    Events:                 <none>
    

    ์„œ๋น„์Šค์˜ ๋…ธ๋“œํฌํŠธ(NodePort) ๊ฐ’์„ ๋ฉ”๋ชจํ•˜์ž. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•ž์„  ๊ฒฐ๊ณผ์—์„œ, ๋…ธ๋“œํฌํŠธ ๊ฐ’์€ 31496์ด๋‹ค.

  6. Hello World ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋ฅผ ๋‚˜์—ดํ•œ๋‹ค.

    kubectl get pods --selector="run=load-balancer-example" --output=wide
    

    ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    NAME                           READY   STATUS    ...  IP           NODE
    hello-world-2895499144-bsbk5   1/1     Running   ...  10.200.1.4   worker1
    hello-world-2895499144-m1pwt   1/1     Running   ...  10.200.2.5   worker2
    
  7. Hello World ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋…ธ๋“œ๋“ค ์ค‘ ํ•˜๋‚˜์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๊ณต์šฉ IP ์ฃผ์†Œ๋ฅผ ์–ป์ž. ์ด ์ฃผ์†Œ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋–ป๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Minikube๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, kubectl cluster-info๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋…ธ๋“œ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Google Compute Engine ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, gcloud compute instances list ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋“ค์˜ ๊ณต์šฉ ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  8. ์„ ํƒํ•œ ๋…ธ๋“œ์—์„œ ๋…ธ๋“œ ํฌํŠธ์— ๋Œ€ํ•ด TCP ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ƒ์„ฑํ•˜์ž. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„œ๋น„์Šค์˜ ๋…ธ๋“œํฌํŠธ ๊ฐ’์ด 31568์ธ ๊ฒฝ์šฐ, 31568 ํฌํŠธ๋กœ TCP ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๋„๋ก ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์ƒ์„ฑํ•˜์ž. ๋‹ค๋ฅธ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋Š” ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์„ค์ •ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

  9. Hello World ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ‘๊ทผ์„ ์œ„ํ•ด ๋…ธ๋“œ ์ฃผ์†Œ์™€ ๋…ธ๋“œ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ž.

    curl http://<public-node-ip>:<node-port>
    

    <public-node-ip>๋Š” ๋…ธ๋“œ์˜ ๊ณต์šฉ IP ์ฃผ์†Œ์ด๊ณ , <node-port>๋Š” ์„œ๋น„์Šค์˜ ๋…ธ๋“œํฌํŠธ ๊ฐ’์ด๋‹ค. ์„ฑ๊ณต์ ์ธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์€ hello ๋ฉ”์‹œ์ง€์ด๋‹ค.

    Hello Kubernetes!
    

์„œ๋น„์Šค ์„ค์ • ํŒŒ์ผ ์‚ฌ์šฉํ•˜๊ธฐ

kubectl expose๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ์„œ๋น„์Šค ์„ค์ • ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜๊ธฐ

์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

kubectl delete services example-service

๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹, Hello World ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰ ์ค‘์ธ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

kubectl delete deployment hello-world

๋‹ค์Œ ๋‚ด์šฉ

ํŠœํ† ๋ฆฌ์–ผ ์„œ๋น„์Šค์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋”ฐ๋ผํ•˜๊ธฐ

6 - ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์— ์—ฐ๊ฒฐ

์ด ์ž‘์—…์€ ํ”„๋ก ํŠธ์—”๋“œ ์™€ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ์ธ์‚ฌํ•˜๊ธฐ(hello greeter)์ด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋Š” nginx ๋ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฑ์—”๋“œ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

๋ชฉ์ 

  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment) ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ˜ํ”Œ hello ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.
  • ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์—ฌ๋Ÿฌ ๋ณต์ œ๋ณธ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ธ๋‹ค.
  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nginx ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.
  • ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ณด๋‚ด๋„๋ก ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • type=LoadBalancer ์˜ ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

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

๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฑ์—”๋“œ ์ƒ์„ฑํ•˜๊ธฐ

๋ฐฑ์—”๋“œ๋Š” ์ธ์‚ฌํ•˜๊ธฐ๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ฐฑ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      tier: backend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        tier: backend
        track: stable
    spec:
      containers:
        - name: hello
          image: "gcr.io/google-samples/hello-go-gke:1.0"
          ports:
            - name: http
              containerPort: 80

๋ฐฑ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/service/access/backend-deployment.yaml

๋ฐฑ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋ณธ๋‹ค.

kubectl describe deployment backend

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Name:                           backend
Namespace:                      default
CreationTimestamp:              Mon, 24 Oct 2016 14:21:02 -0700
Labels:                         app=hello
                                tier=backend
                                track=stable
Annotations:                    deployment.kubernetes.io/revision=1
Selector:                       app=hello,tier=backend,track=stable
Replicas:                       3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:                   RollingUpdate
MinReadySeconds:                0
RollingUpdateStrategy:          1 max unavailable, 1 max surge
Pod Template:
  Labels:       app=hello
                tier=backend
                track=stable
  Containers:
   hello:
    Image:              "gcr.io/google-samples/hello-go-gke:1.0"
    Port:               80/TCP
    Environment:        <none>
    Mounts:             <none>
  Volumes:              <none>
Conditions:
  Type          Status  Reason
  ----          ------  ------
  Available     True    MinimumReplicasAvailable
  Progressing   True    NewReplicaSetAvailable
OldReplicaSets:                 <none>
NewReplicaSet:                  hello-3621623197 (3/3 replicas created)
Events:
...

hello ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ•ต์‹ฌ์€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์ด๋‹ค. ์„œ๋น„์Šค๋Š” ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์— ์–ธ์ œ๋“  ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” IP ์ฃผ์†Œ์™€ DNS ์ด๋ฆ„ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•œ๋‹ค. ์„œ๋น„์Šค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ํŒŒ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋จผ์ €, ์„œ๋น„์Šค ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ดํŽด๋ณด์ž.

apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
    tier: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: http

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ hello ๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค๊ฐ€ app: hello ๋ฐ tier: backend ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ์— ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/service/access/backend-service.yaml

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

ํ”„๋ก ํŠธ์—”๋“œ ์ƒ์„ฑํ•˜๊ธฐ

์ด์ œ ๋ฐฑ์—”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฏ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฐฑ์—”๋“œ๋กœ์˜ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•˜์—ฌ ๋ฐฑ์—”๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ์ง€์ •๋œ DNS ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์›Œ์ปค ํŒŒ๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. DNS ์ด๋ฆ„์€ examples/service/access/backend-service.yaml ๊ตฌ์„ฑ ํŒŒ์ผ์˜ name ํ•„๋“œ ๊ฐ’์ธ hello ์ด๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์•ˆ์˜ ํŒŒ๋“œ๋Š” hello ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ nginx ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋‹ค์Œ์€ nginx ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค.

# The identifier Backend is internal to nginx, and used to name this specific upstream
upstream Backend {
    # hello is the internal DNS name used by the backend Service inside Kubernetes
    server hello;
}

server {
    listen 80;

    location / {
        # The following statement will proxy traffic to the upstream named Backend
        proxy_pass http://Backend;
    }
}

๋ฐฑ์—”๋“œ์™€ ๊ฐ™์ด, ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์™€ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค ๊ฐ„์— ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์˜ ๊ตฌ์„ฑ์— type: LoadBalancer ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์„œ๋น„์Šค๊ฐ€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ํ”„๋กœ๋น„์ €๋‹ํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    app: hello
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  type: LoadBalancer
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      app: hello
      tier: frontend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
        tier: frontend
        track: stable
    spec:
      containers:
        - name: nginx
          image: "gcr.io/google-samples/hello-frontend:1.0"
          lifecycle:
            preStop:
              exec:
                command: ["/usr/sbin/nginx","-s","quit"]
...

ํ”„๋ก ํŠธ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/service/access/frontend-deployment.yaml
kubectl apply -f https://k8s.io/examples/service/access/frontend-service.yaml

๊ฒฐ๊ณผ๋Š” ๋‘ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•œ๋‹ค.

deployment.apps/frontend created
service/frontend created

ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•˜๊ธฐ

์ผ๋‹จ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ํƒ€์ž…์˜ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€ IP๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

kubectl get service frontend --watch

frontend ์„œ๋น„์Šค์˜ ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฃผ์‹œํ•œ๋‹ค. ์ฒ˜์Œ์—, ์™ธ๋ถ€ IP๋Š” <pending> ์œผ๋กœ ๋‚˜์—ด๋œ๋‹ค.

NAME       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)  AGE
frontend   LoadBalancer   10.51.252.116   <pending>     80/TCP   10s

ํ•˜์ง€๋งŒ, ์™ธ๋ถ€ IP๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ๊ตฌ์„ฑ์€ EXTERNAL-IP ์ œ๋ชฉ ์•„๋ž˜์— ์ƒˆ๋กœ์šด IP๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐฑ์‹ ํ•œ๋‹ค.

NAME       TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)  AGE
frontend   LoadBalancer   10.51.252.116   XXX.XXX.XXX.XXX    80/TCP   1m

์ด์ œ ํ•ด๋‹น IP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ frontend ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ํ†ตํ•ด์„œ ํŠธ๋ž˜ํ”ฝ ๋ณด๋‚ด๊ธฐ

์ด์ œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์˜ ์™ธ๋ถ€ IP์—์„œ curl ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ์—”๋“œํฌ์ธํŠธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

curl http://${EXTERNAL_IP} # ์•ž์˜ ์˜ˆ์—์„œ ๋ณธ EXTERNAL-IP๋กœ ์ˆ˜์ •ํ•œ๋‹ค

๊ฒฐ๊ณผ๋กœ ๋ฐฑ์—”๋“œ์—์„œ ์ƒ์„ฑ๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์ธ๋‹ค.

{"message":"Hello"}

์ •๋ฆฌํ•˜๊ธฐ

์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

kubectl delete services frontend backend

๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹, ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

kubectl delete deployment frontend backend

๋‹ค์Œ ๋‚ด์šฉ

7 - ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ƒ์„ฑํ•˜๊ธฐ

์ด ๋ฌธ์„œ๋Š” ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•˜์—ฌ ์„ค๋ช…ํ•œ๋‹ค.

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

๋˜ํ•œ, ์„œ๋น„์Šค ๋Œ€์‹  ์ธ๊ทธ๋ ˆ์Šค(Ingress) ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์ธ๊ทธ๋ ˆ์Šค(Ingress) ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋ฐ˜๋“œ์‹œ ํด๋ผ์šฐ๋“œ ๋˜๋Š” ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ตฌ์„ฑ์„ ์ง€์›ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ์ค‘์ด์–ด์•ผ ํ•œ๋‹ค.

์„œ๋น„์Šค ์ƒ์„ฑ

๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ์ƒ์„ฑํ•˜๊ธฐ

์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์„œ๋น„์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    type: LoadBalancer

๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  type: LoadBalancer

kubectl๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋น„์Šค ์ƒ์„ฑํ•˜๊ธฐ

๋˜ํ•œ, kubectl expose ๋ช…๋ น์–ด์— --type=LoadBalancer ํ”Œ๋ž˜๊ทธ๋ฅผ ์ด์šฉํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl expose deployment example --port=8765 --target-port=9376 \
        --name=example-service --type=LoadBalancer

์ด ๋ช…๋ น์€ ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์…€๋ ‰ํ„ฐ๋กœ ์ฐธ์กฐํ•˜๋Š” ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ ๋‹ค. (์œ„ ์˜ˆ์‹œ์˜ ๊ฒฝ์šฐ, example๋กœ ๋ช…๋ช…๋œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment) ).

๋ช…๋ น์ค„ ์˜ต์…˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ํฌํ•จํ•œ, ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubectl expose ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

IP ์ฃผ์†Œ ์ฐพ๊ธฐ

kubectl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋น„์Šค ์ •๋ณด๋ฅผ ์–ป์–ด, ์ƒ์„ฑ๋œ ์„œ๋น„์Šค์— ๊ด€ํ•œ IP ์ฃผ์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

kubectl describe services example-service

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

Name:                     example-service
Namespace:                default
Labels:                   app=example
Annotations:              <none>
Selector:                 app=example
Type:                     LoadBalancer
IP Families:              <none>
IP:                       10.3.22.96
IPs:                      10.3.22.96
LoadBalancer Ingress:     192.0.2.89
Port:                     <unset>  8765/TCP
TargetPort:               9376/TCP
NodePort:                 <unset>  30593/TCP
Endpoints:                172.17.0.3:9376
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์˜ IP ์ฃผ์†Œ๋Š” LoadBalancer Ingress ์˜†์— ๋‚˜ํƒ€๋‚œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค IP ๋ณด์กดํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋Œ€์ƒ ์ปจํ…Œ์ด๋„ˆ์— ๋ณด์ด๋Š” ์†Œ์Šค IP๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์›๋ž˜ ์†Œ์Šค IP๊ฐ€ ์•„๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ IP๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋ฉด, ์•„๋ž˜์˜ ์„œ๋น„์Šค .spec ํ•„๋“œ ๊ตฌ์„ฑ์„ ๋”ฐ๋ฅธ๋‹ค.

  • .spec.externalTrafficPolicy - ์ด ์„œ๋น„์Šค๊ฐ€ ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ ๋…ธ๋“œ-๋กœ์ปฌ ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ-์ „์ฒด ์—”๋“œํฌ์ธํŠธ๋กœ ๋ผ์šฐํŒ…ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค. Cluster (๊ธฐ๋ณธ) ๊ทธ๋ฆฌ๊ณ  Local. Cluster ๋Š” ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค IP๋ฅผ ๊ฐ€๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ํ™‰(hop)์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ „์ฒด์ ์ธ ๋ถ€ํ•˜ ๋ถ„์‚ฐ์—์„œ ์ด์ ์ด ์žˆ๋‹ค. Local ์€ ํด๋ผ์ด์–ธํŠธ ์†Œ์Šค IP๋ฅผ ๋ณด์กดํ•˜๊ณ  LoadBalancer์™€ NodePort ํƒ€์ž…์˜ ์„œ๋น„์Šค์—์„œ ๋‘ ๋ฒˆ์งธ ํ™‰(hop) ๋ฐœ์ƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ์ด ๋ถˆ๊ท ํ˜•์ ์ธ ์ž ์žฌ์ ์ธ ์œ„ํ—˜์ด ์žˆ๋‹ค.
  • .spec.healthCheckNodePort - ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ํ—ฌ์Šค ์ฒดํฌ ๋…ธ๋“œ ํฌํŠธ(์ •์ˆ˜ ํฌํŠธ ๋ฒˆํ˜ธ)๋ฅผ ์ง€์ •ํ•œ๋‹ค. healthCheckNodePort๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธํŠธ ํฌํŠธ ๋ฒ”์œ„์—์„œ ํฌํŠธ๋ฅผ ํ• ๋‹นํ•œ๋‹ค. API ์„œ๋ฒ„ ๋ช…๋ น์ค„ ํ”Œ๋ž˜๊ทธ --service-node-port-range๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์œ„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค type์ด LoadBalancer์ด๊ณ  externalTrafficPolicy๋ฅผ Local๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ, ์„œ๋น„์Šค๋Š” healthCheckNodePort๊ฐ€ ์ง€์ •๋˜์—ˆ๋‹ค๋ฉด, ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ์„ค์ •์„ ์ด์šฉํ•œ๋‹ค.

์„œ๋น„์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ externalTrafficPolicy๋ฅผ Local๋กœ ์„ค์ •ํ•˜๋ฉด ์ด ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•œ๋‹ค. ์˜ˆ์‹œ:

apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  externalTrafficPolicy: Local
  type: LoadBalancer

์†Œ์Šค IP๋ฅผ ๋ณด์กดํ•  ๋•Œ ์ฃผ์˜์‚ฌํ•ญ ๋ฐ ์ œํ•œ ์‚ฌํ•ญ

์ผ๋ถ€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์„œ๋น„์Šค์—์„œ๋Š” ๋Œ€์ƒ๋ณ„๋กœ ๋‹ค๋ฅธ ๊ฐ€์ค‘์น˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค.

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

์„œ๋น„์ŠคํŒŒ๋“œ๊ฐœ์ˆ˜ << ๋…ธ๋“œ๊ฐœ์ˆ˜ ์ด๊ฑฐ๋‚˜ ์„œ๋น„์ŠคํŒŒ๋“œ๊ฐœ์ˆ˜ >> ๋…ธ๋“œ๊ฐœ์ˆ˜ ์ธ ๊ฒฝ์šฐ์—์„  ๊ฐ€์ค‘์น˜ ์—†์ด๋„ ๊ฑฐ์˜ ๊ท ๋“ฑํ•œ ๋ถ„ํฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๋ถ€ ํŒŒ๋“œ ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์€ ClusterIP ์„œ๋น„์Šค์—์„œ์™€ ๋น„์Šทํ•˜๊ฒŒ ๋ชจ๋“  ํŒŒ๋“œ์—์„œ ๋™์ผํ•œ ํ™•๋ฅ ๋กœ IP ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๊ฐ€๋น„์ง€(Garbage) ์ˆ˜์ง‘ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.17 [stable]

์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์™€ ๊ด€๋ จ ์žˆ๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๋ฆฌ์†Œ์Šค๋Š” type์ด LoadBalancer์ธ ์„œ๋น„์Šค๊ฐ€ ์‚ญ์ œ๋œ ํ›„ ์ฆ‰์‹œ ์ •๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ จ ์„œ๋น„์Šค๊ฐ€ ์‚ญ์ œ๋œ ํ›„ ํด๋ผ์šฐ๋“œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ณ ์•„๊ฐ€ ๋˜๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค๊ฐ€ ๋‹ค์–‘ํ•œ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์œ„ํ•œ Finalizer Protection์ด ๋„์ž…๋˜์—ˆ๋‹ค. Finalizer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋  ๋•Œ๊นŒ์ง€ ์‚ญ์ œ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํŠนํžˆ ์„œ๋น„์Šค์— type์ด LoadBalancer์ธ ๊ฒฝ์šฐ ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” service.kubernetes.io/load-balancer-cleanup ์ด๋ผ๋Š” ์ด๋ฆ„์˜ finalizer๋ฅผ ๋ถ™์ธ๋‹ค. finalizer๋Š” (ํด๋ผ์šฐ๋“œ) ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•œ ํ›„์—๋งŒ ์ œ๊ฑฐ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์„œ๋น„์Šค ์ปจํŠธ๋กค๋Ÿฌ ์ถฉ๋Œ(crash)๊ณผ ๊ฐ™์€ ์ฝ”๋„ˆ ์ผ€์ด์Šค์—์„œ๋„ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๊ณ ์•„๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ œ๊ณต์ž

์ค‘์š”ํ•œ ์ ์€ ์ด ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ฒฝ๋กœ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์—์„œ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์„œ๋น„์Šค์˜ type์ด LoadBalancer๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” type์ด ClusterIP์ธ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ๋™๋“ฑํ•œ ๊ธฐ๋Šฅ์„ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ํŒŒ๋“œ์— ์ œ๊ณตํ•˜๊ณ  ๊ด€๋ จ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํŒŒ๋“œ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ•ญ๋ชฉ์œผ๋กœ (์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์™ธ๋ถ€) ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ํ™•์žฅํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ์™ธ๋ถ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ํ—ฌ์Šค ์ฒดํฌ ๋ฐ (ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ํŒจํ‚ท ํ•„ํ„ฐ๋ง ๊ทœ์น™์˜ ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•œ๋‹ค. ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์— ๋Œ€ํ•œ IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ํ•ด๋‹น ์™ธ๋ถ€ IP ์ฃผ์†Œ๋ฅผ ์ฐพ์•„ ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

8 - NGINX ์ธ๊ทธ๋ ˆ์Šค(Ingress) ์ปจํŠธ๋กค๋Ÿฌ๋กœ Minikube์—์„œ ์ธ๊ทธ๋ ˆ์Šค ์„ค์ •ํ•˜๊ธฐ

์ธ๊ทธ๋ ˆ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜ํ•˜๋Š” API ๊ฐ์ฒด์ด๋‹ค. ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ธ๊ทธ๋ ˆ์Šค์— ์„ค์ •๋œ ๊ทœ์น™์„ ์ดํ–‰ํ•œ๋‹ค.

์ด ํŽ˜์ด์ง€์—์„œ๋Š” HTTP URI์— ๋”ฐ๋ผ ์š”์ฒญ์„ Service web ๋˜๋Š” web2๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋ฒ„์˜ ๋ฒ„์ „์€ ๋‹ค์Œ๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ๋” ๋†’์•„์•ผ ํ•จ. ๋ฒ„์ „: 1.19.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

๋งŒ์•ฝ ์ด๋ณด๋‹ค ๋” ์ด์ „ ๋ฒ„์ „์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „์˜ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

Minikube ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ

Katacoda ํ™œ์šฉํ•˜๊ธฐ
๋กœ์ปฌ์—์„œ ์ƒ์„ฑํ•˜๊ธฐ
์ด๋ฏธ ๋กœ์ปฌ์— Minikube๋ฅผ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด, minikube start๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ ํ™œ์„ฑํ™”

  1. NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.

    minikube addons enable ingress
    
  2. NGINX ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get pods -n ingress-nginx
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    NAME                                        READY   STATUS      RESTARTS    AGE
    ingress-nginx-admission-create-g9g49        0/1     Completed   0          11m
    ingress-nginx-admission-patch-rqp78         0/1     Completed   1          11m
    ingress-nginx-controller-59b45fb494-26npt   1/1     Running     0          11m
    

    kubectl get pods -n kube-system
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    NAME                                        READY     STATUS    RESTARTS   AGE
    default-http-backend-59868b7dd6-xb8tq       1/1       Running   0          1m
    kube-addon-manager-minikube                 1/1       Running   0          3m
    kube-dns-6dcb57bcc8-n4xd4                   3/3       Running   0          2m
    kubernetes-dashboard-5498ccf677-b8p5h       1/1       Running   0          2m
    nginx-ingress-controller-5984b97644-rnkrg   1/1       Running   0          1m
    storage-provisioner                         1/1       Running   0          2m
    

    nginx-ingress-controller-๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŒŒ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

hello, world ์•ฑ ๋ฐฐํฌํ•˜๊ธฐ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl create deployment web --image=gcr.io/google-samples/hello-app:1.0
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    deployment.apps/web created
    
  2. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋…ธ์ถœ์‹œํ‚จ๋‹ค.

    kubectl expose deployment web --type=NodePort --port=8080
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    service/web exposed
    
  3. ์„œ๋น„์Šค(Service)๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋…ธ๋“œ ํฌํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get service web
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    NAME      TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    web       NodePort   10.104.133.249   <none>        8080:31637/TCP   12m
    
  4. ๋…ธ๋“œํฌํŠธ(NodePort)๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์— ์ ‘์†ํ•œ๋‹ค.

    minikube service web --url
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    http://172.17.0.15:31637
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    

    ์ด์ œ Minikube IP ์ฃผ์†Œ์™€ ๋…ธ๋“œํฌํŠธ๋ฅผ ํ†ตํ•ด ์ƒ˜ํ”Œ ์•ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ๋Š” ์ธ๊ทธ๋ ˆ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธ๊ทธ๋ ˆ์Šค ์ƒ์„ฑํ•˜๊ธฐ

๋‹ค์Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” hello-world.info๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

  1. ๋‹ค์Œ ํŒŒ์ผ์„ ํ†ตํ•ด example-ingress.yaml์„ ๋งŒ๋“ ๋‹ค.
apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    name: example-ingress
  spec:
    ingressClassName: nginx
    rules:
      - host: hello-world.info
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: web
                  port:
                    number: 8080
  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ธ๊ทธ๋ ˆ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl apply -f https://k8s.io/examples/service/networking/example-ingress.yaml
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    ingress.networking.k8s.io/example-ingress created
    
  2. IP ์ฃผ์†Œ๊ฐ€ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    kubectl get ingress
    

๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด, ADDRESS ์—ด์—์„œ IPv4 ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

NAME              CLASS    HOSTS              ADDRESS        PORTS   AGE
example-ingress   <none>   hello-world.info   172.17.0.15    80      38s
  1. ํ˜ธ์ŠคํŠธ ์ปดํ“จํ„ฐ์˜ /etc/hosts ํŒŒ์ผ ๋งจ ์•„๋ž˜์— ๋‹ค์Œ ํ–‰์„ ์ถ”๊ฐ€ํ•œ๋‹ค (๊ด€๋ฆฌ์ž ๊ถŒํ•œ ํ•„์š”).

    172.17.0.15 hello-world.info
    

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ hello-world.info URL์— ๋Œ€ํ•œ ์š”์ฒญ์„ Minikube๋กœ ์ „์†กํ•œ๋‹ค.

  2. ์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    curl hello-world.info
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    

๋‘ ๋ฒˆ์งธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์ƒ์„ฑํ•˜๊ธฐ

  1. ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๋ฒˆ์งธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

    kubectl create deployment web2 --image=gcr.io/google-samples/hello-app:2.0
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    deployment.apps/web2 created
    
  2. ๋‘ ๋ฒˆ์งธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋…ธ์ถœ์‹œํ‚จ๋‹ค.

    kubectl expose deployment web2 --port=8080 --type=NodePort
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    service/web2 exposed
    

๊ธฐ์กด ์ธ๊ทธ๋ ˆ์Šค ์ˆ˜์ •ํ•˜๊ธฐ

  1. ๊ธฐ์กด example-ingress.yaml ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ํŽธ์ง‘ํ•˜๊ณ , ํ•˜๋‹จ์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

              - path: /v2
                pathType: Prefix
                backend:
                  service:
                    name: web2
                    port:
                      number: 8080
    
  2. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•œ๋‹ค.

    kubectl apply -f example-ingress.yaml
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    ingress.networking/example-ingress configured
    

์ธ๊ทธ๋ ˆ์Šค ํ…Œ์ŠคํŠธํ•˜๊ธฐ

  1. Hello World ์•ฑ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „์— ์•ก์„ธ์Šคํ•œ๋‹ค.

    curl hello-world.info
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Hello, world!
    Version: 1.0.0
    Hostname: web-55b8c6998d-8k564
    
  2. Hello World ์•ฑ์˜ ๋‘ ๋ฒˆ์งธ ๋ฒ„์ „์— ์•ก์„ธ์Šคํ•œ๋‹ค.

    curl hello-world.info/v2
    

    ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    Hello, world!
    Version: 2.0.0
    Hostname: web2-75cd47646f-t8cjk
    

๋‹ค์Œ ๋‚ด์šฉ

9 - ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๋ณด๊ธฐ

์ด ๋ฌธ์„œ๋Š” kubectl์„ ์ด์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

์ด ์ž‘์—…์—์„œ๋Š” kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ํŒŒ๋“œ์˜ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ , ๊ฒฐ๊ณผ๊ฐ’์˜ ์„œ์‹์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ ํŒŒ๋“œ์— ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ชฉ๋ก์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•  ๊ฒƒ์ด๋‹ค.

๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๊ฐ€์ ธ์˜ค๊ธฐ

  • kubectl get pods --all-namespaces ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ํŒŒ๋“œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์ด๋ฆ„๋งŒ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด -o jsonpath={.items[*].spec.containers[*].image} ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ฐ›์€ json์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ, image ํ•„๋“œ๋งŒ์„ ์ถœ๋ ฅํ•œ๋‹ค.
    • jsonpath๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป๊ณ  ์‹ถ๋‹ค๋ฉด Jsonpath ์ง€์›์„ ํ™•์ธํ•œ๋‹ค.
  • ๋‹ค์Œ์˜ ํ‘œ์ค€ ํˆด์„ ์ด์šฉํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ’์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. tr, sort, uniq
    • tr ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต๋ฐฑ์„ ์ค„ ๋ฐ”๊พธ๊ธฐ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.
    • sort ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์„ ์ •๋ ฌํ•œ๋‹ค.
    • uniq ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๊ฐœ์ˆ˜๋ฅผ ํ•ฉ์‚ฐํ•œ๋‹ค.
kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

์ด jsonpath๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • .items[*]: ๊ฐ ๊ฒฐ๊ณผ๊ฐ’์— ๋Œ€ํ•˜์—ฌ
  • .spec: spec ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • .containers[*]: ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•˜์—ฌ
  • .image: image ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

๊ฐ ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ

range ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๊ฐ’์—์„œ ๊ฐ๊ฐ์˜ ์š”์†Œ๋“ค์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\
sort

ํŒŒ๋“œ ๋ ˆ์ด๋ธ”๋กœ ํ•„ํ„ฐ๋ง๋œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๋ณด๊ธฐ

ํŠน์ • ๋ ˆ์ด๋ธ”์— ๋งž๋Š” ํŒŒ๋“œ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ -l ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด ๊ฒฐ๊ณผ๊ฐ’์€ app=nginx ๋ ˆ์ด๋ธ”์— ์ผ์น˜ํ•˜๋Š” ํŒŒ๋“œ๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" -l app=nginx

ํŒŒ๋“œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ํ•„ํ„ฐ๋ง๋œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๋ณด๊ธฐ

ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํŒŒ๋“œ๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด ๊ฒฐ๊ณผ๊ฐ’์€ kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ํŒŒ๋“œ๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get pods --namespace kube-system -o jsonpath="{.items[*].spec.containers[*].image}"

jsonpath ๋Œ€์‹  Go ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ชฉ๋ก ๋ณด๊ธฐ

jsonpath์˜ ๋Œ€์•ˆ์œผ๋กœ Kubectl์€ Go ํ…œํ”Œ๋ฆฟ์„ ์ง€์›ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ๊ณผ๊ฐ’์˜ ์„œ์‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get pods --all-namespaces -o go-template --template="{{range .items}}{{range .spec.containers}}{{.image}} {{end}}{{end}}"

๋‹ค์Œ ๋‚ด์šฉ

์ฐธ์กฐ

10 - ๊ณต์œ  ๋ณผ๋ฅจ์„ ์ด์šฉํ•˜์—ฌ ๋™์ผํ•œ ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ํ†ต์‹ ํ•˜๊ธฐ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋™์ผํ•œ ํŒŒ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ํ†ต์‹ ํ•  ๋•Œ์—, ์–ด๋–ป๊ฒŒ ๋ณผ๋ฅจ์„ ์ด์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ํ”„๋กœ์„ธ์Šค ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ณต์œ ํ•˜๊ธฐ๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•˜์ž.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ ์ƒ์„ฑ

์ด ์‹ค์Šต์—์„œ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ํ†ต์‹ ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•œ๋‹ค. ์•„๋ž˜๋Š” ์ด ํŒŒ๋“œ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  containers:

  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html

  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo debian ์ปจํ…Œ์ด๋„ˆ์—์„œ ์•ˆ๋…•ํ•˜์„ธ์š” > /pod-data/index.html"]

์ด ๊ตฌ์„ฑ ํŒŒ์ผ์—๋Š” ํŒŒ๋“œ๊ฐ€ shared-data๋กœ ๋ช…๋ช…ํ•œ ๋ณผ๋ฅจ์„ ๊ฐ€์ง„ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ์—๋Š” nginx ์›น ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์ด ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค. ๊ณต์œ  ๋ณผ๋ฅจ์˜ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋Š” /usr/share/nginx/html์ด๋‹ค. ๋‘ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋Š” debian ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์ด๊ณ , ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋Š” /pod-data์ด๋‹ค. ๋‘ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ ํ›„์— ์ข…๋ฃŒํ•œ๋‹ค.

echo debian ์ปจํ…Œ์ด๋„ˆ์—์„œ ์•ˆ๋…•ํ•˜์„ธ์š” > /pod-data/index.html

๋‘ ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ๋Š” index.html ํŒŒ์ผ์„ nginx ์›น ์„œ๋ฒ„์—์„œ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ฌธ์„œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ(/usr/share/nginx/html/)์— ์ €์žฅํ•œ๋‹ค.

์ด์ œ, ํŒŒ๋“œ์™€ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/pods/two-container-pod.yaml

ํŒŒ๋“œ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•œ๋‹ค.

kubectl get pod two-containers --output=yaml

์ถœ๋ ฅ์˜ ์ผ๋ถ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  ...
  name: two-containers
  namespace: default
  ...
spec:
  ...
  containerStatuses:

  - containerID: docker://c1d8abd1 ...
    image: debian
    ...
    lastState:
      terminated:
        ...
    name: debian-container
    ...

  - containerID: docker://96c1ff2c5bb ...
    image: nginx
    ...
    name: nginx-container
    ...
    state:
      running:
    ...

Debian ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๊ณ , nginx ์ปจํ…Œ์ด๋„ˆ๋Š” ์•„์ง ์‹คํ–‰ ์ค‘์ด๋‹ค.

nginx ์ปจํ…Œ์ด๋„ˆ์˜ ์‰˜(shell)์„ ์‹คํ–‰ํ•œ๋‹ค.

kubectl exec -it two-containers -c nginx-container -- /bin/bash

์‰˜์—์„œ nginx ์›น ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

root@two-containers:/# apt-get update
root@two-containers:/# apt-get install curl procps
root@two-containers:/# ps aux

์ถœ๋ ฅ์€ ์•„๋ž˜์™€ ์œ ์‚ฌํ•˜๋‹ค.

USER       PID  ...  STAT START   TIME COMMAND
root         1  ...  Ss   21:12   0:00 nginx: master process nginx -g daemon off;

Debian ์ปจํ…Œ์ด๋„ˆ์—์„œ nginx ์›น ์„œ๋ฒ„๊ฐ€ ํ˜ธ์ŠคํŒ…ํ•˜๋Š” ๋ฌธ์„œ์˜ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— index.html ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ์—ˆ์Œ์„ ์ƒ๊ธฐํ•˜์ž. curl์„ ์ด์šฉํ•˜์—ฌ nginx ์›น ์„œ๋ฒ„์— HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

root@two-containers:/# curl localhost

์ถœ๋ ฅ์„ ๋ณด๋ฉด, nginx ์›น ์„œ๋ฒ„์—์„œ debian ์ปจํ…Œ์ด๋„ˆ์—์„œ ์“ฐ์—ฌ์ง„ ์›น ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

debian ์ปจํ…Œ์ด๋„ˆ์—์„œ ์•ˆ๋…•ํ•˜์„ธ์š”

ํ† ์˜

ํŒŒ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ฃผ์š” ์ด์œ ๋Š” ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด์กฐํ•  ๋„์šฐ๋ฏธ(helper) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๋„์šฐ๋ฏธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋กœ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ค๋Š” ๊ฒฝ์šฐ(data puller)๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒฝ์šฐ(data pusher)์ด๊ฑฐ๋‚˜ ํ”„๋ก์‹œ๊ฐ€ ์žˆ๋‹ค. ๋„์šฐ๋ฏธ์™€ ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ข…์ข… ์„œ๋กœ ๊ฐ„์— ํ†ต์‹ ์„ ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Š” ์ด๋ฒˆ ์˜ˆ์ œ์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ ๊ฐ™์ด, ๊ณต์œ  ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ํ†ตํ•˜๊ฑฐ๋‚˜, ๋ฃจํ”„๋ฐฑ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ๊ณง ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ(localhost)๋ฅผ ํ†ตํ•ด์„œ ์ด๋ค„์ง„๋‹ค. ์ด ํŒจํ„ด์˜ ํ•œ๊ฐ€์ง€ ์˜ˆ๋Š” ์›น ์„œ๋ฒ„๊ฐ€ ๋„์šฐ๋ฏธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ Git ์ €์žฅ์†Œ์—์„œ ์ƒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

์ด ์˜ˆ์ œ์—์„œ ๋ณผ๋ฅจ์€ ํŒŒ๋“œ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ ํ†ต์‹  ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์šฉํ–ˆ๋‹ค. ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์žฌ์ƒ์„ฑ๋˜๋ฉด, ๊ณต์œ  ๋ณผ๋ฅจ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์žƒ์–ด๋ฒ„๋ฆฐ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

11 - ํด๋Ÿฌ์Šคํ„ฐ์˜ DNS ๊ตฌ์„ฑํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ํ™œ์„ฑํ™”๋œ DNS ํด๋Ÿฌ์Šคํ„ฐ ์• ๋“œ์˜จ์„ ์ œ๊ณตํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.11๊ณผ ์ดํ›„ ๋ฒ„์ „์—์„œ๋Š”, CoreDNS๊ฐ€ ๊ถŒ์žฅ๋˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ kubeadm๊ณผ ํ•จ๊ป˜ ์„ค์น˜ ๋œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ CoreDNS ์„ค์ •์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š”, DNS ์„œ๋น„์Šค ์‚ฌ์šฉ์žํ™” ํ•˜๊ธฐ์„ ๋ณธ๋‹ค. kube-dns์™€ ํ•จ๊ป˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค DNS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค DNS ์ƒ˜ํ”Œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ณธ๋‹ค.

12 - ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค์— ์ ‘๊ทผ

์ด ํŽ˜์ด์ง€๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค€๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ , kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ํˆด์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ํŠœํ† ๋ฆฌ์–ผ์€ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ์ ์–ด๋„ 2๊ฐœ ํฌํ•จ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. ๋งŒ์•ฝ, ์•„์ง ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด, minikube๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค์— ์ ‘๊ทผ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ, ๋…ธ๋“œ, ํŒŒ๋“œ ๋ฐ ์„œ๋น„์Šค๋Š” ๋ชจ๋‘ ๊ณ ์œ ํ•œ IP๋ฅผ ๊ฐ€์ง„๋‹ค. ๋‹น์‹ ์˜ ๋ฐ์Šคํฌํƒ‘ PC์™€ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€ ์žฅ๋น„์—์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์˜ ๋…ธ๋“œ IP, ํŒŒ๋“œ IP, ์„œ๋น„์Šค IP๋กœ ๋ผ์šฐํŒ…๋˜์ง€ ์•Š์•„์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•

ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ๋…ธ๋“œ, ํŒŒ๋“œ ๋ฐ ์„œ๋น„์Šค์— ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค.

  • ํผ๋ธ”๋ฆญ IP๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์— ์ ‘๊ทผํ•œ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก NodePort ๋˜๋Š” LoadBalancer ํƒ€์ž…์˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์„œ๋น„์Šค์™€ kubectl expose ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ, ์„œ๋น„์Šค๋Š” ํšŒ์‚ฌ ๋„คํŠธ์›Œํฌ์—๋งŒ ๋…ธ์ถœ๋˜๊ธฐ๋„ ํ•˜๋ฉฐ, ์ธํ„ฐ๋„ท์— ๋…ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋…ธ์ถœ๋˜๋Š” ์„œ๋น„์Šค์˜ ๋ณด์•ˆ ์—ฌ๋ถ€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น ์„œ๋น„์Šค๋Š” ์ž์ฒด์ ์œผ๋กœ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฐ€?
    • ํŒŒ๋“œ๋Š” ์„œ๋น„์Šค ๋’ค์— ์œ„์น˜์‹œํ‚จ๋‹ค. ๋””๋ฒ„๊น…๊ณผ ๊ฐ™์€ ๋ชฉ์ ์œผ๋กœ ๋ ˆํ”Œ๋ฆฌ์นด ์ง‘ํ•ฉ์—์„œ ํŠน์ • ํŒŒ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ํŒŒ๋“œ์— ๊ณ ์œ ํ•œ ๋ ˆ์ด๋ธ”์„ ๋ฐฐ์น˜ํ•˜๊ณ  ์ด ๋ ˆ์ด๋ธ”์„ ์„ ํƒํ•˜๋Š” ์ƒˆ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๊ฐ€ nodeIP๋ฅผ ํ†ตํ•ด ๋…ธ๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ํ•„์š”๋Š” ์—†๋‹ค.
  • ํ”„๋ก์‹œ ์ž‘์—…(Proxy Verb)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค, ๋…ธ๋“œ ๋˜๋Š” ํŒŒ๋“œ์— ์ ‘๊ทผํ•œ๋‹ค.
    • ์›๊ฒฉ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์ „์— apiserver ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ธํ„ฐ๋„ท์— ๋…ธ์ถœ๋˜๊ฑฐ๋‚˜, ๋…ธ๋“œ IP์˜ ํฌํŠธ์— ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜, ๋””๋ฒ„๊น…ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
    • ํ”„๋ก์‹œ๋Š” ์ผ๋ถ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
    • HTTP/HTTPS์—์„œ๋งŒ ์ž‘๋™ํ•œ๋‹ค.
    • ์—ฌ๊ธฐ์— ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ ๋˜๋Š” ํŒŒ๋“œ์—์„œ ์ ‘๊ทผํ•œ๋‹ค.
    • ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ, kubectl exec๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์…ธ์— ์—ฐ๊ฒฐํ•œ๋‹ค. ํ•ด๋‹น ์…ธ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ, ํŒŒ๋“œ ๋ฐ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•œ๋‹ค.
    • ์ผ๋ถ€ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋กœ ssh๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๊ฑฐ๊ธฐ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋น„ํ‘œ์ค€ ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์ผ๋ถ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ธŒ๋ผ์šฐ์ € ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ๊ฐ€ ์„ค์น˜๋˜๊ฑฐ๋‚˜ ์„ค์น˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ DNS๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๋นŒํŠธ์ธ ์„œ๋น„์Šค ๊ฒ€์ƒ‰

์ผ๋ฐ˜์ ์œผ๋กœ kube-system์— ์˜ํ•ด ํด๋Ÿฌ์Šคํ„ฐ์— ์‹คํ–‰๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค. kubectl cluster-info ์ปค๋งจ๋“œ๋กœ ์ด ์„œ๋น„์Šค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

kubectl cluster-info

์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๋‹ค.

Kubernetes master is running at https://192.0.2.1
elasticsearch-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
kibana-logging is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kibana-logging/proxy
kube-dns is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/kube-dns/proxy
grafana is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
heapster is running at https://192.0.2.1/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy

๊ฐ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ก์‹œ-์ž‘์—… URL์ด ํ‘œ์‹œ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/ ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” (Elasticsearch๋ฅผ ์‚ฌ์šฉํ•œ) ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜์ค€ ๋กœ๊น…์ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค. ์ ํ•ฉํ•œ ์ž๊ฒฉ ์ฆ๋ช…์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ๋‚˜ kubectl proxy๋ฅผ ํ†ตํ•ด ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์˜ URL์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/.

apiserver ํ”„๋ก์‹œ URL ์ˆ˜๋™ ๊ตฌ์„ฑ

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, kubectl cluster-info ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค์˜ ํ”„๋ก์‹œ URL์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ, ์ ‘๋ฏธ์‚ฌ ๋ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ํ”„๋ก์‹œ URL์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด, ์„œ๋น„์Šค์˜ ํ”„๋ก์‹œ URL์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. http://kubernetes_master_address/api/v1/namespaces/namespace_name/services/[https:]service_name[:port_name]/proxy

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

๊ธฐ๋ณธ์ ์œผ๋กœ, API ์„œ๋ฒ„๋Š” ์„œ๋น„์Šค๋กœ์˜ ํ”„๋ก์‹œ๋ฅผ HTTP๋กœ ์ œ๊ณตํ•œ๋‹ค. HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ์„œ๋น„์Šค ์ด๋ฆ„ ์•ž์— https:๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. http://<์ฟ ๋ฒ„๋„คํ‹ฐ์Šค_์ปจํŠธ๋กค_ํ”Œ๋ ˆ์ธ_์ฃผ์†Œ>/api/v1/namespaces/<๋„ค์ž„์ŠคํŽ˜์ด์Šค_์ด๋ฆ„>/services/<์„œ๋น„์Šค_์ด๋ฆ„>/proxy

URL์—์„œ <์„œ๋น„์Šค_์ด๋ฆ„>์ด ์ง€์›ํ•˜๋Š” ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • <์„œ๋น„์Šค_์ด๋ฆ„> - ๊ธฐ๋ณธ ํฌํŠธ ๋˜๋Š” ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ํฌํŠธ๋กœ http๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ
  • <์„œ๋น„์Šค_์ด๋ฆ„>:<ํฌํŠธ_์ด๋ฆ„> - ๊ธฐ์žฌ๋œ ํฌํŠธ ์ด๋ฆ„ ๋˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ๋กœ http๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ
  • https:<์„œ๋น„์Šค_์ด๋ฆ„>: - ๊ธฐ๋ณธ ํฌํŠธ ๋˜๋Š” ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ํฌํŠธ๋กœ https๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ(๋งจ ๋์˜ ์ฝœ๋ก ์— ์œ ์˜)
  • https:<์„œ๋น„์Šค_์ด๋ฆ„>:<ํฌํŠธ_์ด๋ฆ„> - ๊ธฐ์žฌ๋œ ํฌํŠธ ์ด๋ฆ„ ๋˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ๋กœ https๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก์‹œ
์˜ˆ์ œ
  • Elasticsearch ์„œ๋น„์Šค ์—”๋“œํฌ์ธํŠธ _search?q=user:kimchy ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    http://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy
    
  • Elasticsearch ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ ์ •๋ณด _cluster/health?pretty=true ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    https://192.0.2.1/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true
    

    ์ƒํƒœ ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๋‹ค.

    {
      "cluster_name" : "kubernetes_logging",
      "status" : "yellow",
      "timed_out" : false,
      "number_of_nodes" : 1,
      "number_of_data_nodes" : 1,
      "active_primary_shards" : 5,
      "active_shards" : 5,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 5
    }
    
  • https Elasticsearch ์„œ๋น„์Šค ์ƒํƒœ ์ •๋ณด _cluster/health?pretty=true ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ๋‹ค์Œ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    https://192.0.2.1/api/v1/namespaces/kube-system/services/https:elasticsearch-logging/proxy/_cluster/health?pretty=true
    

์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋น„์Šค์— ์ ‘๊ทผ

๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ ํ‘œ์‹œ์ค„์— apiserver ํ”„๋ก์‹œ URL์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜,

  • ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ† ํฐ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ๊ธฐ๋ณธ (๋น„๋ฐ€๋ฒˆํ˜ธ) ์ธ์ฆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. Apiserver๋Š” ๊ธฐ๋ณธ ์ธ์ฆ์„ ์ˆ˜๋ฝํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๊ธฐ๋ณธ ์ธ์ฆ์„ ์ˆ˜๋ฝํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ผ๋ถ€ ์›น ์•ฑ, ํŠนํžˆ ํ”„๋ก์‹œ ๊ฒฝ๋กœ ์ ‘๋‘์‚ฌ๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ URL์„ ๊ตฌ์„ฑํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ๋Š” ์›น ์•ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค.