[kubernetes] Volume

이멀젼씨

·

2021. 10. 14. 17:45

목적

Volume에 대해 알고자함

목차

  1. Volume이란?
  2. Volume의 종류 및 양식

1. Volume이란?

파드의 컨테이너에서 접근 가능한 데이터를 포함하고 있는 디렉터리

쿠버네티스에서 파드가 접근하여 데이터를 read/write할 수 있는 저장공간이다.

실제 볼륨은 쿠버네티스 클러스터와 분리되어 관리된다.

2. Volume의 종류 및 양식

emptyDir

파드가 노드에 할당될 때 처음 생성되며, 해당 노드에서 파드가 실행되는 동안에만 존재한다.

최초에 비어있기 때문에 emptyDir이라고 이름이 붙여졌다.

yml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: first
    image: test/example
    volumeMounts:
    - name: test-volume
      mountPath: /test1
  - name: second
    image: test/example
    volumeMounts:
    - name: test-volume
      mountPath: /test2
  volumes:
  - name : test-volume
    emptyDir: {}

Pod를 생성할때 Volume을 함께 생성해주고 연결시켜준다.

volumes속성에 볼륨의 이름과 emptyDir을 정의한다.

컨테이너 속성에서는 각 컨테이너마다 volumeMounts속성을 주어 연결한 볼륨이름과 경로를 지정한다.

이때 컨테이너별로 동일한 볼륨에 대해 다른 경로로 접속하도록 설정할 수 있다.

volume에 test.txt라는 파일이 저장되어 있을때,

first컨테이너는 /test1의 경로로, second컨테이너는 /test2의 경로로 test.txt파일에 접근이 가능하다.

hostPath

emptyDir은 Pod내부에 존재해서 해당 Pod내부의 컨테이너만 접근이 가능했다면,

hostPath는 Pod외부에 존재해서 모든 Pod가 접근할 수 있다.

Pod간에 데이터를 공유할 수 있으며, Pod의 외부에 존재하기때문에 Pod가 제거되어도 볼륨에는 영향을 끼치지 않는다.

하지만 hostPath는 노드에 종속적이기 때문에 Pod가 다른 노드에 있는 경우 접근할 수 없다.

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: first
    image: test/example
    volumeMounts:
    - name: test-volume
      mountPath: /test1
  volumes:
  - name : test-volume
    hostPath:
      path: /mynode
      type: DirectoryOrCreate

volumes속성을 추가하고 내부에 hostPath를 정의한다.

path는 노드의 디렉토리 위치를 나타낸다.

type은 선택사항이며 DirectoryOrCreate는 주어진 경로가 없다면 새롭게 디렉토리를 생성한다.

emptyDir과 동일하게 컨테이너 내부에 마운트할 볼륨을 정의해준다.

nodeSelector를 추가한 이유는 Pod가 재성성될때 기존 노드에 생성되지 않을 가능성이 있다.

따라서 hostPath를 사용하고 있는 상황이라면 Pod가 삭제되어도 동일한 노드에 생성이 되어야 기존처럼 이용이 가능하기 때문에 nodeSelector로 노드를 선택하여 생성하도록 하면 된다.

PersistentVolume(PV) / PersistentClaim(PVC)

쿠버네티스 클러스터의 외부에 존재하는 볼륨에 Pod를 연결하는 방법이다.

AWS와 같은 클라우드서비스의 볼륨 서비스나, NFS 등에 연결할 수 있다.

Pod와 PersistentClaim(PVC)를 연결시키고 원격 볼륨과 PersistentVolume(PV)를 연결시킨다.

마지막으로 PVC와 PV를 연결시키면 된다.

Pod와 원격 볼륨을 직접 연결시키지 않은 이유는 강한 의존성을 제거하기 위함인것 같다.

Pod와 원격 볼륨이 직접 연결되어 있다면 원격 볼륨이 바뀌는 경우 직접 Pod에서 수정해줘야 하고, 마찬가지로 Pod가 재생성되는 경우 원격 볼륨과 다시 연결시켜야한다.

이를 효율적으로 하고자 양쪽에 관리 객체를 두어 자동으로 연결하게 해둔 것 같다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10G
  storageClassName: ""

PVC 설정이다.

accessModes로 읽기 쓰기 모드 설정을 해주고, resources속성에 필요한 용량를 적어준다.

storageClassName에 볼륨 이름을 넣으면 현재 만들어져 있는 볼륨의 PV중에 일치하는 것을 찾아 자동으로 연결시켜준다.

apiVersion: v1
kind: Pod
metadata:
  name: pv
spec:
  containers:
  - name: first
    image: test/example
    volumeMounts:
    - name: mypvc
      mountPath: /test1
  volumes:
  - name : mypvc
    persistentVolumeClaim:
      claimName: pvc

이후 Pod생성 시 볼륨 부분에 PVC를 넣어 Pod와 PVC가 연결되도록 만들어 준다.