CKA

[CKA] Storage

테런 2023. 5. 14. 23:57
  • CKA 시험 비중 (10%)
  • Kubernetes Volume
* Volume은 kubernetes 스토리지의 추상화 개념
컨테이너는 Pod에 바인딩 되는 볼륨을 마운트하고 마치 로컬 파일 시스템에 있는 것처럼 스토리지에 접근한다.
* Kubernetes 스토리지
volumes:
- name: html
   hostPath # node에 있는 로컬 디스크 또는 NFS, AWS EBS, Azure Disk 등
       path: /hostdir or file
* 컨테이너 단위로 mount
volumeMounts:
- name: html
   mountPath: /webdata

 

  • Empty Volume
* Volume을 통해 컨테이너 간 데이터 공유
1. emptyDir 볼륨은 빈 디렉토리로 시작
2. Pod 내부에서 실행중인 애플리케이션은 필요한 모든 파일을 작성
3. Pod를 삭제하면 볼륨의 내용이 손실됨
4. 동일한 Pod에서 실행되는 컨테이너 간에 파일을 공유할 때 유용

 

  • 실습1
* emptyDir Volume을 공유하는 multi-pod 운영
1. 다음 조건에 맞춰서 nginx 웹서버 pod가 생성한 로그파일을 받아서 STDOUT으로 출력하는 busybox 컨테이너를 운영하세요.
Pod Name: weblog
Web container:
     Image: nginx:1.17
     Volume mount: /var/log/nginx
     readwrite
Log container
     Image: busybox
     command: /bin/sh, -c, "tail -n+1 -f /data/access.log"
     volume mount: /data
     readonly
2. emptyDir 볼륨을 통한 데이터 공유
$ vi weblog.yaml

apiVersion: v1
kind: Pod
metadata:
  name: weblog
spec:
  containers:
  - image: nginx:1.17
    name: web
    volumeMounts:
    - mountPath: /var/log/nginx
      name: log-volume
  - image: busybox
    name: log
    command: [ "/bin/sh", "-c", "tail -n+1 -f /data/access.log" ]
    volumeMounts:
    - mountPath: /data
      name: log-volume
      readOnly: true
  volumes:
  - name: log-volume
    emptyDir: {}
    
$ kubectl get pods -o wide # weblog Pod 확인

$ minikube ssh -n minikube # 테스트 로그를 만들어보자.
$ curl {weblog IP} # 로그 찍기
# exit

$ kubectl logs weblog -c log
10.244.0.1 - - [14/May/2023:13:54:13 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

 

  • hostPath
* 노드의 파일시스템의 디렉토리나 파일을 컨테이너에 마운트
* 노드에 디렉토리나 파일을 생성하여 마운트 가능
* 노드마다 저장되는 정보가 다를 수 있으므로 사용안함. 보통 로그 수집기로 많이 사용한다.

 

  • Dynamic Provisioning
* Dynamic Provisioning
1. on-demand 방식으로 스토리지 볼륨을 생성
2. 사용자가 스토리지를 요청하면 자동으로 프로비저닝
3. 하나 이상의 StroageClass 오브젝트를 사전 생성

* StorageClass
1. StorageClass에는 해당 StorageClass에 속하는 PV를 동적으로 프로비저닝할 때 사용되는 provisioner, parameters, reclaimPolicy 필드가 포함
2. reclaimPolicy가 지정되지 않으면 기본값은 Delete이다.

* Provisioner
1. 각 StorageClass는 PV 프로비저닝에 사용되는 볼륨 플러그인을 결정하는 Provisioner가 있다. 이 필드는 필수이다.

 

  • Persistent Volumes (문제 정말 많이 나옴!)
* 관리자가 프로비저닝하거나, StorageClass를 사용해서 동적으로 프로비저닝한 클러스터의 스토리지
이다.

 

  • 실습1
* pv001이라는 이름으로 size 1Gi, access mode ReadWriteMany를 사용하여 persistent volume을 생성합니다.
* volume type은 hostPath이고 위치는 /tmp/app-config입니다.
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /tmp/app-config

 

  • Persistent Volume Claim (PVC)
* PVC는 해당 리소스에 대한 요청이며 리소스에 대한 Claim 검사 역할을 한다.

 

  • 실습1
* PVC를 사용하는 애플리케이션 Pod 운영
1. 다음의 조건에 맞는 새로운 PVC 생성하세요.
- Name: pv-volume
- Class: app-hostpath-sc
- Capacity: 10Mi
2. 앞서 생성한 pv-volume PVC를 mount하는 Pod를 생성하세요.
- Name: web-server-pod
- Image: nginx
- Mount path: /usr/share/nginx/html
3. Volume에서 ReadWriteMany 액세스 권한을 가지도록 구성합니다.
$ vi pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-volume
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi
  storageClassName: app-hostpath-sc
  
$ vi pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: web-server-pod
spec:
  containers:
    - name: myfrontend
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: pv-volume

 

출처: TTABAE-LEARN - 이성미 강사, Udemy - CKA 강의