본문 바로가기
네트워크/k8s

[k8s] 7. Volume - 실습

by Lauren X Ming 2021. 2. 7.

Volume 실습

실습을 하려고 하는데...

머선129..

  • 호스트를 종료했다 다시 시작해서 그래요..

마스터 노드에서 다음 명령어 실행

nohup kubectl proxy --disable-filter=true --port=8001 --address=192.168.35.30 --accept-hosts='^\*$' >/dev/null 2>&1 &
  • --disable-filter=true 킬포
--disable-filter=true

접속 ㄱㄱ링

1. emptyDir

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: {}

실습 과정

  1. 생성
  2. 상세 들어가서 EXEC 클릭
  3. container1 shellmount | grep mount1 명령어로 mount1이 마운트됐는지 확인
  4. cd mount1 && echo "file content" >> file.txt
  5. ls로 파일 생성 확인
  6. container2 shell에 cd mount2 && ls명령어로 file.txt 존재 확인
  7. cat file.txt로 내용도 확인
  8. 당연히 pod 삭제하고 다시 만들면 내용 없어짐
  9. volume은 pod 내에 존재하기 때문

Container1

Container2

  • emptyDir은 두 컨테이너가 파일을 공유해서 쓰되 언제 삭제되도 상관 없을 때 사용

2. HostPath

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
  • DirectoryOrCreate: path가 없으면 생성하겠다.

실습 과정

  1. 위 내용 생성
  2. 위 내용에서 name: pod-volume-2로 이름만 바꿔서 또 하나 더 생성
  3. pod-volume-2 shell 실행
  4. emptyDir이랑 똑같이 mount1에 file.txt 생성
  5. pod-volume-3 shell에서 내용 file.txt 확인 --> 파일 있네 우왕 싱기하당!
  6. 실제 노드에도 있는지 확인 --> node1에 접속
  7. node1에 접속 후 lsnode-v 디렉토리 확인
  8. node-v에 cat file.txt 확인
  9. node1에 파일이 있으니 파드를 삭제하고 다시 만들어도 파일 내용이 그대로 있음
  10. 킹지만 파드가 node1이 아니라 node2에 만들어지면 파일 공유 불가

node1

3. PVC / PV

PersistentVolume

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]}
  • pv의 실체는 local
  • pv에 연결되는 파드들은 node1에 만들어짐
  • capacityaccessModes를 설정해도 그대로 안 만들어짐 --> 지금은 알 거 없음

PersistentVolumeClaim

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
  - ReadWriteOnce
  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
  • pvc-01 claim에 연결

실습 과정

  1. PV 생성
  2. name: pv-02, accessModes: ReadOnlyMany로 바꾸고 생성
  3. name: pv-03, accessModes: ReadWriteOnce, storage: 2G로 바꾸고 생성
  4. PVC 생성 --> 속성때문에 pv-01과 연결됨 우왕
  5. 한 번 PV가 PVC와 바인딩되면 다른 PVC에서 PV 사용 불가능
  6. name: pvc-02, accessModes: ReadWriteOnce로 생성
  7. name: pvc-03, accessModes: ReadWriteOnce, storage: 3G로 생성 --> pending됨
  8. 2G인데 3G를 요구하니 pending~
  9. name: pvc-04, accessModes: ReadWriteOnce, storage: 1G로 생성 --> 2G에 할당됨 싱기하다!
  10. Pod 생성 기존 pod-volume-3는 삭제
  11. pod-volume-3 shell에서 mount3에 file.txt 확인 --> 기존 host-path에서 생성한게 그대로 있눼
  12. pod-volume-5 이름만 바꿔서 pod 생성
  13. pod-volume-5에도 파일 존재 확인

PV

PVC

출처

인프런 - 대세는 쿠버네티스