https://kubernetes.io/docs/concepts/storage/volumes/
기본적으로 Pod의 컨테이너는 무상태이다. Pod의 상태를 유지하기 위해서나 Pod내의 컨테이너끼리 데이터를 공유하기 위해 Volume
을 사용한다.
Docker volume은 host disk를 사용하는 정도였다면 Kubernetes Volume은 좀더 다양한 disk를 제공하고 다양한 제약조건을 추가하게 되었다.
Pod안에 있는 컨테이너끼리 데이터 공유가능 Pod 삭제시 디스크에서 삭제됨 컨테이너 크래시나 종료는 삭제되지 않음
emptyDir
은 머신의 스토리지를 기본으로 사용
emptyDir.medium
값을 "Memory"
로 주면 tmpfs(RAM-backed filesystem)를 사용
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
Pod에서 node 파일시스템에 접근하는 경우 사용
주의점
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
사용하기전에 생성해야 함
데이터가 유지가 되는 디스크
read-only로만 사용하는 경우 동시에 여러군데서 접근 가능 read-write의 경우 한군데 pod에서만 사용 가능
gcloud compute disks create --size=500GB --zone=us-central1-a my-data-disk
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: gcr.io/google_containers/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
# This GCE PD must already exist.
gcePersistentDisk:
pdName: my-data-disk
fsType: ext4
빈 디렉토리로 마운트 되어서 해당 respository에서 git clone을 함
apiVersion: v1
kind: Pod
metadata:
name: server
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- mountPath: /mypath
name: git-volume
volumes:
- name: git-volume
gitRepo:
repository: "git@somewhere:me/my-git-repository.git"
revision: "22f1d8406d464b0c0874075539c1f2e96c253775"
민감한 정보를 마운트 할때 사용 tmpfs(RAM-backed filesystem)에 마운트되어서 디스크에 기록이 남지 않음
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/
다양한 소스를 같은 디렉토리로 제공할때 사용
예제
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "cpu_limit"
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
여러개의 Secret 사용
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- secret:
name: mysecret2
items:
- key: password
path: my-group/my-password
mode: 511
1.7+ PersistentVoulme으로 생성해서 사용
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
annotations:
"volume.alpha.kubernetes.io/node-affinity": '{
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{ "matchExpressions": [
{ "key": "kubernetes.io/hostname",
"operator": "In",
"values": ["example-node"]
}
]}
]}
}'
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
awsElasticBlockStore, nfs, iscsi, fc(fibre channel), flocker, glusterfs, rbd, cephfs, azureFileVolume, azureDisk, vsphereVolume, Quobyte, PortworxVolume, ScaleIO, StorageOS
한 Pod내에서 한개의 Volume을 여러개로 사용할때 사용volumeMounts.subPath
apiVersion: v1
kind: Pod
metadata:
name: my-lamp-site
spec:
containers:
- name: mysql
image: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: site-data
subPath: mysql
- name: php
image: php
volumeMounts:
- mountPath: /var/www/html
name: site-data
subPath: html
volumes:
- name: site-data
persistentVolumeClaim:
claimName: my-lamp-site-data