[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 ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

  1. ReadWriteOnce: ๋ณผ๋ฅจ์€ ๋‹จ์ผ ๋…ธ๋“œ์— ์˜ํ•œ ์ฝ๊ธฐ-์“ฐ๊ธฐ๋กœ ๋งˆ์šดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ReadOnlyMany: ๋ณผ๋ฅจ์€ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ์˜ํ•œ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๋งˆ์šดํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. 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