쿠버네티스

[클라우드] 11. Kubernetes Volume 사용하기

트리스탄1234 2023. 1. 30. 19:50
728x90
반응형

Volume Overview

이번 포스팅에서는 Kubernetes에서 Volume의 개념과 사용방벙에 대해서 알아 보도록 하겠 습니다.

Kubernetes상에서 Volume의 개략적인 구조는 위의 그림과 같습니다 .Pod의 Volume 파라메터를 사용해서 PVC(persistent Volume Claim)의 값을 정의 하고 이 값을 이용해 스토리지에 매핑된 PV(Persistent Volume)에 PVC를 보내서 Pod에서 사용할 PV를 매핑을 하는 구조 입니다

 

Volume Type

그럼 Volume Type에 대해서 알아 봅시다. Volume는 아래와 같은 4가지 Type과 2가지 종류가 존재 합니다.

Volume Type의 종류

  • emptyDirtmp는 Pod 생성시 Pod 안에 존재하는 Volume입니다. 즉 Pod가 삭제되면 데이터도 모두 삭제 됩닏.
  • hostPath(Local)는 Pod에 호스트 노드의 파일이나 디렉토리를 마운트하여 사용하며, Pod가 삭제되어도 내용이 삭제되지 않습니다.
  • local은 특정 로스트 노드에 mount된 파일시스템을 Volume으로 사용합니다.
  • Network : 네트워크 또는 클라우드 상에 존재하는 storage를 Volume으로 사용합니다.(AWS, NFS, EBS etc)

Volume의 Provisioning Type에 따른 분류(Volume의 자동 생성 여부)

  • Static Volume Provisioning : 관리자가 수동으로 Kubernetes에서 Persistent Volume을 생성
  • DynamicVolume Provisoning은 개발자의 요청에 의해 자동으로 Kubernetes에서 Persistent Volume을 생성

Persistent Volume(PV) & Persistent Volume Claim(PVC)

쿠버네티스에서 볼륨을 사용하는 방법은 위에서 말한 것과 같이 2단계로 구성이 되어 있습니다. 우선

스토리지를 매핑시킨 PersistentVolume(PV)와 그 PV를 Pod에서 사용할때 PV로 Volume내역을 요청하는 PersistentVolumeClaim(PVC) 2단계로 분리되어 있습니다.

PV는 스토리지 그 자체라고 생각을 하면 되고. PVC는 개발자 또는 클라우드 사용자가 PV에게 Volume을 할당해달라는 요청을 의미 합니다. 사용하고 싶은 용량과 각종 Volume에 관한 설정값을 정해서 요청을 합니다.

그럼 PV yaml 파일을 살펴 보겠 습니다.

apiVersion: v1
kind: PersistentVolume ==> Object Type 정의
metadata:
name: pv0003 ==> PV 이름
spec: ==> PV Spec 정의
capacity:
storage: 5Gi ==> Volume 용량
volumeMode: Filesystem ==> Volume의 Type정의
accessModes: ==> Access Mode 정의
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
mountOptions: ==> Volume 마운트 정보
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2

위의 yaml파일을 보면 PV를 생성읗 하고 있고 용량은 5G이고 NFS Type의 볼륨을 정의를 하고 있습니다.

Pod와 같이 Volume도 아래오 ㅏ같은 상태를 가집니다.

반응형

Phase

  • Available: PV가 생성되고 PVC가 바인딩되기 전 상태
  • Bound – PVC가 PV에 바인된 상태
  • Released – PVC가 삭제된 상태
  • Failed – 실패상태

위의 파라메터에 보면 AccessMode가 있는데요 이는 Volume에 어떤 접근을 허용할수 설정하는 부분 입니다. 각각의 모드에 대해서 살펴 보면 아래와 같습니다.

Access Modes

  • ReadWriteOnce – 단일 노드에 의한 읽기-쓰기로 볼륨이 마운트될 수 있습니다.
  • ReadOnlyMany – 여러 노드에 의한 읽기 전용으로 볼륨이 마운트될 수 있습니다.
  • ReadWriteMany – 여러 노드에 의한 읽기-쓰기로 볼륨이 마운트될 수 있습니다.

위의 Yaml파일에 보면 Reclaim Policy 파라메터가 있습니다. 이 파라메터는 특정 PV에 바인딩된 PVC를 삭제 했을때 PV와 연결된 디스크의 파일을을 어떻게 처리할지를 정의하는 부분 입니다. 그럼 어떤 값이 어떤 동작을 하는지 살펴 봅시다.

Reclaim Policy

  • Retain – PVC가 삭제되어도 PV 및 데이터 유지(다시 쓰기 위해서는 PV를 삭제하고 재생성해야함)
  • Recycle – PV는 유지하고 파일만 삭제 (rm -rf /thevolume/*)
  • Delete – 볼륨 및 데이터 삭제

그럼 이제 PVC sample yaml파일을 살펴 봅시다.

root@master-VirtualBox:~/test/persistenvolume# vi pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim ==> Object 정류 정의
metadata:
name: myclaim ==> PVC 이름
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi ==> 요구하는 용량
storageClassName: slow ==> IO(Input/Output) Speed 정의
selector:
matchLabels:
release: "stable"
matchExpressions:
- {key: environment, operator: In, values: [dev]}

excerise

그럼 이제 Volume을 사용해 봅시다.우선 mysql을 위한 Password를 secret Object로 생성을 합니다.

root@master-VirtualBox:~# kubectl create secret generic mysql-pass --from-literal=password=pwd
secret/mysql-pass created

이제 아래와 같은 yaml파일을 만들고 아래의 내용을 입력 후 저장 합니다

root@master-VirtualBox:~/test# mkdir persistenvolume
root@master-VirtualBox:~/test# cd persistenvolume/
root@master-VirtualBox:~/test/persistenvolume# vi pv-yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wp-pv-volume
labels:
type: local
spec:
capacity:
storage: 3Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: "/data/mysql"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node

그럼 PVC yaml파일을 생성하고 파일 내용을 입력 후 저장합니다.

root@master-VirtualBox:~/test/persistenvolume# vi pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mysql-pv-claim
spec:
storageClassName: local-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
selector:
matchLabels:
type: local

그럼 이제 Backend(DB) Pod로 mysql Pod yaml파일을 생성하고 아래 내용을 입력 후 저장 합니다.

root@master-VirtualBox:~/test/persistenvolume# vi mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
imagePullPolicy: Always
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim ==> 위에서 생성한 PVC의 이름

이제 Pod간의 통신을 위해 Service 객체를 생성하기 위해 yaml파일을 생성 후 아래와 같은 내용을 입력 후 저장 합니다.

root@master-VirtualBox:~/test/persistenvolume# vi mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None

그럼 이제 Frontend로 Wordpress 서비스를 제공하는 Pod를 생성하기 위한 yaml파일을 생성하고 아래 내용을 입력 후 저장 합니다

root@master-VirtualBox:~/test/persistenvolume# vi wp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
replicas: 1
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
imagePullPolicy: Always
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress

그럼 Frontend Pod와의 통신을 위한 Service Object 만들기 위해 Service yaml파일을 만들고 아래 내용을 입력 후 저장 합니다.

oot@master-VirtualBox:~/test/persistenvolume# vi wp-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
type: NodePort
ports:
- port: 8080
targetPort: 80
protocol: TCP
selector:
app: wordpress
tier: frontend

이제 생성한 객체를 모두 배포를 한 후 생성된 Object의 정보를 조회 합니다.

root@master-VirtualBox:~/test# kubectl apply -f /root/test/persistenvolume/
deployment.apps/wordpress-mysql created
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress created
service/wordpress created
root@master:/lab/dashboard# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.168.1.1 <none> 443/TCP 4h56m
wordpress NodePort 172.168.1.177 <none> 8080:32382/TCP 10m
wordpress-mysql ClusterIP None <none> 3306/TCP 10m

그럼 이제 위에 빨간색으로 표신된 부분으로 http://172.168.1.177:32382 로 서비스 요청을 보내고 정상 수신 되는지 확인 후에 Pod가 실행중인 Worker Node에서 data 디렉토리 밑에 볼륨이 마운트 되었는지 확인 합니다.

root@node:/data/mysql# ll
total 110616
drwxr-xr-x 5 vboxadd vboxsf 4096 12월 5 15:39 ./
drwxr-xr-x 3 root root 4096 12월 5 15:12 ../
-rw-rw---- 1 vboxadd vboxsf 56 12월 5 15:38 auto.cnf
-rw-rw---- 1 vboxadd vboxsf 12582912 12월 5 15:38 ibdata1
-rw-rw---- 1 vboxadd vboxsf 50331648 12월 5 15:38 ib_logfile0
-rw-rw---- 1 vboxadd vboxsf 50331648 12월 5 15:38 ib_logfile1
drwx------ 2 vboxadd vboxsf 4096 12월 5 15:38 mysql/
drwx------ 2 vboxadd vboxsf 4096 12월 5 15:38 performance_schema/
drwx------ 2 vboxadd vboxsf 4096 12월 5 15:39 wordpress/

728x90
반응형