쿠버네티스 컨테이너인 파드는 종료될 때 컨테이너를 삭제하고 파드내 임시 디스크도 같이 삭제된다. 상태와 데이터를 저장해야 할 때 쿠버네티스는 파드와 데이터를 분리해서 영구 볼륨이라고 하는 별도의 추상화된 리소스를 제공한다. 쿠버네티스 볼륨을 구성하는 주요 리소스로는 PV(PersistentVolume, 영구볼륨), PVC(PersistentVolumeClaim, 영구볼륨 요청), SC(StorageClass)가 있다.
오픈소스 OpenEBS HostPath를 이용해 스토리지 관련 설정을 해보자.
설치
설치는 매우 간단하다, 저장소의 매니페스트를 통해서 바로 설치하면 된다.
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
설치 결과를 확인해 보자
파드, 서비스, 데몬셋, 디플로이먼트, 레플리카셋 등 다양한 오브젝트들이 설치되어 있음을 알 수 있다.
스토리지클래스를 보자.
kubectl get sc
openebs-device, openebs-hostpath 두가지 스토리지 클래스가 생성이 되었는데, openebs-device 노드에서 마운트하지 않은 별도의 디스크 디바이스(예:/dev/sdb 등) 에 파드와 데이터를 저장하고, openebs-hostpath는 호스트 노드의 특정 디렉토리에 데이터를 저장한다. hostpath 가 지정하는 호스트 노드의 디렉토리 위치는 관리자가 변경할 수 있다. 기본 위치는 "/var/openebs/local" 이다. 호스트 운영체제에 영향이 가지 않도록, 별도의 마운트 포인트 사용을 권장한다.
영구볼륨 마운트
사용자는 PVC 통해 영구 볼륨을 마운트 할 수 있다. 먼저 PVC를 만드는 매니페스트를 작성하자. 파일이름은 my-pvc.yaml 로 하였다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: default-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: "openebs-hostpath"
위 내용 중 눈여겨 볼 것은 accessModes 인데, ReadWriteOnce, ReadOnlyMany, ReadWriteMany, ReadWriteOncePod 이렇게 4가지가 있다. 자세한 내용은 https://kubernetes.io/docs/concepts/storage/persistent-volumes/ 을 참고하자.
생성된 pvc 를 확인해 보자.
kubectl get pvc
PVC 는 파드가 먼저 생성된 후 볼륨이 연결되기 때문에 상태가 "Pending" 으로 나온다. 볼륨이 연결이 되면 "Bound" 로 상태가 바뀐다. 볼륨을 사용할 파드를 생성해보자. 이전 실습에서 사용하였던 nginx-hello 이미지를 사용하겠다. 디플로이먼트 매니페스트 파일명은 nginx-hell-pvc-deploy.yaml 로 하였다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-hello
namespace: default
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginxdemos/hello
volumeMounts:
- name: nginx-hello-vol
mountPath: /var/log/nginx
volumes:
- name: nginx-hello-vol
persistentVolumeClaim:
claimName: default-pvc
kubectl apply -f nginx-hello-pvc-deploy.yaml
mountPath 는 /var/log/nginx 이다. nginx 의 로그파일 디렉토리이다. PVC 의 상태가 변했는지 보자.
kubectl get pvc
STATUS 가 "Bound" 상태로 바뀌고 VOLUME 도 생성이 되었다. nginx 를 호출해 보자. 엔진엑스를 호출하면 "/var/log/nginx" 디렉토리 "access.log" 파일에 호출 로그가 쌓인다. 잘 쌓이는지 확인해보자. hostpath 에서 사용하는 디렉토리 위치는 기본값이 "/var/openebs/local" 이다. StorageClass 매니페스를 YAML 파일을 통해 재정의 할 수 있다.
"/var/openebs/local" 에 볼륨명으로 디렉토리가 생기고, nginx 파드내 /var/log/nginx 의 파일들이 옮겨 간 걸 확인할 수 있다. nginx 를 계속 호출하면 파일 용량이 계속 늘어나는 걸 확인할 수 있다.
-- 참고 : https://openebs.io/docs/user-guides/localpv-hostpath
StorageClass를 재정의 해보자.
'DevOps와 Infra > Kubernetes On Premise' 카테고리의 다른 글
알고배우자 쿠버네티스 등장배경 (0) | 2023.12.02 |
---|---|
1.2. Kubernetes(k8s) 클러스터 구성 - RHEL (2) | 2023.12.02 |
4. Service (2/2) - Istio (0) | 2023.11.05 |
3. Service (1/2) - LoadBalancer (0) | 2023.11.03 |
2. k8s 플러그인 활용 (1) | 2023.10.30 |