數據持久化
kubernetes
集群不會為你處理數據的存儲,需要為數據庫掛載一個磁盤來確保數據的安全。
可以選擇云存儲、本地磁盤、NFS。
-
本地磁盤:可以掛載某個節點上的目錄,但是這需要限定 pod 在這個節點上運行
-
云存儲:不限定節點,不受集群影響,安全穩定;需要云服務商提供,裸機集群是沒有的。
-
NFS:不限定節點,不受集群影響
hostPath 掛載示例
把節點上的一個目錄掛載到 Pod,但是已經不推薦使用了,https://kubernetes.io/zh/docs/concepts/storage/volumes/#hostpath
配置方式簡單,需要手動指定 Pod 跑在某個固定的節點。
僅供單節點測試使用;不適用于多節點集群。
minikube 提供了 hostPath 存儲 https://minikube.sigs.k8s.io/docs/handbook/persistent_volumes
只能掛載固定目錄,其他目錄丟失數據,不推薦使用,點開手冊即可看到
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mongodb
spec:replicas: 1selector:matchLabels:app: mongodbserviceName: mongodbtemplate:metadata:labels:app: mongodbspec:containers:- name: mongoimage: mongo:4.4# IfNotPresent 僅本地沒有鏡像時才遠程拉,Always 永遠都是從遠程拉,Never 永遠只用本地鏡像,本地沒有則報錯imagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /data/db # 容器里面的掛載路徑name: mongo-data # 卷名字,必須跟下面定義的名字一致volumes:- name: mongo-data # 卷名字hostPath:path: /data/mongo-data # 節點上的路徑 只能掛載指定幾個目錄之下type: DirectoryOrCreate # 指向一個目錄,不存在時自動創建
持久存儲框架
物理硬盤存儲Storage Class (SC)
將存儲卷劃分為不同的種類,例如:SSD,普通磁盤,本地磁盤,按需使用。https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: slow
provisioner: kubernetes.io/aws-ebs
parameters:type: io1iopsPerGB: "10"fsType: ext4
持久存儲卷 PV
- 持久存儲卷(Persistent Volume,PV)是集群中的一塊存儲,可以被 Pod 掛載到具體的應用容器中使用。
- 集群管理員需要負責創建并維護這些 PV
- 持久存儲卷是集群資源,不屬于任何 namespace(不用項目來區分),但需要與某個 namespace 相關聯,因為 Pod 需要通過 namespace 進行調度。
描述卷的具體信息,例如磁盤大小,訪問模式 https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/
apiVersion: v1
kind: PersistentVolume
metadata:name: mongodata
spec:capacity:storage: 2GivolumeMode: Filesystem # Filesystem(文件系統) Block(塊)accessModes:- ReadWriteOnce # 卷可以被一個節點以讀寫方式掛載persistentVolumeReclaimPolicy: DeletestorageClassName: local-storage# 存儲類型,本地存儲,下面要根據所選進行配置local:path: /root/datanodeAffinity:required:# 通過 hostname 限定在某個節點創建存儲卷nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- node2
持久存儲卷聲明 PVC
- 持久存儲卷聲明(Persistent Volume Claim,PVC)是用戶對存儲的請求。
- PVC 并不是具體存儲設備,而僅僅是一個存儲的“描述”
- PVC 類似于 Pod,Pod 會消耗節點資源,而 PVC 則消耗 PV 資源。
- PVC 用于向 Kubernetes 申請存儲資源。
- PVC 所申請的存儲資源由 PersistentVolume(PV)提供。
對存儲需求的一個申明,可以理解為一個申請單,系統根據這個申請單去找一個合適的 PV還可以根據 PVC 自動創建 PV。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mongodata
spec:accessModes: ["ReadWriteOnce"]storageClassName: "local-storage"resources:requests:storage: 2Gi
為什么要這么多層抽象
- 更好的分工,運維人員負責提供好存儲(指定PV,SC),開發人員不需要關注磁盤細節,只需要寫一個申請單(編寫PVC)。
- 方便云服務商提供不同類型的,配置細節不需要開發者關注,只需要一個申請單。
- 動態創建,開發人員寫好申請單后,供應商可以根據需求自動創建所需存儲卷。
本地磁盤
本地磁盤不支持動態創建,需要提前創建好,并且需要指定存儲類型。