Kubernetes (K8S): Object - 6-2. Storage: hostpath
K8S에서 제공하는 Storage 유형은 volume, Persistent Volume, Projected Volume, Storage Class, 임시 볼륨 등으로 다양하며 스냅샷 및 복제가 가능하며 스토리지 용량을 제한하는 등의 기능을 수행한다.
오늘은 가장 많이 사용하는 volume과 persistent volume에 대해서 학습합니다.
1. Volume의 필요성
1.1. Container간의 Data 공유
1.2. Contraier의 문제가 발생 시 Container는 재시작 또는 다시 생성하면 되지만 Data 보존은?
이런 문제를 해결할 수 있는 것이 K8S의 Volume 추상화
2. Storage 유형
2.1. volume
2.2. PV(Persistent Volume)와 PVC(Persistent Volume Claim)를 가지고 사용할 수 있는 볼륨을 지정하고 연결
2.2.1. PV :
2.2.1.1. Volume Resource 그 자체
2.2.1.2. POD의 생명주기와는별도로 PV를 지정하고 사용할 수 있음.
2.2.1.3. POD와 상관없이 Volume 사용 가능하며, 운영 방식에 따라 자유롭게 사용.
2.2.2. PVC
2.2.2.1. 사용자가 Volume에 요청하는 방식을 정의
2.2.2.2. POD와 PV의 의존성을 줄일 수 있음.
3. Storage LifeCycle
3.1. Provisioning
3.1.1. Persistent Volume(이하 PV) 생성 단계
3.1.2. Static and Dynamic 방식
3.1.2.1. Static (고정) : 미리 PV 생성 후 PVC(Persistent Volume Claim)를 통해 사용하는 POD 연결
3.1.2.2. Dynamic (비고정) : PVC을 통해 PV를 사용하려고 할때 권한이나 용량을 정해서 유동적을 사용하는 방법
3.2. Binding
3.2.1. 생성된 PV를 PVC에 Binding 하는 단계
3.3. Using
3.3.1. PVC가 POD에 설정되어 PV가 실질적으로 사용되는 단계
3.3.2. POD가 사용하는 PV는 임의 삭제 불가 : Data 유실 문제 발생 방지
3.4. Reclaiming
3.4.1. PVC가 삭제된 후 PV가 초기화 되는 과정
3.4.1.1. Retain
3.4.1.2. Delete
3.4.1.3. Recycle
4. Volume 실습
4.1 hostPath
4.1.1. hostPath 볼륨은 Host Node의 파일시스템에 있는 파일이나 디렉터리를 Pod에 Mount
4.1.2. 실습
4.1.2.1. master를 비롯한 모든 node에 /data 디렉토리 생성. 지금 실습은 반드시 해당 디렉토리가 존재해야 합니다.
type의 속성이 Directory 이기 때문입니다. File의 경우에는 해당 파일 존재
4.1.2.2. 파일을 생성합니다.
master-> /data/master, node1-> /data/node1, node2-> /data/node2 파일 생성
4.1.2.3. nginx를 실행하는 yaml 파일 생성
4.1.2.4. container가 어느 node에서 실행되는지 확인 후 container 내의 /data/파일 확인
4.2. hostPath FileOrCreate
4.2.1. 만일 node에 해당 디렉토리가 존재하지 않는 경우라면
4.2.1.1. hostpath.yml 파일을 내용을 수정해서 존재하지 않는 /test라는 디렉토리는 Mount하려 하면
4.2.1.2. 아래와 같이 /test 디렉토리가 존재하지 않는다는 오류와 함께 Container가 생성되지 않음.
4.2.2. 이런 경우에는 type을 DirectoryOrCreate 와 FileOrCreate 으로 설정하면 해당 디렉토리 및 파일을 생성하며 Container를 실행시킬 수 있습니다.
4.2.2.1 hostpath.yml 파일 변경
4.2.2.2. pod 생성
4.2.2.3. node 및 container에 디렉토리 및 파일 생성 확인
4.2.2.4. type 값
Value | Action |
빈 문자열은 이전 버전과의 호환성확보, mount전 아무런 검사도 수행하지 않음 | |
Directory | 반드시 디렉토리가 node에 존재해야 함. |
DirectoryOrCreate | 경로에 아무것도 없을 경우 kubelet에 갖는 동일한 그룹,소유권을 0755로 설정한 빈디렉터리 생성 |
File | 반드시 파일이 node에 존재해야 함. |
FileOrCreate | 경로에 아무것도 없을 경우 kubelet에 갖는 동일한 그룹,소유권을 0755로 설정한 파일 생성 |
Socket | 주어진 경로에 Unix 소캣이 있어야 함. |
CharDevice | 주어진 경로에 문자 디바이스가 있어야 함. |
BlockDevice | 주어진 경로에 블록 디바이스가 있어야 함. |
4.2.2.5. pod를 삭제해도 volume은 그대로 존재하면 Container와는 다른 라이프사이클을 갖게 됩니다.
허나 K8S에서는 보안상의 이유로 그다지 권장하지 않는 설정 입니다.
volume와 persistent volume의 가장 큰 차이점은
volume은 node 단위로 관리가 되고 persistent volume은 Cluster 단위로 관리가 된다는 점입니다.
다음 시간에는 Persistence Volume에 대해서 알아보겠습니다.
Have a nice day!