[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
| ํญ๋ชฉ | Static | Dynamic |
|---|---|---|
| PV ์์ฑ | ๊ด๋ฆฌ์ ์๋ | StorageClass ์๋ |
| ์ฌ์ฉ ์๊ธฐ | ๋ ๊ฑฐ์ยทํน์ | ํด๋ผ์ฐ๋ยท์ผ๋ฐ |
| ์ฅ์ | ์ธ๋ฐํ ์ ์ด | ์๋ํยทํธ๋ฆฌ |
| ๋จ์ | ์๋ ๊ด๋ฆฌ ๋ถ๋ด | StorageClass ์์กด |
2. StorageClass์ 3๋ ํต์ฌ ํ๋
Provisioner โ ์ค์ ์คํ ๋ฆฌ์ง ์์ฑ ์ฃผ์ฒด
| Provisioner | ์คํ ๋ฆฌ์ง |
|---|---|
rancher.io/local-path | ๋ ธ๋ ๋ก์ปฌ ๋์คํฌ |
efs.csi.aws.com | AWS EFS(๊ณต์ ํ์ผ์์คํ ) |
ebs.csi.aws.com | AWS EBS(๋ธ๋ก ์คํ ๋ฆฌ์ง) |
VolumeBindingMode โ PV ์์ฑ ์์
| ๋ชจ๋ | ๋์ | ์ฌ์ฉ |
|---|---|---|
| Immediate | PVC ์์ฑ ์ฆ์ ํ๋ก๋น์ ๋ | EFSยทNFS(๋ ธ๋ ์์น ๋ฌด๊ด) |
| WaitForFirstConsumer | Pod ์ค์ผ์ค๋ง ์์ ์ ์์ฑ | LocalยทEBS(๋ ธ๋ ์์น ์ค์) |
Reclaim Policy โ PVC ์ญ์ ์ ์ฒ๋ฆฌ
| ์ ์ฑ | ๋์ | ์ฌ์ฉ |
|---|---|---|
| Delete | PVยท์ค์ ์คํ ๋ฆฌ์ง ํจ๊ป ์ญ์ | ๊ฐ๋ฐ/ํ ์คํธ |
| Retain | PV ์ ์ง, ๋ฐ์ดํฐ ๋ณด์กด | ํ๋ก๋์ |
โ ๏ธ ํ๋ก๋์ ์์๋ 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 | ์ค์ ์คํ ๋ฆฌ์ง ์์ฑ ์ฃผ์ฒด |
| volumeBindingMode | PV ์์ฑ ์์ (์ฆ์/์ค์ผ์ค ํ) |
StorageClass์ ํต์ฌ์ PVC ์์ฒญ๋ง์ผ๋ก PV๊ฐ ์๋ ์์ฑ๋๊ฒ ํ๋ ๊ฒ์ด๋ค. ํ๊ฒฝ์ ๋ง๋ provisioner๋ฅผ ๊ณ ๋ฅด๊ณ , reclaimPolicy์ volumeBindingMode๋ฅผ ์ํฉ์ ๋ง๊ฒ ์ค์ ํ๋ ๊ฒ์ด ๊ด๊ฑด์ด๋ค.
Comments powered by Disqus.