Kubernetes/07. 쿠버네티스 볼륨

[쿠버네티스] emptyDir 볼륨 / gitRepo / 초기화 컨테이너

Jaden Park 2021. 6. 22. 00:15

들어가며

emptyDir 볼륨 생성 및 확인

gitRepo 볼륨

초기화 컨테이너


들어가며:

emptyDir 볼륨은 아무 데이터도 없는 빈 디렉토리를 제공해주는 볼륨입니다. 파드가 생성하는 데이터를 저장할 수 있으며, 동일한 파드 내의 컨테이너 간에 데이터를 공유할 때 유용하게 사용할 수 있습니다. 또한, 빅 데이터와 같은 큰 데이터 셋트를 처리하기 위한 임시 저장소로도 사용 가능 합니다.

 

최초로 volume이 생성될 때는 volume의 내용이 비어있기 때문에 emptyDir 이라고 부릅니다.

Container1이 Web1 역할을 하는 서버이고 Container2가 backend 단을 처리해주는 서버라면 web서버로 받는 특정 파일을 mount가 된 volume에 저장을 해놓고 backend의 Container도 volume에 mount해놓았다면 자신의 Local에 있는 파일처럼 사용이 가능합니다.

즉, 두 서버가 file을 주고 받을 필요없이 편하게 사용 가능합니다.

 

Volume은 그림에서 처럼 Pod안에서 생성이 되기 때문에 Pod에 문제가 생겨 재생성될 경우 Volume에 있는 데이터도 같이 삭제 됩니다.

 

gitRepo 볼륨은 emptyDir 볼륨에 지정한 Git 레포지토리의 파일을 채워서 제공해 주는 볼륨입니다.


emptyDir 볼륨 생성 및 확인

반복

emptyDir 볼륨은 아무 데이터도 없는 빈 디렉토리를 제공해 주는 볼륨입니다. 파드가 생성하는 데이터를 저장할 수 있으며, 동일한 파드 내의 컨테이너 간에 데이터를 공유할 때 유용하게 사용할 수 있습니다. 또한, 빅 데이터와 같은 큰 데이터 셋트를 처리하기 위한 임시 저장소로도 사용 가능합니다.

 

 

spec:
  container:
  - volumeMounts:
    - name: <VOL-NAME>
        mountPath: <PATH>
  volumes:
  - name: <VOL-NAME>
    emptyDir: {}

.spec.containers.volumeMounts: 컨테이너 마운트 할 볼륨을 선언

.spec.containers.volumeMounts.name: 사용할 볼륨 이름 ().spec.volumes 필드와 이름 참조

.spec.containers.volumeMounts.mountPath: 컨테이너 내의 마운트 포인트

.spec.volumes.name: 볼륨의 이름

.spec.volumes.emptyDir: emptyDir 타입의 볼륨 정의

  • {}: 값을 비워두면 호스트의 로컬 디스크를 사용
  • { Memory }: tmpfs(RAM 기반 파일시스템)을 사용해 고성능의 볼륨을 제공

 

 

다음과 같이 EmptyDir 볼륨을 사용하는 레플리카셋을 정의합니다.

// myapp-rs-emptydir.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs-fortune
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-rs-fortune
  template:
    metadata:
      labels:
        app: myapp-rs-fortune
    spec:
      containers:
      - name: web-server
        image: nginx:alpine
        volumeMounts:
        - name: web-fortune
          mountPath: /usr/share/nginx/html
          readOnly: true
        ports:
        - containerPort: 80
      - name: html-generator
        image: ghcr.io/c1t1d0s7/fortune
        volumeMounts:
        - name: web-fortune
          mountPath: /var/htdocs
      volumes:
      - name: web-fortune
        emptyDir: {}

web-fortune 이란 이름의 EmptyDir 볼륨을 정의했으며, web-server 컨테이너는 nginx 웹 서버 이미지로 /usr/share/nginx/html 디렉토리에 볼륨을 마운트 하며, html-genertor 컨테이너는 ghcr.io/c1t1d0s7/fortune 이미지를 사용하여 같은 볼륨을 /var/htdocs 디렉토리에 마운트 합니다.

 

참고

ghcr.io/c1t1d0s7/fortune 이미지는 ubuntu 이미지에 fortune 패키지를 설치해 놓은 이미지

fortune은 명령을 실행할 때 마다 랜덤 메시지를 출력

3초마다 fortune 명령을 실행하도록 구성

 

 

함께 사용할 서비스를 생성합니다.

// myapp-rs-fortune.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-fortune
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: myapp-rs-fortune

포트는 80번 포트로 해줍니다. nginx 이미지는 기본적으로 80번 포트로 서비스 합니다.

 

서비스, 엔드포인트, 파드를 확인해줍니다.

web-server 컨테이너의 /usr/share/nginx/html/index.html 파일을 확인해보겠습니다.

fortune에 의해서 생성된 것이며, 3초마다 랜덤한 문장이 생성되게 됩니다.

 

 

html-generator 컨테이너의 /var/htdocs/index.html 파일을 확인해보겠습니다.

마찬가지로 3초마다 랜덤한 문장으로 초기화 되는 것을 확인할 수 있습니다.

3초 내에 확인하면 같은 내용이 있은 것을 확인할 수 있습니다.

 

 

myapp-svc-fortune 서비스에 접근해보겠습니다.

ClusterIP와 ENDPOINTS 에 접근했을 때도 web-server 컨테이너와 html-generator 컨테이너는 같은 emptyDir 볼륨을 공유하고 있으며, html-generator 컨테이너는 컨텐츠를 생성하고, web-server 컨테이너는 컨텐츠를 읽어 외부에 제공해줍니다.


gitRepo 볼륨

gitRepo 볼륨은 디렉터리를 탑재하고 컨테이너 시작 시 지정된 Git 리포지토리를 해당 디렉터리에 복제합니다.

컨테이너 인스턴스의 gitRepo 볼륨을 사용하면 애플리케이션에서 코드를 추가하지 않아도 됩니다.

volumes:
- name: <VOL-NAME>
  gitRepo:
    repository: <GIT-REPO-URL>
    revision: <BRANCH>
    directory: <PATH>

.volumes.gitRepo: gitRepo 볼륨 정의

.volumes.gitRepo.repository: Git 저장소의 주소

.volumes.gitRepo.revision: 저장소의 브랜치

volumes.gitRepo.directory: 저장소의 특정 경로 지정


초기화 컨테이너

gitRepo 볼륨 유형은 더 이상 사용되지 않기 때문에 대신, Git 저장소가 있는 컨테이너를 프로비전 하려면 초기화 컨테이너(InitContainer)에 EmptyDir 볼륨을 마운트하고, 여기에 git 명령을 사용해서 Git 저장소를 복제하고, 파드 컨테이너에서 emptyDir 볼륨을 마운트 합니다.

초기화 컨테이너는 파드의 애플리케이션 컨테이너가 실행되기 전에 여러가지 작업을 수행하도록 설정할 수 있는 컨테이너 입니다.

초기화 컨테이너는 애플리케이션 컨테이너가 실행되기 전 딱 한 번만 실행되며, 초기화 컨테이너가 실패 시 성공할 때까지 재시도를 하게 되며, 초기화 컨테이너가 성공하기 전까지는 애플리케이션 컨테이너는 실행되지 않습니다.

 

참고로, 초기화 컨테이너는 Readiness Probe 는 지원하지 않습니다.

 

다음은 초기화 컨테이너를 사용하여 Git 저장소를 제공하는 예제입니다.

//myapp-pod-git.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod-git
spec:
  initContainers:
    - name: git-clone
      image: alpine/git
      args:
        - clone
        - --single-branch
        - --
        - https://github.com/kubernetes/kubernetes
        - /repo
      volumeMounts:
        - name: git-repository
          mountPath: /repo
  containers:
    - name: git-container
      image: busybox
      args: ['tail', '-f', '/dev/null']
      volumeMounts:
        - name: git-repository
          mountPath: /repo
  volumes:
    - name: git-repository
      emptyDir: {}

 

초기화 컨테이너(.spec.initContainers)는 쿠버네티스 저장소를 Git으로 클론하며 이를 /repo 디렉토리에 저장하게 됩니다.

/repo 디렉토리는 emptyDir 타입의 볼륨인 git-repository로 제공됩니다. 초기화 컨테이너가 성공하면, git-container 컨테이너에서 똑같은 git-repository 볼륨을 마운트하게 됩니다.

 

 

초기화 컨테이너를 생성 후 곧바로 파드 상태를 확인해보면 파드의 상태가 초기화(Init:0/1)에서 파드 초기화 중(PodInitializing)으로 전환되고, 마지막으로 초기화가 성공하면 애플리케이션 컨테이너가 실행(Running)상태로 되는 것을 확인할 수 있습니다.

 

 

실제로 Git 저장소가 클론됐는지 확인해보겠습니다.

/repo 디렉토리에 정상적으로 쿠버네티스 저장소가 clone 된 것을 확인할 수 있습니다.