Storage in Docker
Container Storage ๊ด๋ จ๋ ๋ด์ฉ์ 07. Docker Storage ์ ์ดํด๋ณด์.
Volume Driver Plugins in Docker
Container ๋ด์์ ์ ์ฅ๊ณต๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด Volume ์ ๋ง์ดํ ํ ๋ Volume Driver ๊ฐ ์ฌ์ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Local Driver Plugin ์ ์ฌ์ฉํ๊ณ ๋ค์ํ Driver ๊ฐ ์กด์ฌํ๋ค. RexRay Driver ์ ๊ฒฝ์ฐ AWS EBS ์ S3 ๋ฅผ Volume ์ผ๋ก ์ฌ์ฉํ ๋ ์ฐ์ธ๋ค.
docker run -it \
--name mysql
--volume-driver rexray/ebs
--mount src=ebs-vol,target=/var/lib/mysql
mysql
Docker Container ๋ฅผ ์คํํ ๋ Volume Driver ๋ฅผ ์ง์ ํด์ค ์ ์๋ค.
Container Storage Interface (CSI)
K8s ๊ฐ CRI ๋ฅผ ํตํด Docker ์ธ์๋ rkt, cri-o ๋ฑ์ Container Runtime ์ผ๋ก ์ฌ์ฉํ ์ ์๋ฏ์ด Container Storage ๋ฅผ ์ํ Interface ๋ฅผ CSI ๋ก ์ ๊ณตํ๋ค. CSI ๋ K8s ์๋ง ์ข ์์ ์ธ ๊ฒ์ด ์๋ Universal Standard ์ด๊ธฐ์ Storage Provider ๋ค์ด CSI ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑํ ์ฝ๋๊ฐ Mesos ๊ฐ์ ๋ค๋ฅธ Container Orchestration ํด์๋ ์ ์ฉ๋ ์ ์๋ค.
Ephemeral Volumes
emptyDir
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- image: alpine
name: alpine
command: ["/bin/sh", "-c"]
args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]
volumeMounts:
- mountPath: /opt
name: temp-storage
volumes:
- name: temp-storage
emptyDir: {}
Pod ๊ฐ ์์ฑ๋ ๋ ๋น ๋๋ ํฐ๋ฆฌ๋ก ์์ํ๊ณ ๋ชจ๋ ์ปจํ ์ด๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค. Pod ์ญ์ ์ ๋ฐ์ดํฐ๋ ์ญ์ ๋๋ค.
hostPath
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: DirectoryPod ๋ด Container ์๊ฒ Volume ์ ๋ง์ดํ
ํด์ฃผ๊ธฐ ์ํด ์์ ๊ฐ์ด ์ค์ ํ ์ ์๋ค. ์ ๋ด์ฉ์ Node ์ /data ๋๋ ํฐ๋ฆฌ๋ฅผ Volume ์ผ๋ก ์ฌ์ฉํ๊ณ Container ๋ด /opt ๋๋ ํฐ๋ฆฌ์ ๋ง์ดํ
ํ๊ฒ ๋ค๋ ์๋ฏธ๋ค. hostPath ์ ๊ฒฝ์ฐ Pod ๊ฐ ์ฌ์์ ์ ๋ค๋ฅธ Node ์ Scheduling ๋๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ Ephemeral Volume ์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค.
Persistent Volumes
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
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4Node ์ ๋๋ ํฐ๋ฆฌ๋ฅผ Volume ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์์ ์ค๋ช ํ์๋ฏ์ด ๋์ผํ Node ์์ Pod ๊ฐ ์ฌ์์ํ๋ค๋ ๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์ EBS ๋ฑ์ Storage ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํฉ๋ฆฌ์ ์ด๋ค.
Persistent Volumes
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-vol1
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 1Gi
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4๊ฐ Pod Definition ๋ง๋ค Volume ์ ์ค์ ํ๊ฒ ๋๋ฉด ๊ด๋ฆฌํฌ์ธํธ๊ฐ ๋์ด๋๊ธฐ ๋๋ฌธ์ ์ด์์ ์ด์ง ์๋ค. ๋๋ฌธ์ Pod ๊ฐ ๊ฐ์ ํ์ํ ๋งํผ ๋๋ ์ ์ธ ์ ์๋ Persistent Volume ์ ์ฌ์ฉํ ์ ์๋ค.
PV ์ ์ฃผ์ ํ๋๋ ์๋์ ๊ฐ๋ค.
capacity- PV ์ ์คํ ๋ฆฌ์ง ์ฉ๋์ ์ ์ํ๋ค
- PVC ๋ ์ด ์ฉ๋์ ์์ฒญํ์ฌ ์ฌ์ฉํ ์ ์๋ค
accessModes- PV ์ ์ ๊ทผ ๋ชจ๋๋ฅผ ์ ์ํ๋ค
ReadWriteOnce: ํ๋์ Node ์์ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅReadOnlyMany: ์ฌ๋ฌ Node ์์ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅReadWriteMany: ์ฌ๋ฌ Node ์์ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅ
- PV ์ ์ ๊ทผ ๋ชจ๋๋ฅผ ์ ์ํ๋ค
storageClassName- PV ์ ์ ์ฉ๋๋
StorageClass๋ฅผ ์ ์ํ๋ค - ์ ์์์์
awsElasticBlockStore๋ฅผ ์ฌ์ฉํ๋ค
- PV ์ ์ ์ฉ๋๋
persistentVolumeReclaimPolicy- PVC ๊ฐ ์ ๊ฑฐ๋ ํ PV ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํ๋ค
Retain: ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๊ณ ๋ถํ์ ์ ๊ด๋ฆฌ์๊ฐ ์๋์ผ๋ก ์ ๋ฆฌํ๋คRecycle: ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ณ PV ๋ฅผ ์ฌ์ฌ์ฉํ๋คDelete: PV ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ ๊ฑฐํ๋ค
- PVC ๊ฐ ์ ๊ฑฐ๋ ํ PV ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํ๋ค
Persistent Volume Claims
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi์์ฑ๋ Persistent Volume ์ ์ฌ์ฉํ๊ธฐ ์ํด์ Persistent Volume Claim ์ ์์ฑํด์ค์ผ ํ๋ค. Persistent Volume Claim ์ Storage Capacity, Access Mode ๋ฑ์ ๋น๊ตํ์ฌ ์ ์ ํ Persistent Volume ์ ์ฐพ๊ณ ๋ฐ์ธ๋ฉ๋๋ค. ๋ง์ฝ ์๊ตฌ์ฌํญ์ ๋ง๋ Persistent Volume ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ PVC ๋ Pending State ๋ก ๊ธฐ๋ค๋ฆฌ๊ฒ ๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: nginx
name: myfrontend
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaimPVC ๊ฐ ์์ฑ๋ ์ดํ Pod ์ ๋ง์ดํ ํ๊ธฐ ์ํด์ ์์ ๊ฐ์ด ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
Storage Class
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: google-storage
provisioner: kubernetes.io/gce-pdAWS EBS ๋ฑ์ PV ๋ก ์ฌ์ฉํ๋ ค๋ฉด AWS EBS ๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํด๋์ด์ผ ํ๋ค. ์ด๋ฅผ Static Provisioning ์ด๋ผ ํ๋๋ฐ PVC ๊ฐ PV ๋ฅผ ์๊ตฌํ ๋ ์๋์ผ๋ก EBS ๋ฅผ ์์ฑํด์ฃผ๋ ๊ฒ์ Dynamic Provisioning ์ด๋ผ ํ๋ฉฐ Storage Class ๋ฅผ ํตํด ์ด๋ค๋ผ ์ ์๋ค.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
storageClassName: google-storage
resources:
requests:
storage: 500MiSC ๋ฅผ ์์ฑํ ์ดํ PVC ๊ฐ SC ๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.