Kubernetes Basics

Kubernetes Basics

Support HackTricks

The original author of this page is Jorge (read his original post here)

Architecture & Basics

What does Kubernetes do?

  • ์ปจํ…Œ์ด๋„ˆ ์—”์ง„์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • ์Šค์ผ€์ค„๋ง์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์˜ ์ž„๋ฌด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํ†ต์‹ ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฐํฌ ๊ธฐ์ˆ ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ •๋ณด์˜ ์–‘์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Architecture

  • Node: ํฌ๋“œ ๋˜๋Š” ํฌ๋“œ๊ฐ€ ์žˆ๋Š” ์šด์˜ ์ฒด์ œ.

  • Pod: ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ์‹ธ๋Š” ๋ž˜ํผ์ž…๋‹ˆ๋‹ค. ํฌ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๋ณดํ†ต ํฌ๋“œ๋Š” ๋‹จ์ง€ 1๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค). ํฌ๋“œ๋Š” Kubernetes๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Service: ๊ฐ ํฌ๋“œ๋Š” ๋…ธ๋“œ์˜ ๋‚ด๋ถ€ ๋ฒ”์œ„์—์„œ 1๊ฐœ์˜ ๋‚ด๋ถ€ IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋น„์Šค๋กœ ๋…ธ์ถœ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ๋˜ํ•œ IP ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๋ฉฐ ๊ทธ ๋ชฉํ‘œ๋Š” ํฌ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜๊ฐ€ ์ฃฝ์œผ๋ฉด ์ƒˆ๋กœ์šด ๋Œ€์ฒด(๋‹ค๋ฅธ ๋‚ด๋ถ€ IP๋ฅผ ๊ฐ€์ง„)๊ฐ€ ์„œ๋น„์Šค์˜ ๋™์ผํ•œ IP๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋˜๋Š” ์™ธ๋ถ€๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ๋˜ํ•œ 2๊ฐœ์˜ ํฌ๋“œ๊ฐ€ ๋™์ผํ•œ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐ๋  ๋•Œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด kubectl get endpoints๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฐ ์„œ๋น„์Šค์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • Kube-proxy: apiserver์™€ ๋…ธ๋“œ ๊ฐ„์˜ ํ†ต์‹ (์„œ๋น„์Šค)์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์€ IPtables์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ˆ™๋ จ๋œ ์‚ฌ์šฉ์ž๋Š” ๋‹ค๋ฅธ ๊ณต๊ธ‰์ž์˜ kube-proxy๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Sidecar container: ์‚ฌ์ด๋“œ์นด ์ปจํ…Œ์ด๋„ˆ๋Š” ํฌ๋“œ์˜ ์ฃผ์š” ์ปจํ…Œ์ด๋„ˆ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ์ด ์‚ฌ์ด๋“œ์นด ํŒจํ„ด์€ ํ˜„์žฌ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•˜๊ณ  ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋””์—์„œ๋‚˜ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“  ์ข…์†์„ฑ์„ ๋ž˜ํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ ๊ทธ ์ž‘์—…์„ ๋งค์šฐ ์ž˜ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • Master process:

  • Api Server: ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ธ์ฆ๋œ ์š”์ฒญ๋งŒ ํ—ˆ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

  • Kube Controller manager: ๋ณต์ œ ์„ธํŠธ๋‚˜ ๋ฐฐํฌ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์ธํ•˜์—ฌ ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ฌ๋ฐ”๋ฅธ ์ˆ˜์˜ ํฌ๋“œ๋‚˜ ๋…ธ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ํฌ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์ผ€์ค„๋Ÿฌ์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค. API์— ๋Œ€ํ•œ ๋ณต์ œ, ํ† ํฐ ๋ฐ ๊ณ„์ • ์„œ๋น„์Šค๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

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

  • Cloud controller manager: AWS ๋˜๋Š” OpenStack์— ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํ๋ฆ„ ์ œ์–ด ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ์ž…๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋…ธ๋“œ(์—ฌ๋Ÿฌ ํฌ๋“œ ์‹คํ–‰)๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋“ค์˜ Api ์„œ๋ฒ„ ์ ‘๊ทผ์€ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๋˜๊ณ  etcd๋Š” ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

Volumes:

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

Other configurations:

  • ConfigMap: ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ URL์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ๋“œ๋Š” ๋‚˜๋จธ์ง€ ์„œ๋น„์Šค(ํฌ๋“œ)์™€ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๊ณณ์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ €์žฅํ•˜๋Š” ๊ถŒ์žฅ ์žฅ์†Œ๊ฐ€ ์•„๋‹˜์„ ์œ ์˜ํ•˜์„ธ์š”!

  • Secret: ๋น„๋ฐ€๋ฒˆํ˜ธ, API ํ‚ค ๋“ฑ๊ณผ ๊ฐ™์€ ๋น„๋ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ B64๋กœ ์ธ์ฝ”๋”ฉํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ํฌ๋“œ๋Š” ํ•„์š”ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • StatefulSet: ์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์ด ๋™์ผํ•œ ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Ingress: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ URL๋กœ ๊ณต๊ฐœ์ ์œผ๋กœ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…ธ์ถœํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Ingress๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด Ingress Controllers๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Ingress Controller๋Š” ์š”์ฒญ์„ ์ˆ˜์‹ ํ•˜๊ณ  ํ™•์ธํ•˜๋ฉฐ ์„œ๋น„์Šค๋ฅผ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑํ•  ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋˜๋Š” ํฌ๋“œ์ž…๋‹ˆ๋‹ค. Ingress Controller๋Š” ๊ตฌ์„ฑ๋œ Ingress ๊ทœ์น™์— ๋”ฐ๋ผ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Ingress ๊ทœ์น™์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋‚˜ ์‹ฌ์ง€์–ด ์„œ๋กœ ๋‹ค๋ฅธ ๋‚ด๋ถ€ Kubernetes ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ•˜์œ„ ๋„๋ฉ”์ธ์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ์–ด๋–ค Ingress ๊ทœ์น™๊ณผ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜๋ฉด, Ingress Controller๋Š” ์ด๋ฅผ "Default backend"๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์–ป์œผ๋ ค๋ฉด Ingress Controller๋ฅผ describeํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • minikube addons enable ingress

PKI infrastructure - Certificate Authority CA:

  • CA๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ชจ๋“  ์ธ์ฆ์„œ์˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฃจํŠธ์ž…๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ์ธ์ฆ์„œ๋Š” CA์— ์˜ํ•ด ์„œ๋ช…๋ฉ๋‹ˆ๋‹ค.

  • etcd๋Š” ์ž์ฒด ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ํ˜•:

  • apiserver cert.

  • kubelet cert.

  • scheduler cert.

Basic Actions

Minikube

Minikube๋Š” ์ „์ฒด Kubernetes ํ™˜๊ฒฝ์„ ๋ฐฐํฌํ•  ํ•„์š” ์—†์ด Kubernetes์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋น ๋ฅธ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ๋ฐ ๋…ธ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•œ ๋จธ์‹ ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Minikube๋Š” VirtualBox๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์„ค์น˜ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์„ธ์š”.

$ minikube start
๐Ÿ˜„  minikube v1.19.0 on Ubuntu 20.04
โœจ  Automatically selected the virtualbox driver. Other choices: none, ssh
๐Ÿ’ฟ  Downloading VM boot image ...
> minikube-v1.19.0.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
> minikube-v1.19.0.iso: 244.49 MiB / 244.49 MiB  100.00% 1.78 MiB p/s 2m17.
๐Ÿ‘  Starting control plane node minikube in cluster minikube
๐Ÿ’พ  Downloading Kubernetes v1.20.2 preload ...
> preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB  100.00% 2.59 MiB
๐Ÿ”ฅ  Creating virtualbox VM (CPUs=2, Memory=3900MB, Disk=20000MB) ...
๐Ÿณ  Preparing Kubernetes v1.20.2 on Docker 20.10.4 ...
โ–ช Generating certificates and keys ...
โ–ช Booting up control plane ...
โ–ช Configuring RBAC rules ...
๐Ÿ”Ž  Verifying Kubernetes components...
โ–ช Using image gcr.io/k8s-minikube/storage-provisioner:v5
๐ŸŒŸ  Enabled addons: storage-provisioner, default-storageclass
๐Ÿ„  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by defaul

$ minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

---- ONCE YOU HAVE A K8 SERVICE RUNNING WITH AN EXTERNAL SERVICE -----
$ minikube service mongo-express-service
(This will open your browser to access the service exposed port)

$ minikube delete
๐Ÿ”ฅ  Deleting "minikube" in virtualbox ...
๐Ÿ’€  Removed all traces of the "minikube" cluster

Kubectl Basics

**Kubectl**๋Š” kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ„ํ•œ ๋ช…๋ น์ค„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” kubernetes์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค์˜ Api ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

kubectl version #Get client and server version
kubectl get pod
kubectl get services
kubectl get deployment
kubectl get replicaset
kubectl get secret
kubectl get all
kubectl get ingress
kubectl get endpoints

#kubectl create deployment <deployment-name> --image=<docker image>
kubectl create deployment nginx-deployment --image=nginx
#Access the configuration of the deployment and modify it
#kubectl edit deployment <deployment-name>
kubectl edit deployment nginx-deployment
#Get the logs of the pod for debbugging (the output of the docker container running)
#kubectl logs <replicaset-id/pod-id>
kubectl logs nginx-deployment-84cd76b964
#kubectl describe pod <pod-id>
kubectl describe pod mongo-depl-5fd6b7d4b4-kkt9q
#kubectl exec -it <pod-id> -- bash
kubectl exec -it mongo-depl-5fd6b7d4b4-kkt9q -- bash
#kubectl describe service <service-name>
kubectl describe service mongodb-service
#kubectl delete deployment <deployment-name>
kubectl delete deployment mongo-depl
#Deploy from config file
kubectl apply -f deployment.yml

Minikube ๋Œ€์‹œ๋ณด๋“œ

๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด minikube๊ฐ€ ๋ฌด์—‡์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋” ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” URL์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

minikube dashboard --url


๐Ÿ”Œ  Enabling dashboard ...
โ–ช Using image kubernetesui/dashboard:v2.3.1
โ–ช Using image kubernetesui/metrics-scraper:v1.0.7
๐Ÿค”  Verifying dashboard health ...
๐Ÿš€  Launching proxy ...
๐Ÿค”  Verifying proxy health ...
http://127.0.0.1:50034/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

YAML ๊ตฌ์„ฑ ํŒŒ์ผ ์˜ˆ์ œ

๊ฐ ๊ตฌ์„ฑ ํŒŒ์ผ์€ 3๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ, ์‚ฌ์–‘ (์‹คํ–‰ํ•ด์•ผ ํ•  ๋‚ด์šฉ), ์ƒํƒœ (์›ํ•˜๋Š” ์ƒํƒœ). ๋ฐฐํฌ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์‚ฌ์–‘ ์•ˆ์—๋Š” ์‹คํ–‰ํ•  ์ด๋ฏธ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ์ƒˆ๋กœ์šด ๊ตฌ์„ฑ ๊ตฌ์กฐ๋กœ ์ •์˜๋œ ํ…œํ”Œ๋ฆฟ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๊ฐ™์€ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์„ ์–ธ๋œ ๋ฐฐํฌ + ์„œ๋น„์Šค์˜ ์˜ˆ (์ถœ์ฒ˜ ์—ฌ๊ธฐ)

์„œ๋น„์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋ฐฐํฌ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ™์€ ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋‘˜ ๋‹ค ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค (์ด ๊ตฌ์„ฑ์—์„œ ์„ ์–ธ๋œ ์„œ๋น„์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค):

apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
labels:
app: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongodb-secret
key: mongo-root-password
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
selector:
app: mongodb
ports:
- protocol: TCP
port: 27017
targetPort: 27017

์™ธ๋ถ€ ์„œ๋น„์Šค ๊ตฌ์„ฑ ์˜ˆ์‹œ

์ด ์„œ๋น„์Šค๋Š” ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( nodePort ๋ฐ type: LoadBlancer ์†์„ฑ์„ ํ™•์ธํ•˜์„ธ์š”):

---
apiVersion: v1
kind: Service
metadata:
name: mongo-express-service
spec:
selector:
app: mongo-express
type: LoadBalancer
ports:
- protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30000

์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ์— ์œ ์šฉํ•˜์ง€๋งŒ, ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋‚ด๋ถ€ ์„œ๋น„์Šค๋งŒ ์žˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ Ingress๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Ingress ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

์ด๊ฒƒ์€ http://dashboard.com์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashboard-ingress
namespace: kubernetes-dashboard
spec:
rules:
- host: dashboard.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 80

๋น„๋ฐ€ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์˜ˆ

๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ B64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”(์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!).

apiVersion: v1
kind: Secret
metadata:
name: mongodb-secret
type: Opaque
data:
mongo-root-username: dXNlcm5hbWU=
mongo-root-password: cGFzc3dvcmQ=

ConfigMap์˜ ์˜ˆ์‹œ

A ConfigMap์€ ํŒŒ๋“œ์— ์ œ๊ณต๋˜๋Š” ๊ตฌ์„ฑ์œผ๋กœ, ํŒŒ๋“œ๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋ฅผ ์ฐพ๊ณ  ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๊ฐ ํŒŒ๋“œ๋Š” mongodb-service๋ผ๋Š” ์ด๋ฆ„์ด ๊ทธ๋“ค์ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋“œ์˜ ์ฃผ์†Œ์ž„์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค(์ด ํŒŒ๋“œ๋Š” mongodb๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค):

apiVersion: v1
kind: ConfigMap
metadata:
name: mongodb-configmap
data:
database_url: mongodb-service

๊ทธ๋Ÿฐ ๋‹ค์Œ, deployment config ๋‚ด์—์„œ ์ด ์ฃผ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ง€์ •๋  ์ˆ˜ ์žˆ์–ด pod์˜ env ๋‚ด์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค:

[...]
spec:
[...]
template:
[...]
spec:
containers:
- name: mongo-express
image: mongo-express
ports:
- containerPort: 8081
env:
- name: ME_CONFIG_MONGODB_SERVER
valueFrom:
configMapKeyRef:
name: mongodb-configmap
key: database_url
[...]

๋ณผ๋ฅจ ๊ตฌ์„ฑ ์˜ˆ์‹œ

๋‹ค์–‘ํ•œ ์ €์žฅ์†Œ ๊ตฌ์„ฑ yaml ํŒŒ์ผ์˜ ์˜ˆ์‹œ๋Š” https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณผ๋ฅจ์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์— ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”.

๋„ค์ž„์ŠคํŽ˜์ด์Šค

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

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ด๋ฆ„์— ๋Œ€ํ•œ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ„์—๋Š” ๊ณ ์œ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์„œ๋กœ ์ค‘์ฒฉ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ฐ Kubernetes ๋ฆฌ์†Œ์Šค๋Š” ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ minikube๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ 4๊ฐœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

kubectl get namespace
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d
  • kube-system: ์‚ฌ์šฉ์ž ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฉฐ ๊ฑด๋“œ๋ฆฌ์ง€ ๋ง์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ ๋ฐ kubectl ํ”„๋กœ์„ธ์Šค๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • kube-public: ๊ณต๊ฐœ์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ. ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” configmap์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • kube-node-lease: ๋…ธ๋“œ์˜ ๊ฐ€์šฉ์„ฑ์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  • default: ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

#Create namespace
kubectl create namespace my-namespace

๋Œ€๋ถ€๋ถ„์˜ Kubernetes ๋ฆฌ์†Œ์Šค(์˜ˆ: pods, services, replication controllers ๋“ฑ)๋Š” ์ผ๋ถ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฆฌ์†Œ์Šค์™€ ๋…ธ๋“œ ๋ฐ persistenVolumes๊ณผ ๊ฐ™์€ ์ €์ˆ˜์ค€ ๋ฆฌ์†Œ์Šค์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๊ณ  ์—†๋Š”์ง€ ๋ณด๋ ค๋ฉด:

kubectl api-resources --namespaced=true #In a namespace
kubectl api-resources --namespaced=false #Not in a namespace

ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์—์„œ ๋ชจ๋“  ํ›„์† kubectl ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl config set-context --current --namespace=<insert-namespace-name-here>

Helm

Helm์€ Kubernetes์˜ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค. YAML ํŒŒ์ผ์„ ํŒจํ‚ค์ง•ํ•˜๊ณ  ์ด๋ฅผ ๊ณต์šฉ ๋ฐ ๊ฐœ์ธ ์ €์žฅ์†Œ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŒจํ‚ค์ง€๋Š” Helm Charts๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

helm search <keyword>

Helm์€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ž…๋‹ˆ๋‹ค:

Kubernetes ๋น„๋ฐ€

**๋น„๋ฐ€(Secret)**์€ ๋น„๋ฐ€๋ฒˆํ˜ธ, ํ† ํฐ ๋˜๋Š” ํ‚ค์™€ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด๋Š” Pod ์‚ฌ์–‘์ด๋‚˜ ์ด๋ฏธ์ง€์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๋น„๋ฐ€์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ์Šคํ…œ์—์„œ๋„ ๋น„๋ฐ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐ€ ๊ฐ์ฒด์˜ ์ด๋ฆ„์€ ์œ ํšจํ•œ DNS ํ•˜์œ„ ๋„๋ฉ”์ธ ์ด๋ฆ„์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋น„๋ฐ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • API, SSH ํ‚ค.

  • OAuth ํ† ํฐ.

  • ์ž๊ฒฉ ์ฆ๋ช…, ๋น„๋ฐ€๋ฒˆํ˜ธ(์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋˜๋Š” b64 + ์•”ํ˜ธํ™”).

  • ์ •๋ณด ๋˜๋Š” ์ฃผ์„.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ฝ”๋“œ, ๋ฌธ์ž์—ดโ€ฆ .

Kubernetes์—๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋น„๋ฐ€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Opaque ์œ ํ˜•์€ ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์ „ํ˜•์ ์ธ ํ‚ค-๊ฐ’ ์Œ์ž…๋‹ˆ๋‹ค.

๋น„๋ฐ€์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹:

๋‹ค์Œ ๊ตฌ์„ฑ ํŒŒ์ผ์€ mysecret์ด๋ผ๋Š” ๋น„๋ฐ€์„ ์ •์˜ํ•˜๋ฉฐ, 2๊ฐœ์˜ ํ‚ค-๊ฐ’ ์Œ username: YWRtaW4= ๋ฐ password: MWYyZDFlMmU2N2Rm์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ mysecret์—์„œ ์ •์˜๋œ username ๋ฐ password๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ SECRET_USERNAME __ ๋ฐ __ SECRET_PASSWOR๋กœ ๋…ธ์ถœํ•˜๋Š” secretpod๋ผ๋Š” pod๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ 0640 ๊ถŒํ•œ์œผ๋กœ /etc/foo/my-group/my-username ๊ฒฝ๋กœ์— mysecret ๋‚ด์˜ username ๋น„๋ฐ€์„ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.

secretpod.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
---
apiVersion: v1
kind: Pod
metadata:
name: secretpod
spec:
containers:
- name: secretpod
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
volumeMounts:
- name: foo
mountPath: "/etc/foo"
restartPolicy: Never
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
mode: 0640
kubectl apply -f <secretpod.yaml>
kubectl get pods #Wait until the pod secretpod is running
kubectl exec -it  secretpod -- bash
env | grep SECRET && cat /etc/foo/my-group/my-username && echo

Secrets in etcd

etcd๋Š” ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ Kubernetes ๋ฐฑ์—… ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ผ๊ด€์„ฑ ์žˆ๊ณ  ๊ณ ๊ฐ€์šฉ์„ฑ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. etcd์— ์ €์žฅ๋œ ๋น„๋ฐ€์— ์ ‘๊ทผํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep etcd

๋‹น์‹ ์€ FS์— ์œ„์น˜ํ•œ certs, keys ๋ฐ url์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์–ป์œผ๋ฉด etcd์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] health

ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] health

ํ•œ ๋ฒˆ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๋ฉด ๋น„๋ฐ€์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

#ETCDCTL_API=3 etcdctl --cert <path to client.crt> --key <path to client.ket> --cacert <path to CA.cert> endpoint=[<ip:port>] get <path/to/secret>

ETCDCTL_API=3 etcdctl --cert /etc/kubernetes/pki/apiserver-etcd-client.crt --key /etc/kubernetes/pki/apiserver-etcd-client.key --cacert /etc/kubernetes/pki/etcd/etcd/ca.cert endpoint=[127.0.0.1:1234] get /registry/secrets/default/secret_02

ETCD์— ์•”ํ˜ธํ™” ์ถ”๊ฐ€ํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋น„๋ฐ€์€ ์•”ํ˜ธํ™” ๊ณ„์ธต์„ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ etcd ๋‚ด๋ถ€์— ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ๋Š” https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

encryption.yaml
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: cjjPMcWpTPKhAdieVtd+KhG4NN+N6e3NmBPMXJvbfrY= #Any random key
- identity: {}

๊ทธ ํ›„, ์ƒ์„ฑ๋œ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก kube-apiserver์—์„œ --encryption-provider-config ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. /etc/kubernetes/manifest/kube-apiserver.yaml๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

containers:
- command:
- kube-apiserver
- --encriyption-provider-config=/etc/kubernetes/etcd/<configFile.yaml>

Scroll down in the volumeMounts: volumeMounts์—์„œ ์•„๋ž˜๋กœ ์Šคํฌ๋กคํ•˜์„ธ์š”:

- mountPath: /etc/kubernetes/etcd
name: etcd
readOnly: true

volumeMounts์—์„œ hostPath๋กœ ์Šคํฌ๋กคํ•˜์„ธ์š”:

- hostPath:
path: /etc/kubernetes/etcd
type: DirectoryOrCreate
name: etcd

๋ฐ์ดํ„ฐ๊ฐ€ ์•”ํ˜ธํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋Š” etcd์— ๊ธฐ๋ก๋  ๋•Œ ์•”ํ˜ธํ™”๋ฉ๋‹ˆ๋‹ค. kube-apiserver๋ฅผ ์žฌ์‹œ์ž‘ํ•œ ํ›„, ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋œ ๋น„๋ฐ€์€ ์ €์žฅ๋  ๋•Œ ์•”ํ˜ธํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ™•์ธํ•˜๋ ค๋ฉด etcdctl ๋ช…๋ น์ค„ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€์˜ ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— secret1์ด๋ผ๋Š” ์ƒˆ ๋น„๋ฐ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

kubectl create secret generic secret1 -n default --from-literal=mykey=mydata
  1. etcdctl ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋น„๋ฐ€์„ etcd์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค:

ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C

์—ฌ๊ธฐ์„œ [...]๋Š” etcd ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ธ์ˆ˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 3. ์ €์žฅ๋œ ๋น„๋ฐ€์ด k8s:enc:aescbc:v1:๋กœ ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” aescbc ์ œ๊ณต์ž๊ฐ€ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 4. API๋ฅผ ํ†ตํ•ด ๊ฒ€์ƒ‰ํ•  ๋•Œ ๋น„๋ฐ€์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณตํ˜ธํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

kubectl describe secret secret1 -n default

mykey: bXlkYXRh์™€ ์ผ์น˜ํ•ด์•ผ ํ•˜๋ฉฐ, mydata๋Š” ์ธ์ฝ”๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋ฐ€์„ ์™„์ „ํžˆ ๋ณตํ˜ธํ™”ํ•˜๋ ค๋ฉด ๋น„๋ฐ€ ๋ณตํ˜ธํ™”๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋น„๋ฐ€์€ ์“ฐ๊ธฐ ์‹œ ์•”ํ˜ธํ™”๋˜๋ฏ€๋กœ ๋น„๋ฐ€์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด ์•”ํ˜ธํ™”๋ฉ๋‹ˆ๋‹ค:

kubectl get secrets --all-namespaces -o json | kubectl replace -f -

๋งˆ์ง€๋ง‰ ํŒ:

์ฐธ๊ณ ๋ฌธํ—Œ

HackTricks ์ง€์›ํ•˜๊ธฐ

Last updated