Back groud

 

ㅁ voulum
 - Container 가 Crash 될때 파일이 손상되는 이슈가 있음, kubelet 는 Container를 재시작하지만 초기화된 상태로 시작됨
 - Pod 간에 파일을 공유할때 문제가 발생됨
 - K8S 의 볼륨추상화는 이러한 문제를 모두 해결할수 있음

 

ㅁ 배경
 - 다양한 유형의 볼륨을 지원함
 - 임시볼륨은 Pod 와 동일한 수명을 가진다. 퍼시던트볼륨은 Pod 수명과 상관없이 존제한다. 
 - Pod 이 삭제되면 임시볼륨(ephemeral volume)은 삭제하지만, 퍼시스턴트 볼륨(persistent volume)은 삭제하지 않음
 - 볼륨종류와는 상관없이 Pod 내의 컨테이너가 재시작되어도 데이터는 보존됨
 - 볼륨은 기본적으로 디렉토리이며, 데이터가 있을수도 있으며, Pod 내 컨테이너에 접근을 할수 있음
 - 디렉토리 생성 방식, 이를 지원하는 매체와 내용은 볼륨유형에 따라 결정이 됨
 - .spec.volumes 에서 Pod 에서 제공할 볼륨을 지정하고, .spec.containers[*].volumeMounts 의 컨테이너에 해당 볼륨을 Mount 할 위치를 선언
 - 컨테이너의 프로세스는 컨테이너이미지 최초 내용물과 컨테이너에 마운트된 볼륨으로 구성된 파일을 볼수 있음
 - 프로세스는 루트파일시스템을 최초로 보게됨, 쓰기가 허용되어있는경우 쓰기작업을 하게되면 변경된 내용을 확인할수 있음
 - 볼륨은 이미지의 특정경로에 마운트됨, 파드에 정의된 컨테이너에 대하여서 컨테이너가 사용할 볼륨을 어디에 마운트할지 명시해야함
 - 볼륨은 다른 볼륨안에 마운트될수 없음, 다른볼륨에 있는 내용물을 가리키는 하드링크를 사용할수 없음 (서브패스 사용에 대하여서 확인 필요)

 

ㅁ 볼륨유형들

 - awsElasticBlockStore (CSI v1.17)

 - azureDisk (CSI v1.19)

 - azureFile (CSI v1.21)

 - cephfs : Ceph File System Storage

 - cinder (CSI v1.21) : Openstack

 

 - configMap

 Config Data 를 Pod 에 주입하는 방법을 제공함, ConfigMap 에 저장된 데이터는 configMap 유형의 볼륨에서 참조, 그 이후 Pod 에서 실행되는 Container 화된 Application 에서 사용함

 

 - downwardAPI

Application 에서 downward API date 를 사용할수 있도록 함, 디렉토리를 마운트하고 요청된 데이터를 일반 텍스트파일로 작성됨

 

 - empthDir

empthDir 볼륨은 Pod 가 Node 에 할당될때 처음 생성이된다. 해당 Node 에서 Pod 가 실행되는 동안에만 존재함, 처음에는 비어있음, Pod 내의 모든 Container 는 empthDir 볼륨에서 동일한 파일을 읽고 쓸수있다. 해당 볼륨은 각각의 컨테이너에서 동일 혹은 다른 경로에서 마운트될수 있음, 어떤 이유로든 Node 에서 Pod 가 제거되는경우 empthDir 에서 Data 가 영구적으로 삭제됨

 

환경에 따라서 emptyDir 볼륨은 Disk, SSD 혹은 Network Storage와 같이 Node 를 지원하는 모든 매체에 저장이된다. emptyDir.medium filed 를 "Memory" 로 설정하면 Kubernetes 에 tmpfs(Ram 기반의 Filesystem) 을 마운트 할수 있음, tmpfs 는 매우 빠르지만 Disk 와 다르게 Node 가 재부팅될수 tmpfs 가 지워지며, 작성되는 모든 File 은 Container Memory limit 수치에 포함이 된다. 

 

 - fc (fibre channel, 파이버 채널)

파이버 채널 블록 스토리지 볼륨을 파드에 마운트 할수있게 한다. 

 

 - flocker (사용중단, deprecated)

 - gcePersistentDisk (CSI v1.17 beta, v1.21 alpha)

GCE 의 PD 를 Pod 에 Mount 시킴, Pod 는 GCE 의 VM Node 에서 실행이 되어야한다.

 

 - gitrepo (사용중단, deprecated)

 - glusterfs : GlusterFS 

 - hostPath

HostPath 볼륨은 많은 보안위험이 있음, 가능하면 HostPath 를 사용하지 않는것이 좋다. HostPath 를 사용해야하는경우라면, 필요한 파일 혹은 디렉토리로만 범위를 제안하고 ReadOnly 로 Mount 해서 사용하는것으르 권장한다. 

AdmissionPolicy 를 사용해서 특정 디렉토리의 HostPath 를 제한하는경우 readOnly Mount 사용하는 정책이 유효하려면 volumeMounts 가 반듯이 지정해야한다. 

 

 - iscsi : iSCSI (SCSI overIP) 볼륨을 Pod 에 mount 가능함, 사용하려면 먼저 iSCSI 서버를 실행하고 볼륨을 생성해야함

 - local : 디스크, 파티션 또는 디렉토리같은 마운트된 로컬 스토리지 장치를 나타냄, Static Persisten Volumes 으로만 사용이 가능함, dynamic pv 는 지원하지 않음

 

 - nfs : Network File System 볼륨을 pod 에 Mount 할수 있음

 - PersistenVolumeClaim : PV 를 Pod 에 Mount 하는대 사용한다. 

 - portwokxVolume : kubernetes 와 하이퍼컨버지드(hyperconverged) 를 실행하는 탄력적인 storage 계층, Portworx 서버의 fingerprints 하고, 기능에 기반하여 계층화수행, 여러버서에 걸쳐 용량을 집계함. Portworx 는 가상머신 혹은 Guest, Baremetal linux node 위에서 실행됨

 - projected : 여러 기존볼륨 소스를 동일한 디렉토리로 매핑함

 - quobyte (사용중단, deprecated)

 - rbd (CSI v1.23 alpha) : Rados Block Device (RBD) 볼륨을 Pod 에 Mount 할수 있음, RBD 를 사용하기 위해서는 Ceph를 설치하고 실행해야 한다. RBD 는 여러고객이 동시에 읽기전용으로 사용이 가능함, 하지만 읽기-쓰기에서는 단일 Mount 만 가능함

 

 - secret

암호와 같은 민감한 정보를 Pod 에 전달하는데 사용된다.  kubernetes 직접적으로 연결하지않고 파드에서 사용할수 있도록 File 로 Mount 가 가능함, secret 볼륨은 tmpfs 로 지원됨, 비휘발성 스토리지에 절대 기록되지 않는다. 

 

 - storageOS (사용중단, deprecated) : 스토리지는 컨테이너 형태로 제공되며 모든 Pod 에서 접근이 가능하다. 

 - vspereVolume (CSI v1.19 beta) : Kubernetes vSphere Cloud 공급자를 구성해야 한다. vSphere VMDK  볼륨을 Pod 에 Mount 하는대 사용됨. VMFS, VSAM Datastore 를 모드 지원

 

ㅁ subPath 

단일 Pod 에서 여러용도로 하나의 볼륨을 공유해서 사용하는것이 가능 "volumeMounts.subPath 속성을 사용해서 root 대신 참조하는 볼륨내의 하위 경로를 지정가능

 

subPath 를 확장된 환경변수와 함께 사용 (v1.17)

subPathExpr filed 를 사용해서 subPath 디렉토리 이름을 구성, subPath 와 subPathExpr 를 상호베타적

 

ㅁ 리소스 (resource)

emtpyDir 볼륨의 스토리지는 kubelet root 디렉토리 "Default /var/lib/kubelet" 보유한 파일 시스템에 의하여서 결정이 된다. emptyDir 및 hostPath 볼륨이 사용할 수 있는 공간의 크기의 제한은 없으며, 컨테이너간 파드간의 격리도 없다. 

 

ㅁ Out of Tree 볼륨 플러그인

CSI (컨테이너 스토리지 인터페이스) 그리고 FlexVolume(사용중단) 이러한것들이 포함된다. 스토리지 관련된 소스코드가 Kubernetes 내부에 있는것이 아니라 각 벤더들이 따로 관리를 하는 방식이다. 

kubernetes 내부에 코드가 관리되었다가 (In tree) 코드를 벤더에서 독립적으로 가져가도록 되었다. 

 

 - CSI : 3가지 방법으로 Pod 에서 사용이 가능하다. 

PVC 를 통해서 사용

일반 임시볼륨과 함께 사용가능 (alpht 기능)

드라이버가 지원하는경우 CSI 임시 볼륨과 함께 (beta 기능)

 

CSI PV 를 구성하는 필드값

 - driver

 - volumeHandle

 - readOnly

 - fsType

 - volumeAttributes

 - controllerPublishSecretRef

 - nodeStageSecretRef

 - nodePublishSecretRef

 

CSI raw block volume (v1.18 stable)

CSI ephemeral block volume (v1.16 beta)

In-Tree 에서 CSI 드라이버로 마이그레이션  (v1.17 beta)

 - CSIMigration 기능이 활성화되면 기존의 in-tree plugin 에 대한 작업을 CSI Plugin 으로 유도한다. 

 - 결과적으로 운영자는 In-tree 에서 CSI 로 전환할때 기존 SC, PV, PVC 에 대한 구성변경을 수행할 필요가 없음

 - 프로비저닝/삭제, 연결/분리, 마운트/마운트 해제, 볼륨크기 재조정이 포함됨

 - CSIMigration 을 지원하고 CSI 드라이버가 구현된 In-tree plugin 은 볼륨유형에 나열이 되어 있음

 

ㅁ Mount propagation (마운트전파)

Mount propagation 을 통해서 Container 가 Mount 한 Volume 를 동일한 Pod 의 다른 Container 혹은 동일한 Node 의 다른 Pod 로 공유할수 있음

Volume mount propagation 은 Container.volumeMounts 의 mountPropagation 필드에 제어가 됨

 -  None

 - HostToContainer

 - Bidirectional (해당 설정은 위험할수 있음, 호스트운영체제를 손상시킬수 있기에 권한이 있는 Container 에서만 허용이 된다. 리눅스 커널 동작을 숙지하는것을 권장한다. Pod 내 Container 에 의해 생성된 Volume Mount 는 종류시 Container에 의하여서 UMount 수행이 되어야 한다. 

 

CoreOS, Redhat/CentOS, Ubuntu 에서 Mount propagation 이 동작하려면 Docker 의 Mount share 을 올바르게 구성해야 한다. 

Docker 의 Service File 의 MountFlags 를 "MountFlags=shared" 수정 하며, slave 가 있으면 제거한다. 이 후 데몬 재시작을 수행

 

 

+ Recent posts