Post

[Kubernetes] StorageClass

๐Ÿ“Œ ๊ฐœ์š”

ํ•œ ์ค„ ์š”์•ฝ: ๋™์  ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹์„ ์œ„ํ•œ ์Šคํ† ๋ฆฌ์ง€ ํ…œํ”Œ๋ฆฟ ๋ฆฌ์†Œ์Šค

์–ธ์ œ ์‚ฌ์šฉ:

  • PVC ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ PV๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ์—ฌ๋Ÿฌ ์Šคํ† ๋ฆฌ์ง€ ํƒ€์ž…(EFS, EBS, Local Path ๋“ฑ)์„ ๊ตฌ๋ถ„ํ•ด์„œ ์‚ฌ์šฉํ•  ๋•Œ
  • Tekton Pipeline์—์„œ Workspace ๋ณผ๋ฅจ์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ๋•Œ

๊ด€๋ จ ๊ธฐ์ˆ : PersistentVolume, PersistentVolumeClaim, CSI Driver, Tekton Workspace


๐ŸŽฏ ํ•ต์‹ฌ ๊ฐœ๋…

Static vs Dynamic Provisioning

ํ•ญ๋ชฉStatic ProvisioningDynamic Provisioning
PV ์ƒ์„ฑ๊ด€๋ฆฌ์ž๊ฐ€ ์ˆ˜๋™ ์ƒ์„ฑStorageClass๊ฐ€ ์ž๋™ ์ƒ์„ฑ
์‚ฌ์šฉ ์‹œ๊ธฐ๋ ˆ๊ฑฐ์‹œ, ํŠน์ˆ˜ ์Šคํ† ๋ฆฌ์ง€ํด๋ผ์šฐ๋“œ, ์ผ๋ฐ˜์  ์‚ฌ์šฉ
์žฅ์ ์„ธ๋ฐ€ํ•œ ์ œ์–ด์ž๋™ํ™”, ํŽธ๋ฆฌ
๋‹จ์ ์ˆ˜๋™ ๊ด€๋ฆฌ ๋ถ€๋‹ดStorageClass ์˜์กด
1
2
3
4
5
[Static]
๊ด€๋ฆฌ์ž๊ฐ€ PV ๋ฏธ๋ฆฌ ์ƒ์„ฑ โ†’ PVC๊ฐ€ ๊ธฐ์กด PV๋ฅผ ์ฐพ์•„์„œ ๋ฐ”์ธ๋”ฉ

[Dynamic]
PVC ์ƒ์„ฑ โ†’ StorageClass๊ฐ€ PV ์ž๋™ ์ƒ์„ฑ ๋ฐ ๋ฐ”์ธ๋”ฉ

Provisioner

์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฃผ์ฒด๋กœ, ๊ฐ Provisioner๋งˆ๋‹ค ๊ณ ์œ ํ•œ parameters ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

VolumeBindingMode

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

Reclaim Policy

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

๐Ÿ’ป ๊ธฐ๋ณธ ๋ช…๋ น์–ด

1
2
3
4
5
6
7
8
# StorageClass ๋ชฉ๋ก ์กฐํšŒ
kubectl get sc

# StorageClass ์ƒ์„ธ ํ™•์ธ
kubectl describe sc <sc-name>

# ํŠน์ • StorageClass๋ฅผ ์‚ฌ์šฉํ•˜๋Š” PVC ์กฐํšŒ
kubectl get pvc -A | grep <sc-name>

์ถœ๋ ฅ ์˜ˆ์‹œ:

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

๐Ÿ”ง ์ž์ฃผ ์“ฐ๋Š” ํŒจํ„ด

ํŒจํ„ด 1: local-path (๊ธฐ๋ณธ StorageClass)

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

ํŠน์ง•:

  • WaitForFirstConsumer: Pod๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ๋…ธ๋“œ์—์„œ ๋ณผ๋ฅจ ์ƒ์„ฑ
  • PVC๋งŒ ์ƒ์„ฑํ•˜๋ฉด Pending ์ƒํƒœ โ†’ Pod ์ƒ์„ฑ ์‹œ PV ์ž๋™ ์ƒ์„ฑ
  • ๋…ธ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ  ๋ถˆ๊ฐ€ (Local Storage)
1
2
3
4
5
6
7
PVC ์ƒ์„ฑ โ†’ Pending
    โ†“
Pod ์Šค์ผ€์ค„๋ง (๋…ธ๋“œ ๊ฒฐ์ •)
    โ†“
ํ•ด๋‹น ๋…ธ๋“œ์— PV ์ž๋™ ์ƒ์„ฑ โ†’ Bound
    โ†“
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: PVC ์ƒ์„ฑ ์ฆ‰์‹œ PV ํ”„๋กœ๋น„์ €๋‹
  • ์—ฌ๋Ÿฌ Pod/๋…ธ๋“œ์—์„œ ๋™์‹œ ReadWriteMany ๊ฐ€๋Šฅ
  • Tekton Pipeline Workspace ๊ณต์œ ์— ์ ํ•ฉ

ํŒจํ„ด 3: Tekton Pipeline 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   # StorageClass ์ง€์ •
        resources:
          requests:
            storage: 1Gi

Tekton ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ:

  • volumeClaimTemplate: PipelineRun๋งˆ๋‹ค ์ƒˆ๋กœ์šด PVC ์ž๋™ ์ƒ์„ฑ
  • local-path (WaitForFirstConsumer): Task Pod๊ฐ€ ์Šค์ผ€์ค„๋ง๋œ ํ›„ ๋ณผ๋ฅจ ์ƒ์„ฑ
  • Workspace ๊ฒฝ๋กœ: $(workspaces.<name>.path) โ†’ /workspace/<name>

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

volumeBindingMode ํ˜ผ๋™

1
2
3
4
5
โŒ local-path๋ฅผ Immediate๋กœ ์„ค์ •
โ†’ PVC ์ƒ์„ฑ ์‹œ ํŠน์ • ๋…ธ๋“œ ์„ ํƒ ๋ถˆ๊ฐ€๋กœ ์‹คํŒจ

โœ… local-path๋Š” WaitForFirstConsumer ์œ ์ง€
โ†’ Pod ์Šค์ผ€์ค„๋ง ํ›„ ํ•ด๋‹น ๋…ธ๋“œ์— ๋ณผ๋ฅจ ์ƒ์„ฑ

default StorageClass ์ค‘๋ณต ์„ค์ •

1
2
3
4
5
6
7
8
9
# default StorageClass ํ™•์ธ
kubectl get sc

# (default) ํ‘œ์‹œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด PVC ๋ฐ”์ธ๋”ฉ ํ˜ผ๋ž€ ๋ฐœ์ƒ
# โ†’ ํ•˜๋‚˜๋งŒ default๋กœ ์œ ์ง€

# default ํ•ด์ œ
kubectl patch sc <sc-name> \
  -p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

PVC Pending ์ƒํƒœ ๋””๋ฒ„๊น…

1
2
3
4
5
6
7
8
# ์›์ธ ํ™•์ธ
kubectl describe pvc <pvc-name> -n <namespace>

# ์ฃผ์š” ์›์ธ:
# - WaitForFirstConsumer โ†’ Pod ์•„์ง ์ƒ์„ฑ ์•ˆ ๋จ (์ •์ƒ)
# - ์กฐ๊ฑด ๋งž๋Š” PV ์—†์Œ
# - StorageClass ์ด๋ฆ„ ์˜คํƒ€
# - ๋…ธ๋“œ ๋””์Šคํฌ ์šฉ๋Ÿ‰ ๋ถ€์กฑ

๐Ÿ“ ์š”์•ฝ

1
2
3
4
5
6
7
8
9
10
11
12
StorageClass:
- ๋™์  ๋ณผ๋ฅจ ํ”„๋กœ๋น„์ €๋‹ ํ…œํ”Œ๋ฆฟ
- Provisioner๊ฐ€ ์‹ค์ œ ์Šคํ† ๋ฆฌ์ง€ ์ƒ์„ฑ

ํ•ต์‹ฌ ํ•„๋“œ:
- provisioner: ์Šคํ† ๋ฆฌ์ง€ ์ƒ์„ฑ ์ฃผ์ฒด
- reclaimPolicy: PVC ์‚ญ์ œ ์‹œ PV ์ฒ˜๋ฆฌ ๋ฐฉ์‹
- volumeBindingMode: PV ์ƒ์„ฑ ์‹œ์  (์ฆ‰์‹œ or Pod ์Šค์ผ€์ค„๋ง ํ›„)

ํ™˜๊ฒฝ๋ณ„ ์„ ํƒ:
- local-path: ๋‹จ์ผ ๋…ธ๋“œ, ๋น ๋ฅธ I/O (Tekton ์ปดํŒŒ์ผ ๋“ฑ)
- efs-sc: ๋‹ค์ค‘ ๋…ธ๋“œ ๊ณต์œ  (ReadWriteMany ํ•„์š” ์‹œ)

๐Ÿ”— ๊ด€๋ จ ๋ฌธ์„œ

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

Comments powered by Disqus.