sungsu9022 / study-kubernetes-in-action

study-kubernetes
12 stars 8 forks source link

6. 볼륨 : 컨테이너에 디스크 스토리지 연결 #6

Open sungsu9022 opened 4 years ago

sungsu9022 commented 4 years ago

6. 볼륨 : 컨테이너에 디스크 스토리지 연결

6.1 볼륨 소개

6.1.1 볼륨 예제

스크린샷 2020-08-17 오후 5 41 21

6.1.2 사용 가능한 볼륨 유형 소개

6.2 볼륨을 사용한 컨테이너간 데이터 공유

6.2.1 emptyDir 볼륨 사용

파드에 emptyDir 볼륨 사용(동일한 볼륨을 공유하는 컨테이너 2개가 있는 파드)

apiVersion: v1
kind: Pod
metadata:
  name: fortune
spec:
  containers:
  - image: luksa/fortune
    name: html-generator                          # 첫번째 컨테이너 html-generator
    volumeMounts:                                     # html이라는 이름의 볼륨을 컨테이너 /var/htdocs에 마운트
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server                               # 두번째 컨테이너 web-server
    volumeMounts:                                    # html이라는 이름의 볼륨을 컨테이너 /usr/share/nginx/html에 마운트
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:                                                 # html이라는 단일 emptyDir 볼륨을 위의 컨테이너 2개에 마운트하기 위한 정의
  - name: html
    emptyDir: {}

실행중인 파드 보기

# pod 조회
kubectl get po 

# fortune pod 포트 포워딩
kubectl port-forward fortune 8080:80

# request
curl http://localhost:8080

# html-generator 컨테이너 내부 확인
kubectl exec -i -t fortune -c html-generator -- /bin/bash

# web-server 컨테이너 index.html 파일 확인
kubectl exec -i -t fortune -c web-server -- cat /usr/share/nginx/html/index.html

emptyDir을 사용하기 위한 매체 지정하기

  volumes: 
  - name: html
    emptyDir: 
        medium: Memory   # 이 emptyDir의 파일들은 메모리에 저장된다.

6.2.2 깃 리포지터리를 볼륨으로 사용하기

스크린샷 2020-08-17 오후 6 18 08

복제된 깃 리포지터리 파일을 서비스하는 웹 서버 실행하기

apiVersion: v1
kind: Pod
metadata:
  name: gitrepo-volume-pod
spec:
  containers:
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    gitRepo:               # gitRepo 정의하여 볼륨 정의 가능
      repository: https://github.com/luksa/kubia-website-example.git
      revision: master
      directory: .

gitRepo 볼륨에 대한 정리

6.3 워커 노드 파일시스템의 파일 접근

6.3.1 hostPath 볼륨 소개

스크린샷 2020-08-17 오후 6 40 24

6.3.2 hostPath 볼륨을 사용하는 시스템 파드 검사하기

# kube-system 네임스페이스의 시스템 파드 조회
kubectl get pods --namespace kube-system

# 시스템 파드 Path 확인
kubectl describe po kube-controller-manager-minikube --namespace kube-system

# path 내용들
ca-certs:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/ssl/certs
    HostPathType:  DirectoryOrCreate
  flexvolume-dir:
    Type:          HostPath (bare host directory volume)
    Path:          /usr/libexec/kubernetes/kubelet-plugins/volume/exec
    HostPathType:  DirectoryOrCreate
  k8s-certs:
    Type:          HostPath (bare host directory volume)
    Path:          /var/lib/minikube/certs
    HostPathType:  DirectoryOrCreate
  kubeconfig:
    Type:          HostPath (bare host directory volume)
    Path:          /etc/kubernetes/controller-manager.conf
    HostPathType:  FileOrCreate

6.4 퍼시스턴트 스토리지 사용

6.4.1 GCE 퍼시스턴트 디스크를 파드 볼륨에 사용하기

apiVersion: v1
kind: Pod
metadata:
  name: mongodb 
spec:
  volumes:
  - name: mongodb-data
    gcePersistentDisk:                 # 볼륨의 유형은 GCE 퍼시스턴트 디스크
      pdName: mongodb            
      fsType: ext4                         # 리눅스 파일시스템 유형
  containers:
  - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db           # 컨테이너 내 마운트 되는 path
    ports:
    - containerPort: 27017
      protocol: TCP
스크린샷 2020-08-17 오후 6 57 35

6.4.2 기반 퍼시스턴트 스토리지로 다른 유형의 볼륨 사용하기

AWS Elastic Block Store 볼륨 사용

apiVersion: v1
kind: Pod
metadata:
  name: mongodb-aws
spec:
  volumes:
  - name: mongodb-data
    awsElasticBlockStore:                 # awsElasticBlockStore
      volumeID: my-volume
      fsType: ext4
...

NFS 볼륨 사용

apiVersion: v1
kind: Pod
metadata:
  name: mongodb-nfs
spec:
  volumes:
  - name: mongodb-data
    nfs:
      server: 1.2.3.4
      path: /some/path
...

다른 스토리지 기술 사용

6.5 기반 스토리지 기술과 파드 분리

6.5.1 퍼시스턴트볼륨(PV, PersistentVolume)과 퍼시스턴트볼륨클레임(PVC, PersistentVolumeClaim)

스크린샷 2020-08-17 오후 7 07 36

6.5.2 퍼시스턴트볼륨 생성

정의

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongodb-pv
spec:
  capacity: 
    storage: 1Gi
  accessModes:
    - ReadWriteOnce                                       # 단일 클라이언트의 읽기/쓰기용으로 마운트
    - ReadOnlyMany                                        # 여러 클라이언트의 읽기 전용으로 마운트
  persistentVolumeReclaimPolicy: Retain    # 클레임이 해제된 후 퍼시스턴트볼륨을 유지한다.
  hostPath:                                                     # ohstPath 볼륨 (minikube)
    path: /tmp/mongodb

persistentVolumeReclaimPolicy

현재 NFS 및 HostPath만 재활용을 지원한다. AWS EBS, GCE PD, Azure Disk 및 Cinder 볼륨은 삭제를 지원한다.

생성 및 조회

# hostPath PV 생성
kubectl create -f mongodb-pv-hostpath.yaml

# pv 조회
kubectl get pv
스크린샷 2020-08-17 오후 7 22 00

6.5.3 퍼시스턴트볼륨클레임 생성을 통한 퍼시스턴트볼륨 요청

퍼시스턴트볼륨클레임 생성하기

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc 
spec:
  resources:
    requests:                         # 1GiB의 스토리지를 요청
      storage: 1Gi 
  accessModes:
  - ReadWriteOnce               # 단일 클라이언트를 지원하는 읽기/쓰기 스토리지
  storageClassName: ""

퍼시스턴트볼륨클레임 조회하기

# 퍼시스턴트볼륨클레임 생성
kubectl create -f mongodb-pvc.yaml

# 퍼시스턴트볼륨클레임 조회
kubectl get pvc

퍼시스턴트볼륨 접근모드

6.5.4 파드에서 퍼시스턴트볼륨클레임 사용하기

apiVersion: v1
kind: Pod
metadata:
  name: mongodb 
spec:
  containers:
  - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db
    ports:
    - containerPort: 27017
      protocol: TCP
  volumes:
  - name: mongodb-data                # 파드 볼륨에서 이름으로 퍼시스턴트볼륨클레임을 참조
    persistentVolumeClaim:
      claimName: mongodb-pvc

mongodb test

# 퍼시스턴트클레임을 이용하는 mongodb pod 생성
kubectl create -f mongodb-pod-pvc.yaml

# mongodb 셸 접속
kubectl exec -it mongodb mongo

# mongodb db 변경
use mystore

# 데이터 insert
db.foo.insert({name:'foo'})

# 데이터 조회
db.foo.find()

6.5.5 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 사용의 장점 이해하기

스크린샷 2020-08-17 오후 11 34 27

6.5.6 퍼시스턴트볼륨 재사용

# mongodb pod 삭제
kubectl delete pod mongodb

# pvc 삭제
kubectl delete pvc mongodb-pvc

#pvc, pod 재생성 ( 이 경우 pvc는 바로 volume을 할당받지 못하고 Pending 상태가 된다.)
kubectl create -f mongodb-pvc.yaml
kubectl create -f mongodb-pod-pvc.yaml

# pvc 조회
kubectl get pvc

# pv 조회 ( 퍼시스턴트볼륨의 상태가 Released로 표시되고 Available이 아니다. 그 이유는 이미 볼륨을 사용했기 떄문에 데이터를 가지고 있어서 새로운 클레임을 바인딩할 수 없는 상태)
kubectl get pv

퍼시스턴트볼륨을 수동으로 다시 클레임하기

퍼시스턴트볼륨을 자동으로 다시 클레임하기

스크린샷 2020-08-18 오전 12 29 06

6.6 퍼시스턴트볼륨의 동적 프로비저닝

6.6.2 퍼시스턴트볼륨클레임에서 스토리지 클래스 요청하기

특정 스토리지클래스를 요청하는 pvc 정의

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc 
spec:
  storageClassName: fast           # PVC는 사용자 정의 스토리지 클래스를 요청
  resources:
    requests:
      storage: 100Mi
  accessModes:
    - ReadWriteOnce

스토리지클래스 정의

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast
provisioner: k8s.io/minikube-hostpath
parameters:
  type: pd-ssd

동적 프로비저닝된 PV와 생성된 PVC 조회

# 스토리지클래스 생성
kubectl create -f storageclass-fast-hostpath.yaml

# PVC 생성
kubectl create -f mongodb-pvc-dp.yaml

# pvc 조회
kubectl get pvc

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
mongodb-pvc   Bound    pvc-b767134f-218a-48cc-b1a4-4787a661fd09   100Mi      RWO            fast           16m

# pv 조회
kubectl get pv 
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
pvc-b767134f-218a-48cc-b1a4-4787a661fd09   100Mi      RWO            Delete           Bound    default/mongodb-pvc   fast                    16m

스토리지 클래스 사용하는 법 이해하기

6.6.3 스토리지 클래스를 지정하지 않는 동적 프로비저닝

# 스토리지 클래스 조회
kubectl get sc

NAME                 PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
fast                 k8s.io/minikube-hostpath   Delete          Immediate           false                  18m
standard (default)   k8s.io/minikube-hostpath   Delete          Immediate           false                  26h

# 기본 스토리지 클래스 확인
kubectl get sc standard -o yaml

스토리지 클래스를 지정하지 않고 퍼시스턴트볼륨클레임 생성하기

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc2 
spec:
  resources:
    requests:
      storage: 100Mi
  accessModes:
    - ReadWriteOnce
# 스토리지 클래스를 지정하지 않고 pvc 생성
kubectl create -f mongodb-pvc-dp-nostorageclass.yaml

# pvc 확인
kubectl get pvc

# pv 확인
kubectl get pv

퍼시스턴트볼륨클레임을 미리 프로비저닝된 퍼시스턴트볼륨으로 바인딩 강제화하기

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mongodb-pvc 
spec:
  resources:
    requests:
      storage: 1Gi
  accessModes:
  - ReadWriteOnce
  storageClassName: ""      # 빈 문자열을 스토리지클래스 이름으로 지정하면 PVC가 새로운 PV를 동적 프로비저닝하지 않고 미리 프로비저닝된 PV에 바인딩된다.

퍼시스턴트볼륨 동적 프로비저닝의 플로우

스크린샷 2020-08-18 오전 12 30 12

6.7 요약

sungsu9022 commented 4 years ago

minikube vm 기반으로 설정하는 방법

minikube start --driver=hyperkit