Volume
emptyDir, hostPath, PVC/PV에 대해 알아보자
1. emptyDir
- 컨테이너들끼리 데이터를 공유하기 위해서 볼륨을 사용하는 것
- 최초 볼륨이 생성될 때 볼륨 내용이 비어있기 때문에 emptyDir로 명명됨
- Container1이 web이고 Contaner2가 back-end라 하자
- Container1은 웹서버로 받은 특정 파일을 마운트된 Volume에 저장
- Container2도 Volume을 이용하여 두 서버가 파일을 주고받을 필요 없이 편하게 사용 가능
- 이 볼륨은 파드안에 생성되기 때문에 파드에 문제가 생겨 재생성되면 데이터가 없어짐
- 볼륨에 쓰인 데이터는 꼭 일시적인 사용목적을 가져야 함
Sample YAML
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-1
spec:
containers:
- name: container1
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount1
- name: container2
image: kubetm/init
volumeMounts:
- name: empty-dir
mountPath: /mount2
volumes:
- name : empty-dir
emptyDir: {}
- 컨테이너가 2개
- 둘 다 볼륨을 마운트하고 있음
- 마운트하는 path를 보면 컨테이너1은 mount1, 컨테이너2는 mount2
- path가 달라도 name이 empty-dir이여서 컨테이너마다 자신이 원하는 경로를 사용할 수 있음
- 무튼 같은 볼륨 사용하는거임
2. hostPath
- 파드들이 올라가진 노드의 path를 볼륨으로써 사용
- emptyDir이랑 다른점은 path를 파드들이 공유하기 때문에 파드가 죽어도 노드의 볼륨은 안 죽음
- 문제점: 파드2가 죽어서 노드1이 아닌 노드2에 파드2가 재생성되면 노드1의 볼륨 이용 불가
- 노드2가 생길 때, 똑같은 경로를 만들어서 노드에 있는 path끼리 마운트시켜주면 해결가능하지만 쿠버네티스가 해주는게 아님
- 운영자가 리눅스 시스템의 마운트 기술을 사용하는 것 --> 자동화가 아니니 안정적이지 않음, 노권장
- 아무튼 hostPath는 파드 자신이 할당되어 있는 노드의 데이터를 읽거나 쓸 때 사용함
Sample YAML
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-3
spec:
nodeSelector:
kubernetes.io/hostname: k8s-node1
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: host-path
mountPath: /mount1
volumes:
- name : host-path
hostPath:
path: /node-v
type: DirectoryOrCreate
- 파드를 만들 때 컨테이너에서 볼륨을 마운트하는데 mountPath는 /mount1
- path에 대한 host-path의 볼륨이 /node-v에 있음
- host-path의 타입은 Directory
- host-path의 path(/node-v)는 파드가 생성되기 전에 있어야 오류가 나지 않음
- hostPath는 파드의 데이터를 저장하는 용도가 아니라 노드의 데이터를 파드에서 쓰기 위함
3. PVC/PV
- Persistent Volume Claim, Persistent Volume
- PVC/PV는 파드에 영속성 있는 볼륨을 제공함
- 볼륨은 Local도 있고 외부에 원격으로 활용하는 것도 있음
- 이런 것들을 각각 PV를 정의하여 연결함
- 파드는 PV에 바로 연결하지 않고 PVC를 통하여 연결됨
- 파드를 PV에 바로 연결하지 않는 이유는 쿠버네티스가 User와 Admin으로 영역을 나눠서 관리하기 때문
- Admin은 쿠버네티스 운영자, User는 파드에 서비스를 만들고 배포를 담당하는 자
Sample YAML
PV(원격 스토리지)
- 각각의 볼륨에따라 속성들이 다름
PVC
- 읽기/쓰기 모드가 되고 용량이 1G인 볼륨을 달라
- storageClassName: ""인데 이는 현재 만들어진 PV중에서 선택되는 걸 의미
Pod
- claimName에 pvc-01을 연결함
- 볼륨을 만들어 놓으면, 볼륨을 컨테이너에서 사용
정리
- Admin이 PV를 만듦
- User가 PVC를 만듦
- k8s가 PVC에 맞는 PV를 연결해줌
- Pod를 만들 때, PVC를 사용
PV(Local Storage)
- 호스트패스처럼 호스트에 있는 local path를 사용함
- 밑에 내용이 많은데 결론적으로 PV에 연결되는 파드들은 node1이라고 라벨링 되어있는 노드 위에만 만들어짐
- 파드를 생성할 때 무조건 이 노드위에 만들어짐
- 근데 Local type PV는 잘 사용 안 함 ㅋ 그럼 왜하지
- 중요한건 spec의 capacity와 accessMode임, 중요한게 참 많아요
- 이 capacity와 accessMode가 PVC-PV의 연결 근거임
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 8. ConfigMap, Secret - Env, Mount (0) | 2021.02.07 |
---|---|
[k8s] 7. Volume - 실습 (0) | 2021.02.07 |
[k8s] 5. Service - 실습 (0) | 2021.02.03 |
[k8s] 4. Service - ClusterIP, NodePort, LoadBalancer (0) | 2021.02.01 |
[k8s] 3. Pod - 실습 (0) | 2021.01.31 |