kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: claim-log-1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Mi
179. Storage - Section Introduction
여러가지 스토리지 옵션에 대해서 배워보자
180. Introduction to Docker Storage
도커의 스토리지가 어떻게 동작하는지 먼저 알아보자
Docker Storage
스토리지 드라이버, 볼륨 드라이버로 나뉜다.
181. Storage in Docker
File System
docker 호스트의 파일 시스템
Layered architecture
레이어 형식이 라서 엔트리포인트는 용량이 없다
비슷한 내용으로 도커 빌드를 할 때 중복되는 레이어는 다시 생성하지 않는다.
소스 코드와 엔트리포인트만 업데이트한다.
공간 절약! & 빠른 실행
엔트리 포인트까지 업데이트한 것이 이미지 레이어이다.
이미지 레이어는 read only 로서 변경할려면 다시 초기화 해야한다.
빌드후 run 하면 컨테이너가 생긴다. - 컨테이너 레이어
컨테이너가 제거되면 컨테이너 레이어도 제거된다.
Copy on write
이미지 레이어의 뭔가 하고 싶다면 컨테이너 레이어로 복사한 후 작성하라
컨테이너 레이어 삭제하면 데이터 모두 사라진다.
volumes
1. 볼륨을 생성하고
2. 컨테이너 생성할 때 마운트 옵션으로
볼륨 마운팅
이제 컨테이너가 사라져도 데이터가 남아있다.
컨테이너 생성전에 볼륨 생성안했다면?
도커가 볼륨을 자동으로 생성해준다.
다른 경로와 연결
Storage drivers
182. Volume Driver Plugins in Docker
스토리지 드라이버
볼륨 드라이버 플러그인
다 다르다.
도커에서 실행시 특정 볼륨 드라이버를 고를 수 있다.
183. Containter Storage Interface
container 는 cri
네트워크는 cni
스토리지는 csi
인터페이스로 통신한다.
csi는 쿠버네티스 뿐만 아니라 다른 오케스트레이션 에서도 사용된다.
185. Volumes
컨테이너에서 데이터는 컨테이너가 죽으면 같이 사라진다.
컨테이너를 볼륨에 연결하면 데이터를 유지할 수 있다.
Volumes & Mounts
랜덤 숫자를 생성하는 파드를 만든다.
volumes에 마운트할 디렉토리를 명시한다.(호스트의)
volumeMounts 에는 컨테이너의 마운트할 경로를 작성한다.
Volume Types
노드가 많아질 경우 다 똑같은 호스트 경로를 쓰면 비효율 적이다.
쿠버네티스는 다양한 스토리지를 지원한다.
ebs 에 담자
186. Persistent Volumes
파드가 많아지면 스토리지 구성이 어렵다.
persistent volume is a cluster-wide pool of storage volumes configured by an adminstrator
PV- 여러 파드들이 쓸 수 있는 클러스터 단위의 스토리지
여기에 요청 pvc 를 해야한다?
Persistent Volume 만들기
pv를 먼저 구성한다.
187. Persistent Volume Claims
pv와 pvc를 별개다.
관리자는 pv 를 만들고 사용자는 pvc를 만든다 .
pv와 pvc를 정렬하고 쿠버네티스가 매치되는 것과 바인딩한다.
여러가지 모드도 고려해야함.
pvc 와 매치되는 pv 가 없으면 해당pvc는 pending 상태가 된다.
pvc 생성하기
생성하자마자 pending 상태가 된다.
쿠버네티스가 매칭되는 pv를 찾는다.
매칭되면 bound 가 된다.
pvc를 제거 옵션
persistentVolumeReclaimPolicy -pvc 제거시 옵션
retain - pv는 남지만 다른 요청으로 재사용될 수 없음.
delete- pv도 삭제
recycle - 볼륨안의 데이터만 삭제
188. Using PVCs in PODs
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: myclaim
pod, deploy, rs 등 pvc를 쓰고 싶다면 spec 아래에 volumes
pvc 옵션을 추가해서 사용한다.
189. Practice Test - Persistent Volumes and Persistent Volume Claims
1. We have deployed a POD. Inspect the POD and wait for it to start running.
2. The application stores logs at location /log/app.log. View the logs.
You can exec in to the container and open the file:
kubectl exec webapp -- cat /log/app.log
3. If the POD was to get deleted now, would you be able to view these logs.
no
4. Configure a volume to store these logs at /var/log/webapp on the host.
Name: webapp
Image Name: kodekloud/event-simulator
Volume HostPath: /var/log/webapp
Volume Mount: /log
apiVersion: v1
kind: Pod
metadata:
name: webapp
spec:
containers:
- name: event-simulator
image: kodekloud/event-simulator
env:
- name: LOG_HANDLERS
value: file
volumeMounts:
- mountPath: /log
name: log-volume
volumes:
- name: log-volume
hostPath:
# directory location on host
path: /var/log/webapp
# this field is optional
type: Directory
5. Create a Persistent Volume with the given specification.
Volume Name: pv-log
Storage: 100Mi
Access Modes: ReadWriteMany
Host Path: /pv/log
Reclaim Policy: Retain
6. Let us claim some of that storage for our application. Create a Persistent Volume Claim with the given specification.
Volume Name: claim-log-1
Storage Request: 50Mi
Access Modes: ReadWriteOnce
7. What is the state of the Persistent Volume Claim?
pending
8. What is the state of the Persistent Volume?
available
9. Why is the claim not bound to the available Persistent Volume?
access 모드 차이 때문
10.
Update the Access Mode on the claim to bind it to the PV.
Delete and recreate the claim-log-1.
pvc access mode
readWriteMany 로 변경
11. You requested for 50Mi, how much capacity is now available to the PVC?
여전히 100mi 사용가능
12.
Update the webapp pod to use the persistent volume claim as its storage.
Replace hostPath configured earlier with the newly created PersistentVolumeClaim.
13. What is the Reclaim Policy set on the Persistent Volume pv-log?
14. What would happen to the PV if the PVC was destroyed?
The PV is not deleted but not available
15. Try deleting the PVC and notice what happens.
If the command hangs, you can use CTRL + C to get back to the bash prompt OR check the status of the pvc from another terminal
terminating 상태에 걸린다.
16. Why is the PVC stuck in Terminating state?
The PVC was still being used by the webapp pod when we issued the delete command. Until the pod is deleted, the PVC will remain in a terminating state.
webapp pod 가 아직 사용하고 있기 때문 파드가 삭제될때까지 대기중
17.
Let us now delete the webapp Pod.
Once deleted, wait for the pod to fully terminate.
18. What is the state of the PVC now?
deleted
19. What is the state of the PV now?
released
193. Storage Classes
지난 시간에 배운 pv, pvc 그리고 pod 에서 pvc 사용하기를 배웠다 .
Static Provisioning
pv 를 처음 구성할때 수동으로 기입해줘야한다. (여기선 외부 클라우드를 예시로 들었다.)
static 프로비저닝이라고 한다.
당연히 이게 귀찮으니....
Dynamic Provisioning
pv 대신 storageClass를 사용할 거다.
기존에 pv-pvc-pod 이렇게 연결되있었다.
sc를 쓸거면 sc-pvc-pod 이렇게 연결 가능하다.
pvc에서 sc를 쓸 수 있게 storageClassName 을 추가한다.
여기서 중요한 건
sc 에 연결되어도 결국 pv 는 생성한다.
pv를 수동으로 생성안할 뿐 pv 랑은 여전히 연결된다.!!!
Storage Class
여러 회사의 스토리지 클래스를 사용할 수 있으며 여러 옵션이 존재한다.
1. How many StorageClasses exist in the cluster right now?
2. How about now? How many Storage Classes exist in the cluster?
3개
3. What is the name of the Storage Class that does not support dynamic volume provisioning?
local-storage
provisioner 에서 no-provisioner 이다.
4. What is the Volume Binding Mode used for this storage class (the one identified in the previous question)?
waitForFirstConsumer
5. What is the Provisioner used for the storage class called portworx-io-priority-high ?
portworkvolume
6. Is there a PersistentVolumeClaim that is consuming the PersistentVolume called local-pv ?
no
7. Let's fix that. Create a new PersistentVolumeClaim by the name of local-pvc that should bind to the volume local-pv.
Inspect the pv local-pv for the specs.
8. What is the status of the newly created Persistent Volume Claim?
pending
9. Why is the PVC in a pending state despite making a valid request to claim the volume called local-pv?
Inspect the PVC events.
Normal WaitForFirstConsumer 12s (x8 over 111s) persistentvolume-controller waiting for first consumer to be created before binding
waitForFirstConsummer는 사용하지 않으면 pv 에 고정되지 않는다.
사용을 기다리는 중
10. The Storage Class called local-storage makes use of VolumeBindingMode set to WaitForFirstConsumer . This will delay the binding and provisioning of a PersistentVolume until a Pod using the PersistentVolumeClaim is created.
11. Create a new pod called nginx with the image nginx:alpine. The Pod should make use of the PVC local-pvc and mount the volume at the path /var/www/html.
The PV local-pv should in a bound state.
12. What is the status of the local-pvc Persistent Volume Claim now?
13. Create a new Storage Class called delayed-volume-sc that makes use of the below specs:
provisioner: kubernetes.io/no-provisionervolumeBindingMode: WaitForFirstConsumer