๋ชฉ์ฐจ
ย Volumes
ย Docker ๋ณผ๋ฅจ
โข
๋์ปค ์ปจํ
์ด๋๋ ์ผ์์ (transient)์ด๋ค.
โข
์ปจํ
์ด๋๊ฐ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์ด๋์ ํจ๊ป ์ญ์ ๋๋ค.
โข
๊ทธ๋์ ์ปจํ
์ด๋๊ฐ ์์ฑ๋ ๋ ๋ณผ๋ฅจ์ ๋ถ์ฌ์(volume attach), ์ปจํ
์ด๋๊ฐ ๋ง๋ /์ฒ๋ฆฌํ ๋ฐ์ดํฐ๋ฅผ ๋ณผ๋ฅจ์ ์ ์ฅํ๋ค.
โข
์ปจํ
์ด๋๊ฐ ์ญ์ ๋์ด๋ ๋ณผ๋ฅจ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋จ๋๋ค.
ย Kubernetes ๋ณผ๋ฅจ
โข
์ฟ ๋ฒ๋คํฐ์ค์์ ์์ฑ๋๋ Pod ์ญ์ ๋ณธ์ง์ ์ผ๋ก ์ผ์์ ์ด๋ค.
โข
Pod๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ Pod๋ฅผ ์ญ์ ํ๋ฉด, Pod ๋ด๋ถ์ ์๋ ๋ฐ์ดํฐ๋ ํจ๊ป ์ฌ๋ผ์ง๋ค.
โข
ํด๊ฒฐ ๋ฐฉ์๋ ๋์ผํ๋ค: Pod์ ๋ณผ๋ฅจ์ ๋ถ์ธ๋ค.
โข
์ด์ Pod๊ฐ ๋ง๋ ๋ฐ์ดํฐ๋ ๋ณผ๋ฅจ์ ์ ์ฅ๋๋ฏ๋ก Pod๊ฐ ์ญ์ ๋์ด๋ ๋ฐ์ดํฐ๋ ์ ์ง๋๋ค.
ย Volume ๊ตฌํ (Single Node)
์๋๋ฆฌ์ค:
โข
๋จ์ผ ๋
ธ๋ Kubernetes ํด๋ฌ์คํฐ
โข
Pod๊ฐ 1~100 ๋์ ์์ฑ
โข
๊ฒฐ๊ณผ๋ฅผ ์ปจํ
์ด๋ ๋ด๋ถ ๊ฒฝ๋ก์ ํ์ผ(/opt/number.out)๋ก ๊ธฐ๋ก
โข
Pod ์ข
๋ฃ/์ญ์
Pod๊ฐ ์ฌ๋ผ์ ธ๋ ํ์ผ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ณผ๋ฅจ์ ๋ง๋ค๊ณ ๋ณผ๋ฅจ์ด ์ฌ์ฉํ ์คํ ๋ฆฌ์ง๋ฅผ ์ง์ ํด์ผ ํ๋ค.
โ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ์์ ํธ์คํธ์ ๋๋ ํ ๋ฆฌ๋ฅผ ์คํ ๋ฆฌ์ง๋ก ์ฐ๋ ๋ฐฉ์์ด๋ค.
โข
ํธ์คํธ์ /data ๋๋ ํ ๋ฆฌ๋ฅผ ๋ณผ๋ฅจ ์คํ ๋ฆฌ์ง๋ก ์ง์
โข
์ปจํ
์ด๋ ๋ด๋ถ์ /opt์ ๋ง์ดํธ
โข
์ปจํ
์ด๋๊ฐ /opt/number.out์ ์ฐ๋ฉด โ ์ค์ ๋ก ํธ์คํธ /data์ ์ ์ฅ๋๋ ํํ
apiVersion: v1
kind: Pod
metadata:
name: random-number-generator
spec:
containers:
- image: alpine
name: alpine
command: ["/bin/sh","-c"]
args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]
volumeMounts:
- mountPath: /opt
name: data-volume
volumes:
- name: data-volume
hostPath:
path: /data
type: Directory
YAML
๋ณต์ฌ
ย Volume ๊ตฌํ (Multi Node)
hostPath๊ฐ ๋จ์ผ ๋
ธ๋์์๋ ์ ๋์ํ์ง๋ง, ๋ฉํฐ ๋
ธ๋ ํด๋ฌ์คํฐ์์๋ ๊ถ์ฅ๋์ง ์๋๋ค. ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค:
โข
Pod๊ฐ ์ด๋ค ๋
ธ๋์ ๋ฐ์ง ๋ณด์ฅ๋์ง ์๋๋ค
โข
๋ชจ๋ ๋
ธ๋๊ฐ /data๋ผ๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ๊ณ ์์ด๋, ์๋ก ๋ค๋ฅธ ์๋ฒ์ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ์ด๋ฏ๋ก ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋๋ค
โข
์ฆ, Pod๊ฐ ๋
ธ๋๋ฅผ ์ฎ๊ฒจ๊ฐ๋ฉด ๋ฐ์ดํฐ ์ฐ์์ฑ์ด ๊นจ์ง ์ ์๋ค.
โข
๋ฉํฐ ๋
ธ๋์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ธฐ ์ํด์ ์ธ๋ถ ๊ณต์ /๋ณต์ ์คํ ๋ฆฌ์ง๊ฐ ํ์ํ๋ค
Kubernetes๋ hostPath ์ธ์๋ ๋ค์ํ ์คํ ๋ฆฌ์ง ์๋ฃจ์
์ ์ง์ํ๋ค:
โข
์จํ๋ ๋ฏธ์ค/ํด๋ฌ์คํฐ ์คํ ๋ฆฌ์ง: NFS, Flocker, Fibre Channel, CephFS, ScaleIO ๋ฑ
โข
ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋: AWS EBS, Azure Disk/File, GCP Persistent Disk ๋ฑ
๋ณผ๋ฅจ์ ์คํ ๋ฆฌ์ง ์ต์
์ผ๋ก ์คํ ๋ฆฌ์ง ์๋ฃจ์
์ ์ฌ์ฉํ๋ ค๋ฉด hostPath๋ฅผ ํด๋น ์๋ฃจ์
์ ๋ํ ํ๋๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
YAML
๋ณต์ฌ
ย Persistent Volumes
ย ๊ธฐ์กด ๋ฐฉ์
Volume์ Pod ์ ์ ํ์ผ ๋ด๋ถ์ ์ง์ ๊ตฌ์ฑํ๋ ์์ ๊ฐ์ ๋ฐฉ์์, ๋ณผ๋ฅจ์ ๋ง๋ค๊ธฐ ์ํด ํ์ํ ์คํ ๋ฆฌ์ง ์ค์ (hostPath, EBS ๋ฑ)์ด ๋งค๋ฒ Pod YAML ์์ ๋ค์ด๊ฐ๋ ๊ตฌ์กฐ์ด๋ค.
์ด ๋ฐฉ์์ ํ๊ฒฝ์ด ์ปค์ง๋ฉด ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
ย ๋ฌธ์ ์
Pod์ ๋ณผ๋ฅจ์ ์ง์ ๋ฃ๋ ๋ฐฉ์์ ๋ฌธ์ ๋ ์ฌ์ฉ์ ์๊ฐ ๋ง๊ณ , Pod๋ ๋ง์์ง๋ ํ๊ฒฝ์์ ๋ฐ์ํ๋ค.
์ฌ์ฉ์ ์๊ฐ ๋ง๊ณ , Pod๋ ๋ง์์ง๋ ํ๊ฒฝ์์๋:
โข
Pod๋ฅผ ๋ฐฐํฌํ๋ ์ฌ์ฉ์๊ฐ ๋งค๋ฒ ์คํ ๋ฆฌ์ง ์ค์ ์ ์ง์ ์์ฑํด์ผ ํ๋ค
โข
์คํ ๋ฆฌ์ง ํ์
์ด ๋ฐ๋๊ฑฐ๋ ์ค์ ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ Pod ์ ์ ํ์ผ์ ์ผ๊ด ์์ ํด์ผ ํ๋ค
โ ๊ฒฐ๊ณผ์ ์ผ๋ก ์คํ ๋ฆฌ์ง๊ฐ ๋ถ์ฐ ๊ด๋ฆฌ๋๊ณ , ์ด์/๋ณ๊ฒฝ ๋น์ฉ์ด ์ปค์ง๋ค
ย ๊ธฐ์กด ๋ฐฉ์์ ํด๊ฒฐ
์คํ ๋ฆฌ์ง๊ฐ ๋ถ์ฐ ๊ด๋ฆฌ๋๊ณ , ์ด์/๋ณ๊ฒฝ ๋น์ฉ์ด ์ปค์ง๋ ๊ธฐ์กด ๋ฐฉ์์ ํด๊ฒฐํ๊ธฐ ์ํด์ :
โข
๊ด๋ฆฌ์ง๊ฐ ํฐ ์คํ ๋ฆฌ์ง ํ(pool)์ ๋ง๋ค์ด ๋๊ณ
โข
์ฌ์ฉ์๊ฐ ํ์ํ ๋ ๊ทธ ํ์์ ํ์ํ ๋งํผ์ โ๋ผ์ดโ ์จ์ Pod์ ๋ถ์ธ๋ค
์ด ๊ฐ๋
์ด Persistent Volume(PV)์ด๋ค
Persistent Volume
PV = ๊ด๋ฆฌ์๊ฐ ๋ฏธ๋ฆฌ ํด๋ฌ์คํฐ์ ์ค๋นํด ๋ โํด๋ฌ์คํฐ ์ ์ฒดโ ์คํ ๋ฆฌ์ง ๋ฆฌ์์ค
โข
PV๋ ํด๋ฌ์คํฐ ๋ฒ์(cluster-wide) ๋ฆฌ์์ค์ด๋ค
โข
์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ์๋ PV๋ฅผ ์ง์ ๋ง์ง๋ ๋์ , PVC(Persistent Volume Claim)๋ก โํ์ํ ์คํ ๋ฆฌ์งโ๋ฅผ ์์ฒญ/์ ํํ๋ค
โ PV๋ ๊ณต๊ธ(๊ด๋ฆฌ์), PVC๋ ์๋น(์ฌ์ฉ์)์ ๊ฐ๋
์ด๋ค
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-vol1
spec:
accessModes:
- ReadWriteOnce
capacity:
starage: 1Gi
awsElasticBlockStore: # volume type์ผ๋ก hostPath๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง ํ๋ก๋์
ํ๊ฒฝ์์ ๊ถ์ฅ๋์ง ์์
volumeID: <volume-id>
fsType: ext4
YAML
๋ณต์ฌ
โข
accessModes:
โฆ
ReadOnlyMany: ์ฌ๋ฌ ๋
ธ๋์์ ์ฝ๊ธฐ ์ ์ฉ
โฆ
ReadWriteOnce: ํ ๋
ธ๋์์ ์ฝ๊ธฐ/์ฐ๊ธฐ
โฆ
ReadWriteMany: ์ฌ๋ฌ ๋
ธ๋์์ ์ฝ๊ธฐ/์ฐ๊ธฐ
โข
capacity: PV์ โ์์ฝํด ๋โ ์คํ ๋ฆฌ์ง ์ฉ๋
ย Persistent Volume Claim
PV์ PVC๋ ์๋ก ๋ค๋ฅธ ์ค๋ธ์ ํธ๋ก, PVC๋ ์ฌ์ฉ์๊ฐ ํ์ํ ์คํ ๋ฆฌ์ง๋ฅผ ์์ฒญํ๋ ๊ฐ์ฒด์ด๋ค.
ย Bind
PVC๊ฐ ์์ฑ๋๋ฉด Kubernetes๋ PVC์ ์์ฒญ ์กฐ๊ฑด(request/properties)์ ๊ธฐ์ค์ผ๋ก ์ ์ ํ PV๋ฅผ ์ฐพ์ ๋ฐ์ธ๋ฉํ๋ค.
ย ๊ท์น
๋ชจ๋ PVC๋ ๋จ ํ๋์ PV์๋ง ๋ฐ์ธ๋ฉ์ด ๋๋ 1๋1 ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์, ๋ฐ์ธ๋ฉ ์ ๊ณ ๋ ค๋๋ ์กฐ๊ฑด๋ค์ ๋งค์นญ๋์ผ ํ๋ค:
โข
capacity: ์์ฒญํ ์ฉ๋ ์ด์์ธ์ง
โข
accessModes
โข
volumeMode
โข
storageClass ๋ฑ
PV์ PVC๋ ์ ์กฐ๊ฑด๋ค์ ์ผ์น์์ผ์ผ ํ์ง๋ง capacity ๊ฐ์ ๊ฒฝ์ฐ, PVC์ ๊ฐ์ด PV๋ณด๋ค ์์ ์ ์๋ค. ์ฆ, ์์ PVC๊ฐ ๋ ํฐ PV์ ๋ถ์ ์ ์๋ค. ํ์ง๋ง PV์ ์ฌ์ ๊ณต๊ฐ์ด ์๊ธฐ๋๋ผ๋, 1๋1 ๊ด๊ณ์ด๋ฏ๋ก ๋ค๋ฅธ PVC๊ฐ ๋จ๋ ์ฉ๋์ ๋๋ ์ฐ์ง ๋ชปํ๋ค.
์กฐ๊ฑด์ ๋งค์นญ๋๋ PV๊ฐ ์์ ๊ฒฝ์ฐ, PVC๋ Pending ์ํ๋ก ๋จ๋๋ค. ์๋ก์ด PV๊ฐ ํด๋ฌ์คํฐ์ ์ ๊ณต๋๋ฉด Pending PVC๋ ์๋์ผ๋ก ๊ทธ PV์ ๋ฐ์ธ๋ฉ ๋๋ค.
ย Label + Selector
์ฌ๋ฌ ํ๋ณด๊ฐ ๋งค์นญ๋ ์ ์๋ ์ํฉ์์ ํน์ PV๋ฅผ ์ ํํ๊ณ ์ถ์ผ๋ฉด labels + selectors๋ฅผ ์ฌ์ฉํด ์ํ๋ PV๋ก ๋ฐ์ธ๋ฉํ ์ ์๋ค.
ย PVC
ย PVC ์์ฑ ์์
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 500Mi
YAML
๋ณต์ฌ
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-vol1
spec:
accessModes:
- ReadWriteOnce
capacity:
starage: 1Gi
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
YAML
๋ณต์ฌ
PV๊ฐ 1Gi์ด๊ณ , PVC๋ 500Mi์ธ ์์์ด๋ค.
โข
accessModes๊ฐ ์ผ์นํ๊ณ
โข
PV ์ฉ๋(1Gi)์ด PVC ์์ฒญ(500Mi)๋ณด๋ค ํฌ๋ฉฐ
โข
๋ค๋ฅธ ํ๋ณด PV๊ฐ ์๋ค๋ฉด
โ PVC๋ ํด๋น PV์ ๋ฐ์ธ๋ฉ ๋๋ค.
ย Reclaim Policy
PVC๋ฅผ ์ญ์ ํ๋ฉด PV๋ ์ด๋ป๊ฒ ๋๋๊ฐ์ ๋ํด์๋ reclaim policy์ ์ํด ๊ฒฐ์ ๋๋ค
1.
Retain (๊ธฐ๋ณธ)
โข
PVC๊ฐ ์ญ์ ๋ผ๋ PV๊ฐ ๋จ๋๋ค
โข
๊ด๋ฆฌ์๊ฐ ์๋์ผ๋ก ์ ๋ฆฌ/์ญ์ ํ๊ธฐ ์ ๊น์ง ์ ์ง๋๋ค
โข
๋ค๋ฅธ PVC์์ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค (์ ๋ฆฌ ์์
ํ์)
2.
Delete
โข
PVC๊ฐ ์ญ์ ๋๋ฉด PV๋ ํจ๊ป ์ญ์ ๋๋ค
โข
ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๊ฐ์ ๊ฒฝ์ฐ ์ค์ ๋ฆฌ์์ค ์ญ์ ๋ก ์ด์ด์ง ์ ์๋ค
3.
Recycle (Deprecated)
โข
PV ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ์ง์ด ๋ค ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ต์
โข
๊ณผ๊ฑฐ์๋ โRecycler Podโ๊ฐ ๋ณผ๋ฅจ์ ๋ง์ดํธํ๊ณ rm -rf ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ผ์ ์ง์ฐ๋ โbest effort wipeโ์๋ค
โข
ํ์ง๋ง ์ค๋ฌด์ ์ผ๋ก ์ถฉ๋ถํ์ง ์์ deprecated ๋์๋ค.
โฆ
์์ ํ ์ญ์ (secure erase) ๋ณด์ฅ ๋ถ๊ฐ
โฆ
์ค๋
์ท ์ฒ๋ฆฌ ๋ถ๊ฐ
โฆ
provider metadata ์ฒ๋ฆฌ ๋ถ๊ฐ
โฆ
์ง์ ํ๋ฆฌ๊ฑฐ์ธ/๋ฐฑ์๋๊ฐ ์ ํ์
โฆ
์ค์ ์ ๋ฆฌ์์๋ unmount, detach, ์ฌํฌ๋งท, ์ค๋
์ท, ์ ์ฑ
์ฒ๋ฆฌ, ์ํธํ/ํค ๋กํ
์ด์
, provider-level delete call ๋ฑ ๋ค์ํ ์์
์ด ํ์ํ ์ ์์
โฆ
rm -rf๋ inode metadata๋ฅผ ๋จ๊ธธ ์ ์๊ณ , ๊ถํ ๋ฌธ์ ๋ก ์คํจํ ์ ์์
โ ์ด๋ฌํ ์ด์์ฑ/๋ณด์ ๊ฒฉ์ฐจ ๋๋ฌธ์ Kubernetes๋ ๋ ์ต์ ๋ชจ๋ธ๋ก ์ ํํ๋ค
ย Using PVC in Pod
์์ฑ๋ PVC์ ๋ํด Pod๋ volume ์น์
์ pvc ๋ช
์ ์ ์ ํ์ผ์ ๋ฃ์ผ๋ฉด ๋๋ค. ์ด๋ ReplicaSets๋ Deployments์์๋ Pod ์น์
์์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
YAML
๋ณต์ฌ
์ด์ ๊ฒ์๋ฌผ
๋ค์ ๊ฒ์๋ฌผ

