Post

[Kubernetes] StorageClass

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

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ StorageClass๋ฅผ ์ •๋ฆฌํ•œ๋‹ค. PVC๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ๊ด€๋ฆฌ์ž๊ฐ€ PV๋ฅผ ์†์ˆ˜ ๋งŒ๋“ค์ง€ ์•Š์•„๋„, StorageClass๊ฐ€ ๋ณผ๋ฅจ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ(๋™์  ํ”„๋กœ๋น„์ €๋‹)ํ•ด์ค€๋‹ค. Tekton Pipeline์˜ Workspace ๋ณผ๋ฅจ์„ ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ์ƒํ™ฉ๊นŒ์ง€ ํ•จ๊ป˜ ์‚ดํŽด๋ณธ๋‹ค.

StorageClass๋ž€? ๋™์  ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹์„ ์œ„ํ•œ ์Šคํ† ๋ฆฌ์ง€ ํ…œํ”Œ๋ฆฟ ๋ฆฌ์†Œ์Šค. PVC๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ์ง€์ •๋œ Provisioner๊ฐ€ ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€(EBSยทEFSยทLocal ๋“ฑ)๋ฅผ ๋งŒ๋“ค๊ณ  PV๋ฅผ ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•œ๋‹ค.

์–ธ์ œ ์“ฐ๋‚˜ โ€” PVC ์ƒ์„ฑ ์‹œ PV ์ž๋™ ์ƒ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ, ์—ฌ๋Ÿฌ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•ด ์“ธ ๋•Œ, Tekton Workspace ๋ณผ๋ฅจ์„ ๋™์  ์ƒ์„ฑํ•  ๋•Œ.


1. Static vs Dynamic Provisioning

ํ•ต์‹ฌ์€ PV๋ฅผ ๋ˆ„๊ฐ€ ๋งŒ๋“œ๋А๋ƒ๋‹ค. ์ •์ ์€ ๊ด€๋ฆฌ์ž๊ฐ€, ๋™์ ์€ StorageClass๊ฐ€ ๋งŒ๋“ ๋‹ค.

flowchart LR
    subgraph Static["Static"]
        A1["๊ด€๋ฆฌ์ž๊ฐ€ PV ๋ฏธ๋ฆฌ ์ƒ์„ฑ"] --> A2["PVC๊ฐ€ ๊ธฐ์กด PV ๋ฐ”์ธ๋”ฉ"]
    end
    subgraph Dynamic["Dynamic"]
        B1["PVC ์ƒ์„ฑ"] --> B2["StorageClass๊ฐ€ PV ์ž๋™ ์ƒ์„ฑยท๋ฐ”์ธ๋”ฉ"]
    end
ํ•ญ๋ชฉStaticDynamic
PV ์ƒ์„ฑ๊ด€๋ฆฌ์ž ์ˆ˜๋™StorageClass ์ž๋™
์‚ฌ์šฉ ์‹œ๊ธฐ๋ ˆ๊ฑฐ์‹œยทํŠน์ˆ˜ํด๋ผ์šฐ๋“œยท์ผ๋ฐ˜
์žฅ์ ์„ธ๋ฐ€ํ•œ ์ œ์–ด์ž๋™ํ™”ยทํŽธ๋ฆฌ
๋‹จ์ ์ˆ˜๋™ ๊ด€๋ฆฌ ๋ถ€๋‹ดStorageClass ์˜์กด

2. StorageClass์˜ 3๋Œ€ ํ•ต์‹ฌ ํ•„๋“œ

Provisioner โ€” ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€ ์ƒ์„ฑ ์ฃผ์ฒด

Provisioner์Šคํ† ๋ฆฌ์ง€
rancher.io/local-path๋…ธ๋“œ ๋กœ์ปฌ ๋””์Šคํฌ
efs.csi.aws.comAWS EFS(๊ณต์œ  ํŒŒ์ผ์‹œ์Šคํ…œ)
ebs.csi.aws.comAWS EBS(๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€)

VolumeBindingMode โ€” PV ์ƒ์„ฑ ์‹œ์ 

๋ชจ๋“œ๋™์ž‘์‚ฌ์šฉ
ImmediatePVC ์ƒ์„ฑ ์ฆ‰์‹œ ํ”„๋กœ๋น„์ €๋‹EFSยทNFS(๋…ธ๋“œ ์œ„์น˜ ๋ฌด๊ด€)
WaitForFirstConsumerPod ์Šค์ผ€์ค„๋ง ์‹œ์ ์— ์ƒ์„ฑLocalยทEBS(๋…ธ๋“œ ์œ„์น˜ ์ค‘์š”)

Reclaim Policy โ€” PVC ์‚ญ์ œ ์‹œ ์ฒ˜๋ฆฌ

์ •์ฑ…๋™์ž‘์‚ฌ์šฉ
DeletePVยท์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€ ํ•จ๊ป˜ ์‚ญ์ œ๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ
RetainPV ์œ ์ง€, ๋ฐ์ดํ„ฐ ๋ณด์กดํ”„๋กœ๋•์…˜

โš ๏ธ ํ”„๋กœ๋•์…˜์—์„œ๋Š” Reclaim Policy๋ฅผ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜์ž. ๊ธฐ๋ณธ Delete๋กœ ๋‘๋ฉด PVC๋ฅผ ์ง€์šฐ๋Š” ์ˆœ๊ฐ„ ์‹ค์ œ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์‚ฌ๋ผ์ง„๋‹ค. ์ง€์ผœ์•ผ ํ•  ๋ฐ์ดํ„ฐ๋Š” Retain์œผ๋กœ ์„ค์ •ํ•ด์•ผ ์•ˆ์ „ํ•˜๋‹ค.


3. ๊ธฐ๋ณธ ๋ช…๋ น์–ด

1
2
3
kubectl get sc                          # StorageClass ๋ชฉ๋ก
kubectl describe sc <sc-name>           # ์ƒ์„ธ
kubectl get pvc -A | grep <sc-name>     # ์‚ฌ์šฉํ•˜๋Š” PVC ์กฐํšŒ
1
2
3
NAME                PROVISIONER              RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION
efs-sc              efs.csi.aws.com          Delete          Immediate              false
local-path(default) rancher.io/local-path    Delete          WaitForFirstConsumer   false

4. ์ž์ฃผ ์“ฐ๋Š” ํŒจํ„ด

ํŒจํ„ด 1 โ€” local-path (๊ธฐ๋ณธ, ๋‹จ์ผ ๋…ธ๋“œ)

HyperCloud/Rancher ํ™˜๊ฒฝ์˜ ๊ธฐ๋ณธ StorageClass๋‹ค.

1
2
3
4
5
6
7
8
9
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-path
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
1
2
3
PVC ์ƒ์„ฑ โ†’ Pending
    โ†“ Pod ์Šค์ผ€์ค„๋ง(๋…ธ๋“œ ๊ฒฐ์ •)
ํ•ด๋‹น ๋…ธ๋“œ์— PV ์ž๋™ ์ƒ์„ฑ โ†’ Bound โ†’ Pod ๊ธฐ๋™

WaitForFirstConsumer๋ผ PVC๋งŒ ๋งŒ๋“ค๋ฉด Pending์ด๊ณ , Pod๊ฐ€ ์Šค์ผ€์ค„๋  ๋…ธ๋“œ๊ฐ€ ์ •ํ•ด์ ธ์•ผ ๊ทธ ๋…ธ๋“œ์— ๋ณผ๋ฅจ์ด ์ƒ๊ธด๋‹ค. ๋…ธ๋“œ ๊ฐ„ ๊ณต์œ ๋Š” ๋ถˆ๊ฐ€ํ•˜๋‹ค.

ํŒจํ„ด 2 โ€” efs-sc (๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€)

์—ฌ๋Ÿฌ Pod/๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ๋•Œ ์“ด๋‹ค.

1
2
3
4
5
6
7
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
reclaimPolicy: Delete
volumeBindingMode: Immediate

Immediate + ReadWriteMany๋กœ ๋‹ค์ค‘ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ด, Tekton Pipeline Workspace ๊ณต์œ ์— ์ ํ•ฉํ•˜๋‹ค.

ํŒจํ„ด 3 โ€” Tekton Workspace์—์„œ ์‚ฌ์šฉ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: tekton.dev/v1beta1
kind: PipelineRun
metadata:
  name: build-pipeline-run
spec:
  pipelineRef:
    name: build-pipeline
  workspaces:
  - name: shared-workspace
    volumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        storageClassName: local-path
        resources:
          requests:
            storage: 1Gi

volumeClaimTemplate์€ PipelineRun๋งˆ๋‹ค ์ƒˆ PVC๋ฅผ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค. Workspace ๊ฒฝ๋กœ๋Š” $(workspaces.<name>.path) โ†’ /workspace/<name>.


5. ์ฃผ์˜์‚ฌํ•ญ (ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…)

โš ๏ธ volumeBindingMode ํ˜ผ๋™ โ€” local-path๋ฅผ Immediate๋กœ ์„ค์ •ํ•˜๋ฉด ๋…ธ๋“œ ์„ ํƒ ๋ถˆ๊ฐ€๋กœ ์‹คํŒจํ•œ๋‹ค. local-path๋Š” WaitForFirstConsumer๋ฅผ ์œ ์ง€ํ•ด์•ผ Pod ์Šค์ผ€์ค„ ํ›„ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ณผ๋ฅจ์ด ์ƒ๊ธด๋‹ค.

โš ๏ธ default StorageClass ์ค‘๋ณต โ€” (default) ํ‘œ์‹œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด PVC ๋ฐ”์ธ๋”ฉ์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์ง„๋‹ค. ํ•˜๋‚˜๋งŒ default๋กœ ๋‘์ž.

1
2
kubectl patch sc <sc-name> \
  -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

PVC Pending ๋””๋ฒ„๊น… โ€” kubectl describe pvc <์ด๋ฆ„> -n <ns>๋กœ ์›์ธ ํ™•์ธ. ์ฃผ์š” ์›์ธ: WaitForFirstConsumer(์ •์ƒ), ์กฐ๊ฑด ๋งž๋Š” PV ์—†์Œ, StorageClass ์ด๋ฆ„ ์˜คํƒ€, ๋…ธ๋“œ ๋””์Šคํฌ ๋ถ€์กฑ.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
StorageClass
โ”œโ”€ ๊ฐœ๋…   ๋™์  ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹ ํ…œํ”Œ๋ฆฟ
โ”œโ”€ ํ•„๋“œ   provisioner(์ƒ์„ฑ์ฃผ์ฒด) / reclaimPolicy(์‚ญ์ œ์ฒ˜๋ฆฌ) / volumeBindingMode(์ƒ์„ฑ์‹œ์ )
โ”œโ”€ ์„ ํƒ   local-path(๋‹จ์ผ๋…ธ๋“œยท๋น ๋ฅธIO) / efs-sc(๋‹ค์ค‘๋…ธ๋“œ ๊ณต์œ )
โ””โ”€ ์ฃผ์˜   ๋ฐ”์ธ๋”ฉ๋ชจ๋“œ ํ˜ผ๋™, default ์ค‘๋ณต, Pending ๋””๋ฒ„๊น…
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
StorageClass๋™์  PV ์ƒ์„ฑ ํ…œํ”Œ๋ฆฟ
Provisioner์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€ ์ƒ์„ฑ ์ฃผ์ฒด
volumeBindingModePV ์ƒ์„ฑ ์‹œ์ (์ฆ‰์‹œ/์Šค์ผ€์ค„ ํ›„)

StorageClass์˜ ํ•ต์‹ฌ์€ PVC ์š”์ฒญ๋งŒ์œผ๋กœ PV๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ™˜๊ฒฝ์— ๋งž๋Š” provisioner๋ฅผ ๊ณ ๋ฅด๊ณ , reclaimPolicy์™€ volumeBindingMode๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด๋‹ค.


๐Ÿ”— ์ฐธ๊ณ 

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

Comments powered by Disqus.