昨天有提到 kind 會自動建立 StorageClass standard
,但是 ReclaimPolicy 是 Delete
,這會造成 PVC 被刪除後,PV 自動被清除。
可以在官方 Repository 看到 local-path-provisioner 的範例,可以透過該指令自動建立 Pod 並套用 PVC。
kubectl create -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/examples/pvc/pvc.yaml
kubectl create -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/examples/pod/pod.yaml
觀察官方範例的 pvc.yaml
可以看到它的 AccessModes 是 ReadWriteOnce
,也就是指同時只能有一個 Pod 可以掛載一個 PVC,無法多個 Pods 共同使用相同的 PVC。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-path-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 128Mi
我嘗試將其改為 ReadWriteMany
,讓多個 Pods 可以同時使用這個 PVC,以及 StorageClassName 改為 standard
,再使用 Pod 來 Mount 上這個 PVC。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim-rwx
namespace: gitlab
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 8Gi
storageClassName: standard
volumeMode: Filesystem
結果可以從下圖看到,standard 只支援 ReadWriteOnce,所以只能將其改回。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim-rwo-2
namespace: gitlab
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 8Gi
storageClassName: standard
---
apiVersion: v1
kind: Pod
metadata:
name: volume-test-2
namespace: gitlab
spec:
containers:
- name: volume-test
image: nginx:stable-alpine
imagePullPolicy: IfNotPresent
volumeMounts:
- name: myclaim-rwo-2
mountPath: /data
ports:
- containerPort: 80
volumes:
- name: myclaim-rwo-2
persistentVolumeClaim:
claimName: myclaim-rwo-2
連到 volume-test-2
內部,掛載 PVC 的位置 /data
內建立一個檔案 test-pvc.txt
touch /data/test-pvc.txt
但在我們 Cluster 的 hostPath 卻沒有發現任何檔案?
這時我覺得,既然是使用 local-path,那這個檔案應該會放在 Node 上的某個位置,我連到該 Pod 所在的 Node 上的 Container 內部搜尋。
find / -name test-pvc.txt
於是我們可以得知預設的位置不會在 kind-config 中的 hostPath 所在的 /data
,而是在 /var/local-path-provisioner/
之下。
從官方文件中可以得知,這個路徑定義在 ConfigMap 內。可以為每個 Nodes 都設置專屬的路徑。
{
"nodePathMap":[
{
"node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
"paths":["/opt/local-path-provisioner"]
},
{
"node":"yasker-lp-dev1",
"paths":["/opt/local-path-provisioner", "/data1"]
},
{
"node":"yasker-lp-dev3",
"paths":[]
}
]
}
我試著將自動建立的 ConfigMap local-path-config
中定義 nodePathMap 的 config.json
做修改。
{
"nodePathMap":[
{
"node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
"paths":["/data"]
}
]
}
現在我們可以再來實驗看看是否成功?
將前面建立的 Pod 和 PVC 都重建,這樣我們就可以知道 StorageClass 與 nodePathMap 是否如預期的?
從上圖可以得知,這個假設是成立的。
/data
?Retain
是否可以保留資料?