Volume이란
독립적인 쿠버네티스 리소스가 아니므로 자체적으로 생성, 삭제될 수 없음. 볼륨은 파드의 모든 컨테이너에서 사용 가능하며 이 경우 접근하려는 각 컨테이너에서 마운트해야 함. 각 컨테이너 파일 시스템의 어느 경로에나 볼륨을 마운트 가능.
Volume의 종류
1. emptyDir
- 최초 생성될 때 볼륨 내용이 비어있기 때문에 emptyDir로 명칭
- 파드 단위로 마운트되는 볼륨
- 같은 Pod내의 컨테이너들끼리 데이터를 공유가능
- Pod내의 마운트된 볼륨을 통해 자신의 로컬처럼 데이터를 공유가능
- 파드 생성시 만들어지고 삭제시 없어지므로 일시적인 데이터 보관
emptyDir yaml 작성 예시
2. hostPath
- Pod가 올라가 있는 Node를 Path로 사용하기 때문에 명칭 - 노드 단위로 마운트되는 볼륨
- Pod 생성전에 만들지 않으면 해당 볼륨과 연결하는 Pod 생성시 에러 발생
- emptyDir과 다르게 Pod가 죽어도 볼륨의 데이터는 사라지지 않음
- 노드 자신을 위해 사용하는 파일을 위해 사용(Pod의 데이터를 위해 존재 X)
- 노드 단위 마운트의 문제점
- 파드가 재생성 될때 같은 노드에 생성된다는 보장이 없음 - 노드 추가시 운영자가 직접 마운트를 해줘야함(자동화 X)
hostPath yaml 작성 예시
3. PVC(PersistentVolumeClaim)/PV(PersistentVolume)
- Pod 영속성이 있는 볼륨
- PV는 로컬 및 외부 원격 볼륨 등 다양하게 존재 ex) NFS, AWS, git
- Pod는 PV와 직접 연결 X -> PVC를 통해 PV를 연결
- PV 생성 -> PVC 생성 -> 연결 -> Pod생성 및 마운팅 의 순으로 진행
- Kubernetes는 볼륨 사용에 있어 유저 영역과 관리자 영역을 나눔
PV yaml 작성 예시
PVC yaml 작성 예시
PVC연결 Pod yaml 작성 예시
Volume실습
emptyDir 볼륨
yaml 파일 작성 및 Volume, Pod 생성
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: {}
생성된 Pod 및 Container에 마운트된 볼륨 확인
hostPath 볼륨
yaml 파일 작성 및 Pod 생성
해당 Pod는 이름을 바꿔 node-v 볼륨을 공유하는 3개를 생성 -> pod-volume-1, pod-volume-2, pod-volume-3
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-1
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
생성된 Pod 확인
hostPath 공유여부 확인
pod ~ 1에서 마운트 디렉토리에 파일 추가
pod ~ 2의 마운트 디렉토리에 동일한 파일이 존재
Pod가 생성된 node1서버에서 node-v 디렉토리 및 마운트 볼륨에 생성된 파일 확인
-> Pod 재생성에도 데이터가 유지됨
PV/PVC 볼륨
yaml파일 작성, 3개의 PV 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-01
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteOnce
local:
path: /node-v
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-02
spec:
capacity:
storage: 1G
accessModes:
- ReadWriteMany
local:
path: /node-v
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-03
spec:
capacity:
storage: 2G
accessModes:
- ReadWriteOnce
local:
path: /node-v
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
생성 확인
3개의 PV와 연결될 3개의 PVC 생성, yaml 파일 작성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-01
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
storageClassName: ""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-02
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1G
storageClassName: ""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-03
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2G
storageClassName: ""
생성된 PVC확인
PV와 연결 확인
PVC-3와 연결할 Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-3
spec:
containers:
- name: container
image: kubetm/init
volumeMounts:
- name: pvc-pv
mountPath: /mount3
volumes:
- name : pvc-pv
persistentVolumeClaim:
claimName: pvc-01
생성된 Pod 확인
생성된 Pod의 Container에 mount3으로 마운트 디렉토리를 확인
'CICD' 카테고리의 다른 글
[Kubernetes] Namespace, ResourceQuota, LimitRange(기본 오브젝트) (0) | 2022.01.05 |
---|---|
[Kubernetes] ConfigMap, Secret(기본 오브젝트) (0) | 2022.01.05 |
[Kubernetes] Service(기본 오브젝트) (0) | 2022.01.03 |
[Kubernetes] Pod(기본 오브젝트) (0) | 2022.01.03 |
쿠버네티스 소개 (0) | 2021.12.28 |
댓글