数据持久化
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)。
- 方便云服务商提供不同类型的,配置细节不需要开发者关注,只需要一个申请单。
- 动态创建,开发人员写好申请单后,供应商可以根据需求自动创建所需存储卷。
本地磁盘
本地磁盘不支持动态创建,需要提前创建好,并且需要指定存储类型。