[k8s] Persistent Volume
๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์ด๋๋ค์ ์ง์์ ์ธ ์ํ๋ฅผ ๊ฐ์ง์ง ์๋๋ค.
์ด๊ฑด docker์ docker ๋ฒ ์ด์ค์ธ ์ฟ ๋ฒ์์ ๋์ผํ๊ฒ ๋ํ๋๋ ํ์์ด๋ค.
์๋ฅผ ๋ค์ด, ์ปจํ ์ด๋ ์์์ ํ์ผ์ ์ถ๊ฐํ ์ํ์์ ์ปจํ ์ด๋๋ฅผ ์ฃฝ์ด๊ณ ๋์ผํ ์ด๋ฏธ์ง๋ก ๋์ฐ๋๋ผ๋, "์ด๋ฏธ์ง" ์์ ์ ์ํ๋ง ๊ฐ๊ณ ์๊ณ , ์ด์ ์ ์ปจํ ์ด๋์์ ์ถ๊ฐํ๋ ํ์ผ์ ์ฆ๋ฐํ ์ฑ์ผ ๊ฒ์ด๋ค.
์ด๋ฐ statelessํ ํํ๋ ์ง์์ ์ธ ๊ด๋ฆฌ์ ๋ฉ๋ฆฌํธ๋ฅผ ์ฃผ๊ธฐ๋ ํ์ง๋ง, ์ํ๊ฐ ์ ์ค๋๋ค๋ ์ ์์ ํ๊ณ๋ ์๋ค.
docker๋ ์ฟ ๋ฒ๋คํฐ์ค๋ ๋ณผ๋ฅจ์ด๋ผ๋ ์ํ๊ด๋ฆฌ ๋งค์ปค๋์ฆ์ ํ์ฉํด์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
๋ณผ๋ฅจ์ ์ปจํ
์ด๋๊ฐ ์ฌ์์๋๋๋ผ๋ ์ํ๊ฐ ์ ์ง๋๋ค. ์ ์ฅํ ํ์ผ ๊ฐ์ ๊ฒ๋ค์ด ๋ ๋ผ๊ฐ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
๋ณผ๋ฅจ์๋ ์์(ephemeral) ๋ณผ๋ฅจ๊ณผ ํผ์์คํดํธ(persistent) ๋ณผ๋ฅจ ๋ฑ์ด ์กด์ฌํ๋ค.
์์ ๋ณผ๋ฅจ์ ์๋ช
์ด ํ๋์ ์ข
์๋๋ค. ํ๋๊ฐ ์ฃฝ์ผ๋ฉด ๊ทธ๋๋ก ์ํ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ด๋ค.
ํผ์์คํดํธ ๋ณผ๋ฅจ์ ์ง์ ์ญ์ ํ์ง ์๋ ํ ์ํ๊ฐ ์๊ตฌ์ ์ผ๋ก ๋ณด์กด๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค ๋ณผ๋ฅจ์ ๊ตฌ์กฐ
k8s ๋ณผ๋ฅจ์ docker ๋ณผ๋ฅจ์ ๋นํด์ ๊ตฌ์กฐ๊ฐ ๊ฝค ๋ณต์กํ๊ณ ๊ธฐ๋ฅ์ด ๋ ๋ง์ ํธ์ด๋ค.
๋ณผ๋ฅจ์ ๊ทธ ์์ฒด๋ก ๊ณ ์ ํ ์ํ๋ฅผ ๊ฐ์ง๋ ์คํ ๋ฆฌ์ง๋ค.
๋ณผ๋ฅจ์ ๊ตฌํ๋ฐฉ๋ฒ์ ํด๋ฌ์คํฐ ๊ตฌ์ถ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
AWS, GCP, Azure ๊ฐ์ ํด๋ผ์ฐ๋ ์๋น์ค์์ ์ด์ํ๋ ๊ฒฝ์ฐ์๋ ํด๋น ํด๋ผ์ฐ๋์์ ์ ๊ณตํ๋ ๋ณผ๋ฅจ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๊ณ , ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์ด๋ผ๋ฉด ์ง์ ์คํ ๋ฆฌ์ง ์๋ฃจ์
์ ๊ตฌ์ฑํด์ ์ฌ์ฉํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋๋ ๋ณผ๋ฅจ์ ๋ฐ๋ก ๊ฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๋ผ, Volumn Claim์ด๋ผ๋ ์ค๊ฐ ์ธํฐํ์ด์ค๋ฅผ ํตํด์ ์ ๊ทผ์ ํ๋ค. Volumn Claim์ ๋ณผ๋ฅจ ์๋ณธ๊ณผ๋ ๋ณ๊ฐ๋ก ์ฉ๋ ์ ํ, ์ฝ๊ธฐ/์ฐ๊ธฐ ์ ํ ๋ฑ์ ๋ ์ค์ ํ ์ ์๋ค.
ํผ์์คํด์ค ๋ณผ๋ฅจ์ด ์ฉ๋์ ์ ๋๋ก ํ๋ฒ ์ก์์ฃผ๋ฉด, ์ฌ๋ฌ๊ฐ์ Claim์ด ๋๋ ์ธ ์ ์๋ ๊ตฌ์กฐ๋ค.
์ฌ๊ธฐ์๋ ํผ์์คํดํธ ๋ณผ๋ฅจ์ ํ์ฉํด์ ๊ฐ๋จํ๊ฒ ๋ก๊ทธ ์ ์ฅ์๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ๋ค.
Persistent ๋ณผ๋ฅจ ๋ง๋ค๊ธฐ (GKE)
Persistant ๋ณผ๋ฅจ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ํด๋ฌ์คํฐ ๊ตฌ์ถ ํ๊ฒฝ์ ๋ฐ๋ผ์ ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
๋ด๊ฐ ์ฌ์ฉํ ํ๊ฒฝ์ GCP GKE๋ค.
GKE์์๋ ๋ณผ๋ฅจ์ ์ง์ ๋ง๋ค ํ์๊ฐ ์๊ณ , ๋ณผ๋ฅจ ํด๋ ์์ ๋ง๋ค๋ฉด ๋ฐ๋ก ํ๋์ ๋ถ์ฌ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
Storage Class๋ GCP์์ ๋ฏธ๋ฆฌ ์ ๊ณตํ๋ ๊ฒ์ ๊ณจ๋ผ์ธ ์ ์๋ค.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: log-data
spec:
accessModes:
- ReadWriteOnce # ๋จ์ผ ๋
ธ๋์ ๋ฉํฐํ๋์์ R/W ๊ฐ๋ฅ
resources:
requests:
storage: 30Gi # ์ฉ๋์ 30๊ธฐ๊ฐ
storageClassName: standard-rwo # ํ์ค ์คํ ๋ฆฌ์ง
accessModes๋ ReadWriteOnce, ReadOnlyMany, ReadWriteMany ์ค ํ๋๊ฐ ๋ ์ ์๋ค.
- ReadWriteOnce: ๋ณผ๋ฅจ์ ๋จ์ผ ๋ ธ๋์ ์ํ ์ฝ๊ธฐ-์ฐ๊ธฐ๋ก ๋ง์ดํธ๋ ์ ์์ต๋๋ค.
- ReadOnlyMany: ๋ณผ๋ฅจ์ ์ฌ๋ฌ ๋ ธ๋์ ์ํ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ง์ดํธ๋ ์ ์์ต๋๋ค.
- ReadWriteMany: ๋ณผ๋ฅจ์ ์ฌ๋ฌ ๋ ธ๋์ ์ํ ์ฝ๊ธฐ-์ฐ๊ธฐ๋ก ๋ง์ดํธ๋ ์ ์์ต๋๋ค. Compute Engine ์๊ตฌ ๋์คํฌ๊ฐ ์ง์ํ๋ PersistentVolume ๋ฆฌ์์ค๋ ์ด ์ก์ธ์ค ๋ชจ๋๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
storageClassName์ standard-rwo์ premium-rwo๊ฐ ์ ๊ณต๋๋๋ฐ, ์คํ ๋ค๋๋ ํ๋๋์คํฌ ์ ์ฅ์ด๊ณ , ํ๋ฆฌ๋ฏธ์์ SSD ์ ์ฅ์ด๋ค. ํ์์ ๋ฐ๋ผ ๊ณ ๋ฅด๋ฉด ๋๋ค.

์๊ธ์ ์ด๊ฑธ ์ฐธ์กฐํ๋ฉด ๋๋ค.
๋์คํฌ ๋ฐ ์ด๋ฏธ์ง ๊ฐ๊ฒฉ ์ฑ
์ | Compute Engine: ๊ฐ์ ๋จธ์ (VM) | Google Cloud
์๋ฌดํผ ์ ๊ฑธ๋ก ๋ณผ๋ฅจ ํด๋ ์์ ์์ฑํ๋ฉด
์ด๋ฐ์์ผ๋ก ์ถ๊ฐ๊ฐ ๋ ๊ฒ์ด๋ค.
์ด๋ฒ์๋ ๋ก๊ทธ๋ฅผ ๋ณผ๋ฅจ์ ์ ์ฅํ๋ ๋ฐ๋ชฌ ํ๋๋ฅผ ๋์์ ์ ๋์ํ๋์ง ํ
์คํธ๋ฅผ ํด๋ณด๊ฒ ๋ค.
์์ค์ฝ๋๋
https://github.com/myyrakle/infrastructures/tree/master/Dockerfiles/examples/log-daemon-for-test
์ฌ๊ธฐ์ ๋ณผ ์ ์๋ค.
apiVersion: v1
kind: Pod
metadata:
name: log-daemon
spec:
volumes:
- name: log-data
persistentVolumeClaim:
claimName: log-data
containers:
- name: log-daemon
image: myyrakle/log-daemon-for-test
volumeMounts:
- name: log-data
mountPath: /var/log/nodejs
resources:
requests:
memory: ".5Gi"
cpu: "500m"
limits:
memory: ".5Gi"
cpu: "500m"
์ ๋ฐ๋ชฌ์ด /var/log/nodejs ๊ฒฝ๋ก์ ๋ก๊ทธํ์ผ์ ์๊ธฐ ๋๋ฌธ์, ๊ฒฝ๋ก๋ฅผ ์ ๊ฑธ๋ก ๋ง์ดํ
ํ๋ค.
๊ทธ๋ฌ๋ฉด /var/log/nodejs ๊ฒฝ๋ก์ ์ฐ๊ณ ์ฝ๋ ๋์์ ์ปจํ
์ด๋ ๋ด์์ ์ด๋ฃจ์ด์ง๋๊ฒ ์๋๋ผ, ๋ณผ๋ฅจ ๋ด์ ์ ์ฅ์์์ ๋ฐ์ํ๋ค!
์ ๋๋ก ์คํํด๋ณด๊ฒ ๋ค.


๊ทธ๋ฌ๋ฉด Persistant Volume์ด ์๋์ผ๋ก ์์ฑ๋๋ค.

๊ทธ๋ฆฌ๊ณ ๋ค์ด๊ฐ์ ๋ก๊ทธํ์ผ์ ํ์ธํด๋ณด๋ฉด
์ ์จ์ ธ์์ ๊ฒ์ด๋ค.
์ํ์ ์ฅ์ด ์ ๋๋์ง ํ์ธํด๋ณด์.
๋ฐ๋ชฌ ํ๋๋ฅผ ์ฃฝ์ด๊ณ ๋ค์ ๋์ ๋ค.
๋ณผ๋ฅจ์ ์ ์ฉํ์ง ์์๋ค๋ฉด ๋ก๊ทธ ๋ฐ์ดํฐ๋ ์ฆ๋ฐํ์ ๊ฒ์ด๋ค.
๋ค์ด๊ฐ์ ๋ณด๋ฉด
์ด์ ์ ๋ก๊ทธํ์ผ๋ค๋ ๋จ์์๊ณ
๊ทธ ์ดํ๋ก ์ ๋ก๊ทธํ์ผ๋ค์ ์ฐ๊ณ ์์ ๊ฒ์ด๋ค.
์ด๋ฐ ๋๋์ผ๋ก ์ฐ๋ฉด ๋๋ค.
Persistent ๋ณผ๋ฅจ ๋ง๋ค๊ธฐ (์จํ๋ ๋ฏธ์ค)
ํด๋ผ์ฐ๋์์ ์ ๊ณตํ๋ ์๋ฃจ์ ์ ์ฐ๊ณ ์ถ์ง ์๊ฑฐ๋, ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์ผ ๊ฒฝ์ฐ์๋ ์ง์ ๊ตฌ์ฑ์ ํด์ผ ํ๋ค.
์คํ ๋ฆฌ์ง๋ฅผ ์ํ ์๋ฒ๊น์ง ๋ฐ๋ก ๋์ฐ๊ณ ๊ทธ๊ฑธ ํตํด ๋ณผ๋ฅจ์ ๋ง๋ค๊ณ , ๋ณผ๋ฅจ ํด๋ ์์ ๋ง๋ค์ด์ ์ด๋ค.
๊ตฌ์ฑ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. NFS, Cinder, HostPath ๋ฑ๋ฑ... ์ด๊ฑด ๋ณ๋ ํฌ์คํธ์์ ๋ค๋ค๋ณด๊ฒ ๋ค.
์ฐธ์กฐ
https://kubernetes.io/ko/docs/concepts/storage/volumes/
https://kimjingo.tistory.com/153
https://cloud.google.com/kubernetes-engine/docs/concepts/persistent-volumes?hl=ko
https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
https://github.com/docker-library/postgres/issues/263
https://github.com/appscode/third-party-tools/blob/master/storage/nfs/README.md