Kubernetes - Object:Volume
Devops/Kubernetes

Kubernetes - Object:Volume

뉴비뉴 2020. 4. 27.

emptyDir

컨테이너들끼리 데이터를 공유하기 위해서 Volume을 생성합니다.

최초 Volume을 생성 할 때 공간이 비어져있기 때문에 emptyDir이라고 이름이 지어졌다.

만약에 컨테이너 1번이 Web역할을하고 2번에 Backend 단을 설정한다고하면

마운트를 해두면 두 서버가 자신의 로컬에 있는 파일처럼 사용을 할 수 있습니다.

 

Pod 안에 생성이 되기 때문에 일시적으로 사용하기 위한 데이터만 넣는 것이 좋다.

 

 

HostPath

이름대로 한 개의 호스트, 파드들이 올라가져 있는 Node의 Path를 볼륨으로 사용한다.

Pod 들이 죽어도 Node의 데이터를 사라지지 않는다.

하지만 Pod-2가 죽어서 ReCreateion 될 때 다른 Node에 생성 될 수도 있다.

해결방법으로는 Node가 추가 될 때 마다 똑같은 경로의 이름을 만들어 Node에 있는 Path끼리 연결을 해주면 된다.

하지만 이 방법은 어렵지는 않지만 자동화를 시키는데 있어서 사람의 개입이 들어가서 추천하는 방법이 아니다.

 

마지막으로 Pod가 생성되기 전에 미리 생성되어있어야 한다.

 

용도

노드에 있는 데이터를 Pod 에서 사용하기 위한 용도

각 노드 자신을 위해서 사용되는 System, 설정 파일들이 있다.

Pod 자신이 할당되어있는 Host에 데이터를 읽거나 사용해야 될 때 쓰면 된다.

 

PVC(Persistent Volume Claim) / PV(Persistent Volume)

Pod에 영속성있는 DB를 제공하기 위한 것들이다.

 

실제 Volume은 다양하다 Local Volume도 있고, 외부에 원격으로 사용되는 Volume들이 많다.

 

  • Pod는 PV에 바로 연결하지않고, PVC를 통해서 연결한다.
  • 중간에 PVC를 두는 이유는 쿠버네티스는 유저구역(Pod에 Service를 만들고 배포하는 Service 담당자)과 어드민구역(K8s담당자)으로 나눴기 때문입니다.
  • 각각의 Volume들을 연결하기 위한 설정하는 방법과 연결하는 속성들이 다 다르다. 그래서 전문적으로 이런 걸 관리하는 어드민이 PV를 만들어놓으면 유저는 이것을 사용하기 위해서 PVC를 생성합니다. 

복습

emptyDir은 Pod 내에서 Container들 끼리 데이터를 공유하여 사용할 수 있는 것이다.

Pod-1을 생성하였고, 안에 컨테이너를 2개를 생성하였다. 둘 다 volumeMounts: 는 empty-dir로 설정하였다.

제가 진행하면서 헷갈린 부분은 mountPath: 가 Container가 서로 달라서 '공유가 될까?' 라는 생각을 했는데 Path 이름은 중요하지 않았다. 결국 맨 아래 volumes에서 empty-dir를 지정함으로써 Pod-1의 1번 컨테이너에서 mount1 안에 생성한 file.txt 라는 파일이 2번 컨테이너에서도 똑같이 확인할 수 있었다.

 

Pod가 삭제되고 재생성되면 mount 안에 있던 내용도 같이 삭제된다.

그래서 언제 삭제되도 상관이 없는 것을 담아야 한다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  containers:
  - name: container1
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount1
  - name: container2
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount2
  volumes:
  - name : empty-dir
    emptyDir: {}

 

hostPath은 Pod들이 올라가져있는 노드에 데이터를 저장시킨다고 생각하면된다.

  • 같은 노드의 모든 Pod들을 데이터들을 공유하여 사용할 수 있다.
  • 하지만 hostPath의 단점은 Pod이 어떠한 이유로 죽었다 살아날 때 다른 노드로 이동되면 문제가 발생한다.
  • 다른 노드로 이동안되게 설정할 수도 있지만 권장하진 않는다.
apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: host-path
      mountPath: /mount1
  volumes:
  - name : host-path
    hostPath:
      path: /node-v
      type: DirectoryOrCreate

 

PV(Persistent Volume)/PVC(Persistent Volume Claim)

 

 

PV 특정 물리적인 Volume을 연결하는 설정이라고 생각하면 됩니다.

  • PV에 연결되는 Pod들 k8s-node1에 생성된다.
  • PV에 위치시키는 파일은 대체로 대용량 파일데이터나 변경되지 않는 정적파일 등의 애플리케이션 영역과 WEB/WAS/DB등의 Log를 저장하는 용도 등으로 활용할 수 있습니다.
  • 옵션
    • ReadWriteOnce(RWO): 하나의 노드가 볼륨을 Read/Write 가능하도록 마운트
    • ReadOnlyMany(ROX): 여러개의 노드가 Read 전용으로 사용하도록 마운트
    • ReadWriteMany(RWX): 여러개의 노드가 Read/Write 가능하도록 마운트
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-01
spec:
  capacity:
    storage: 1G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-02  # 변경
spec:
  capacity:
    storage: 1G
  accessModes:
  - ReadOnlyMany  # 변경
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-03  # 변경
spec:
  capacity:
    storage: 2G  # 변경
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}

PVC

  • storage 용량과 accessModes의 타입이 같은 PV를 찾아 연결한다.
  • 연결한다는 것은 곧 Bound 했다는 것인데 한번 클레임이 Bound 되었다면 해당 PV는 다른 클레임에서 사용할 수 없다.
  • PVC가 PV 용량과 적합한 PV가 없다면 대기중인 상태가 된다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-02
spec:
  accessModes:
  - ReadOnlyMany
  resources:
    requests:
      storage: 1G
  storageClassName: ""

Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: pvc-pv
      mountPath: /mount3
  volumes:
  - name : pvc-pv
    persistentVolumeClaim:
      claimName: pvc-01

 

'Devops > Kubernetes' 카테고리의 다른 글

Kubernetes - Object:ConfigMap, Secret  (0) 2020.05.08
Kubernetes 세미나  (0) 2020.04.29
Kubernetes - Object:Service  (0) 2020.04.27
Kubernetes - Object  (0) 2020.04.27
Kubernetes - 배경, 개념, 장점  (0) 2020.04.23

댓글

💲 추천 글