본문 바로가기

Kubenetes/Volumes

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

쿠버네티스의 볼륨은 Pod의 컴포넌트이므로 컨테이너와 마찬가지로 Pod의 스펙에 정의

볼륨은 독립적인 쿠버네티스 오브젝트가 아니며 스스로 생성하거나 삭제할 수 없다.

 

공유 스토리지가 없는 동일한 Poddml 세 Container

 

다양한 마운트 경로에 마운트된 두 개의 볼륨을 공유하는 세 개의 Container

 

 

ㅁ 사용 가능한 볼륨 유형

 

 - emptyDir: 일시적인 데이터를 저장하는 데 사용되는 비어있는 다순한 디렉터리 

 

 - hostPath: 워커노드의 파일 시스템에서 Pod로 디렉터리를 마운트하는 데 사용

 

 - gitRepo: Git 스토리지의 내용을 체크아웃해 초기화된 볼륨

 

 - nfs: Pod에 마운트된 NFS 공유

 

 - gcePersistentDisk(구글 컴퓨트 엔진 영구 디스크), awsElastic-BlockStore(AWS EBS), azureDisk(마이크로소프트 애저 디스크 볼륨): 클라우드 제공자에 따라 전용 스토리지를 마운트하는데 사용

 

 - cinder, cephfs, iscsi, flocker, glusterfs, quobyte, rbd, flexVolume, vsphere-Volume, photonPersistenDisk, scaleIO: 다른 유형의 네트워크 스토리지를 마운트하는 데 사용

 

 - configMap, secret, downardAPI: 특정 쿠버네티스 리소스 및 클러스터 정보를 Pod에 노출하는 데 사용되는 특수한 유형의 보륨

 

 - persistentVolumeClaim: 사전 또는 동적으로 프로비저닝된 영구 스토리지를 사용하는 방법 

 

ㅁ emptyDir 볼륨 사용하기

 

 - emptyDir 볼륨은 빈디렉터리로 시작

 - Pod 내부에서 실행 중인 애플리케이션은 필요한 모든 파일을 작성할 수 있다.

 - 볼륨의 수명이 포드와 연관되어 있기 때문에 포드를 삭제하면 볼륨의 내용이 손실

 

 - emptyDir 볼륨은 동일한 Pod에서 실행 중인 컨테이너 간에 파일을 공유할 때 특히 유용

 - 사용 가능한 메모리에 맞지 않는 대규모 데이터 세트를 정렬할 때 처럼 단일 컨테이너가 임시로 디스크에 데이터를 기록해야 하는 경우에도 사용 가능.

 

[동일한 볼륨을 공유하는 두 개의 컨테이너가 있는 Pod 생성]

apiVersion: v1
kind: Pod
metadata:
    name: fortune
spec:
    containers:
    - image: luksa/fortune       #첫번째 이미지는 html-generator
      name: html-generator
      volumeMounts:              #html이라는 볼륨이 컨테이너의 /var/htdocs에 마운트
      - name: html
         mountPath: /var/htdocs
   - image: nginx:alpine        # 두번째 컨테이너는 웹 서버라고 하며 nginx:alpine 이미지를 실행
      name: web-server
      volumeMounts:            # 위와 동일한 볼륨이 /usr/share/nginx/html에 읽기 전용으로 마운트
      - name: html
        mounthPath: /usr/share/nginx/html
        readOnly: true
     ports:
     - containerPort: 80
        protocol: TCP
volumes:                            # 위의 두 컨테이너에 마운트된 html이라는 단일 emptyDir 볼륨
- name: html
   emptyDir: {}

 

 

ㅁ Git 스토리지를 볼륨의 시작점으로 사용

 

gitRepo 볼륨은 기본적으로 a를 복제하여 채워지는 emptyDir 볼륨

 

gitRepo 볼륨은 시작 시점에는 깃 스토리지의 내용으로 채워진 emptyDir 볼륨

 

 

gitRepo 볼륨을 사용하는 Pod: gitrepo-volume-pod.yaml

apiVersion: v1
kind: Pod
metadata:
    name: gitrepo-volume-pod
spec:
    containers:
    - image: nginx:alpine
      name: web-server
      voluemMounts:
      - name: html
        mountPath: /usr/share/nginx/html
        readOnly: true
    ports:
    - containerPort: 80
      protocol: TCP
volume:
- name: html
  gitRepo:                  # gitRepo 볼륨을 생성하는 중
    repository: https://github.com/luksa/kubia-website-example.git   # 볼륨은 깃 스토리지로 복제될 것이다.
    revision: master   # 마스터 브랜치가 체크아웃될 것이다.
    directory: .            # 볼륨의 루트 디렉토리에 복제할 수 있다.

 

ㅁ Worker Node 파일 시스템에 액세스

 

[hostPath 볼륨 소개]

 

hostPath 볼륨은 노드의 파일 시스템에 있는 특정 파일 도는 디렉터리를 가리킴

hostPath 볼륨은 워커노드의 파일 또는 디렉터리를 컨테이너의 파일 시스템에 마운트

 

  - hostPath 볼륨은 영구 스토리지 유형

  - gitRepo와 emptyDir볼륨은 포드가 해체될 때 삭제되지만 hostPath 볼륨의 내용은 삭제 되지 않음

 

ㅁ 영구 스토리지 사용

 

[포드 볼륨에서 GCE 영구 디스크 사용]

 

GCE(구글 컴퓨터 엔진)에서 클러스터 노드를 실행하는 예제를 실행한 경우 GCE 영구 디스크를 기본 스토리지 매커니즘으로 사용

 

$ gcloud container clusters list

NAME     Zone                      MASTER_VERSION       MASTER_IP ...

kubia      europe-west1-b     1.2.5                             104.155.84.137

 

위에 나온 GCloud Zone과 동일한 위치에 디스크 생성

$ gcloud compute disks create --size=1GiB --zone=europe-west1-b mongodb

 

gcePersistentDisk를 사용해 Pod 생성

 

mongodb-pod-gcepd.yaml

apiVersion: v1
kind: Pod
metadata:
    name: mongodb
spec:
    voluems:
    - name: mongodb-data
      gcePersistentDis:        # 볼륨의 유형이 GCE 영구 디스크
        pdName: mongodb. # 영구 디스크의 이름은 이전에 만든 실제 PD와 일치해야 함.
        fsType: ext4             # 파일 시스템 유형이 ext4(리눅스 시스템 유형)
  containers:
  - image: mongo
    name: mongodb
    volumeMounts:
    - name: mongodb-data
      mountPath: /data/db # 몽고DB가 데이터를 저장하는 경로
    ports:
    - containerPort: 27017
       protocol: TCP

 

외부 GCE 영구 디스크를 참조하는 볼륨을 마운트하는 몽고DB를 실행하는 단일 컨테이너가 있는 포드

 

[awsElasticBlockStore 볼륨 사용]

 

mongodb-pod-aws.yaml

apiVersion: v1
kind: Pod
metadata:
    name: mongodb
spec:
    voluems:
    - name: mongodb-data
      awsElasticBlockStore:        # 볼륨의 유형이 AWS EBS 영구 디스크
        volumeId: my-volume     # 생성한 EBS 볼륨의 ID 지정.
        fsType: ext4                    # 파일 시스템 유형이 ext4(리눅스 시스템 유형)
  containers: 
  .....

 

 

[NFS 볼륨 사용]

 

mongodb-pod-nfs.yaml

.....
volumes:
    - name: mongodb-data
      nfs:
         server: 1.2.3.4
         path: /some/path

 

 

'Kubenetes > Volumes' 카테고리의 다른 글

볼륨: PersistentVolume과 PersistentVolumeClaim  (0) 2021.02.06