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 가 있으면 제거한다. 이 후 데몬 재시작을 수행