1. in-tree,它的实现的代码是放在 K8s 代码仓库中的,随着k8s对存储类型支持的增多,这种方式会给k8s本身的维护和发展带来很大的负担
2. out-of-tree,它的实现其实是给 K8s 本身解耦的,通过抽象接口将不同存储的driver实现从k8s代码仓库中剥离,因此out-of-tree 是后面社区主推的一种实现网络存储插件的方式;
pod 中声明的 volume 生命周期与 pod 是相同的,以下有几种常见的场景:
当用户在使用完 PVC,将其删除后,这个 PV 就处在 released 状态,这时通过 ReclaimPolicy 决定删除还是保留。
但是即使保留也不能复用这个 PV,因为 PV 已经处在 released 状态下,它是没有办法直接回到 available 状态,也就是说接下来无法被一个新的 PVC 去做绑定。
提前创建一些 PV,用户提交 PVC 时,k8s 将 PVC 与合适的 PV bound 在一起
- 单 node 读写访问;
- 多个 node 只读访问,是常见的一种数据的共享方式;
- 多个 node 上读写访问。
- delete,也就是说 PVC 被删除之后,PV 也会被删除;
- Retain,就是保留,保留之后,后面这个 PV 需要管理员来手动处理。
需求不同,想要与预规划的 PV 匹配上很难。如果制定标准,减少匹配难度,又会造成资源浪费。
配置存储模板 StorageClass,在需要 PV 时,提交 PVC,指定模板,动态创建需要的 PV。
StorageClassName
- 第一部分是由k8s社区驱动实现的通用的部分,例如 csi-provisioner和 csi-attacher controller;
- 另外一种是由云存储厂商实践的,对接云存储厂商的 OpenApi,主要是实现真正的 create/delete/mount/unmount 存储的相关操作,对应到上图中的csi-controller-server和csi-node-server。
在Dockerfile里声明 volume,可用于持久化数据,多容器共享数据。这里的volume没有指定宿主机目录,所以是交给docker管理。经测试,这样声明的volume,容器删除后依旧存在。
提供前台程序,不让容器退出。
docker run -d test-docker-volume sleep infinity
containers:
- name: ubuntu
image: ubuntu
command: [ "sleep" ]
args: [ "infinity" ]