iT邦幫忙

2024 iThome 鐵人賽

DAY 14
1

昨天有提到 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

AccessModes

觀察官方範例的 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,所以只能將其改回。
https://ithelp.ithome.com.tw/upload/images/20240928/20141794D554UTC7yR.png

---
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

Paths

連到 volume-test-2 內部,掛載 PVC 的位置 /data 內建立一個檔案 test-pvc.txt

touch /data/test-pvc.txt

但在我們 Cluster 的 hostPath 卻沒有發現任何檔案?
https://ithelp.ithome.com.tw/upload/images/20240928/20141794USqeYTWMuE.png

這時我覺得,既然是使用 local-path,那這個檔案應該會放在 Node 上的某個位置,我連到該 Pod 所在的 Node 上的 Container 內部搜尋。

find / -name test-pvc.txt

https://ithelp.ithome.com.tw/upload/images/20240928/20141794eJEcWdkkub.png

於是我們可以得知預設的位置不會在 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 是否如預期的?

  1. 是否 test-pvc.txt 在 PVC 被刪除後,也會跟著被清空?
    https://ithelp.ithome.com.tw/upload/images/20240928/20141794rifvUSsNxI.png

從上圖可以得知,這個假設是成立的。

  1. 新建立的 PVC 是否會出現在 /data
  2. 將 StorageClass 的 AccessModes 改為 Retain 是否可以保留資料?

上一篇
Day 13:StorageClass
下一篇
Day 15:local-path-provisioner (2)
系列文
在Local建立完整的開發環境筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言