Kubernetes - 05. 쿠버네티스의 저장소 개념 탐구

2020. 9. 10. 00:35Computer/Kubernetes

시작하기에 앞서서

Node (미니언), Pod, Container 에 대한 정리가 잘된 이미지가 있어 첨부하고 시작한다. ( Kubernetes 공식 홈페이지에 있는 사진 )

01

 

퍼시스턴트 데이터 저장소란?

쉽게 생각하면 데이터가 사라지지 않는 데이터 저장소다. 예를들어 도커의 컨테이너가 죽으면, 도커 컨테이너 자체의 데이터는 사라질 수 있다. 그러나, 이를 mount 하는 형태로 설정을 하면, 컨테이너가 중단되더라도, mount 된 볼륨 혹은 디스크에 저장된 데이터는 사라지지 않는다.

 

쿠버네티스에서도 이런 데이터 저장소를 지원한다.

kubernetes.io/docs/concepts/storage/volumes를 참조하면 쿠버네티스에서 지원하는 볼륨 유형들을 볼 수 있다.

 

1. 임시디스크

다음의 yml 을 생성한다.

apiVersion: v1
kind: Pod
metadata:
  name: memory-pd
spec:
  containers:
  - image: nginx:latest
    ports:
    - containerPort: 80
    name: memory-pd
    volumeMounts:
    - mountPath: /memory-pd
      name: memory-volume
  volumes:
  - name: memory-volume
    emptyDir:
      medium: Memory

아래의 커맨드를 이용하여 pod 을 생성한다.

pc:~ user$ kubectl create -f storage-memory.yml
pod/memory-pd created

pc:~ user$ kubectl get pods
NAME                              READY   STATUS              RESTARTS   AGE
hello-minikube-5655c9d946-fq2gd   1/1     Running             1          34d
memory-pd                         0/1     ContainerCreating   0          14s

pc:~ user$ kubectl exec memory-pd -- df
Filesystem     1K-blocks    Used Available Use% Mounted on
overlay         17784752 2791836  13952680  17% /
tmpfs              65536       0     65536   0% /dev
tmpfs            1967400       0   1967400   0% /sys/fs/cgroup
tmpfs            1967400       0   1967400   0% /memory-pd
/dev/sda1       17784752 2791836  13952680  17% /etc/hosts
shm                65536       0     65536   0% /dev/shm
tmpfs            1967400      12   1967388   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs            1967400       0   1967400   0% /proc/acpi
tmpfs            1967400       0   1967400   0% /proc/scsi
tmpfs            1967400       0   1967400   0% /sys/firmware

pod 을 생성하고 memory-pd 컨테이너가 memory-volume 라는 메모리 타입의 저장소를 마운트 하고 있는지 확인할 수 있었다.

이후 실제로, 메모리타입의 스토리지는 container 가 재부팅될떄 데이터가 유지가 안되는지 확인해보았다.

pc:~ user$ kubectl exec memory-pd -- touch ./memory-pd/test 

pc:~ user$ kubectl exec memory-pd -- ls ./memory-pd
test

pc:~ user$ kubectl delete -f memory-pd.yaml
pc:~ user$ kubectl create -f memory-pd.yaml

pc:~ user$ kubectl exec memory-pd -- ls ./memory-pd

pod 를 삭제후 새로 생성하면 mount 했던 memory volume 의 데이터는 없어진다.

 

2. 퍼시스턴트 볼륨을 이용한 pod 구성

구성은 아래의 순서로 진행합니다.

1. node 의 특정 path 에 데이터 추가 

2. 클러스터 관리자는 물리적 스토리지로 지원되는 PersistentVolume을 생성합니다. 볼륨을 포드와 연결하지 않습니다.

3. 개발자 / 클러스터 사용자 역할을 맡은 사용자는 적절한 PersistentVolume에 자동으로 바인딩되는 PersistentVolumeClaim을 만듭니다.

4. PersistentVolumeClaim을 저장소로 사용하는 포드를 만듭니다

 

1. node 의 특정 path 에 데이터 추가

pc:~ user$ minikube ssh
$ sudo mkdir /mnt/data
$ sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"
$ cat /mnt/data/index.html
Hello from Kubernetes storage

 

2. Persistent Volume 생성

pv.yaml

더보기

apiVersion: v1

kind: PersistentVolume

metadata:

name: task-pv-volume

labels:

type: local

spec:

storageClassName: manual

capacity:

storage: 2Gi

accessModes:

- ReadWriteOnce

hostPath:

path: "/mnt/data"

kubectl apply -f pv.yaml

3. Persistent Volume Claim 생성 

pvc.yaml

더보기

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: task-pv-claim

spec:

storageClassName: manual

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 1Gi

kubectl apply -f pvc.yaml

4. PVC 를 volume 으로 사용하는 container 생성

더보기

apiVersion: v1

kind: Pod

metadata:

name: task-pv-pod

spec:

volumes:

- name: task-pv-storage

persistentVolumeClaim:

claimName: task-pv-claim

containers:

- name: task-pv-container

image: nginx

ports:

- containerPort: 80

name: "http-server"

volumeMounts:

- mountPath: "/usr/share/nginx/html"

name: task-pv-storage

생성이 완료되면, 해당 container 로 진입하여 curl 을 설치 로컬호스트로 실제 PVC 가 잘 바인딩했는지 확인해본다.

pc:~ user$ kubectl exec -it task-pv-pod -- /bin/bash
root@task-pv-pod:/# apt update
root@task-pv-pod:/# apt install curl
root@task-pv-pod:/# curl http://localhost/
Hello from Kubernetes storage

확인시 node 에서 생성해둔 index.html 파일이 잘 나오는것을 볼 수 있다.

 

보다 더 이해를 돕기 위해 아래 영상을 보며 마치겠다. ( 1:48:02 부터 )

www.youtube.com/watch?v=l42GttmnnZ4&t=715s

반응형