본문 바로가기
Kubernetes

볼륨

by Nirah 2022. 12. 29.

 

볼륨

컨테이너 내의 디스크에 있는 파일은 임시적이기 때문에 문제가 발생할 수 있다.

한 가지 문제는 컨테이너가 크래시될 때 파일이 손실돼서 kubelet은 컨테이너를 다시 시작하지만 초기화된 상태이다.

두 번째 문제는 Pod에서 같이 실행되는 컨테이너간에 파일을 공유하고자 할 때 어렵다.

쿠버네티스 볼륨 추상화는 이러한 문제를 모두 해결한다.

 

 

일전에 docker 공부를 하면서 작성했던 볼륨 글을 참조하자

쿠버네티스에서도 이런 볼륨이란 개념이 더 고급화된 기능으로 존재한다.

도커 볼륨은 디스크에 있는 디렉터리이거나 다른 컨테이너에 있다.

이렇게 도커는 볼륨 드라이버를 제공하지만, 쿠버네티스의 볼륨 기능보다 다소 제한된다는 차이가 있다.

https://raid-1.tistory.com/106

 

Volume / bind mount ( Container Data 공유)

Volume / bind mount 원래 컨테이너의 생명주기와 컨테이너 안의 데이터는 생명주기가 똑같다. 컨테이너를 삭제하면 내부 데이터는 사라지게 된다는 뜻이다. 이를 막기 위해 Docker에서 관리하는 Volume

raid-1.tistory.com

 

반면 쿠버네티스는 다양한 유형의 볼륨을 지원한다. 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