pv와 pvc가 무엇인가에 대해서는 앞선에 잘 정리해두었으니 여기를 참조하자.
# pv 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/usr/share/nginx/html"
# pvc 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
생성 후 서로 bounding 되어있는 것을 볼 수 있습니다.
정의된 워크 노드가 1개 이상일 경우 스케줄러에 의해 파드가 할달될 때
매번 실행되는 노드가 달라집니다.
이렇게 되면 볼륨에 담긴 내용도 결국 이전 노드안에 있는 것이기에 볼 수가 없습니다.
따라서, 볼륨을 제대로 사용하기 위해서는 스케줄러가 파드를 할당할때 특정 노드에만 할당할 수 있도록 해야합니다.
그렇기 위해서 우선 노드에 라벨을 정의해야합니다.
저는 type=taskpv라고 라벨을 달았습니다.
# 라벨 달기
kubectl label nodes 지정할워크노드 라벨명=라벨값
# 라벨 확인
kubectl get nodes --show-labels
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
labels:
app: grafana
spec:
selector:
matchLabels:
app: grafana
replicas: 1
template:
metadata:
labels:
app: grafana
spec:
containers:
- name: grafana
image: 이미지
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: 500m
memory: 200Mi
ports:
- containerPort: 3000
volumeMounts: # 컨테이너 내 볼륨 정의
- mountPath: "/usr/share/nginx/html"
name: my-vol
securityContext: # 루트 권한 접근
allowPrivilegeEscalation: false
runAsUser: 0
nodeSelector:
type: taskpv # 위에 정의한 라벨이 달린 노드로 파드가 실행되게함.
volumes: # 생성한 볼륨 클레임 연결
- name: my-vol
persistentVolumeClaim:
claimName: task-pv-claim
다음같이 디플로이먼트 정의 후
디플로이먼트 삭제 후 재정의하고 들어가도 생성한 자료 asdf.html이 그대로 남아있음을 알 수 있습니다.