kubernetes_volume
๋ณผ๋ฅจ: ์ปจํ
์ด๋์ ๋์คํฌ ์คํ ๋ฆฌ์ง ์ฐ๊ฒฐ
์คํ ๋ฆฌ์ง ๋ณผ๋ฅจ์ ํ๋์ ๊ฐ์ ์ต์์ ๋ฆฌ์์ค๋ ์๋์ง๋ง ํ๋์ ์ผ๋ถ๋ถ์ผ๋ก ์ ์๋๋ฉฐ ํ๋์ ๋์ผํ ๋ผ์ดํ์ฌ์ดํด์ ๊ฐ์ง๋๋ค. ํ๋๊ฐ ์์๋๋ฉด ๋ณผ๋ฅจ์ด ์์ฑ๋๊ณ , ํ๋๊ฐ ์ญ์ ๋๋ฉด ๋ณผ๋ฅจ์ด ์ญ์ ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋ณผ๋ฅจ
์ฟ ๋ฒ๋คํฐ์ค ๋ณผ๋ฅจ์ ํ๋์ ๊ตฌ์ฑ ์์๋ก ์ปจํ ์ด๋์ ๋์ผํ๊ฒ ํ๋ ์คํ์์ ์ ์๋ฉ๋๋ค. ๋ณผ๋ฅจ์ ๋ ๋ฆฝ์ ์ธ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๊ฐ ์๋๋ฏ๋ก ์์ฒด์ ์ผ๋ก ์์ฑ, ์ญ์ ๋ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๋๋ ํฐ๋ฆฌ๋ก Pod ๋ด ์ปจํ ์ด๋๋ค์ด ์ ๊ทผ๊ฐ๋ฅํฉ๋๋ค.
Pod์ ์์๋๋ ๋์ ์ ์ง๋ฉ๋๋ค. Pod ๋ด์์ ๊ตฌ๋๋๋ ์ปจํ ์ด๋๋ค๋ณด๋ค ์ค๋ ์ ์ง๋๋ฉฐ, ๊ทธ ๋ฐ์ดํฐ๋ ์ปจํ ์ด๋๊ฐ ์ฌ์์๋๋๋ผ๋ ๊ณ์ ๋ณด์กด๋ฉ๋๋ค.
iSCSI๋ NFS์ ๊ฐ์ Onpremiss๊ธฐ๋ฐ์ ์ธ์ฅ ์คํ ๋ฆฌ์ง ์ด์ธ์ ํด๋ผ์ฐ๋ ์ธ์ฅ ์คํ ๋ฆฌ์ง์ธ AWS EBS, Google PD ๊ทธ๋ฆฌ๊ณ github, ๋ฑ์ ์คํ์์ค ๊ธฐ๋ฐ ์ธ์ฅ์คํ ๋ฆฌ ์๋น์ค๋ฅผ ์ง์ํฉ๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ๋ณผ๋ฅจ ์ ํ ์๊ฐ
emptyDir : ์ผ์์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋จํ ๋น ๋๋ ํฐ๋ฆฌ
hostPath : ์์ปค ๋ ธ๋์ ํ์ผ์์คํ ์ ํ๋์ ๋๋ ํฐ๋ฆฌ๋ก ๋ง์ดํธ ํ๋ ๋ฐ ์ฌ์ฉํจ
gitRepo : ๊น ๋ฆฌํฌ์งํฐ๋ฆฌ์ ์ฝํ ์ธ ๋ฅผ ์ฒดํฌ์์ํด ์ด๊ธฐํํ ๋ณผ๋ฅจ
์์ฑ ์์ ์ง์ ๋ git ๋ ํ์งํ ๋ฆฌ์ ํน์ ๋ฆฌ๋น์ ์ ๋ด์ฉ์ clone์ ์ด์ฉํด์ ๋ด๋ ค๋ฐ์ ํ์ ๋์คํฌ ๋ณผ๋ฅจ์ ์์ฑํ๋ ๋ฐฉ์
๋ฌผ๋ฆฌ์ ์ผ๋ก emptyDir์ด ์์ฑ๋๊ณ , git ๋ ํ์งํ ๋ฆฌ ๋ด์ฉ์ clone์ผ๋ก ๋ค์ด
nfs :NFS ๊ณต์ ๋ฅผ ํ๋์ ๋ง์ดํธํจ
gcePersistentDisk(Google Compute Engine Persistent Disk), awsElasticBlock Store(Amazon Web Services Elastic Block Store Volume), azureDisk(Microsoft Azure Disk Volume): ํด๋ผ์ฐ๋ ์ ๊ณต์์ ์ ์ฉ ์คํ ๋ฆฌ์ง๋ฅผ ๋ง์ดํธํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
cinder, cephfs, iscsi, flocker, glusterfs, quobyte, rdb, flexVolume, vsphere Volume, photonPersistentDisk, ScaleIO : ๋ค๋ฅธ ์ ํ์ ๋คํธ์ํฌ ์คํ ๋ฆฌ์ง๋ฅผ ๋ง์ดํธ ํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
configMap, secret, downwardAPI : ์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค๋ ํด๋ฌ์คํฐ ์ ๋ณด๋ฅผ ํ๋์ ๋ ธ์ถํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํน๋ณํ ์ ํ์ ๋ณผ๋ฅจ
persistentVolumeClaim : ์ฌ์ ์ ํน์ ๋์ ์ผ๋ก ํ๋ก๋น์ ๋ ๋ ํผ์์คํดํธ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
ํด๋ฌ์คํฐ ๋ด ์คํ ๋ฆฌ์ง ์ผ๋ถ ์กฐ๊ฐ์ ๋ํ๋ด๋ API ๊ฐ์ฒด๋ก ๊ฐ๋ณ Pod์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋์ด ๋ณด์กด๋๋ ๋ฒ์ฉ, ํ๋ฌ๊ทธ๊ฐ๋ฅ ์์์ผ๋ก์ ๊ฐ์ฉํฉ๋๋ค.
๋ณผ๋ฅจ ์์ฒด๋ฅผ ์๋ฏธํ๋ PV๋ค์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ ๋ ๊ทธ ์ ๊ณต๋ฐฉ์์ ์ธ๋ถ์ฌํญ๋ค์ ์ถ์ํํ๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
์คํ ๋ฆฌ์ง๊ฐ ์ฌ์ ์ ์์ฑ๋๋ ์๋๋ฆฌ์ค(์ ์ ํ๋ก๋น์ ๋)์์๋ PV๋ค์ด ์ง์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ฉด ์จ๋๋ฉํธ ์คํ ๋ฆฌ์ง๋ฅผ ํ์๋ก ํ๋ ์๋๋ฆฌ์ค(๋์ ํ๋ก๋น์ ๋)์์๋ PV ๋์ PVC๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
PV๋ ํ๋ํ๊ณ ๋ ๋ณ๊ฐ๋ก ๊ด๋ฆฌ๋๊ณ ๋ณ๋์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, PVC๋ ์ฌ์ฉ์๊ฐ PV์ ํ๋ ์์ฒญ
๋ณผ๋ฅจ์ ์ฌ์ฉํ ์ปจํ ์ด๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์
emptyDir ๋ณผ๋ฅจ ์ฌ์ฉ
apiVersion: v1 kind: Pod metadata: name: fortune spec: containers: - image: luksa/fortune name: html-generator volumeMounts: - name: html mountPath: /var/htdocs - image: nginx:alpine name: web-server volumeMounts: - name: html mountPath: /usr/share/nginx/html readOnly: true ports: - containerPort: 80 protocol: TCP volumes: - name: html emptyDir: {}
Pod๊ฐ ์์ฑ๋ ๋ ์์ฑ๋๊ณ , Pod๊ฐ ์ญ์ ๋ ๋ ๊ฐ์ด ์ญ์ ๋๋ ์์ ๋ณผ๋ฅจ์ผ๋ก ์์ฑ ๋น์์๋ ๋์คํฌ์ ์๋ฌด ๋ด์ฉ์ด ์๊ธฐ ๋๋ฌธ์ emptyDir, ๋จ Pod ๋ด์ ์ปจํ ์ด๋ ํฌ๋์ฌ ๋์ด ์ญ์ ๋๊ฑฐ๋ ์ฌ์์๋๋๋ผ๋ emptyDir์ ์๋ช ์ฃผ๊ธฐ๋ ์ปจํ ์ด๋ ๋จ์๊ฐ ์๋๋ผ Pod ๋จ์์ด๊ธฐ ๋๋ฌธ์ emptyDir์ ์ญ์ ๋์ง ์๊ณ ๊ณ์ํด์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ณผ๋ฅจ์ด ๋น ๋๋ ํฐ๋ฆฌ๋ก ์์๋ฉ๋๋ค. ํ๋์ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ค ํ์ผ์ด๋ ๋ณผ๋ฅจ์ ์ธ ์ ์๊ณ ๋ณผ๋ฅจ์ ๋ผ์ดํ์ฌ์ดํด์ด ํ๋์ ๋ฌถ์ฌ ์์ผ๋ฏ๋ก ํ๋๊ฐ ์ญ์ ๋๋ฉด ๋ณผ๋ฅจ์ ์ฝํ ์ธ ๋ ์ฌ๋ผ์ง๋๋ค.
emptyDir ๋ณผ๋ฅจ์ ๋์ผ ํ๋์์ ์คํ ์ค์ธ ์ปจํ ์ด๋ ๊ฐ ํ์ผ์ ๊ณต์ ํ ๋ ์ ์ฉํฉ๋๋ค.
์ฌ์ด๋์นด ์ปจํ ์ด๋ ์๊ฐ
https://matthewpalmer.net/kubernetes-app-developer/articles/multi-container-pod-design-patterns.html#sidecar-pattern-example
์ฌ์ด๋์นด ์ปจํ ์ด๋๋ ํ๋์ ์ฃผ ์ปจํ ์ด๋์ ๋์์ ๋ณด์ํฉ๋๋ค.
์๋ก์ด ๋ก์ง์ ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ๋ฐ์ด ๋ฃ์ด ๋ณต์ก์ฑ์ ๋ํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ ๋์ ์ ํ๋์ ์ฌ์ด๋์นด๋ฅผ ์ถ๊ฐํ๋ฉด ๊ธฐ์กด ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ปค ๋ ธ๋ ํ์ผ ์์คํ ์ ํ์ผ ์ ๊ทผ
hostPath ๋ณผ๋ฅจ
hostPath ๋ณผ๋ฅจ์ ๋ ธ๋ ํ์ผ์์คํ ์ ํน์ ํ์ผ์ด๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ๋์ผ ๋ ธ๋์ ์คํ ์ค์ธ ํ๋๊ฐ hostPath ๋ณผ๋ฅจ์ ๋์ผ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉ ์ค์ด๋ฉฐ ๋์ผํ ํ์ผ์ด ํ์๋ฉ๋๋ค.
gitRepo๋ emptyDir ๋ณผ๋ฅจ์ ์ฝํ ์ธ ๋ ํ๋๊ฐ ์ข ๋ฃ๋๋ฉด ์ญ์ ๋๋ ๋ฐ๋ฉด, hostPath ๋ณผ๋ฅจ์ ์ฝํ ์ธ ๋ ์ญ์ ๋์ง ์์ต๋๋ค. ํ๋๊ฐ ์ญ์ ๋๋ฉด ๋ค์ ํ๋๊ฐ ํธ์คํธ์ ๋์ผ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ฆฌํค๋ hostPath ๋ณผ๋ฅจ์ ์ฌ์ฉํ๊ณ , ์ด์ ํ๋์ ๋์ผํ ๋ ธ๋์ ์ค์ผ์ค๋ง๋๋ค๋ ์กฐ๊ฑด์์ ์๋ก์ด ํ๋๋ ์ด์ ํ๋๊ฐ ๋จ๊ธด ๋ชจ๋ ํญ๋ชฉ์ ๋ณผ ์ ์์ต๋๋ค.
๋ ธ๋์ ๋ก์ปฌ ๋์คํฌ์ ๊ฒฝ๋ก๋ฅผ Pod์์ ๋ง์ดํธ ํด์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ hostPath์ ์๋ ๋ณผ๋ฅจ์ ์ฌ๋ฌ Pod ์ฌ์ด์์ ๊ณต์ ๋์ด ์ฌ์ฉ
๊ธฐ๋ฐ ์คํ ๋ฆฌ์ง ๊ธฐ์ ๊ณผ ํ๋ ๋ถ๋ฆฌ - ํผ์์คํดํธ๋ณผ๋ฅจ๊ณผ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์
์ธํ๋ผ์คํธ๋ญ์ฒ์ ์ธ๋ถ ์ฌํญ์ ์ฒ๋ฆฌํ์ง ์๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์คํ ๋ฆฌ์ง๋ฅผ ์์ฒญํ ์ ์๋๋ก ํ๊ธฐ ์ํด ์๋ก์ด ๋ฆฌ์์ค ๋ ๊ฐ๊ฐ ๋์ ๋๋๋ค. ํผ์์คํดํธ๋ณผ๋ฅจ(PV, PersistentVolume)๊ณผ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์(PVC, PersistentVolumeClaim)
ํผ์์คํดํธ๋ณผ๋ฅจ ์์ฑ
PersistentVolume์ ํด๋ฌ์คํฐ ๊ด๋ฆฌ์๊ฐ ํ๋ก๋น์ ๋ ํ๊ณ PersistentVolumeClaim์ ํตํด ํฌ๋์์ ์ฌ์ฉํฉ๋๋ค.
apiVersion: v1 kind: PersistentVolume metadata: name: mongodb-pv spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce - ReadOnlyMany persistentVolumeReclaimPolicy: Retain gcePersistentDisk: pdName: mongodb fsType: ext4
ํผ์์คํดํธ๋ณผ๋ฅจ์ ์์ฑํ ๋ ๊ด๋ฆฌ์๋ ์ฟ ๋ฒ๋คํฐ์ค์๊ฒ ์ฉ๋์ด ์ผ๋ง๊ฐ ๋๋์ง ๋จ์ผ ๋ ธ๋๋ ๋์์ ๋ค์ ๋ ธ๋์ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ผ ํฉ๋๋ค. ๋ํ ์ฟ ๋ฒ๋คํฐ์ค์๊ฒ ํผ์์คํดํธ๋ณผ๋ฅจ์ด ํด์ ๋๋ฉด ์ด๋ค ๋์์ ํด์ผ ํ ์ง ์๋ ค์ผ ํฉ๋๋ค.(๋ฐ์ธ๋ฉ๋ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ด ์ญ์ ๋๋ ๊ฒฝ์ฐ)
ํผ์์คํดํธ๋ณผ๋ฅจ์ ์ง์ํ๋ ์ค์ ์คํ ๋ฆฌ์ง์ ์ ํ, ์์น, ๊ทธ ๋ฐ์ ์์ฑ ์ ๋ณด๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
PersistentVolume์ ํด๋ฌ์คํฐ ๋ ธ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํฌ๋ ๋ฐ PersistentVolumeClaim๊ณผ ๋ฌ๋ฆฌ ๋ค์์คํ์ด์ค์ ์ํ์ง ์์ต๋๋ค
ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์ ์์ฑ์ ํตํ ํผ์์คํดํธ๋ณผ๋ฅจ ์์ฒญ
apiVersion: v1 kind: Pod metadata: name: mongodb spec: containers: - image: mongo name: mongodb volumeMounts: - name: mongodb-data mountPath: /data/db ports: - containerPort: 27017 protocol: TCP volumes: - name: mongodb-data persistentVolumeClaim: claimName: mongodb-pvc
ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ด ์์ฑ๋์๋ง์ ์ฟ ๋ฒ๋คํฐ์ค๋ ์ ์ ํ ํผ์์คํดํธ๋ณผ๋ฅจ์ ์ฐพ๊ณ ํด๋ ์์ ๋ฐ์ธ๋ฉํฉ๋๋ค. ํผ์์คํดํธ๋ณผ๋ฅจ์ ์ฉ๋์ ํผ์์คํดํธ๋ณผ๋ฅจํด๋ ์์ ์์ฒญ์ ์์ฉํ ๋งํผ ์ถฉ๋ถํ ์ปค์ผ ํฉ๋๋ค.
RWO(ReadWriteOnce) : ๋จ์ผ ๋ ธ๋๋ง์ด ์ฝ๊ธฐ/์ฐ๊ธฐ์ฉ์ผ๋ก ๋ณผ๋ฅจ์ ๋ง์ดํธ ํ ์ ์์ต๋๋ค.
ROX(ReadOnlyMany) : ๋ค์ ๋ ธ๋๊ฐ ์ฝ๊ธฐ์ฉ์ผ๋ก ๋ณผ๋ฅจ์ ๋ง์ดํธ ํ ์ ์์ต๋๋ค.
RWX(ReadWriteMany) : ๋ค์ ๋ ธ๋๊ฐ ์ฝ๊ธฐ/์ฐ๊ธฐ์ฉ์ผ๋ก ๋ณผ๋ฅจ์ ๋ง์ดํธ ํ ์ ์์ต๋๋ค.
Reference
https://www.oreilly.com/library/view/kubernetes-in-action/9781617293726/
https://www.oreilly.com/library/view/cloud-native-devops/9781492040750/
Last updated