์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ—„๏ธ Persistent Volume๊ณผ PVC ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๐Ÿ—„๏ธ Persistent Volume๊ณผ PVC ์™„๋ฒฝ ๊ฐ€์ด๋“œ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€์˜ ๋ชจ๋“  ๊ฒƒ, ์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”!

๐ŸŽฏ ์™œ PV์™€ PVC๋ฅผ ์•Œ์•„์•ผ ํ• ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค(Kubernetes)๋ฅผ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ๋ฐ˜๋“œ์‹œ ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜๋Š” Persistent Volume(PV)๊ณผ Persistent Volume Claim(PVC)์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณผ๊ฒŒ์š”. ๐Ÿ˜Š

์—ฌ๋Ÿฌ๋ถ„์ด ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์šด์˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์•„๋งˆ ์ด๋Ÿฐ ๊ณ ๋ฏผ์„ ํ•ด๋ณด์…จ์„ ๊ฑฐ์˜ˆ์š”. "์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋‚ ์•„๊ฐ€๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋ณด๊ด€ํ•˜์ง€?" ๋ฐ”๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒŒ PV์™€ PVC๋ž๋‹ˆ๋‹ค! ๐ŸŽ‰

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด๋‚˜ DevOps ๋ถ„์•ผ์—์„œ ์ผํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด๋ผ๋ฉด, ์ด ๊ฐœ๋…์€ ์ •๋ง ํ•„์ˆ˜์ ์ด์—์š”. ์žฌ๋Šฅ๋„ท์—์„œ๋„ ํด๋ผ์šฐ๋“œ ๊ด€๋ จ ์žฌ๋Šฅ์„ ๊ณต์œ ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๋งŽ์€๋ฐ, PV์™€ PVC๋Š” ๊ทธ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฐœ๋…์ด๊ฑฐ๋“ ์š”.


๐Ÿ“ฆ ์ปจํ…Œ์ด๋„ˆ ์Šคํ† ๋ฆฌ์ง€์˜ ๊ธฐ๋ณธ ์ดํ•ด

๐Ÿ” ์ปจํ…Œ์ด๋„ˆ์˜ ์ž„์‹œ ์ €์žฅ์†Œ ๋ฌธ์ œ

๋จผ์ € ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ํŠน์„ฑ๋ถ€ํ„ฐ ์ดํ•ดํ•ด๋ณผ๊นŒ์š”? ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž„์‹œ(ephemeral) ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์žฌ์‹œ์ž‘๋˜๋ฉด ๊ทธ ์•ˆ์— ์žˆ๋˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๊ฑฐ์ฃ . ๐Ÿ˜ฑ

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”. ์—ฌ๋Ÿฌ๋ถ„์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์ด ์—ด์‹ฌํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐ ์ปจํ…Œ์ด๋„ˆ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ์„œ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋ฉด? ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ ์•„๊ฐ€๋ฒ„๋ฆฌ๋Š” ๋”์ฐํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ฅ

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์Šคํ† ๋ฆฌ์ง€ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š”๋ฐ, ๊ทธ์ค‘์—์„œ๋„ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ Persistent Volume์ด์—์š”.

๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ
์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ํŒŒ์ผ์‹œ์Šคํ…œ์€ ์ปจํ…Œ์ด๋„ˆ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์˜๊ตฌ์ ์ธ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ์œ„ํ•ด์„œ๋Š” ๋ณ„๋„์˜ ์Šคํ† ๋ฆฌ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ด์š”!

๐ŸŽจ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€์˜ ์ง„ํ™”

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ดˆ๊ธฐ์—๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ •๋ง ๋ณต์žกํ–ˆ์–ด์š”. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์Šคํ† ๋ฆฌ์ง€ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ–ˆ๊ณ , ์ธํ”„๋ผ ๊ด€๋ฆฌ์ž์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ˜‘์—…ํ•ด์•ผ ํ–ˆ์ฃ . ํ•˜์ง€๋งŒ PV์™€ PVC๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ ์ด ๋ชจ๋“  ๊ฒŒ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์กŒ๋‹ต๋‹ˆ๋‹ค! ๐ŸŒŸ

PV์™€ PVC๋Š” ์ถ”์ƒํ™”(abstraction)๋ผ๋Š” ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ์–ด์š”. ๊ฐœ๋ฐœ์ž๋Š” "๋‚˜๋Š” 100GB ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ํ•„์š”ํ•ด"๋ผ๊ณ ๋งŒ ์š”์ฒญํ•˜๋ฉด, ์‹ค์ œ๋กœ ๊ทธ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ AWS EBS์ธ์ง€, Google Persistent Disk์ธ์ง€, NFS์ธ์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋œ ๊ฑฐ์ฃ . ์ด๊ฒŒ ๋ฐ”๋กœ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์˜ ์•„๋ฆ„๋‹ค์›€์ด์—์š”! โœจ


๐Ÿ—‚๏ธ Persistent Volume(PV) ๊นŠ์ด ํŒŒํ—ค์น˜๊ธฐ

๐Ÿ“š PV์˜ ์ •์˜์™€ ์—ญํ• 

Persistent Volume(PV)์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€ ๋ฆฌ์†Œ์Šค์˜ˆ์š”. ์‰ฝ๊ฒŒ ๋งํ•ด์„œ, ์‹ค์ œ ๋ฌผ๋ฆฌ์  ๋˜๋Š” ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•œ ๊ฐ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”. ๐ŸŽฏ

PV๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ๋ฒจ์˜ ๋ฆฌ์†Œ์Šค์˜ˆ์š”. ์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ด๋ƒ๋ฉด, ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€ ์•Š๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์ฃ . ๋งˆ์น˜ ๊ณต์šฉ ์ฐฝ๊ณ  ๊ฐ™์€ ๊ฐœ๋…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ“ฆ

PV์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” Pod์™€ ๋…๋ฆฝ์ ์ด์—์š”. Pod๊ฐ€ ์‚ญ์ œ๋˜๋”๋ผ๋„ PV๋Š” ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋„ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ "Persistent(์˜๊ตฌ์ )"๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์€ ์ด์œ ๋ž๋‹ˆ๋‹ค!

๐Ÿ”‘ PV์˜ ํ•ต์‹ฌ ํŠน์ง•
โ€ข ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ๋ฒจ ๋ฆฌ์†Œ์Šค (๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋…๋ฆฝ์ )
โ€ข Pod ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ 
โ€ข ๊ด€๋ฆฌ์ž๊ฐ€ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ฑฐ๋‚˜ ๋™์ ์œผ๋กœ ์ƒ์„ฑ
โ€ข ๋‹ค์–‘ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ ์ง€์›

๐Ÿ› ๏ธ PV์˜ ๊ตฌ์„ฑ ์š”์†Œ

PV๋ฅผ ์ •์˜ํ•  ๋•Œ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์†์„ฑ์„ ์ง€์ •ํ•ด์•ผ ํ•ด์š”. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ”

1. Capacity (์šฉ๋Ÿ‰)
๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์†์„ฑ์ด์—์š”. ์Šคํ† ๋ฆฌ์ง€์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฑฐ์ฃ . ์˜ˆ๋ฅผ ๋“ค์–ด 10Gi, 100Gi ์ด๋Ÿฐ ์‹์œผ๋กœ ํ‘œํ˜„ํ•ด์š”. ํ˜„์žฌ๋Š” ์šฉ๋Ÿ‰๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฏธ๋ž˜์—๋Š” IOPS(์ดˆ๋‹น ์ž…์ถœ๋ ฅ ์ž‘์—… ์ˆ˜)๋‚˜ ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ฐ™์€ ๊ฒƒ๋„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ“Š

2. Access Modes (์ ‘๊ทผ ๋ชจ๋“œ)
์Šคํ† ๋ฆฌ์ง€์— ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ •์˜ํ•ด์š”. ์„ธ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์žˆ๋‹ต๋‹ˆ๋‹ค:

โ€ข ReadWriteOnce (RWO): ํ•˜๋‚˜์˜ ๋…ธ๋“œ์—์„œ๋งŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ฐ€๋Šฅ. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ชจ๋“œ์˜ˆ์š”. ๐Ÿ’พ
โ€ข ReadOnlyMany (ROX): ์—ฌ๋Ÿฌ ๋…ธ๋“œ์—์„œ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ. ๊ณต์œ  ์„ค์ • ํŒŒ์ผ ๊ฐ™์€ ๊ฑฐ์— ์ ํ•ฉํ•ด์š”. ๐Ÿ“–
โ€ข ReadWriteMany (RWX): ์—ฌ๋Ÿฌ ๋…ธ๋“œ์—์„œ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅ. NFS ๊ฐ™์€ ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€์—์„œ ์ง€์›ํ•ด์š”. ๐Ÿ”„

3. Storage Class (์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค)
PV์˜ "๋“ฑ๊ธ‰"์ด๋‚˜ "ํƒ€์ž…"์„ ๋‚˜ํƒ€๋‚ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด "๋น ๋ฅธ SSD", "์ €๋ ดํ•œ HDD", "๊ณ ๊ฐ€์šฉ์„ฑ ์Šคํ† ๋ฆฌ์ง€" ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ฃ . ์ด๊ฑด ๋‚˜์ค‘์— PVC๊ฐ€ ์›ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉ๋ผ์š”. ๐Ÿท๏ธ

4. Reclaim Policy (ํšŒ์ˆ˜ ์ •์ฑ…)
PVC๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์„ ๋•Œ PV๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•ด์š”. ์„ธ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์–ด์š”:

โ€ข Retain: PV๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€. ๋ฐ์ดํ„ฐ๋„ ๋ณด์กด๋˜๊ณ , ์ˆ˜๋™์œผ๋กœ ์ •๋ฆฌํ•ด์•ผ ํ•ด์š”. ๐Ÿ”’
โ€ข Delete: PV์™€ ์—ฐ๊ฒฐ๋œ ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€๊นŒ์ง€ ์‚ญ์ œ. ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ๋น„์šฉ ์ ˆ๊ฐ์— ์ข‹์•„์š”. ๐Ÿ—‘๏ธ
โ€ข Recycle: ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ  PV๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์š”. (deprecated ๋˜์—ˆ์–ด์š”) โ™ป๏ธ

๐Ÿ’ป PV ์ƒ์„ฑ ์˜ˆ์ œ

์‹ค์ œ๋กœ PV๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ณผ๊นŒ์š”? YAML ํŒŒ์ผ๋กœ ์ •์˜ํ•˜๋ฉด ๋ผ์š”:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
  labels:
    type: local
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: standard
  hostPath:
    path: "/mnt/data"

์ด ์˜ˆ์ œ๋Š” ๋กœ์ปฌ ํ˜ธ์ŠคํŠธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ PV์˜ˆ์š”. ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” AWS EBS, GCE Persistent Disk, Azure Disk, NFS ๋“ฑ ๋‹ค์–‘ํ•œ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŒ

๐Ÿ’š ์‹ค๋ฌด ํŒ
๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” hostPath๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์ง€๋งŒ, ํ”„๋กœ๋•์…˜์—์„œ๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”! ๋…ธ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๊ฑฐ๋“ ์š”. ํ•ญ์ƒ ๋„คํŠธ์›Œํฌ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

๐Ÿ”Œ ๋‹ค์–‘ํ•œ PV ํƒ€์ž…

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ •๋ง ๋งŽ์€ ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•ด์š”. ์ฃผ์š”ํ•œ ๊ฒƒ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐ŸŽช

์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž… ์„ค๋ช… ์ฃผ์š” ์‚ฌ์šฉ์ฒ˜
AWS EBS Amazon Elastic Block Store AWS ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ
GCE PD Google Compute Engine Persistent Disk GCP ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ
Azure Disk Microsoft Azure Disk Storage Azure ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ
NFS Network File System ์˜จํ”„๋ ˆ๋ฏธ์Šค, ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€
Ceph RBD Ceph Block Device ๋ถ„์‚ฐ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ
iSCSI Internet Small Computer Systems Interface SAN ์Šคํ† ๋ฆฌ์ง€

๊ฐ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…๋งˆ๋‹ค ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์กฐ๊ธˆ์”ฉ ๋‹ฌ๋ผ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด NFS๋Š” ReadWriteMany๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, AWS EBS๋Š” ReadWriteOnce๋งŒ ์ง€์›ํ•˜์ฃ . ํ”„๋กœ์ ํŠธ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”! ๐ŸŽฏ


๐ŸŽซ Persistent Volume Claim(PVC) ์™„์ „ ์ •๋ณต

๐ŸŽญ PVC๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Persistent Volume Claim(PVC)์€ ์‚ฌ์šฉ์ž๊ฐ€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. PV๊ฐ€ ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€๋ผ๋ฉด, PVC๋Š” ๊ทธ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” "์‹ ์ฒญ์„œ" ๊ฐ™์€ ๊ฑฐ์ฃ ! ๐Ÿ“

๋น„์œ ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”. PV๋Š” ์•„ํŒŒํŠธ ๋‹จ์ง€์— ์žˆ๋Š” ์‹ค์ œ ์ฃผ์ฐจ ๊ณต๊ฐ„์ด๊ณ , PVC๋Š” ์ž…์ฃผ๋ฏผ์ด ์ œ์ถœํ•˜๋Š” ์ฃผ์ฐจ ๊ณต๊ฐ„ ์‹ ์ฒญ์„œ์˜ˆ์š”. ์‹ ์ฒญ์„œ์— "์ง€ํ•˜ 1์ธต์— ์žˆ๋Š” ๋„“์€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ด์š”"๋ผ๊ณ  ์“ฐ๋ฉด, ๊ด€๋ฆฌ์‚ฌ๋ฌด์†Œ(์ฟ ๋ฒ„๋„คํ‹ฐ์Šค)๊ฐ€ ์กฐ๊ฑด์— ๋งž๋Š” ์ฃผ์ฐจ ๊ณต๊ฐ„์„ ๋ฐฐ์ •ํ•ด์ฃผ๋Š” ๊ฑฐ์ฃ ! ๐Ÿš—

PVC๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ ˆ๋ฒจ์˜ ๋ฆฌ์†Œ์Šค์˜ˆ์š”. ์ฆ‰, ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ณ , ๊ทธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์•ˆ์˜ Pod๋“ค๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํŒ€๋ณ„๋กœ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณด์•ˆ๊ณผ ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•ด์ ธ์š”! ๐Ÿ”

๐ŸŽฏ PVC์˜ ํ•ต์‹ฌ ๊ฐœ๋…
โ€ข ์‚ฌ์šฉ์ž(๊ฐœ๋ฐœ์ž)๊ฐ€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐฉ๋ฒ•
โ€ข ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ ˆ๋ฒจ ๋ฆฌ์†Œ์Šค
โ€ข PV์™€ ๋ฐ”์ธ๋”ฉ๋˜์–ด ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ
โ€ข Pod์—์„œ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธํ•˜์—ฌ ์‚ฌ์šฉ

๐Ÿ”— PVC์™€ PV์˜ ๋ฐ”์ธ๋”ฉ ํ”„๋กœ์„ธ์Šค

PVC๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ž๋™์œผ๋กœ ์ ํ•ฉํ•œ PV๋ฅผ ์ฐพ์•„์„œ ์—ฐ๊ฒฐ(๋ฐ”์ธ๋”ฉ)ํ•ด์ค˜์š”. ์ด ๊ณผ์ •์ด ์ •๋ง ํฅ๋ฏธ๋กœ์šด๋ฐ, ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณผ๊นŒ์š”? ๐Ÿ”

1๋‹จ๊ณ„: PVC ์ƒ์„ฑ
์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ์Šคํ† ๋ฆฌ์ง€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋‹ด์€ PVC๋ฅผ ์ƒ์„ฑํ•ด์š”. "๋‚˜๋Š” 10GB ์šฉ๋Ÿ‰์— ReadWriteOnce ๋ชจ๋“œ๊ฐ€ ํ•„์š”ํ•ด"๋ผ๊ณ  ๋ช…์‹œํ•˜๋Š” ๊ฑฐ์ฃ .

2๋‹จ๊ณ„: PV ๊ฒ€์ƒ‰
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋ชจ๋“  PV๋ฅผ ๊ฒ€์ƒ‰ํ•ด์š”. PVC์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” PV๋ฅผ ์ฐพ๋Š” ๊ฑฐ์ฃ . ์ด๋•Œ ๋‹ค์Œ ์กฐ๊ฑด๋“ค์„ ํ™•์ธํ•ด์š”:
โ€ข ์šฉ๋Ÿ‰์ด ์ถฉ๋ถ„ํ•œ๊ฐ€?
โ€ข ์ ‘๊ทผ ๋ชจ๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”๊ฐ€?
โ€ข ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๊ฐ€ ๋งž๋Š”๊ฐ€?
โ€ข ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ๊ฐ€ ์ผ์น˜ํ•˜๋Š”๊ฐ€?

3๋‹จ๊ณ„: ๋ฐ”์ธ๋”ฉ
์ ํ•ฉํ•œ PV๋ฅผ ์ฐพ์œผ๋ฉด PVC์™€ PV๋ฅผ 1:1๋กœ ๋ฐ”์ธ๋”ฉํ•ด์š”. ์ด ๊ด€๊ณ„๋Š” ๋…์ ์ ์ด์—์š”. ํ•œ ๋ฒˆ ๋ฐ”์ธ๋”ฉ๋œ PV๋Š” ๋‹ค๋ฅธ PVC๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์š”! ๐Ÿ’

4๋‹จ๊ณ„: ์‚ฌ์šฉ
๋ฐ”์ธ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด Pod์—์„œ PVC๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ ! ๐ŸŽ‰

๐Ÿ“ PVC ์ƒ์„ฑ ์˜ˆ์ œ

์‹ค์ œ PVC๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ๋ณผ๊นŒ์š”?

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  storageClassName: standard
  selector:
    matchLabels:
      type: local

์ด PVC๋Š” 8GB ์šฉ๋Ÿ‰์˜ ReadWriteOnce ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์š”์ฒญํ•˜๊ณ  ์žˆ์–ด์š”. storageClassName์ด "standard"๋กœ ์ง€์ •๋˜์–ด ์žˆ์œผ๋‹ˆ, ๊ฐ™์€ ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ PV์™€ ๋ฐ”์ธ๋”ฉ๋  ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

selector ๋ถ€๋ถ„์€ ์„ ํƒ์‚ฌํ•ญ์ด์—์š”. ํŠน์ • ๋ผ๋ฒจ์„ ๊ฐ€์ง„ PV๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ง€์ •ํ•˜๋ฉด ๋ผ์š”. ์ด ์˜ˆ์ œ์—์„œ๋Š” type: local ๋ผ๋ฒจ์„ ๊ฐ€์ง„ PV๋งŒ ์ฐพ๊ฒŒ ๋˜์ฃ .

๐Ÿš€ Pod์—์„œ PVC ์‚ฌ์šฉํ•˜๊ธฐ

PVC๋ฅผ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ์ด์ œ Pod์—์„œ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ์ฃ ? ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ผ์š”:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app-container
    image: nginx
    volumeMounts:
    - name: my-storage
      mountPath: /usr/share/nginx/html
  volumes:
  - name: my-storage
    persistentVolumeClaim:
      claimName: my-pvc

์ด Pod๋Š” my-pvc๋ผ๋Š” PVC๋ฅผ /usr/share/nginx/html ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธํ•˜๊ณ  ์žˆ์–ด์š”. ์ด์ œ nginx๊ฐ€ ์ด ๊ฒฝ๋กœ์— ์“ฐ๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋˜๋Š” ๊ฑฐ์ฃ ! ๐Ÿ“

Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•ด๋„, ๊ฐ™์€ PVC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์— ๊ณ„์† ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๊ฒŒ ๋ฐ”๋กœ Persistent Volume์˜ ํž˜์ด๋ž๋‹ˆ๋‹ค! ๐Ÿ’ช

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ
ReadWriteOnce ๋ชจ๋“œ์˜ PV๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋…ธ๋“œ์—์„œ๋งŒ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์–ด์š”. ์—ฌ๋Ÿฌ Pod๊ฐ€ ๊ฐ™์€ PVC๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ๋ชจ๋‘ ๊ฐ™์€ ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋ง๋˜์–ด์•ผ ํ•ด์š”. ๋‹ค์ค‘ ๋…ธ๋“œ ์ ‘๊ทผ์ด ํ•„์š”ํ•˜๋ฉด ReadWriteMany๋ฅผ ์ง€์›ํ•˜๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”!

โšก Dynamic Provisioning: ์ž๋™ํ™”์˜ ๋งˆ๋ฒ•

๐ŸŽช ๋™์  ํ”„๋กœ๋น„์ €๋‹์ด๋ž€?

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์€ ์ •์  ํ”„๋กœ๋น„์ €๋‹(Static Provisioning)์ด์—์š”. ๊ด€๋ฆฌ์ž๊ฐ€ ๋ฏธ๋ฆฌ PV๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ PVC๋กœ ์š”์ฒญํ•˜๋ฉด ๋งค์นญ๋˜๋Š” ๋ฐฉ์‹์ด์ฃ . ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ์ข€ ๋ถˆํŽธํ•ด์š”. ๊ด€๋ฆฌ์ž๊ฐ€ ํ•ญ์ƒ PV๋ฅผ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด์•ผ ํ•˜๊ฑฐ๋“ ์š”. ๐Ÿ˜…

๋™์  ํ”„๋กœ๋น„์ €๋‹(Dynamic Provisioning)์€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค˜์š”! PVC๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ž๋™์œผ๋กœ PV๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฑฐ์ฃ . ๋งˆ์น˜ ์žํŒ๊ธฐ์ฒ˜๋Ÿผ์š”! ๐ŸŽฐ

๋™์  ํ”„๋กœ๋น„์ €๋‹์„ ์‚ฌ์šฉํ•˜๋ฉด:
โ€ข ๊ด€๋ฆฌ์ž๊ฐ€ PV๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์–ด์š”
โ€ข ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ์ƒ์„ฑ๋ผ์š”
โ€ข ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ํŠนํžˆ ํšจ์œจ์ ์ด์—์š”
โ€ข ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์ ธ์š”

๐Ÿ—๏ธ Storage Class: ๋™์  ํ”„๋กœ๋น„์ €๋‹์˜ ํ•ต์‹ฌ

๋™์  ํ”„๋กœ๋น„์ €๋‹์˜ ํ•ต์‹ฌ์€ Storage Class์˜ˆ์š”. Storage Class๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ• ์ง€ ์ •์˜ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๊ฐ™์€ ๊ฑฐ์ฃ . ๐ŸŽจ

Storage Class์—๋Š” ๋‹ค์Œ ์ •๋ณด๋“ค์ด ๋“ค์–ด๊ฐ€์š”:
โ€ข Provisioner: ์–ด๋–ค ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ• ์ง€ (์˜ˆ: AWS EBS, GCE PD)
โ€ข Parameters: ์Šคํ† ๋ฆฌ์ง€ ์ƒ์„ฑ ์‹œ ํ•„์š”ํ•œ ์„ธ๋ถ€ ์„ค์ •
โ€ข Reclaim Policy: PVC ์‚ญ์ œ ์‹œ PV ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
โ€ข Volume Binding Mode: ๋ฐ”์ธ๋”ฉ ์‹œ์  ์ œ์–ด

๐Ÿ“‹ Storage Class ์˜ˆ์ œ

AWS EBS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Storage Class๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊นŒ์š”?

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"
  encrypted: "true"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer

์ด Storage Class๋Š” AWS EBS gp3 ํƒ€์ž…์˜ SSD๋ฅผ ์ƒ์„ฑํ•ด์š”. IOPS์™€ ์ฒ˜๋ฆฌ๋Ÿ‰๋„ ์ง€์ •๋˜์–ด ์žˆ๊ณ , ์•”ํ˜ธํ™”๋„ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ฃ . allowVolumeExpansion: true๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์„œ ๋‚˜์ค‘์— ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆด ์ˆ˜๋„ ์žˆ์–ด์š”! ๐Ÿ“ˆ

volumeBindingMode: WaitForFirstConsumer๋Š” ํŠนํžˆ ์ค‘์š”ํ•ด์š”. ์ด ์„ค์ •์€ PVC๊ฐ€ ์ƒ์„ฑ๋˜์–ด๋„ ๋ฐ”๋กœ PV๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์‹ค์ œ๋กœ Pod๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Pod์™€ ๊ฐ™์€ ๊ฐ€์šฉ ์˜์—ญ(Availability Zone)์— ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„ฑ๋Šฅ์ด ์ข‹์•„์ ธ์š”! ๐ŸŽฏ

๐Ÿ”„ ๋™์  ํ”„๋กœ๋น„์ €๋‹ ์‚ฌ์šฉํ•˜๊ธฐ

๋™์  ํ”„๋กœ๋น„์ €๋‹์„ ์‚ฌ์šฉํ•˜๋Š” PVC๋Š” ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์š”:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: dynamic-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: fast-ssd
  resources:
    requests:
      storage: 50Gi

์ด PVC๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ž๋™์œผ๋กœ:
1. fast-ssd Storage Class๋ฅผ ์ฐพ์•„์š”
2. AWS EBS provisioner๋ฅผ ํ˜ธ์ถœํ•ด์š”
3. 50GB gp3 ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•ด์š”
4. ๊ทธ ๋ณผ๋ฅจ์„ ๋‚˜ํƒ€๋‚ด๋Š” PV๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์š”
5. PVC์™€ PV๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์š”

๋ชจ๋“  ๊ฒŒ ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ ธ์š”! ๋งˆ๋ฒ• ๊ฐ™์ฃ ? โœจ

๐Ÿ’ก ํ”„๋กœ ํŒ
๋Œ€๋ถ€๋ถ„์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๊ธฐ๋ณธ Storage Class๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. PVC์—์„œ storageClassName์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ Storage Class๊ฐ€ ์‚ฌ์šฉ๋ผ์š”. kubectl get storageclass ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”!

๐ŸŒŸ ํด๋ผ์šฐ๋“œ๋ณ„ Storage Class

๊ฐ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋งˆ๋‹ค ๋‹ค์–‘ํ•œ Storage Class ์˜ต์…˜์ด ์žˆ์–ด์š”. ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”? โ˜๏ธ

AWS (Amazon Web Services)
โ€ข gp2/gp3: ๋ฒ”์šฉ SSD, ๊ฐ€์žฅ ์ผ๋ฐ˜์ 
โ€ข io1/io2: ํ”„๋กœ๋น„์ €๋‹๋œ IOPS SSD, ๊ณ ์„ฑ๋Šฅ
โ€ข st1: ์ฒ˜๋ฆฌ๋Ÿ‰ ์ตœ์ ํ™” HDD, ๋น…๋ฐ์ดํ„ฐ
โ€ข sc1: ์ฝœ๋“œ HDD, ์•„์นด์ด๋ธŒ

GCP (Google Cloud Platform)
โ€ข pd-standard: ํ‘œ์ค€ ์˜๊ตฌ ๋””์Šคํฌ
โ€ข pd-ssd: SSD ์˜๊ตฌ ๋””์Šคํฌ
โ€ข pd-balanced: ๊ท ํ˜•์žกํžŒ ์˜๊ตฌ ๋””์Šคํฌ
โ€ข pd-extreme: ์ตœ๊ณ  ์„ฑ๋Šฅ ๋””์Šคํฌ

Azure
โ€ข Standard_LRS: ํ‘œ์ค€ ๋กœ์ปฌ ์ค‘๋ณต ์Šคํ† ๋ฆฌ์ง€
โ€ข Premium_LRS: ํ”„๋ฆฌ๋ฏธ์—„ SSD
โ€ข StandardSSD_LRS: ํ‘œ์ค€ SSD
โ€ข UltraSSD_LRS: ์šธํŠธ๋ผ ๋””์Šคํฌ


๐ŸŽ“ PV์™€ PVC์˜ ์ƒ๋ช…์ฃผ๊ธฐ

๐Ÿ”„ ์ƒ๋ช…์ฃผ๊ธฐ ๋‹จ๊ณ„๋ณ„ ์ดํ•ด

PV์™€ PVC๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฑฐ์ณ์š”. ๊ฐ ๋‹จ๊ณ„๋ฅผ ์ดํ•ดํ•˜๋ฉด ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ์š”! ๐Ÿ“Š

1. Provisioning (ํ”„๋กœ๋น„์ €๋‹)
PV๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”. ์ •์  ํ”„๋กœ๋น„์ €๋‹์ด๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค๊ณ , ๋™์  ํ”„๋กœ๋น„์ €๋‹์ด๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ฃ .

2. Binding (๋ฐ”์ธ๋”ฉ)
PVC์™€ PV๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ PVC์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” PV๋ฅผ ์ฐพ์•„์„œ 1:1๋กœ ๋งค์นญํ•ด์ค˜์š”. ๋ฐ”์ธ๋”ฉ๋˜๋ฉด PV์˜ ์ƒํƒœ๊ฐ€ Bound๋กœ ๋ณ€๊ฒฝ๋ผ์š”. ๐Ÿ”—

3. Using (์‚ฌ์šฉ)
Pod๊ฐ€ PVC๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธํ•ด์„œ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”. ์ด ๋‹จ๊ณ„์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์–ด์š”. ๐Ÿ“

4. Reclaiming (ํšŒ์ˆ˜)
PVC๊ฐ€ ์‚ญ์ œ๋˜๋ฉด PV๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”. Reclaim Policy์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•ด์š”:
โ€ข Retain: PV๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์ˆ˜๋™ ์ •๋ฆฌ ํ•„์š”
โ€ข Delete: PV์™€ ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€ ๋ชจ๋‘ ์‚ญ์ œ
โ€ข Recycle: ๋ฐ์ดํ„ฐ ์‚ญ์ œ ํ›„ ์žฌ์‚ฌ์šฉ (deprecated)

๐Ÿ“Š PV ์ƒํƒœ ์ดํ•ดํ•˜๊ธฐ

PV๋Š” ์—ฌ๋Ÿฌ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์š”. kubectl get pv ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ :

์ƒํƒœ ์˜๋ฏธ ์„ค๋ช…
Available ์‚ฌ์šฉ ๊ฐ€๋Šฅ PVC์™€ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ ์ƒํƒœ
Bound ๋ฐ”์ธ๋”ฉ๋จ PVC์™€ ์—ฐ๊ฒฐ๋˜์–ด ์‚ฌ์šฉ ์ค‘
Released ํ•ด์ œ๋จ PVC๊ฐ€ ์‚ญ์ œ๋˜์—ˆ์ง€๋งŒ ์•„์ง ํšŒ์ˆ˜๋˜์ง€ ์•Š์Œ
Failed ์‹คํŒจ ์ž๋™ ํšŒ์ˆ˜๊ฐ€ ์‹คํŒจํ•œ ์ƒํƒœ

๐Ÿ” PVC ์ƒํƒœ ๋ชจ๋‹ˆํ„ฐ๋ง

PVC๋„ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ์ฃผ์š” ์ƒํƒœ๋“ค์„ ์•Œ์•„๋ณผ๊นŒ์š”?

Pending
PVC๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ ์•„์ง ์ ํ•ฉํ•œ PV๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ์ƒํƒœ์˜ˆ์š”. ์ด ์ƒํƒœ๊ฐ€ ๊ณ„์†๋˜๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•ด๋ด์•ผ ํ•ด์š”:
โ€ข ์ถฉ๋ถ„ํ•œ ์šฉ๋Ÿ‰์˜ PV๊ฐ€ ์žˆ๋Š”๊ฐ€?
โ€ข ์ ‘๊ทผ ๋ชจ๋“œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”๊ฐ€?
โ€ข Storage Class๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ๊ฐ€?
โ€ข ๋™์  ํ”„๋กœ๋น„์ €๋‹์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”๊ฐ€?

Bound
PV์™€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋œ ์ƒํƒœ์˜ˆ์š”. ์ด์ œ Pod์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽ‰

Lost
๋ฐ”์ธ๋”ฉ๋œ PV๊ฐ€ ์‚ฌ๋ผ์ง„ ์ƒํƒœ์˜ˆ์š”. ์ด๊ฑด ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ์ด๋‹ˆ ์ฆ‰์‹œ ์กฐ์‚ฌํ•ด์•ผ ํ•ด์š”! ๐Ÿšจ

๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ํŒ
PVC๊ฐ€ Pending ์ƒํƒœ์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ๋‹ค๋ฉด:
โ€ข kubectl describe pvc [pvc-name]์œผ๋กœ ์ด๋ฒคํŠธ ํ™•์ธ
โ€ข kubectl get pv๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ PV ํ™•์ธ
โ€ข Storage Class provisioner ๋กœ๊ทธ ํ™•์ธ
โ€ข ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์˜ ํ• ๋‹น๋Ÿ‰(quota) ํ™•์ธ

๐Ÿ›ก๏ธ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ๊ณผ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

๐Ÿ“ ๋ณผ๋ฅจ ํ™•์žฅ (Volume Expansion)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ์žฅํ•˜๋ฉด์„œ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ๋ถ€์กฑํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๋‹คํ–‰ํžˆ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋ณผ๋ฅจ ํ™•์žฅ์„ ์ง€์›ํ•ด์š”! ๐Ÿ“ˆ

๋ณผ๋ฅจ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด:
1. Storage Class์—์„œ allowVolumeExpansion: true ์„ค์ •
2. PVC์˜ spec.resources.requests.storage ๊ฐ’์„ ์ฆ๊ฐ€
3. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๋ณผ๋ฅจ ํฌ๊ธฐ ์กฐ์ •

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”:

# ๊ธฐ์กด PVC ์ˆ˜์ •
kubectl edit pvc my-pvc

# storage ๊ฐ’์„ 10Gi์—์„œ 20Gi๋กœ ๋ณ€๊ฒฝ
spec:
  resources:
    requests:
      storage: 20Gi  # 10Gi์—์„œ ์ฆ๊ฐ€

์ฃผ์˜ํ•  ์ ์€ ๋ณผ๋ฅจ์„ ์ถ•์†Œํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”. ์˜ค์ง ํ™•์žฅ๋งŒ ๊ฐ€๋Šฅํ•ด์š”! ๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์€ Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•ด์•ผ ํ™•์žฅ์ด ์™„๋ฃŒ๋ผ์š”. ๐Ÿ”„

๐Ÿ“ธ ๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท (Volume Snapshot)

๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท์€ ํŠน์ • ์‹œ์ ์˜ ๋ณผ๋ฅจ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์ด์—์š”. ๋ฐฑ์—…์ด๋‚˜ ๋ณต์ œ์— ์ •๋ง ์œ ์šฉํ•˜์ฃ ! ๐Ÿ“ท

์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„ธ ๊ฐ€์ง€ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•ด์š”:
โ€ข VolumeSnapshotClass: ์Šค๋ƒ…์ƒท ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ •์˜
โ€ข VolumeSnapshot: ์‹ค์ œ ์Šค๋ƒ…์ƒท ์š”์ฒญ
โ€ข VolumeSnapshotContent: ์‹ค์ œ ์Šค๋ƒ…์ƒท ๋ฐ์ดํ„ฐ

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-snapclass
  source:
    persistentVolumeClaimName: my-pvc

์Šค๋ƒ…์ƒท์„ ๋งŒ๋“ค๋ฉด ๋‚˜์ค‘์— ์ƒˆ๋กœ์šด PVC๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•์ด๋‚˜ ์žฌํ•ด ๋ณต๊ตฌ์— ์ •๋ง ์ข‹์•„์š”! ๐Ÿ’พ

๐Ÿ” ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

์Šคํ† ๋ฆฌ์ง€ ๋ณด์•ˆ์€ ์ •๋ง ์ค‘์š”ํ•ด์š”! ๋ช‡ ๊ฐ€์ง€ ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค๋ฅผ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”: ๐Ÿ›ก๏ธ

1. ์•”ํ˜ธํ™”
๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋Œ€๋ถ€๋ถ„์˜ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋Š” ์ €์žฅ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™”(encryption at rest)๋ฅผ ์ง€์›ํ•ด์š”.

AWS EBS ์˜ˆ์ œ:

parameters:
  type: gp3
  encrypted: "true"
  kmsKeyId: "arn:aws:kms:region:account:key/key-id"

2. RBAC (Role-Based Access Control)
PV์™€ PVC์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•˜์„ธ์š”. ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ์Šคํ† ๋ฆฌ์ง€์— ์ ‘๊ทผํ•  ํ•„์š”๋Š” ์—†์–ด์š”.

3. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฒฉ๋ฆฌ
PVC๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ ˆ๋ฒจ ๋ฆฌ์†Œ์Šค์˜ˆ์š”. ํŒ€์ด๋‚˜ ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์Šคํ† ๋ฆฌ์ง€๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฒฉ๋ฆฌ๋ผ์š”.

4. ์ •๊ธฐ์ ์ธ ๋ฐฑ์—…
๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท์ด๋‚˜ ์™ธ๋ถ€ ๋ฐฑ์—… ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์ •๊ธฐ์ ์œผ๋กœ ๋ฐฑ์—…ํ•˜์„ธ์š”. ์žฌํ•ด๋Š” ์˜ˆ๊ณ  ์—†์ด ์ฐพ์•„์™€์š”! ๐Ÿšจ

๐Ÿ’ฐ ๋น„์šฉ ์ตœ์ ํ™”

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์Šคํ† ๋ฆฌ์ง€๋Š” ํฐ ๋น„์šฉ ์š”์†Œ์˜ˆ์š”. ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋Š” ํŒ์„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”: ๐Ÿ’ต

1. ์ ์ ˆํ•œ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž… ์„ ํƒ
๋ชจ๋“  ์›Œํฌ๋กœ๋“œ๊ฐ€ ๊ณ ์„ฑ๋Šฅ SSD๊ฐ€ ํ•„์š”ํ•œ ๊ฑด ์•„๋‹ˆ์—์š”. ๋กœ๊ทธ๋‚˜ ๋ฐฑ์—… ๊ฐ™์€ ๊ฑด ์ €๋ ดํ•œ HDD๋กœ๋„ ์ถฉ๋ถ„ํ•ด์š”.

2. Reclaim Policy ์„ค์ •
์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” PV๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋„๋ก reclaimPolicy: Delete๋ฅผ ์„ค์ •ํ•˜์„ธ์š”. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ณ„์† ๋น„์šฉ์ด ๋ฐœ์ƒํ•ด์š”!

3. ๋ณผ๋ฅจ ํฌ๊ธฐ ์ตœ์ ํ™”
ํ•„์š” ์ด์ƒ์œผ๋กœ ํฐ ๋ณผ๋ฅจ์„ ์š”์ฒญํ•˜์ง€ ๋งˆ์„ธ์š”. ๋‚˜์ค‘์— ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ์‹œ์ž‘ํ•˜์„ธ์š”.

4. ๋ฏธ์‚ฌ์šฉ ๋ณผ๋ฅจ ๋ชจ๋‹ˆํ„ฐ๋ง
์ •๊ธฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” PV๋ฅผ ์ฐพ์•„์„œ ์ •๋ฆฌํ•˜์„ธ์š”. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ž๋™ํ™”ํ•˜๋ฉด ์ข‹์•„์š”!

# ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์€ PV ์ฐพ๊ธฐ
kubectl get pv | grep Available

# Released ์ƒํƒœ์˜ PV ์ฐพ๊ธฐ
kubectl get pv | grep Released

โšก ์„ฑ๋Šฅ ์ตœ์ ํ™”

์Šคํ† ๋ฆฌ์ง€ ์„ฑ๋Šฅ๋„ ์ค‘์š”ํ•˜์ฃ ! ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿš€

1. ๋กœ์ปฌ๋ฆฌํ‹ฐ (Locality)
Pod์™€ ๋ณผ๋ฅจ์„ ๊ฐ™์€ ๊ฐ€์šฉ ์˜์—ญ์— ๋ฐฐ์น˜ํ•˜์„ธ์š”. volumeBindingMode: WaitForFirstConsumer๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋ผ์š”.

2. IOPS์™€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์กฐ์ •
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ™์€ I/O ์ง‘์•ฝ์  ์›Œํฌ๋กœ๋“œ๋Š” ๋†’์€ IOPS๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

3. ์ ์ ˆํ•œ ํŒŒ์ผ์‹œ์Šคํ…œ ์„ ํƒ
ext4, xfs ๋“ฑ ์›Œํฌ๋กœ๋“œ์— ๋งž๋Š” ํŒŒ์ผ์‹œ์Šคํ…œ์„ ์„ ํƒํ•˜์„ธ์š”. ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์€ xfs๊ฐ€ ์ข‹๊ณ , ์ž‘์€ ํŒŒ์ผ์ด ๋งŽ์œผ๋ฉด ext4๊ฐ€ ์ข‹์•„์š”.

4. ์บ์‹ฑ ํ™œ์šฉ
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ์—์„œ ์บ์‹ฑ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋””์Šคํฌ I/O๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์–ด์š”. Redis๋‚˜ Memcached๋ฅผ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”!

๐Ÿ’ก ์žฌ๋Šฅ๋„ท ํ™œ์šฉ ํŒ
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋‚˜ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์ตœ์ ํ™”๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„๋ณด์„ธ์š”! DevOps ์—”์ง€๋‹ˆ์–ด๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ํ™˜๊ฒฝ์— ๋งž๋Š” ์ตœ์ ์˜ ์Šคํ† ๋ฆฌ์ง€ ์ „๋žต์„ ์ œ์•ˆํ•ด์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๐ŸŽฏ

๐ŸŽฏ ์‹ค์ „ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์˜ˆ์ œ

๐Ÿ’พ ์‹œ๋‚˜๋ฆฌ์˜ค 1: MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐํฌ

๊ฐ€์žฅ ํ”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐํฌ๋ฅผ ํ•ด๋ณผ๊นŒ์š”? MySQL์„ ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์™€ ํ•จ๊ป˜ ๋ฐฐํฌํ•˜๋Š” ์™„์ „ํ•œ ์˜ˆ์ œ์˜ˆ์š”! ๐Ÿ—„๏ธ

# Storage Class ์ •์˜
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: mysql-storage
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iops: "3000"
  encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
---
# PVC ์ƒ์„ฑ
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: mysql-storage
  resources:
    requests:
      storage: 20Gi
---
# MySQL Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secret
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-pvc

์ด ์˜ˆ์ œ์˜ ํฌ์ธํŠธ:
โ€ข reclaimPolicy: Retain์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ
โ€ข allowVolumeExpansion: true๋กœ ๋‚˜์ค‘์— ํ™•์žฅ ๊ฐ€๋Šฅ
โ€ข strategy: Recreate๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ
โ€ข ์•”ํ˜ธํ™” ํ™œ์„ฑํ™”๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”

๐Ÿ“ ์‹œ๋‚˜๋ฆฌ์˜ค 2: ๊ณต์œ  ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€ (NFS)

์—ฌ๋Ÿฌ Pod๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด์š”. NFS๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ์š”? ๐Ÿ“‚

# NFS PV ์ƒ์„ฑ
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: nfs-server.example.com
    path: "/shared/data"
---
# PVC ์ƒ์„ฑ
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Gi
---
# ์—ฌ๋Ÿฌ Pod์—์„œ ์‚ฌ์šฉ
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: shared-data
          mountPath: /usr/share/nginx/html
      volumes:
      - name: shared-data
        persistentVolumeClaim:
          claimName: nfs-pvc

์ด ์˜ˆ์ œ์—์„œ๋Š” 3๊ฐœ์˜ nginx Pod๊ฐ€ ๋ชจ๋‘ ๊ฐ™์€ NFS ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•ด์š”. ReadWriteMany ๋ชจ๋“œ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•œ ๊ฑฐ์ฃ ! ๐Ÿ”„

๐Ÿ”„ ์‹œ๋‚˜๋ฆฌ์˜ค 3: StatefulSet๊ณผ PVC

StatefulSet์€ ๊ฐ Pod๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด Kafka๋‚˜ Elasticsearch ๊ฐ™์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์ด์ฃ . ๐ŸŽช

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elasticsearch:7.17.0
        ports:
        - containerPort: 9200
          name: http
        - containerPort: 9300
          name: transport
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: fast-ssd
      resources:
        requests:
          storage: 50Gi

volumeClaimTemplates๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ Pod๋งˆ๋‹ค ์ž๋™์œผ๋กœ PVC๊ฐ€ ์ƒ์„ฑ๋ผ์š”. elasticsearch-0, elasticsearch-1, elasticsearch-2 ๊ฐ๊ฐ์ด ๋…๋ฆฝ์ ์ธ 50GB ๋ณผ๋ฅจ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ ! ๐ŸŽฏ

StatefulSet์˜ ์žฅ์ :
โ€ข ๊ฐ Pod๊ฐ€ ์•ˆ์ •์ ์ธ ๋„คํŠธ์›Œํฌ ID์™€ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ฐ€์ ธ์š”
โ€ข Pod๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๊ฐ™์€ PVC์— ๋‹ค์‹œ ์—ฐ๊ฒฐ๋ผ์š”
โ€ข ์ˆœ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑ/์‚ญ์ œ๋˜์–ด ์•ˆ์ „ํ•ด์š”
โ€ข ์Šค์ผ€์ผ๋งํ•  ๋•Œ ์ž๋™์œผ๋กœ PVC๊ฐ€ ์ƒ์„ฑ/์‚ญ์ œ๋ผ์š”

๐Ÿ“Š ์‹œ๋‚˜๋ฆฌ์˜ค 4: ๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท์„ ์ด์šฉํ•œ ๋ฐฑ์—…

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ •๊ธฐ์ ์ธ ๋ฐฑ์—…์ด ํ•„์ˆ˜์˜ˆ์š”. ๋ณผ๋ฅจ ์Šค๋ƒ…์ƒท์„ ํ™œ์šฉํ•œ ๋ฐฑ์—… ์ „๋žต์„ ์•Œ์•„๋ณผ๊นŒ์š”? ๐Ÿ’พ

# VolumeSnapshotClass ์ •์˜
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-snapclass
driver: ebs.csi.aws.com
deletionPolicy: Retain
---
# ์Šค๋ƒ…์ƒท ์ƒ์„ฑ
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mysql-snapshot-20240101
spec:
  volumeSnapshotClassName: csi-snapclass
  source:
    persistentVolumeClaimName: mysql-pvc
---
# ์Šค๋ƒ…์ƒท์—์„œ ๋ณต์›
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc-restored
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: mysql-storage
  dataSource:
    name: mysql-snapshot-20240101
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  resources:
    requests:
      storage: 20Gi

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด:
โ€ข ์šด์˜ ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ค‘๋‹จ ์—†์ด ๋ฐฑ์—…ํ•  ์ˆ˜ ์žˆ์–ด์š”
โ€ข ์Šค๋ƒ…์ƒท์—์„œ ์ƒˆ๋กœ์šด PVC๋ฅผ ๋งŒ๋“ค์–ด ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€๋Šฅ
โ€ข ์žฌํ•ด ๋ฐœ์ƒ ์‹œ ๋น ๋ฅด๊ฒŒ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
โ€ข ์‹œ์  ๋ณต๊ตฌ(Point-in-Time Recovery) ๊ฐ€๋Šฅ

๐ŸŽฏ ์‹ค์ „ ํŒ
CronJob์„ ์‚ฌ์šฉํ•ด์„œ ๋งค์ผ ์ž๋™์œผ๋กœ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์š”! ๊ทธ๋ฆฌ๊ณ  ์˜ค๋ž˜๋œ ์Šค๋ƒ…์ƒท์€ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ์ •์ฑ…๋„ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•˜์„ธ์š”. ์Šคํ† ๋ฆฌ์ง€ ๋น„์šฉ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฐ€์ด๋“œ

โŒ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค

๋ฌธ์ œ 1: PVC๊ฐ€ ๊ณ„์† Pending ์ƒํƒœ

์ฆ์ƒ: PVC๋ฅผ ์ƒ์„ฑํ–ˆ๋Š”๋ฐ ๊ณ„์† Pending ์ƒํƒœ์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ์–ด์š”.

์›์ธ๊ณผ ํ•ด๊ฒฐ:
โ€ข ์ ํ•ฉํ•œ PV๊ฐ€ ์—†์Œ: kubectl get pv๋กœ Available ์ƒํƒœ์˜ PV ํ™•์ธ
โ€ข ์šฉ๋Ÿ‰ ๋ถˆ์ผ์น˜: PVC๊ฐ€ ์š”์ฒญํ•œ ์šฉ๋Ÿ‰๋ณด๋‹ค ํฐ PV๊ฐ€ ํ•„์š”ํ•ด์š”
โ€ข ์ ‘๊ทผ ๋ชจ๋“œ ๋ถˆ์ผ์น˜: PV์™€ PVC์˜ accessModes๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ด์š”
โ€ข Storage Class ๋ฌธ์ œ: ๋™์  ํ”„๋กœ๋น„์ €๋‹์ด ์‹คํŒจํ–ˆ์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ: ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์˜ ๋ฆฌ์†Œ์Šค ํ• ๋‹น๋Ÿ‰์„ ํ™•์ธํ•˜์„ธ์š”

๋””๋ฒ„๊น… ๋ช…๋ น:

# PVC ์ƒ์„ธ ์ •๋ณด ํ™•์ธ
kubectl describe pvc [pvc-name]

# ์ด๋ฒคํŠธ ํ™•์ธ
kubectl get events --sort-by='.lastTimestamp'

# Storage Class ํ™•์ธ
kubectl get storageclass

# Provisioner ๋กœ๊ทธ ํ™•์ธ (์˜ˆ: AWS EBS CSI)
kubectl logs -n kube-system -l app=ebs-csi-controller

๋ฌธ์ œ 2: Pod๊ฐ€ PVC๋ฅผ ๋งˆ์šดํŠธํ•˜์ง€ ๋ชปํ•จ

์ฆ์ƒ: Pod๊ฐ€ ContainerCreating ์ƒํƒœ์—์„œ ๋ฉˆ์ถฐ์žˆ์–ด์š”.

์›์ธ๊ณผ ํ•ด๊ฒฐ:
โ€ข PVC๊ฐ€ Bound ์ƒํƒœ๊ฐ€ ์•„๋‹˜: PVC๊ฐ€ ๋จผ์ € ๋ฐ”์ธ๋”ฉ๋˜์–ด์•ผ ํ•ด์š”
โ€ข ๋…ธ๋“œ ๊ถŒํ•œ ๋ฌธ์ œ: ๋…ธ๋“œ๊ฐ€ ์Šคํ† ๋ฆฌ์ง€์— ์ ‘๊ทผํ•  ๊ถŒํ•œ์ด ์—†์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข CSI ๋“œ๋ผ์ด๋ฒ„ ๋ฌธ์ œ: CSI ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์น˜๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข ๋‹ค์ค‘ ๋…ธ๋“œ ๋งˆ์šดํŠธ: ReadWriteOnce ๋ณผ๋ฅจ์„ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์—์„œ ๋งˆ์šดํŠธํ•˜๋ ค๊ณ  ์‹œ๋„

๋””๋ฒ„๊น…:

# Pod ์ด๋ฒคํŠธ ํ™•์ธ
kubectl describe pod [pod-name]

# PVC ์ƒํƒœ ํ™•์ธ
kubectl get pvc

# ๋…ธ๋“œ์˜ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์ƒํƒœ ํ™•์ธ
kubectl get volumeattachment

๋ฌธ์ œ 3: ๋ณผ๋ฅจ ํ™•์žฅ์ด ์•ˆ ๋จ

์ฆ์ƒ: PVC์˜ storage ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผฐ๋Š”๋ฐ ์‹ค์ œ ๋ณผ๋ฅจ ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜์ง€ ์•Š์•„์š”.

์›์ธ๊ณผ ํ•ด๊ฒฐ:
โ€ข allowVolumeExpansion์ด false: Storage Class์—์„œ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ด์š”
โ€ข ํŒŒ์ผ์‹œ์Šคํ…œ ํ™•์žฅ ํ•„์š”: ์ผ๋ถ€ ์Šคํ† ๋ฆฌ์ง€๋Š” Pod ์žฌ์‹œ์ž‘์ด ํ•„์š”ํ•ด์š”
โ€ข ์˜จ๋ผ์ธ ํ™•์žฅ ๋ฏธ์ง€์›: ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์ด ์˜จ๋ผ์ธ ํ™•์žฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์š”

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

# Storage Class ํ™•์ธ
kubectl get storageclass [class-name] -o yaml

# PVC ์ƒํƒœ ํ™•์ธ
kubectl describe pvc [pvc-name]

# ํ•„์š”์‹œ Pod ์žฌ์‹œ์ž‘
kubectl rollout restart deployment [deployment-name]

๋ฌธ์ œ 4: ์„ฑ๋Šฅ์ด ๋А๋ฆผ

์ฆ์ƒ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋””์Šคํฌ I/O๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋А๋ ค์š”.

์›์ธ๊ณผ ํ•ด๊ฒฐ:
โ€ข IOPS ์ œํ•œ: ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์˜ IOPS๊ฐ€ ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์–ด์š”
โ€ข ๋„คํŠธ์›Œํฌ ์ง€์—ฐ: Pod์™€ ๋ณผ๋ฅจ์ด ๋‹ค๋ฅธ ๊ฐ€์šฉ ์˜์—ญ์— ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข ๋ฒ„์ŠคํŠธ ํฌ๋ ˆ๋”ง ์†Œ์ง„: gp2 ๊ฐ™์€ ๋ฒ„์ŠคํŠธ ๊ฐ€๋Šฅ ๋ณผ๋ฅจ์˜ ํฌ๋ ˆ๋”ง์ด ์†Œ์ง„๋˜์—ˆ์„ ์ˆ˜ ์žˆ์–ด์š”
โ€ข ๋™์‹œ ์ ‘๊ทผ: ๋„ˆ๋ฌด ๋งŽ์€ Pod๊ฐ€ ๊ฐ™์€ ๋ณผ๋ฅจ์— ์ ‘๊ทผํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:
โ€ข ๋” ๋†’์€ IOPS์˜ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝ (์˜ˆ: gp2 โ†’ gp3 ๋˜๋Š” io1)
โ€ข volumeBindingMode๋ฅผ WaitForFirstConsumer๋กœ ์„ค์ •
โ€ข ๋ณผ๋ฅจ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ ค์„œ ๊ธฐ๋ณธ IOPS ์ฆ๊ฐ€
โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ ์บ์‹ฑ ๊ตฌํ˜„

๐Ÿ” ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ด€์ฐฐ

๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋ ค๋ฉด ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ์ค‘์š”ํ•ด์š”! ๋‹ค์Œ ๋ฉ”ํŠธ๋ฆญ๋“ค์„ ์ถ”์ ํ•˜์„ธ์š”: ๐Ÿ“Š

์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰
โ€ข ์‚ฌ์šฉ ์ค‘์ธ ์šฉ๋Ÿ‰ vs ์ „์ฒด ์šฉ๋Ÿ‰
โ€ข ์šฉ๋Ÿ‰ ์ฆ๊ฐ€ ์ถ”์„ธ
โ€ข ์ž„๊ณ„๊ฐ’ ์•Œ๋ฆผ ์„ค์ • (์˜ˆ: 80% ์‚ฌ์šฉ ์‹œ)

์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ
โ€ข IOPS (์ฝ๊ธฐ/์“ฐ๊ธฐ)
โ€ข ์ฒ˜๋ฆฌ๋Ÿ‰ (MB/s)
โ€ข ์ง€์—ฐ ์‹œ๊ฐ„ (latency)
โ€ข ํ ๊นŠ์ด

๋ฆฌ์†Œ์Šค ์ƒํƒœ
โ€ข PV/PVC ๋ฐ”์ธ๋”ฉ ์ƒํƒœ
โ€ข ์‹คํŒจํ•œ ํ”„๋กœ๋น„์ €๋‹
โ€ข ์˜ค๋ž˜๋œ Released PV
โ€ข ์Šค๋ƒ…์ƒท ์„ฑ๊ณต/์‹คํŒจ์œจ

# ์œ ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ช…๋ น๋“ค
# ๋ชจ๋“  PV ์ƒํƒœ ํ™•์ธ
kubectl get pv -o wide

# PVC ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ
kubectl get pvc --all-namespaces

# ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์Šคํ† ๋ฆฌ์ง€ ์‚ฌ์šฉ๋Ÿ‰
kubectl top pvc -n [namespace]

# ์ด๋ฒคํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง
kubectl get events --watch

# ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ จ ๋ฆฌ์†Œ์Šค ์ „์ฒด ํ™•์ธ
kubectl get pv,pvc,sc,volumesnapshot --all-namespaces
โš ๏ธ ํ”„๋กœ๋•์…˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
โ€ข ์ •๊ธฐ์ ์ธ ๋ฐฑ์—… ์Šค์ผ€์ค„ ์„ค์ • โœ…
โ€ข ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ ๊ตฌ์„ฑ โœ…
โ€ข ์žฌํ•ด ๋ณต๊ตฌ ๊ณ„ํš ์ˆ˜๋ฆฝ โœ…
โ€ข ์šฉ๋Ÿ‰ ๊ณ„ํš ๋ฐ ์˜ˆ์ธก โœ…
โ€ข ๋ณด์•ˆ ์ •์ฑ… ์ ์šฉ (์•”ํ˜ธํ™”, RBAC) โœ…
โ€ข ๋น„์šฉ ์ตœ์ ํ™” ์ „๋žต โœ…

๐ŸŒŸ ๋ฏธ๋ž˜ ์ „๋ง๊ณผ ์ตœ์‹  ํŠธ๋ Œ๋“œ

๐Ÿš€ CSI (Container Storage Interface)

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€์˜ ๋ฏธ๋ž˜๋Š” CSI์˜ˆ์š”! CSI๋Š” ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์™€ ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ ์‚ฌ์ด์˜ ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค๋ž๋‹ˆ๋‹ค. ๐ŸŽฏ

CSI์˜ ์žฅ์ :
โ€ข ๋ฒค๋” ์ค‘๋ฆฝ์ : ์–ด๋–ค ์Šคํ† ๋ฆฌ์ง€ ์‹œ์Šคํ…œ์ด๋“  CSI ๋“œ๋ผ์ด๋ฒ„๋งŒ ์žˆ์œผ๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ข ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์™ธ๋ถ€ ๊ฐœ๋ฐœ: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆด๋ฆฌ์Šค์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
โ€ข ํ’๋ถ€ํ•œ ๊ธฐ๋Šฅ: ์Šค๋ƒ…์ƒท, ํด๋ก , ํ™•์žฅ ๋“ฑ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ์ง€์›
โ€ข ํ™œ๋ฐœํ•œ ์ƒํƒœ๊ณ„: ์ˆ˜๋งŽ์€ ์Šคํ† ๋ฆฌ์ง€ ๋ฒค๋”๊ฐ€ CSI ๋“œ๋ผ์ด๋ฒ„ ์ œ๊ณต

์ฃผ์š” CSI ๋“œ๋ผ์ด๋ฒ„๋“ค:
โ€ข AWS EBS CSI Driver
โ€ข GCE PD CSI Driver
โ€ข Azure Disk CSI Driver
โ€ข Ceph CSI
โ€ข NetApp Trident
โ€ข Pure Storage
โ€ข Dell EMC PowerStore

๐Ÿ”ฎ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€๋Š” ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด์š”. ์ตœ์‹  ๊ธฐ๋Šฅ๋“ค์„ ์‚ดํŽด๋ณผ๊นŒ์š”? โœจ

Volume Populator
PVC๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด S3 ๋ฒ„ํ‚ท์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ PVC์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ๐ŸŽช

Generic Ephemeral Volumes
Pod์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ํ•จ๊ป˜ํ•˜๋Š” ์ž„์‹œ ๋ณผ๋ฅจ์ด์ง€๋งŒ, PVC์ฒ˜๋Ÿผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ…Œ์ŠคํŠธ๋‚˜ ์ž„์‹œ ์ž‘์—…์— ์œ ์šฉํ•ด์š”. ๐Ÿ”„

Volume Health Monitoring
๋ณผ๋ฅจ์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์•Œ๋ฆผ์„ ๋ณด๋‚ด์ค˜์š”. ๋””์Šคํฌ ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์–ด์š”! ๐Ÿฅ

Volume Group Snapshots
์—ฌ๋Ÿฌ ๋ณผ๋ฅจ์„ ๋™์‹œ์— ์Šค๋ƒ…์ƒทํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฑ์—…์ด ํ•„์š”ํ•œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ์™„๋ฒฝํ•ด์š”. ๐Ÿ“ธ

๐ŸŒ ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ์™€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋ผ์šฐ๋“œ

์š”์ฆ˜์€ ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ์ „๋žต์ด ์ธ๊ธฐ์˜ˆ์š”. ์Šคํ† ๋ฆฌ์ง€๋„ ์ด์— ๋งž์ถฐ ์ง„ํ™”ํ•˜๊ณ  ์žˆ์ฃ ! โ˜๏ธ

Portworx: ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋œ ์Šคํ† ๋ฆฌ์ง€ ๊ฒฝํ—˜ ์ œ๊ณต
Rook: Ceph๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์‰ฝ๊ฒŒ ์šด์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ
Longhorn: Rancher์—์„œ ๋งŒ๋“  ๊ฒฝ๋Ÿ‰ ๋ถ„์‚ฐ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€
OpenEBS: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํ† ๋ฆฌ์ง€ ์†”๋ฃจ์…˜

์ด๋Ÿฐ ์†”๋ฃจ์…˜๋“ค์€ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ์˜จํ”„๋ ˆ๋ฏธ์Šค์™€ ํด๋ผ์šฐ๋“œ๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ง„์ •ํ•œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํ† ๋ฆฌ์ง€์ฃ ! ๐ŸŒŸ

๐Ÿ’ก AI/ML ์›Œํฌ๋กœ๋“œ์™€ ์Šคํ† ๋ฆฌ์ง€

AI์™€ ๋จธ์‹ ๋Ÿฌ๋‹ ์›Œํฌ๋กœ๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์Šคํ† ๋ฆฌ์ง€ ์š”๊ตฌ์‚ฌํ•ญ๋„ ๋ณ€ํ•˜๊ณ  ์žˆ์–ด์š”. ๐Ÿค–

ํŠน์ง•:
โ€ข ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์…‹: TB~PB ๋‹จ์œ„์˜ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ
โ€ข ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰: ๋น ๋ฅธ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์ด ์ค‘์š”
โ€ข ๊ณต์œ  ์ ‘๊ทผ: ์—ฌ๋Ÿฌ GPU Pod๊ฐ€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ ์ ‘๊ทผ
โ€ข ๋ฐ์ดํ„ฐ ๋ฒ„์ „ ๊ด€๋ฆฌ: ์‹คํ—˜ ์žฌํ˜„์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์Šค๋ƒ…์ƒท

์†”๋ฃจ์…˜:
โ€ข WekaFS: ๊ณ ์„ฑ๋Šฅ ๋ณ‘๋ ฌ ํŒŒ์ผ์‹œ์Šคํ…œ
โ€ข NVIDIA GPUDirect Storage: GPU๊ฐ€ ์ง์ ‘ ์Šคํ† ๋ฆฌ์ง€ ์ ‘๊ทผ
โ€ข Alluxio: ๋ฐ์ดํ„ฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”Œ๋žซํผ
โ€ข MinIO: S3 ํ˜ธํ™˜ ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€

๐ŸŽ“ ํ•™์Šต ๋ฆฌ์†Œ์Šค
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด:
โ€ข Kubernetes ๊ณต์‹ ๋ฌธ์„œ์˜ Storage ์„น์…˜
โ€ข CNCF์˜ Storage Landscape
โ€ข CSI ์ŠคํŽ™ ๋ฌธ์„œ
โ€ข ๊ฐ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์˜ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ€์ด๋“œ
โ€ข ์žฌ๋Šฅ๋„ท์˜ ํด๋ผ์šฐ๋“œ/DevOps ์ „๋ฌธ๊ฐ€๋“ค๊ณผ ์ƒ๋‹ด ๐Ÿ˜Š

๐ŸŽฌ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์™€! ์—ฌ๊ธฐ๊นŒ์ง€ ์ •๋ง ๊ธด ์—ฌ์ •์ด์—ˆ์ฃ ? ๐Ÿ˜… Persistent Volume๊ณผ PVC์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์› ์–ด์š”!

ํ•ต์‹ฌ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”? ๐Ÿ“

PV (Persistent Volume)
โ€ข ํด๋Ÿฌ์Šคํ„ฐ ๋ ˆ๋ฒจ์˜ ์Šคํ† ๋ฆฌ์ง€ ๋ฆฌ์†Œ์Šค
โ€ข ์‹ค์ œ ๋ฌผ๋ฆฌ์ /ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ถ”์ƒํ™”
โ€ข ๊ด€๋ฆฌ์ž๊ฐ€ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ฑฐ๋‚˜ ๋™์ ์œผ๋กœ ์ƒ์„ฑ
โ€ข Pod ์ƒ๋ช…์ฃผ๊ธฐ์™€ ๋…๋ฆฝ์ 

PVC (Persistent Volume Claim)
โ€ข ์‚ฌ์šฉ์ž์˜ ์Šคํ† ๋ฆฌ์ง€ ์š”์ฒญ
โ€ข ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ ˆ๋ฒจ ๋ฆฌ์†Œ์Šค
โ€ข PV์™€ 1:1 ๋ฐ”์ธ๋”ฉ
โ€ข Pod์—์„œ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธ

Storage Class
โ€ข ๋™์  ํ”„๋กœ๋น„์ €๋‹์˜ ํ•ต์‹ฌ
โ€ข ์Šคํ† ๋ฆฌ์ง€ ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ •์˜
โ€ข ๋‹ค์–‘ํ•œ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž… ์ง€์›
โ€ข ์ž๋™ํ™”์™€ ํšจ์œจ์„ฑ ์ œ๊ณต

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฑด ์ฒ˜์Œ์—๋Š” ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ PV์™€ PVC์˜ ๊ฐœ๋…์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๋ฉด, ์‹ค์ œ๋กœ๋Š” ๋งค์šฐ ์šฐ์•„ํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ช

ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ์€ ์ •๋ง ์ค‘์š”ํ•œ ์ฃผ์ œ์˜ˆ์š”. ์ปจํ…Œ์ด๋„ˆ๋Š” ์ž„์‹œ์ ์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋Š” ์˜๊ตฌ์ ์ด์–ด์•ผ ํ•˜๋‹ˆ๊นŒ์š”. PV์™€ PVC๋Š” ์ด ๋‘ ์„ธ๊ณ„๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•˜์ฃ . ๐ŸŒ‰

์‹ค๋ฌด์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š”:
โ€ข ์›Œํฌ๋กœ๋“œ ํŠน์„ฑ์— ๋งž๋Š” ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž… ์„ ํƒ
โ€ข ์ ์ ˆํ•œ ๋ฐฑ์—… ์ „๋žต ์ˆ˜๋ฆฝ
โ€ข ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ์ตœ์ ํ™”
โ€ข ๋ณด์•ˆ๊ณผ ๋น„์šฉ์„ ํ•จ๊ป˜ ๊ณ ๋ ค
โ€ข ์žฌํ•ด ๋ณต๊ตฌ ๊ณ„ํš ์ค€๋น„

์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์žŠ์ง€ ๋งˆ์„ธ์š”! ๐ŸŽฏ

ํ˜น์‹œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€ ๊ตฌ์ถ•์ด๋‚˜ ์ตœ์ ํ™”์— ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ์žฌ๋Šฅ๋„ท์—๋Š” ๋‹ค์–‘ํ•œ ํด๋ผ์šฐ๋“œ์™€ DevOps ์ „๋ฌธ๊ฐ€๋“ค์ด ์žˆ์–ด์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ๋”ฑ ๋งž๋Š” ์Šคํ† ๋ฆฌ์ง€ ์ „๋žต์„ ํ•จ๊ป˜ ๊ณ ๋ฏผํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ’ผ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์„ธ๊ณ„๋Š” ๋„“๊ณ  ๊นŠ์–ด์š”. ํ•˜์ง€๋งŒ ํ•œ ๊ฑธ์Œ์”ฉ ๋ฐฐ์›Œ๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์—ฌ์ •์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€โœจ

Happy Kubernetes-ing! ์ฆ๊ฑฐ์šด ์ฝ”๋”ฉ ๋˜์„ธ์š”! ๐Ÿ˜Š๐ŸŽ‰

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0