쿠버네티스 퍼시스턴트 볼륨 사용하기

snooby·2022년 8월 2일
0

🐳 Docker & K8S

목록 보기
17/51
post-thumbnail

필요한 것

  1. pv와 pvc
  2. 실행 지정할 노드에 라벨 정의
  3. 디플로이먼트

1. pv와 pvc 생성

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 되어있는 것을 볼 수 있습니다.

2. 노드에 라벨 정의

정의된 워크 노드가 1개 이상일 경우 스케줄러에 의해 파드가 할달될 때
매번 실행되는 노드가 달라집니다.
이렇게 되면 볼륨에 담긴 내용도 결국 이전 노드안에 있는 것이기에 볼 수가 없습니다.
따라서, 볼륨을 제대로 사용하기 위해서는 스케줄러가 파드를 할당할때 특정 노드에만 할당할 수 있도록 해야합니다.

그렇기 위해서 우선 노드에 라벨을 정의해야합니다.

저는 type=taskpv라고 라벨을 달았습니다.

# 라벨 달기
kubectl label nodes 지정할워크노드 라벨명=라벨값

# 라벨 확인
kubectl get nodes --show-labels

3. 디플로이먼트

# 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이 그대로 남아있음을 알 수 있습니다.

profile
데이터를 가치있게 다루고 싶은 개발자 🐥

0개의 댓글