LocalVolume
注意:僅在 v1.7 + 中支持,並從 v1.10 開始升級爲 beta 版本。
本地數據卷(Local Volume)代表一個本地存儲設備,比如磁盤、分區或者目錄等。主要的應用場景包括分佈式存儲和數據庫等需要高性能和高可靠性的環境裏。本地數據卷同時支持塊設備和文件系統,通過 spec.local.path
指定;但對於文件系統來說,kubernetes 並不會限制該目錄可以使用的存儲空間大小。
本地數據卷只能以靜態創建的 PV 使用。相對於 HostPath,本地數據卷可以直接以持久化的方式使用(它總是通過 NodeAffinity 調度在某個指定的節點上)。
另外,社區還提供了一個 local-volume-provisioner,用於自動創建和清理本地數據卷。
示例
StorageClass
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
創建一個調度到 hostname 爲 example-node
的本地數據卷:
# For kubernetes v1.10
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-local-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
# For kubernetes v1.7-1.9
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-local-pv
annotations:
"volume.alpha.kubernetes.io/node-affinity": '{
"requiredDuringSchedulingIgnoredDuringExecution": {
"nodeSelectorTerms": [
{ "matchExpressions": [
{ "key": "kubernetes.io/hostname",
"operator": "In",
"values": ["example-node"]
}
]}
]}
}',
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
創建 PVC:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: example-local-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-storage
創建 Pod,引用 PVC:
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: myfrontend
image: nginx
volumeMounts:
- mountPath: "/var/www/html"
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: example-local-claim
限制
暫不支持一個 Pod 綁定多個本地數據卷的 PVC(計劃 v1.9 支持)
有可能導致調度衝突,比如 CPU 或者內存資源不足(計劃 v1.9 增強)
外部 Provisoner 在啓動後無法正確檢測掛載點的空間大小(需要 Mount Propagation,計劃 v1.9 支持)
最佳實踐
推薦爲每個存儲卷分配獨立的磁盤,以便隔離 IO 請求
推薦爲每個存儲卷分配獨立的分區,以便隔離存儲空間
避免重新創建同名的 Node,否則會導致新 Node 無法識別已綁定舊 Node 的 PV
推薦使用 UUID 而不是文件路徑,以避免文件路徑誤配的問題
對於不帶文件系統的塊存儲,推薦使用唯一 ID(如
/dev/disk/by-id/
),以避免塊設備路徑誤配的問題
參考文檔
Last updated