- 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
'CKA' 카테고리의 다른 글
[CKA] 자격증 취득 후기 (2023.05.22) (2) | 2023.05.24 |
---|---|
[CKA] Workloads & Scheduling (0) | 2023.05.14 |
[CKA] Cluster Architecture, Installation & Configuration (2) (0) | 2023.05.14 |
[CKA] Cluster Architecture, Installation & Configuration (1) (0) | 2023.05.13 |
[CKA] Troubleshooting (0) | 2023.05.13 |