본문 바로가기
IT/Kubernetes

K8S 퍼시스턴트볼륨 테스트 - Azure Disk

by rapker 2023. 4. 11.
반응형

참고

 

정적 볼륨 - Azure Disk

정적 볼륨의 데이터 재 사용성을 확인하기 위한 테스트 입니다.

볼륨에 사용할 Azure Disk 생성

 

yaml 작성

static-disk.yaml
0.00MB

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - image: ubuntu/nginx
    name: mypod
    volumeMounts:
      - name: azure
        mountPath: /mnt/azure
  volumes:
      - name: azure
        azureDisk:
          kind: Managed
          diskName: azureDisk
          diskURI: /subscriptions/9a5fbf78-8626-4402-8f1c-f0ae7fc988fa/resourcegroups/MC_rgAKS_aksTest998_koreacentral/providers/Microsoft.Compute/disks/azureDisk

 

yaml 적용

kubectl apply -f ststic-disk.yaml

 

pod로 접속

kubectl exec -it mypod bash

 

볼륨 확인

df -h

 

마운트된 볼륨에 파일 생성

cd /mnt/azure
ll
touch aaa.txt
ll

 

pod 삭제 후 static-disk.yaml 파일 배포해도 aaa.txt 파일 남아 있음

kubectl delete -f static-disk.yaml
kubectl apply -f static-disk.yaml

당연히 pv, pvc는 존재하지 않고

kubectl get pv
kubectl get pvc

 

 

테스트에 사용했던 pod 삭제

kubectl delete -f static-disk.yaml

aaa.txt 파일이 들어 있는 Managed Disk 삭제하지 않습니다.

다음번 테스트할  pcv 정적 볼륨 - azure disk 에서  마운트 했을 때 aaa.txt 파일이 살아 있는지 확인하기 위함입니다.

 

 

PVC 정적 볼륨

정적 디스크의 재사용성 테스트 입니다.

 

위에서 테스트 했던 managed disk를 pv static 볼륨으로 마운트 했을 때 aaa.txt파일이 살아 있는지 확인합니다.

 

yaml 파일 작성

pvc-static-disk.yaml
0.00MB

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: ubuntu/nginx
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc-azure-managed-disk

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-azure-managed-disk
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: "" 
  resources:
    requests:
      storage: 4Gi
  volumeName: pv-azure-disk

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-azure-disk
spec:
  storageClassName: ""
  capacity:
    storage: 4Gi
  accessModes: ["ReadWriteOnce"]
  azureDisk:
    kind: Managed
    diskName: azureDisk
    diskURI: /subscriptions/9a5fbf78-8626-4402-8f1c-f0ae7fc988fa/resourcegroups/MC_rgAKS_aksTest998_koreacentral/providers/Microsoft.Compute/disks/azureDisk

 

yaml 배포

kubectl apply -f pvc-static-disk.yaml

 

당연히 pv, pvc 잘 생성되어 있고

kubectl get pv
kubectl get pvc

 

마운트 확인

df -h

 

aaa.txt 파일 확인

cd /mnt/azure
ll

 

azure disk는 남겨두고 azure disk를 참조하는 pod만 지웠다가 다시 생성하는건 무리없이 사용 가능해 보임

 

pod제거와 Managed disk 제거

pod가 실행중일 때 portal에서 managed disk 삭제 버튼 비활성화 되어 있음 오~~ 당연한 거지만 신통하네

 

pod 제거

kubectl delete -f pvc-static-disk.yaml

 

managed disk 제거

 

 

pvc 동적 볼륨 - 기본제공 클래스

기본 스토리지 클래스로 동적 볼륨으로 pod 배포시 azure disk가 같이 생성되는지 확인해보고,

pod 삭제 시 자동으로 배포 되었던 azure disk도 같이 삭제 되는지 확인 (기본 스토리지 클래스는 회수 정책이 delete)

 

먼저 aks 리소스 그룹에 managed disk 가 없는것을 확인 하고

 

yaml 작성

  • storage class : managed-premium
  • reclaiming : delete

pvc-dynamic-disk.yaml
0.00MB

 

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: ubuntu/nginx
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc-azure-managed-disk

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-azure-managed-disk
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: managed-premium
  resources:
    requests:
      storage: 4Gi

 

yaml 배포

kubectl apply -f pvc-dynamic-disk.yaml

 

pv, pvc 확인

kubectl get pv
kubectl get pvc

 

포탈에 생성된 디스크 확인

 

pod에 들어가서 마운트된 디스크에 bbb.txt 파일 생성

kubectl exec -it mypod bash

 

reclaimPolicy가 delete 니까 아래 내용되로 진행되는 부분 확인

  • yaml 파일로
    • pod, pvc를 삭제 하면 disk도 삭제 될거고,
    • pod를 다시 배포하면 아까와는 다른 disk가 새로 생성 될거니까

pod 삭제

kubectl delete -f pvc-dynamic-disk.yaml

 

 

포탈에서 삭제된 disk 확인

 

자 그러면 다시 pvc-dynamic-disk.yaml 배포

kubectl apply -f pvc-dynamic-disk.yaml

 

pv, pvc 배포 확인 및 포탈에서 disk 생성 확인

kubectl get pv
kubectl get pvc

 

당연하게도 처음 동적 생성했던 disk와 새로 생성된 disk 이름이 다르고

또 당연히 pod에는 아까 만든 bbb.txt가 없겠지만 그래도 굳이 한번 더 확인

 

 

리소스 정리

kubectl delete -f pvc-dynamic-disk.yaml

 


 

pvc 동적 볼륨 - 기본제공 클래스

storage class - default 배포 되는지만 테스트 해봄

 

yaml 작성

pvc-dynamic-default-disk.yaml
0.00MB

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: ubuntu/nginx
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc-azure-managed-disk

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-azure-managed-disk
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: default
  resources:
    requests:
      storage: 4Gi

 

yaml 배포

kubectl apply -f pvc-dynamic-default-disk.yaml

 

pv, pvc 확인

kubectl get pv
kubectl get pvc

 

디스크도 생성 되어 있고

 

리소스 정리

kubectl delete -f pvc-dynamic-default-disk.yaml

 


 

Custom Storage Class - pvc 동적 볼륨

 

custom storage class - reclaim = retain

 

sku = 표준 HDD, reclaim = retain

pod 삭제 시 디스크 남아 있어야 하고

pod가 다시 배포 되었을 때 새로운 디스크를 할당 받아야 하는데

결과는 어찌 될까?

 

storage class 생성 확인

kubectl get sc

 

pv, pvc 확인

kubectl get pv
kubectl get pvc

 

포탈에서 디스크 확인

 

pod에 마운트된 공간에 ccc.txt 생성

 

표준 HDD로 잘 배포 되었고

이제 pod 삭제 후 디스크는 유지 되는지 보자

 

pod 삭제

kubectl delete -f pvc-dynamic-standard-hdd-disk.yaml

 

포탈에서 디스크 확인해보면 unattached 상태이지만 삭제는 안되고 있는 상태 확인

 

자! 그럼 다시한번 pod 배포

kubectl apply -f pvc-dynamic-standard-hdd-disk.yaml

 

 

pv, pvc 확인

kubectl get pv
kubectl get pvc

 

처음 배포했을 때와는 달리 두 개의  디스크가 출력되고 각 디스크의 상태 정보가 다름을 확인할 수 있습니다.

 

사용중인 디스크는 Bound로 출력되고 사용되었던(지금 사용하지 않는) 디스크는 Reclaim Policy가 Retain이라 Released상태로 남아 있습니다.

 

이것은 정상이고 k8s에서는 다시 사용하지 않습니다. Released 상태의 디스크의 내용을 수동으로 백업하거나 삭제할 수 있습니다.

 

당연히 존재하지 않겠지만 아까 생성했던 ccc.txt 파일 존재 하는지 확인

 

역시 ccc.txt 파일은 존재하지 않습니다.

 

리소스 정리

kubectl delete -f pvc-dynamic-standard-hdd-disk.yaml

지금 테스트에 사용되는 yaml 파일 안에는 pvc, pod, sc가 같이 정의가 되어 있어서  yaml로 삭제하면 스토리지 클래스도 삭제 됩니다.

 

실제 환경에서는 반드시 스토리지 클래스는 별도 yaml 파일로 분리 하는게 바람직 합니다.

포탈에서 디스크 삭제 해주세요

 

reclaiming이 retain인 경우 yaml로 리소스들 삭제 했고 포탈에서 디스크를 삭제 했더라도 PV는 살아 있습니다.

 

delete pv api로 삭제 해 줍니다.

kubectl get pv
kubectl delete pv [pv1 이름]
kubectl delete pv [pv2 이름]

 

 

 

사용중인 PV, PVC 보호 확인

 

동적 pv 사용중에 pv 삭제 했을 때 pv의 terminating 값 확인

 

사용된 yaml

pvc-dynamic-standard-hdd-disk.yaml
0.00MB

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: ubuntu/nginx
    volumeMounts:
    - mountPath: "/mnt/azure"
      name: volume
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc-azure-managed-disk

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-azure-managed-disk
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: managed-standard-retain
  resources:
    requests:
      storage: 4Gi

---

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: managed-standard-retain
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Retain
parameters:
  storageaccounttype: Standard_LRS
  kind: Managed
allowVolumeExpansion: true

 

pvc-dynamic-standard-hdd-disk.yaml에 포함된 storage class

apiVersion: storage.k8s.io/v1 
kind: StorageClass 
metadata: 
  name: managed-standard-retain 
provisioner: kubernetes.io/azure-disk 
reclaimPolicy: Retain 
parameters: 
  storageaccounttype: Standard_LRS 
  kind: Managed 
allowVolumeExpansion: true

 

yaml 배포

kubectl apply -f pvc-dynamic-standard-hdd-disk.yaml

 

배포된 리소스 확인

kubtctl get sc
kubectl get pv
kubectl get pvc

 

pv, pvc 보호 상태 확인

 

pv

 

pv 삭제하려고 api를 날렸는데 20분이 지나도록 api 완료가 되지 않고 있습니다.

kubectl delete pv <pv name>

 

 

Ctrl+C로 빠져나와서 pv 상태를 살펴 봅니다.

kubectl get pv
kubectl describe pv <pv name>

 

pv가 Terminating 상태로 살아 있습니다.

 

pvc도 삭제를 해봐야 겠죠~

kubectl delete pvc <pvc name>

 

pvc 삭제도 delete api 날렸는데 완료가 되지 않고 있습니다

 

아까만큼 오래 기다려 보진 않았지만 이미 api가 실행된 상태라 추측되므로 곧바로 Ctrl+C로 중지 시키고 pvc상태를 확인해 봅니다.

 

pvc도 terminating 상태로 잘 동작하고 있는것을 확인할 수 있습니다.

 

자 그러면 현재 pv, pvc는 삭제가 예약되어 있고, reclaiming은 retain 이니까

pod만 삭제하면 pv, pvc는 자동으로 삭제 될거고

스토리지 클래스와 azure disk는 남아 있어야 정상

 

pod만 지워봅니다.

kubectl delete pod mypod

 

pod는 잘 삭제 되었고 pv, pvc도 확인해 봅니다.

kubectl get pv
kubectl get pvc

 

pv,pvc도 제대로 삭제 되었고 이제 sc랑 azureDisk도 확인해 봅니다.

kubectl get sc

 

오~~ 깔끔합니다.

스토리지 클래스 남아 있고 Azure Disk도 남아 있습니다.

 

자 그럼 리소스 정리

스토리지 클래스 삭제하고 포탈에서도 Azure Disk 삭제합니다.

kubectl delete sc <sc name>

 

볼륨 확장

pvc를 통해 사용중인 볼륨의 크기를 상향 조정할 수 있습니다.

 

볼륨의 사이즈를 변경하려면 스토리지 클래스에 볼륨확장 플래그가 활성화 상태로 설정되어 있어야 합니다.

 

볼륨 확장이 설정되어 있는 스토리지 클래스를 생성하고 4Gi를 요청하는 pvc와 이를 사용하는 pod를 배포 합니다.

 

yaml 파일 준비

pvc-expansion-sc.yaml
0.00MB
pvc-expansion-pvc.yaml
0.00MB
pvc-expansion-pod.yaml
0.00MB

 

yaml 파일 배포

kubectl apply -f pvc-expansion-sc.yaml
kubectl apply -f pvc-expansion-pvc.yaml
kubectl apply -f pvc-expansion-pod.yaml

 

배포 확인

 

볼륨 사이즈를 변경하기 전에 pod를 제거하여 AzureDisk를 Unattached 상태로 만들어야 합니다.

 

pod 삭제

kubectl delete pod mypod

 

pvc의 사이즈 수정

kubectl edit pvc pvc-azure-managed-disk

 

pv, pvc 용량 확인

kubectl get pv
kubectl get pvc

pv는 용량변경되었는데 pvc는 변경전의 사이즈 그대로 출력되고 있습니다.

 

pvc를 자세하게 살펴 봅니다.

kubectl describe pvc pvc-azure-managed-disk

 

pod가 실행 되어야 사이즈 변경이 완료 되는 모양입니다.

 

pod를 다시 배포 하고 pvc 의 size 확인

kubectl apply -f pvc-expansion-pod.yaml

 

kubectl get pvc

 

container os에 별다른 설정을 하지 않아도 변경된 용량으로 마운트 되어 있습니다.

kubectl exec -it mypod bash
df -h

 

리소스 정리

kubectl delete -f pvc-expansion-pod.yaml
kubectl delete -f pvc-expansion-pvc.yaml
kubectl delete -f pvc-expansion-sc.yaml

 

reclaimpolicy가 retain이였으므로 포탈에서도 삭제해 주어야 합니다.

(portal에서 삭제하는 내용은 생략)

 

반응형
LIST