Post

[Kubernetes] ์ €์žฅ ๋ณผ๋ฅจ(Storage Volume)

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์Šคํ† ๋ฆฌ์ง€ ๋ณผ๋ฅจ(Volume)์„ ์ •๋ฆฌํ•œ๋‹ค. ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์žฌ์‹œ์ž‘๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฏ€๋กœ, ๋ณผ๋ฅจ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์† ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•œ๋‹ค. ์ž„์‹œ ๋ณผ๋ฅจ(emptyDir)๋ถ€ํ„ฐ PV/PVC, ๋™์  ํ• ๋‹น(StorageClass), NFS๊นŒ์ง€ ์‚ดํŽด๋ณธ๋‹ค.

์™œ ๋ณผ๋ฅจ์ธ๊ฐ€? ์ปจํ…Œ์ด๋„ˆ ํŒŒ์ผ์‹œ์Šคํ…œ์€ ์ผ์‹œ์ (ephemeral)์ด๋ผ, ์žฌ์‹œ์ž‘ํ•˜๋ฉด ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ง€ํ‚ค๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ๊ณต์œ ํ•˜๋ ค๋ฉด ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•ด์•ผ ํ•œ๋‹ค.


1. ๋ณผ๋ฅจ ์œ ํ˜• ๊ฐœ์š”

์œ ํ˜•์ˆ˜๋ช…์šฉ๋„
emptyDirํŒŒ๋“œ์™€ ํ•จ๊ป˜(์‚ญ์ œ ์‹œ ์†Œ๋ฉธ)์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ์ž„์‹œ ๊ณต์œ 
hostPath๋…ธ๋“œ์— ์ข…์†ํ˜ธ์ŠคํŠธ ํŒŒ์ผ์‹œ์Šคํ…œ ์ ‘๊ทผ
PV / PVCํŒŒ๋“œ์™€ ๋…๋ฆฝ์˜๊ตฌ ์ €์žฅ(ํ•ต์‹ฌ)
StorageClass๋™์ PV ์ž๋™ ์ƒ์„ฑ

2. emptyDir โ€” ์ž„์‹œ ๊ณต์œ 

ํŒŒ๋“œ ์ƒ์„ฑ ์‹œ ๋นˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ƒ๊ธฐ๊ณ , ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ํ•จ๊ป˜ ์‚ฌ๋ผ์ง„๋‹ค. ํ•œ ํŒŒ๋“œ ๋‚ด ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
  name: temp-pod1
spec:
  volumes:
  - name: temp-vol
    emptyDir: {}
  containers:
  - name: container1
    image: ubuntu:14.04
    volumeMounts:
    - name: temp-vol
      mountPath: /mount1
  - name: container2
    image: ubuntu:14.04
    volumeMounts:
    - name: temp-vol
      mountPath: /mount2

๋‘ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ™์€ emptyDir์„ /mount1ยท/mount2์— ๋งˆ์šดํŠธํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.


3. hostPath โ€” ๋…ธ๋“œ ํŒŒ์ผ์‹œ์Šคํ…œ

ํ˜ธ์ŠคํŠธ ๋…ธ๋“œ์˜ ๊ฒฝ๋กœ๋ฅผ ํŒŒ๋“œ์— ๋งˆ์šดํŠธํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1
kind: Pod
metadata:
  name: host-pod1
spec:
  containers:
  - name: container
    image: ubuntu:20.04
    volumeMounts:
    - name: host-path
      mountPath: /mnt/host
  volumes:
  - name: host-path
    hostPath:
      path: /data
      type: DirectoryOrCreate

โš ๏ธ hostPath๋Š” ๋…ธ๋“œ์— ์ข…์†์ ์ด๋ผ, ํŒŒ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ฒจ๊ฐ€๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ชป ์ฐพ๋Š”๋‹ค. ํŠน์ • ๋…ธ๋“œ์˜ ํŒŒ์ผ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์“ฐ๊ณ , ์ผ๋ฐ˜์ ์ธ ์˜๊ตฌ ์ €์žฅ์—๋Š” PV/PVC๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค.


4. PV & PVC โ€” ์˜๊ตฌ ์ €์žฅ์˜ ํ•ต์‹ฌ

PV(๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ €์žฅ์†Œ) โ†” PVC(์‚ฌ์šฉ์ž์˜ ์š”์ฒญ)๋กœ ์ €์žฅ์†Œ๋ฅผ ์ถ”์ƒํ™”ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ €์žฅ์†Œ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ๋ชฐ๋ผ๋„ PVC๋กœ โ€œ1Gi ์ฃผ์„ธ์š”โ€๋ผ๊ณ  ์š”์ฒญ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

flowchart LR
    Admin["๐Ÿ‘ค ๊ด€๋ฆฌ์ž"] -- ์ƒ์„ฑ --> PV[("๐Ÿ’พ PV<br/>์‹ค์ œ ์ €์žฅ์†Œ")]
    User["๐Ÿ‘จโ€๐Ÿ’ป ์‚ฌ์šฉ์ž"] -- ์š”์ฒญ --> PVC["๐Ÿ“‹ PVC<br/>(1Gi ์š”์ฒญ)"]
    PVC -. ๋ฐ”์ธ๋”ฉ .-> PV
    Pod["๐Ÿ“ฆ Pod"] -- ๋งˆ์šดํŠธ --> PVC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# PV โ€” ๊ด€๋ฆฌ์ž๊ฐ€ ์ œ๊ณต
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: ""
  local:
    path: /mnt/data
---
# PVC โ€” ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: ""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ํŒŒ๋“œ์—์„œ PVC ์‚ฌ์šฉ
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: myapp
    image: nginx
    volumeMounts:
    - name: mypvc
      mountPath: /usr/share/nginx/html
  volumes:
  - name: mypvc
    persistentVolumeClaim:
      claimName: pvc1

๐Ÿ’ก PV/PVC ๋ถ„๋ฆฌ์˜ ์ด์  โ€” ๊ฐœ๋ฐœ์ž(์‚ฌ์šฉ์ž)๋Š” ์ €์žฅ์†Œ๊ฐ€ EBS์ธ์ง€ NFS์ธ์ง€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค. โ€œ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ•œ์ง€(PVC)โ€๋งŒ ์„ ์–ธํ•˜๋ฉด, ๊ด€๋ฆฌ์ž๊ฐ€ ์ค€๋น„ํ•œ PV์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ์ธํ”„๋ผ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ์„ค๊ณ„๋‹ค.


5. StorageClass โ€” ๋™์  ํ• ๋‹น

PV๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘์ง€ ์•Š๊ณ , PVC ์š”์ฒญ ์‹œ ์ž๋™์œผ๋กœ PV๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

1
2
3
4
5
6
7
8
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none

๐Ÿ’ก ์ •์  vs ๋™์  โ€” ์ •์ ์€ ๊ด€๋ฆฌ์ž๊ฐ€ PV๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๋Š” ๋ฐฉ์‹, ๋™์ ์€ StorageClass๊ฐ€ ์š”์ฒญ ์‹œ ์ฆ‰์„์—์„œ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํด๋ผ์šฐ๋“œ(EBSยทGCE PD)์—์„œ๋Š” ๋™์  ํ• ๋‹น์ด ํ‘œ์ค€์ด๋ผ, ๊ด€๋ฆฌ์ž๊ฐ€ ๋งค๋ฒˆ PV๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค.


6. NFS โ€” ์—ฌ๋Ÿฌ ๋…ธ๋“œ ๊ณต์œ 

์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ์ฝ๊ณ  ์“ฐ๋Š”(ReadWriteMany) ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ํ•„์š”ํ•˜๋ฉด NFS๋ฅผ ์“ด๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data
    server: nfs-server.example.com

๐Ÿ’ก ์ ‘๊ทผ ๋ชจ๋“œ ์ฐจ์ด โ€” ReadWriteOnce(RWO)๋Š” ํ•œ ๋…ธ๋“œ๋งŒ, ReadWriteMany(RWX)๋Š” ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. EBS๋Š” RWO, NFSยทEFS๋Š” RWX๋ฅผ ์ง€์›ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ํŒŒ๋“œ๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋ฉด RWX๊ฐ€ ํ•„์š”ํ•˜๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
6
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šคํ† ๋ฆฌ์ง€
โ”œโ”€ emptyDir   ํŒŒ๋“œ ์ˆ˜๋ช… ์ž„์‹œ(์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๊ณต์œ )
โ”œโ”€ hostPath   ๋…ธ๋“œ ๊ฒฝ๋กœ(๋…ธ๋“œ ์ข…์†)
โ”œโ”€ PV/PVC     ์˜๊ตฌ ์ €์žฅ(์ œ๊ณต vs ์š”์ฒญ ๋ถ„๋ฆฌ)
โ”œโ”€ StorageClass ๋™์  PV ์ž๋™ ์ƒ์„ฑ
โ””โ”€ NFS/RWX    ์—ฌ๋Ÿฌ ๋…ธ๋“œ ๋™์‹œ ๊ณต์œ 
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
PV / PVC์ €์žฅ์†Œ ์ œ๊ณต / ์š”์ฒญ
StorageClass๋™์  ํ”„๋กœ๋น„์ €๋‹
RWO / RWX๋‹จ์ผ / ๋‹ค์ค‘ ๋…ธ๋“œ ๋งˆ์šดํŠธ

์Šคํ† ๋ฆฌ์ง€์˜ ํ•ต์‹ฌ์€ PV/PVC๋กœ ์ €์žฅ์†Œ๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ณ , ํด๋ผ์šฐ๋“œ์—์„œ๋Š” StorageClass๋กœ ๋™์  ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์šฉ์ž๋Š” โ€œ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ•œ์ง€โ€๋งŒ ์„ ์–ธํ•˜๋ฉด ๋˜๋„๋ก ์„ค๊ณ„๋œ ์ ์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋‹ต๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.