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 ํด์๋ ์ ์ฉ๋ ์ ์๋ค.
Persistent Volumes
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
hostPath:
path: /data
type: Directory
Pod ๋ด Container ์๊ฒ Volume ์ ๋ง์ดํ
ํด์ฃผ๊ธฐ ์ํด ์์ ๊ฐ์ด ์ค์ ํ ์ ์๋ค. ์ ๋ด์ฉ์ Node ์ /data
๋๋ ํฐ๋ฆฌ๋ฅผ Volume ์ผ๋ก ์ฌ์ฉํ๊ณ Container ๋ด /opt
๋๋ ํฐ๋ฆฌ์ ๋ง์ดํ
ํ๊ฒ ๋ค๋ ์๋ฏธ๋ค.
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID: <volume-id>
fsType: ext4
Node ์ ๋๋ ํฐ๋ฆฌ๋ฅผ Volume ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค 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 ์ ์ฌ์ฉํ ์ ์๋ค.
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: myclaim
PVC ๊ฐ ์์ฑ๋ ์ดํ Pod ์ ๋ง์ดํ ํ๊ธฐ ์ํด์ ์์ ๊ฐ์ด ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
Storage Class
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: google-storage
provisioner: kubernetes.io/gce-pd
AWS 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: 500Mi
SC ๋ฅผ ์์ฑํ ์ดํ PVC ๊ฐ SC ๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.