前面提過 Pod 被刪除後,容器裡的暫存檔案可能一起消失。這次我們用 PVC 掛載 /data,實際測試換一個新 Pod 後,原本寫入的檔案能不能留下來。
先看看 Minikube 有沒有提供預設儲存類別:
kubectl get storageclass
名稱旁邊應該會看到 (default)。下面的 PVC 沒有指定 StorageClass,會使用這個預設值;如果完全沒有預設類別,申請可能會一直停在 Pending。
把以下內容存成 storage-demo.yaml。PVC 申請 1 GiB 空間,Pod 再把它掛載到 /data:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: demo-pvc
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: storage-demo
spec:
containers:
- name: writer
image: busybox:1.37
command: ["sleep", "3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: demo-pvc
套用設定後查看 PVC。狀態變成 Bound,表示它已經綁定到可用的儲存空間;接著等待 Pod 就緒,再寫入一段測試文字:
kubectl apply -f storage-demo.yaml
kubectl get pvc
kubectl wait --for=condition=Ready pod/storage-demo --timeout=120s
kubectl exec storage-demo -- sh -c 'echo persistent-data > /data/message.txt'
如果 PVC 一直停在 Pending,可以執行 kubectl describe pvc demo-pvc 查看事件。有些儲存類別會等到 Pod 建立後才配置空間,不一定會立刻變成 Bound。
這裡只刪 Pod,千萬不要執行 kubectl delete -f storage-demo.yaml,否則 PVC 也會被刪除,實驗條件就不同了。
kubectl delete pod storage-demo
再次套用同一份 YAML,新 Pod 會掛回原本的 PVC。讀取檔案時若看到 persistent-data,就代表資料成功跨過 Pod 的生命週期:
kubectl apply -f storage-demo.yaml
kubectl wait --for=condition=Ready pod/storage-demo --timeout=120s
kubectl exec storage-demo -- cat /data/message.txt
這只證明本次 Pod 重建後資料仍在,不代表磁碟損壞時也能還原。正式環境仍要準備備份、還原演練與容量監控。