1. 스토리지 볼륨
K8S에서 컨테이너 파일을 보존하기 위해 사용되는 객체
- 노드 내부의 일부 디스크 공간을 pod와 공유하는 방식으로 제공
- 노드 외부의 스토리지 시스템과 연결하는 방식
1-1. K8S 스토리지 볼륨 종류
emptyDir :
pod 내부에서 임시적으로 사용하는 볼륨(저장소)
hostPath:
노드 내에 데이터를 저장할 수 있는 볼륨(저장소)
PersistentVolume:
외부 서버(노드 외부)에 데이터를 저장하는 볼륨(저장소)
1-2. emptyDir
pod 내부에서 임시적으로 사용하는 볼륨(저장소)
- pod가 노드에 할당될 때 처음 생성
- pod가 노드에서 실행하는 동안만 존재(pod가 삭제되면 볼륨도 삭제됨)
apiVersion: v1
kind: Pod
metadata:
name: my-ev-pod
spec:
volumes:
- name: upload-volume
emptyDir: {}
containers:
- name: nginx
image: nginx
volumeMounts:
- name: upload-volume
mountPath: /tmp/uploads
spec.volumes : pod 내부에 생성할 볼륨
- emptyDir{} : emptyDir 은 볼륨타입 설정, {} 는 추가 옵션을 사용하지 않는다는 의미
spec.containers.volumeMount.name : 컨테이너가 사용하게 될 볼륨명
- 단, volumes와 name은 동일해야 한다
spec.contaienrs.volumeMount.mountPath : 볼륨이 마운트할 경로
실행
kubectl apply -f .\ex9_my_ev_prod.yaml
kubectl get pod
kubectl describe pod my-ev-pod
⇒ 컨테이너 설정에서 Mounts가 된 것을 찾을 수 있다
- 사용
# volume에 데이터 저장
kubectl exec my-ev-pod -- bash -c "echo hello>/tmp/uploads/hello.txt"
# volume에 저장한 데이터 조회(hello 출력)
kubectl exec my-ev-pod -- cat /tmp/uploads/hello.txt
- 임시 저장소 확인
kubectl delete pod my-ev-pod.yaml
kubectl apply -f .\ex9_my_ev_prod.yaml
kubectl exec my-ev-pod -- ls /tmp/uploads
⇒ 생성한 저장소를 삭제 후 다시 재 생성을 하면 이전에 생성한 데이터가 존재하는지 확인하는 작업
⇒ pod 삭제 후 재 생성 하고 저장소를 확인하니 아무런 데이터가 존재하지 않았다
⇒ 즉, 임시 저장소라는 것을 확실히 확인 할 수 있다
1-3. PersistentVolume
종류
PV(Persistence Volume) : 저장소 생성
PVC( PersistenceVolume Claim) :
저장된 저장소 사용을 요청
스토리지를 동적으로 바인딩하기 위한 요청 객체
⇒ K8S 클러스터 관리자가 PV 를 생성 및 관리하고, 사용자(개발자) PVC를 통해서 PV 를 요청
PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv-100
spec:
storageClassName: host-pv
persistentVolumeReclaimPolicy: Delete
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
hostPath:
path: "/my-pv/data/v1"
spec.storageClassName : pvc에서 스토리지 사용 요청 시 사용하는 정보
spec.persistentVolumeReclaimPolicy : PVC 삭제 -> PV 데이터도 삭제
spec.accessModes : multi PV가 접속해서 사용
실행
kubectl get pv
⇒ 생성된 것을 확인할 수 있다
⇒ 용량을 150으로 설정한 pv를 하나 더 생성한다
PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: host-pv
resources:
requests:
storage: 10Mi
- 실행
kubectl apply -f .\ex11_my_pvc.yaml
kubectl get pvc
⇒ pvc가 pv2개중 하나를 bound한 것을 알 수 있다
⇒ pv를 확인해 보면 status가 변한 것을 확인 할 수 있다
PVC pod
PVC는 PV 사용을 정의해 놓은 명세서 같은 것이므로 이 PVC를 사용해서 pv를 사용할 수 있도록 해야 한다
→ 앞에서 생성한 pvc를 사용하여 데이터를 저장하고, pvc 삭제 시 저장한 데이터가 남아 있는지 확인해 본다
apiVersion: v1
kind: Pod
metadata:
name: my-pv-pod
spec:
volumes:
- name: my-pvc
persistentVolumeClaim:
claimName: my-pvc
containers:
- name: nginx
image: nginx
volumeMounts:
- name: my-pvc
mountPath: "/data/pv"
spec.volumes.name : pvc를 volume 으로 사용하겠다는 의미
spec.vloumes.claimName: bounding 상태인 pvc를 지정 (ex11 에 지정한 pvc 사용)
spec.containers: my-pvc 이름의 vloume 을 사용할 container 정의
- volumeMounts: container 에서 mount 해서 사용할 volume 지정
- mountPath: container에서 사용할 working directory 경로 지정
실행
- 쿠버네티스에 pvc 컨테이너와 마운트 후 데이터 저장
kubectl apply -f ex12_my_pv_pod.yaml
kubectl exec my-pv-pod -- bash -c "echo hello! > /data/pv/hello.txt"
kubectl exec my-pv-pod --cat /data/pv/hello.txt
- 파드 생성
- nginx container를 통해 working directory 에서 linux shell로 파일 생성
- pv에 생성된 파일 확인
⇒ my-pv-pod 가 생성
⇒ my-pv-pod 안에 파일 생성
kubectl delete pod my-pv-pod
kubectl exec my-pv-pod -- cat /data/pv/hello.txt
- pvc에서 사용하던 파드를 삭제
- pod가 삭제 된 후 생성했던 파일을 확인 ⇒ pod가 삭제 되어 확인 불가
kubectl apply -f ex12_my_pv_pod.yaml
kubectl exec my-pv-pod -- cat /data/pv/hello.txt
- 삭제한 pvc pod 재 생성
- 생성한 파드에 데이터가 존재하는지 확인
⇒ 파드 생성
⇒ 파일 재조회 시 계속 존재하고 있음
2. Chapter1 정리
- yaml에 정의된 pod spec으로 k8s 적용 (선언형, apply)
- pod에 restartpolicy 정의
- 재시작에 대한 정상, 비정상 테스트
- pod의 상태 확인
- container의 상태 확인
- 하나의 pod 에 multi container spec 을 정의
- ReplicaSet spec 정의
- 지정된 pod 수를 계속 유지
- 각 pod의 container의 이미지 버전 업데이트
- 업데이트 전략 : Recreate, RollingUpdate
- container 환경 변수
- 컨테이너 내부에 직접 설정 (configMap, secret (명령형, 선언형))
- 스토리지 볼륨
- emptyDir
- hostPath(권장 하지 않음)
- PersistentVolume
- PersistentVolume
- PV(Persistent Volume) : 저장소 생성
- PVC(Persistent Volume Claim) : 생성된 저장소 사용을 요청, 스토리지 동적 바인딩 객체
'BackEnd' 카테고리의 다른 글
도커와 쿠버네티스 -K8S(spring boot 의 통신 with Ingress) (0) | 2024.12.02 |
---|---|
도커와 쿠버네티스 -K8S(네트워크 통신_pod들의 통신) (0) | 2024.11.24 |
도커와 쿠버네티스 -K8S(환경 변수) (0) | 2024.11.17 |
도커와 쿠버네티스 -K8S (Deployment) (0) | 2024.11.14 |
도커와 쿠버네티스 -K8S (multi container & replicaset) (0) | 2024.11.11 |