์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ถ”์  ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ž„์‹œ ๋ณผ๋ฅจ: ์Šคํ…Œ๋กœ์ด๋“œ์˜ ๋นˆDir

์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ถ”์  ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์ž„์‹œ ๋ณผ๋ฅจ: ์Šคํ…Œ๋กœ์ด๋“œ์˜ ๋นˆDir

์ผ๋ถ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜์ง€๋งŒ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ๋งค์šฐ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์บ์‹ฑ ์„œ๋น„์Šค๋Š” RAM์— ์˜ํ•ด ์ œํ•œ๋˜์ง€๋งŒ, ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ RAM๋ณด๋‹ค ๋Š๋ฆฐ ์Šคํ† ๋ฆฌ์ง€๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ์–ด ์ „์ฒด ์„ฑ๋Šฅ์— ๊ฑฐ์˜ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ํŒŒ์ผ์— ์„ค์ •์ด๋‚˜ ๋น„๋ฐ€ ํ‚ค์™€ ๊ฐ™์€ ์ผ๋ถ€ ์ฝ๊ธฐ ์ „์šฉ ์ž…๋ ฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Kubernetes์—๋Š” ์ด๋ฏธ ์—ฌ๋Ÿฌ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„์‹œ ๋ณผ๋ฅจ, ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ๊ธฐ๋Šฅ์€ K8s์— ๊ตฌํ˜„๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

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

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

  • ๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ;

  • CSI ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ถ”์ .

์ƒˆ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์žฅ์ :

  • ์ €์žฅ์†Œ๋Š” ๋กœ์ปฌ์ด๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณผ๋ฅจ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋Š” ์ง€์ •๋œ ํฌ๊ธฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์˜๊ตฌ ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹์„ ์ง€์›ํ•˜๊ณ  (์šฉ๋Ÿ‰ ์ถ”์ ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด) ํ˜ธ์ถœ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  CSI ๋“œ๋ผ์ด๋ฒ„์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. GetCapacity;

  • ๋ณผ๋ฅจ์—๋Š” ๋“œ๋ผ์ด๋ฒ„ ๋ฐ ์„ค์ •์— ๋”ฐ๋ผ ์ผ๋ถ€ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ๋ชจ๋“  ํ‘œ์ค€ ์ž‘์—…(์Šค๋ƒ…์ƒท ์ƒ์„ฑ, ํฌ๊ธฐ ์กฐ์ • ๋“ฑ)์ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

  • ๋ณผ๋ฅจ์€ ๋ชจ๋“ˆ ๋˜๋Š” ๋ณผ๋ฅจ ์‚ฌ์–‘์„ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Kubernetes ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ž์ฒด์ ์œผ๋กœ ์ ํ•ฉํ•œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ ๋” ์ด์ƒ ์Šค์ผ€์ค„๋Ÿฌ ํ™•์žฅ์„ ํ”„๋กœ๋น„์ €๋‹ ๋ฐ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ์›นํ›„ํฌ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์˜ต์…˜

๋”ฐ๋ผ์„œ ๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ์€ ๋‹ค์Œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

memcached์˜ RAM์„ ๋Œ€์ฒดํ•˜๋Š” ์˜๊ตฌ ๋ฉ”๋ชจ๋ฆฌ

memcached์˜ ์ตœ์‹  ๋ฆด๋ฆฌ์Šค ์ถ”๊ฐ€ ์ง€์› ์˜๊ตฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ(Intel Optane ๋“ฑ, ์•ฝ. ์—ญ์ž) ์ผ๋ฐ˜ RAM ๋Œ€์‹ . ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ†ตํ•ด memcached๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ CSI ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PMEM์—์„œ ํŠน์ • ํฌ๊ธฐ์˜ ๋ณผ๋ฅจ์„ ํ• ๋‹นํ•˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด PMEM-CSI.

์ž‘์—… ๊ณต๊ฐ„์œผ๋กœ์„œ์˜ LVM ๋กœ์ปฌ ์ €์žฅ์†Œ

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

๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ „์šฉ ์•ก์„ธ์Šค

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ณผ๋ฅจ์„ ํ• ๋‹นํ•˜๋ฉด ์ „์ฒด ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ณผ๋ฅจ์€ ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋“œ๋กœ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ ์‹œ์ผœ์š”

๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ

๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ์˜ ์ฃผ์š” ํŠน์ง•์€ ์ƒˆ๋กœ์šด ๋ณผ๋ฅจ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. EphemeralVolumeSource, ๋ณผ๋ฅจ ์š”์ฒญ(์—ญ์‚ฌ์ ์œผ๋กœ๋Š” ์˜๊ตฌ ๋ณผ๋ฅจ ์š”์ฒญ, PVC๋ผ๊ณ  ํ•จ)์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์ปจํŠธ๋กค๋Ÿฌ kube-controller-manager ๊ทธ๋Ÿฌํ•œ ๋ณผ๋ฅจ ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํฌ๋“œ๋ฅผ ์‚ดํŽด๋ณธ ๋‹ค์Œ ํ•ด๋‹น ํฌ๋“œ์— ๋Œ€ํ•œ PVC๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. CSI ๋“œ๋ผ์ด๋ฒ„์˜ ๊ฒฝ์šฐ ์ด ์š”์ฒญ์€ ๋‹ค๋ฅธ ์š”์ฒญ๊ณผ ๋™์ผํ•ด ๋ณด์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ํŠน๋ณ„ํ•œ ์ง€์›์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ PVC๊ฐ€ ์กด์žฌํ•˜๋Š” ํ•œ ๋ณผ๋ฅจ์˜ ๋‹ค๋ฅธ ์š”์ฒญ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ณผ๋ฅจ์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ณผ๋ฅจ์—์„œ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ์ฐธ์กฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PVC ๊ฐ์ฒด์—๋Š” ๋ณผ๋ฅจ์˜ ํ˜„์žฌ ์ƒํƒœ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ถ”์ 

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

์ƒˆ๋กœ์šด API CSIStorageCapacity์•ŒํŒŒ ๋‹จ๊ณ„์— ์žˆ๋Š” ๋Š” ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ etcd์— ์ €์žฅํ•˜์—ฌ ์Šค์ผ€์ค„๋Ÿฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ์— ๋Œ€ํ•œ ์ง€์›๊ณผ ๋‹ฌ๋ฆฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์ถ”์ ์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. external-provisioner ์ผ๋ฐ˜์„ ํ†ตํ•ด ์šด์ „์ž๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ๋œ ์šฉ๋Ÿ‰ ์ •๋ณด๋ฅผ ๊ฒŒ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. GetCapacity.

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

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

Kubernetes ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ž ์žฌ์ ์œผ๋กœ ์˜ค๋ž˜๋œ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์šฉ๋Ÿ‰์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์žฌ์‹œ๋„ ์—†์ด ์ƒ์„ฑ๋  ๊ฐ€๋Šฅ์„ฑ์€ ๋†’์•„์ง‘๋‹ˆ๋‹ค.

NB ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•ˆ์ „ํ•˜๊ฒŒ "๊ณ ์–‘์ด ์Šคํƒ ๋“œ์—์„œ ์—ฐ์Šต"ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์™„์ „ํžˆ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์˜ ๊ฒฝ์šฐ ์ง‘์ค‘ ๊ณผ์ •์—์„œ ์ž๊ฒฉ์„ ๊ฐ–์ถ˜ ๊ธฐ์ˆ  ์ง€์› ์ง€์›์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ ์ด์Šค 28์›” 30~XNUMX์ผ์— ์ง„ํ–‰๋˜๋ฉฐ, ๋ณด๋‹ค ๊ณ ๊ธ‰ ์ „๋ฌธ๊ฐ€๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฉ”๊ฐ€ 14์›” 16~XNUMX์ผ.

ะ‘ะตะทะพะฟะฐัะฝะพัั‚ัŒ

CSIS์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰

CSIStorageCapacity ๊ฐœ์ฒด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ƒ์ฃผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ CSI ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ž์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋กค์•„์›ƒํ•  ๋•Œ ๋ฐ์ดํ„ฐ์˜ ์ถœ์ฒ˜๊ฐ€ ๋ถ„๋ช…ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๊ณต๊ฐ„์˜ CSIStorageCapacity์— ๋Œ€ํ•œ RBAC ๊ถŒํ•œ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. Kubernetes๋Š” ์–ด์จŒ๋“  ์ด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„๋Š” ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ฐฐ์น˜๋˜๋ฏ€๋กœ ๊ถ๊ทน์ ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ž‘๋™ํ•˜๊ณ  ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒŒ์‹œํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ๋‚ด ์นด๋“œ๊ฐ€ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต. ์ˆ˜์—ผ๋‚œ ๋†๋‹ด์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ๋ฒˆ์—ญ๊ธฐ)

๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ

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

์˜ˆ

๋ณ„๊ฐœ์˜ ๋‚˜๋ญ‡ ๊ฐ€์ง€ PMEM-CSI์—๋Š” ์•ŒํŒŒ ๋‹จ๊ณ„์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ QEMU ๊ฐ€์ƒ ๋จธ์‹  ๋‚ด์—์„œ Kubernetes 1.19 ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋“œ๋ผ์ด๋ฒ„ ์ฝ”๋“œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋ฐฐํฌ๋งŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ ํ•ฉํ•œ ๋จธ์‹ (Linux, ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ๋„์ปค, ๋ณด๋‹ค ์—ฌ๊ธฐ์— ์„ธ๋ถ€ ์ •๋ณด) ๋‹ค์Œ ๋ช…๋ น์€ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  PMEM-CSI ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

git clone --branch=kubernetes-1-19-blog-post https://github.com/intel/pmem-csi.git
cd pmem-csi
export TEST_KUBERNETES_VERSION=1.19 TEST_FEATURE_GATES=CSIStorageCapacity=true,GenericEphemeralVolume=true TEST_PMEM_REGISTRY=intel
make start && echo && test/setup-deployment.sh

๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜๋ฉด ์ถœ๋ ฅ์— ์‚ฌ์šฉ ์ง€์นจ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

The test cluster is ready. Log in with [...]/pmem-csi/_work/pmem-govm/ssh.0, run
kubectl once logged in.  Alternatively, use kubectl directly with the
following env variable:
   KUBECONFIG=[...]/pmem-csi/_work/pmem-govm/kube.config

secret/pmem-csi-registry-secrets created
secret/pmem-csi-node-secrets created
serviceaccount/pmem-csi-controller created
...
To try out the pmem-csi driver ephemeral volumes:
   cat deploy/kubernetes-1.19/pmem-app-ephemeral.yaml |
   [...]/pmem-csi/_work/pmem-govm/ssh.0 kubectl create -f -

CSIStorageCapacity ๊ฐœ์ฒด๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ผ๋ถ€ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Golang ํ…œํ”Œ๋ฆฟ ํ•„ํ„ฐ๋Š” ์Šคํ† ๋ฆฌ์ง€ ํด๋ž˜์Šค๋ฅผ ํ‘œ์‹œํ•˜๋ฉฐ, ์ด ์˜ˆ์—์„œ๋Š” ์ด๋ฆ„, ํ† ํด๋กœ์ง€ ๋ฐ ์šฉ๋Ÿ‰์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

$ kubectl get 
        -o go-template='{{range .items}}{{if eq .storageClassName "pmem-csi-sc-late-binding"}}{{.metadata.name}} {{.nodeTopology.matchLabels}} {{.capacity}}
{{end}}{{end}}' 
        csistoragecapacities
csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 30716Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

๋‹จ์ผ ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

$ kubectl describe csistoragecapacities/csisc-6cw8j
Name:         csisc-sqdnt
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  storage.k8s.io/v1alpha1
Capacity:     30716Mi
Kind:         CSIStorageCapacity
Metadata:
  Creation Timestamp:  2020-08-11T15:41:03Z
  Generate Name:       csisc-
  Managed Fields:
    ...
  Owner References:
    API Version:     apps/v1
    Controller:      true
    Kind:            StatefulSet
    Name:            pmem-csi-controller
    UID:             590237f9-1eb4-4208-b37b-5f7eab4597d1
  Resource Version:  2994
  Self Link:         /apis/storage.k8s.io/v1alpha1/namespaces/default/csistoragecapacities/csisc-sqdnt
  UID:               da36215b-3b9d-404a-a4c7-3f1c3502ab13
Node Topology:
  Match Labels:
    pmem-csi.intel.com/node:  pmem-csi-pmem-govm-worker1
Storage Class Name:           pmem-csi-sc-late-binding
Events:                       <none>

๋‹จ์ผ ๋ฒ”์šฉ ์ž„์‹œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด์šฉ pmem-app-ephemeral.yaml:

# This example Pod definition demonstrates
# how to use generic ephemeral inline volumes
# with a PMEM-CSI storage class.
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app-inline-volume
spec:
  containers:
    - name: my-frontend
      image: intel/pmem-csi-driver-test:v0.7.14
      command: [ "sleep", "100000" ]
      volumeMounts:
      - mountPath: "/data"
        name: my-csi-volume
  volumes:
  - name: my-csi-volume
    ephemeral:
      volumeClaimTemplate:
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 4Gi
          storageClassName: pmem-csi-sc-late-binding

์œ„ ์ง€์นจ์— ํ‘œ์‹œ๋œ ๋Œ€๋กœ ์ƒ์„ฑ ํ›„ ์ด์ œ ์ถ”๊ฐ€ ํฌ๋“œ์™€ PVC๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

$ kubectl get pods/my-csi-app-inline-volume -o wide
NAME                       READY   STATUS    RESTARTS   AGE     IP          NODE                         NOMINATED NODE   READINESS GATES
my-csi-app-inline-volume   1/1     Running   0          6m58s   10.36.0.2   pmem-csi-pmem-govm-worker1   <none>           <none>
$ kubectl get pvc/my-csi-app-inline-volume-my-csi-volume
NAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
my-csi-app-inline-volume-my-csi-volume   Bound    pvc-c11eb7ab-a4fa-46fe-b515-b366be908823   4Gi        RWO            pmem-csi-sc-late-binding   9m21s

PVC ์†Œ์œ ์ž - ์•„๋ž˜:

$ kubectl get -o yaml pvc/my-csi-app-inline-volume-my-csi-volume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    pv.kubernetes.io/bind-completed: "yes"
    pv.kubernetes.io/bound-by-controller: "yes"
    volume.beta.kubernetes.io/storage-provisioner: pmem-csi.intel.com
    volume.kubernetes.io/selected-node: pmem-csi-pmem-govm-worker1
  creationTimestamp: "2020-08-11T15:44:57Z"
  finalizers:
  - kubernetes.io/pvc-protection
  managedFields:
    ...
  name: my-csi-app-inline-volume-my-csi-volume
  namespace: default
  ownerReferences:
  - apiVersion: v1
    blockOwnerDeletion: true
    controller: true
    kind: Pod
    name: my-csi-app-inline-volume
    uid: 75c925bf-ca8e-441a-ac67-f190b7a2265f
...

๋‹ค์Œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. pmem-csi-pmem-govm-worker1:

csisc-2js6n map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker2] 30716Mi
csisc-sqdnt map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker1] 26620Mi
csisc-ws4bv map[pmem-csi.intel.com/node:pmem-csi-pmem-govm-worker3] 30716Mi

๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— 26620Mi ์ด์ƒ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ด๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. pmem-csi-pmem-govm-worker1 ์–ด์จŒ๋“ .

๋‹ค์Œ์€ ๋ญ์ง€?

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

์ถœ์ฒ˜ : habr.com

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