不知道各位還記不記得,在前面介紹 Docker 時,我曾經講過一個超重要的東西,就是 Volume ,可以避免重要資料跟著 Container 一起消失的東西。
那麼 Kubernetes 有沒有同樣的機制呢?
有的,而且還不只一種。
首先說說第一種,就是跟 Docker 同樣的機制 Volume ,使用方式也大致相同,不過是改成 YAML 檔的方式而已。
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
args:
[
bash,
-c,
'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done',
]
volumeMounts:
- mountPath: /volume
name: test-volume # 這邊的名稱
volumes:
- name: test-volume # 要跟這邊對上
hostPath:
path: /data
type: DirectoryOrCreate
這樣就可以將 Volume 連接到 Worker Node 的儲存空間,我們可以進去看一下,我們可以透過以下指令進到 Pod 中。
$ kubectl exec -it <pod_name> -- bash
接著我們可以 cd 進 /volume
中,隨便新增一個檔案,然後就可以到我們 Worker Node 的 /data
中尋找(兩台都找找看吧),正常會找到同樣的檔案。
接著各位應該都有發現一個問題,因為是透過 kube-scheduler 決定 Pod 在哪一個 Worker Node 上運行,因此每次的 Node 都可能不同,儲存的東西就可能散布在不同的機器上,這樣 我們需要的時候就需要一台一台找,節點一多的話就非常耗時間,因此就有了另一個機制 PersistentVolume & PersistentVolumeClaim 。
PersistentVolume 中文意思就是持久儲存卷,一看就知道可以將資料持久的儲存;而 PersistentVolumeClaim 中文意思就是持久儲存卷申請,就是負責跟 PersistentVolume 申請空間放置重要資料。
而的 Pod 可以向下面一樣連接上 PersistentVolume & PersistentVolumeClaim ,但是我們這邊還是拿本地的儲存空間來示範。
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: ubuntu
image: ubuntu:20.04
args:
[
bash,
-c,
'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 100; done',
]
volumeMounts:
- mountPath: /volume
name: test-volume
volumes:
- name: test-volume
persistentVolumeClaim:
claimName: local-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-pvc
spec:
accessModes:
- ReadWriteOnce
volumeName: local-pv
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 5Gi
volumeMode: Filesystem
hostPath:
path: "/data"
type: "DirectoryOrCreate"
這樣我們就可以成功透過 PersistentVolume & PersistentVolumeClaim 將資料儲存在 Worker Node 上了。
如果需要查看 PersistentVolume 或 PersistentVolumeClaim 的狀態可以透過以下指令。
$ kubectl get persistentvolume
$ kubectl get persistentvolumeclaim
# or
$ kubectl get pv
$ kubectl get pvc
PersistentVolume 跟 PersistentVolumeClaim 成功連結的話則會顯示 Binding 。
詳細設定可參考官方文件 Volume 、 PersistentVolume 、 PersistentVolumeClaim
那麼就先到這邊,我們下次再來講一下如何儲存在額外的空間中。
大家掰~掰~