볼륨
볼륨 (volumes)
쿠버네티스 볼륨(volumes) 은 Pod 안의 컨테이너가 파일시스템을 통해 데이터에 접근하고 데이터를 공유하는 방법을 제공해요. 서로 다른 용도에 쓸 수 있는 여러 종류의 볼륨이 있어요.
볼륨이 동작하는 방식 (How volumes work)
쿠버네티스는 많은 유형의 볼륨을 지원해요. Pod는 동시에 여러 볼륨 유형을 사용할 수 있어요. 일시적(ephemeral) 볼륨 유형은 특정 Pod에 묶인 수명주기를 가지지만, 영구 볼륨(persistent volumes)은 개별 Pod의 수명주기를 넘어 존재해요. Pod가 사라지면 쿠버네티스는 일시적 볼륨을 파괴해요.
핵심적으로 볼륨은, 어쩌면 일부 데이터가 담겨 있는, pod의 컨테이너가 접근할 수 있는 디렉터리예요. 그 디렉터리가 어떻게 생기고, 무엇이 이를 뒷받침하며(medium), 무엇이 담기는지는 사용된 특정 볼륨 유형에 따라 결정돼요.
볼륨을 사용하려면 .spec.volumes에 Pod가 가질 볼륨을 지정하고, .spec.containers[*].volumeMounts에 컨테이너 안에서 그 볼륨을 어디에 마운트할지 선언해요. Pod가 시작되면 컨테이너의 프로세스는 컨테이너 이미지의 초기 내용에 볼륨을 더해 구성된 파일시스템 뷰를 보게 돼요.
볼륨의 유형 (Types of volumes)
configMap
ConfigMap은 구성 데이터를 Pod에 주입하는 방법을 제공해요. ConfigMap에 저장된 데이터는 configMap 유형의 볼륨에서 참조된 다음, Pod 안에서 실행되는 컨테이너화된 애플리케이션이 사용할 수 있어요.
emptyDir
emptyDir 볼륨을 정의한 Pod의 경우, 볼륨은 Pod가 노드에 배정될 때 생성돼요. 이름에서 알 수 있듯이 emptyDir 볼륨은 처음에는 비어 있어요. Pod의 모든 컨테이너는 emptyDir 볼륨의 같은 파일을 읽고 쓸 수 있어요. 다만 그 볼륨은 각 컨테이너에서 같은 경로나 다른 경로에 마운트될 수 있어요.
fc (fibre channel)
fc 볼륨 유형은 기존 fibre channel 블록 스토리지 볼륨을 Pod에 마운트할 수 있게 해줘요. 볼륨 구성의 targetWWNs 매개변수로 단일 또는 여러 대상 WWN(world wide names)을 지정할 수 있어요. 여러 WWN을 지정하면...
hostPath
hostPath FileOrCreate 구성 예시
apiVersion: v1
kind: Pod
metadata:
name: test-webserver
spec:
os:
name: linux
nodeSelector:
kubernetes.io/os: linux
containers:
- name: test-webserver
image: registry.k8s.io/test-webserver:latest
volumeMounts:
- mountPath: /var/local/aaa
name: mydir
- mountPath: /var/local/bbb
name: myfile
image
apiVersion: v1
kind: Pod
metadata:
name: image-volume
spec:
containers:
- name: shell
command: ["sleep", "infinity"]
image: debian
volumeMounts:
- name: volume
mountPath: /volume
volumes:
- name: volume
image:
reference: quay.io/crio/artifact:v2
pullPolicy: IfNotPresent
local
local 볼륨은 hostPath 볼륨과 비교해, Pod를 노드에 수동으로 스케줄링하지 않고도 내구성 있고 이식 가능한 방식으로 사용돼요. 시스템은 PersistentVolume의 노드 어피니티(node affinity)를 확인해서 볼륨의 노드 제약을 인지해요.
local 볼륨을 사용할 때는 PersistentVolume nodeAffinity를 반드시 설정해야 해요. 쿠버네티스 스케줄러는 PersistentVolume nodeAffinity를 사용해 이 Pod들을 올바른 노드에 스케줄해요.
PersistentVolume volumeMode를 (기본값 "Filesystem" 대신) "Block"으로 설정하면 local 볼륨을 원시 블록 디바이스로 노출할 수 있어요.
nfs
nfs 볼륨은 기존 NFS(Network File System) 공유를 Pod에 마운트할 수 있게 해줘요. Pod가 제거될 때 지워지는 emptyDir과 달리, nfs 볼륨의 내용은 보존되고 볼륨은 단지 언마운트될 뿐이에요. 즉 NFS 볼륨은 데이터로 미리 채울 수 있고...
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /my-nfs-data
name: test-volume
volumes:
- name: test-volume
nfs:
server: my-nfs-server.example.com
path: /my-nfs-volume
readOnly: true
참고 (Note)
Pod 스펙에서는 NFS 마운트 옵션을 지정할 수 없다는 점도 기억해 두세요. 마운트 옵션은 서버 측에서 설정하거나 /etc/nfsmount.conf를 사용할 수 있어요. NFS 볼륨을 PersistentVolume으로 마운트할 수도 있는데, 이 경우 마운트 옵션을 설정할 수 있어요.
persistentVolumeClaim
persistentVolumeClaim 볼륨은 PersistentVolume을 Pod에 마운트하는 데 사용돼요. PersistentVolumeClaim은 특정 클라우드 환경의 세부 사항을 알 필요 없이 사용자가 내구성 있는 스토리지(예: iSCSI 볼륨)를 "청구(claim)"하는 방법이에요. 자세한 내용은 PersistentVolumes 정보를 참고하세요.
secret
secret 볼륨은 비밀번호 같은 민감한 정보를 Pod에 전달하는 데 사용돼요. Secret을 쿠버네티스 API에 저장하고 파일로 마운트해서 쿠버네티스에 직접 결합(coupling)하지 않고도 Pod가 사용하게 할 수 있어요. secret 볼륨은 tmpfs(RAM 기반 파일시스템)로 뒷받침되므로 비휘발성 스토리지에는 절대 기록되지 않아요.
리소스 (Resources)
emptyDir 볼륨의 스토리지 매체(디스크나 SSD 등)는 kubelet 루트 디렉터리(보통 /var/lib/kubelet)를 담고 있는 파일시스템의 매체에 의해 결정돼요. emptyDir나 hostPath 볼륨이 소비할 수 있는 공간에는 제한이 없고, 컨테이너나 Pod 사이에 격리도 없어요.
읽기 전용 마운트 (Read-only mounts)
재귀적 읽기 전용 마운트 (Recursive read-only mounts)
apiVersion: v1
kind: Pod
metadata:
name: rro
spec:
volumes:
- name: mnt
hostPath:
# tmpfs is mounted on /mnt/tmpfs
path: /mnt
containers:
- name: busybox
image: busybox
args: ["sleep", "infinity"]
volumeMounts:
# /mnt-rro/tmpfs is not writable
- name: mnt
mountPath: /mnt-rro
readOnly: true