볼륨
컨테이너 내의 디스크에 있는 파일은 임시적이기 때문에 문제가 발생할 수 있다.
한 가지 문제는 컨테이너가 크래시될 때 파일이 손실돼서 kubelet은 컨테이너를 다시 시작하지만 초기화된 상태이다.
두 번째 문제는 Pod에서 같이 실행되는 컨테이너간에 파일을 공유하고자 할 때 어렵다.
쿠버네티스 볼륨 추상화는 이러한 문제를 모두 해결한다.
일전에 docker 공부를 하면서 작성했던 볼륨 글을 참조하자
쿠버네티스에서도 이런 볼륨이란 개념이 더 고급화된 기능으로 존재한다.
도커 볼륨은 디스크에 있는 디렉터리이거나 다른 컨테이너에 있다.
이렇게 도커는 볼륨 드라이버를 제공하지만, 쿠버네티스의 볼륨 기능보다 다소 제한된다는 차이가 있다.
https://raid-1.tistory.com/106
반면 쿠버네티스는 다양한 유형의 볼륨을 지원한다. pods는 여러 볼륨 유형을 동시에 사용할 수 있다.
기본적으로 볼륨은 디렉터리이며, 일부 데이터가 있을 수 있으며, 파드 내 컨테이너에서 접근할 수 있다.
- 임시 볼륨(ephemeral) : pods 삭제와 동시에 삭제된다. 파드 내의 컨테이너가 재시작되어도 데이터는 보존된다.
- 퍼시스턴트(persistent) 볼륨 : pods의 수명과 관계없다. 파드 내의 컨테이너가 재시작되어도 데이터는 보존된다.
볼륨 마운트된 디렉터리 위치는 여기서 확인한다.
예를 들어 nginx 라는 pods를 실행시켰다고 치자.
k describe pods nginx
emptyDir
임시 디스크 같은 개념이다.
emptyDir 볼륨은 파드가 노드에 할당될 때 처음 생성되며, 해당 노드에서 파드가 실행되는 동안에만 존재한다.
파드 내 모든 컨테이너는 emptyDir 볼륨에서 동일한 파일을 읽고 쓸 수 있지만
노드에서 파드가 제거되면 emptyDir 의 데이터가 영구적으로 삭제된다.
볼륨에 대한 설정(디렉토리 지정등)을 한 yaml파일을 작성해보자.
cat << EOF > vl-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: sidecar
spec:
containers:
- name: app
image: busybox
args:
- /bin/sh
- -c
- >
while true;
do
echo "$(date)\n" >> /var/log/example.log;
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: sidecar
image: busybox
args: [/bin/sh, -c, "tail -f /var/log/example.log"]
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
EOF
k create -f vl-emptydir.yaml
컨테이너에 접속하여 마운트 설정이 제대로 들어갔나 확인해보자.
k exec sidecar -it -- /bin/sh
다음과 같이 검색된다.
k delete pods sidecar
PV / PVC
퍼시스턴트볼륨 서브시스템은 스토리지 사용 방법에서부터
스토리지가 제공되는 방법에 대한 세부 사항을 추상화하는 API를 제공한다.
이를 위해 persistentVolume(PV) 및 persistentVolumeClaim(PVC)라는 두 가지 새로운 API 리소스가 있다.
- persistentVolume(PV) : 관리자가 프로비저닝하거나 스토리지 클래스를 사용하여 동적으로 프로비저닝한 클러스터의 스토리지이다. 노드가 클러스터 리소스인 것처럼 PV는 클러스터 리소스이다. PV를 사용하는 pods와는 별개의 라이프사이클을 가진다.
- persistentVolumeClaim(PVC) : 사용자의 스토리지에 대한 요청이다. pods는 노드에 리소스를 요청해서 사용하고 PVC는 PV 리소스를 사용하는 점이 파드와 비슷하다.
master node에서 진행
cat << EOF > vl-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
storageClassName: manual
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 192.168.108.6
path: /html
EOF
cat << EOF > vl-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: manual
EOF
cat << EOF > vl-st-nginx.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: st-nginx
spec:
selector:
matchLabels:
app: st-nginx
replicas: 3
serviceName: st-nginx
podManagementPolicy: OrderedReady
template:
metadata:
labels:
app: st-nginx
spec:
containers:
- name: st-nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: pvc-volume
volumes:
- name: pvc-volume
persistentVolumeClaim:
claimName: nfs-pvc
EOF
node1,node2 모두 nfs-utils 설치 진행
yum install -y nfs-utils
master node에서 진행
k create -f vl-pv.yaml
k get pv
k create -f vl-pvc.yaml
k get pv, pvc
k create -f vl-st-nginx.yaml
k exec st-nginx-0 -it -- /bin/bash
mount | egrep html
마운트 디렉토리 위치를 확인한다.
확인한 위치에 테스트용 파일 작성
cd /usr/share/nginx/html/
echo “Hello SeSAC” > index.html
curl localhost
exit
node3에서 진행
다음과 같이 노드끼리 스토리지가 공유되고 있음을 알 수 있다.
master node에서 진행
k delete pv,pvc,pods --all
k delete -f vl-st-nginx.yaml
https://kubernetes.io/ko/docs/concepts/storage/volumes/
https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/
'Kubernetes' 카테고리의 다른 글
쿠버네티스 논리연산자 (0) | 2023.01.02 |
---|---|
스케쥴링 (0) | 2023.01.02 |
pods 및 컨테이너 리소스 관리 (0) | 2022.12.29 |
스태틱(static) pods (1) | 2022.12.29 |
init container (초기화 컨테이너) (0) | 2022.12.28 |