06. 存储
K8s 存储
在
-
本地存储:
emptydir/hostpath 等,主要使用Pod 运行的node 上的本地存储 -
网络存储:
in-tree( 内置): awsElasticBlockStore/gcePersistentDisk/nfs 等,存储插件的实现代码是放在K8s 代码仓库中的;out-of-tree( 外置): flexvolume/CSI 等网络存储inline volume plugins ,存储插件单独实现,特别是CSI 是Volume 扩展机制的核心发展方向。 -
Projected Volume: Secret/ConfigMap/downwardAPI/serviceAccountToken,将
K8s 集群中的一些配置信息以volume 的方式挂载到Pod 的容器中,也即应用可以通过POSIX 接口来访问这些对象中的数据。 -
PersistentVolumeClaim 与PersistentVolume 体系,K8s 中将存储资源与计算资源分开管理的设计体系。
卷(Volume)
卷(Volume)其实是一个比较特定的概念,它并不是一个持久化存储,可能会随着
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
volumeMounts:
- name: cache-volume
mountPath: /cache
- name: test-volume
mountPath: /hostpath
- name: config-volume
mountPath: /data/configmap
- name: special-volume
mountPath: /data/secret
volumes:
- name: cache-volume
emptyDir: {}
- name: hostpath-volume
hostPath:
path: /data/hostpath
type: Directory
- name: config-volume
configMap:
name: special-config
- name: secret-volume
secret:
secretName: secret-config
需要注意的是,当我们将
从上面我们其实可以看出
持久卷
如果我们希望将数据进行持久化存储,可以引入
因为
访问模式
ReadWriteOnce
、ReadOnlyMany
和 ReadWriteMany
,这三种模式的含义和用法我们可以通过它们的名字推测出来:
ReadWriteOnce
表示当前卷可以被一个节点使用读写模式挂载;ReadOnlyMany
表示当前卷可以被多个节点使用只读模式挂载;ReadWriteMany
表示当前卷可以被多个节点使用读写模式挂载;
不同的卷插件对于访问模式其实有着不同的支持,AWSElasticBlockStore
和GCEPersistentDisk
就只支持 ReadWriteOnce
方式的挂载,不能同时挂载到多个节点上,但是 CephFS
就同时支持这三种访问模式。
回收策略
当某个服务使用完某一个卷之后,它们会从
-
第一种回收策略就是保留(Retain)
PV 中的数据,如果希望PV 能够被重新使用,系统管理员需要删除被使用的PersistentVolume 对象并手动清除存储和相关存储上的数据。 -
另一种常见的回收策略就是删除(Delete
) ,当PVC 被使用者删除之后,如果当前卷支持删除的回收策略,那么PV 和相关的存储会被自动删除,如果当前PV 上的数据确实不再需要,那么将回收策略设置成Delete 能够节省手动处理的时间并快速释放无用的资源。