kubernetes 存储
k8s 支持多种途径的多种类型的存储。例如 iSCSI,SMB,NFS,以及对象存储。都是不同类型的部署在云上或者自建数据中心的外部存储系统。k8s 上的所有存储都被称作卷
CSI 容器存储接口
CSI 是 k8s 存储体系中一部分,是一个开源项目,定义了一套基于标准的接口,从而使容器能够以一种统一的方式被不同的容器编排的工具使用。可以将插件称为provisioner
持久化
- 持久化卷 (pv)
- 持久化卷申请 (pvc)
- 存储类 (sv)
PV 代表 k8s 的存储,pvc 代表的是许可证,赋予 pod 访问 pv 的权限。cs 使分配过程是动态的。
使用 iSCSI 操作存储
iscsi
卷能将 iSCSI (基于 IP 的 SCSI) 卷挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,iscsi 卷的内容在删除 Pod 时会被保留,卷只是被卸载。 这意味着 iscsi 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。iSCSI
的一个特点是它可以同时被多个用户以只读方式挂载。 这意味着你可以用数据集预先填充卷,然后根据需要在尽可能多的 Pod 上使用它。 不幸的是,iSCSI 卷只能由单个使用者以读写模式挂载。不允许同时写入。
创建 iscsi-pv.yaml iscsi-pvc.yaml
iscsi-pv.yaml
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: iscsi-pv
5spec:
6 capacity:
7 storage: 500Gi
8 accessModes:
9 - ReadWriteOnce
10 iscsi:
11 targetPortal: 10.12.12.xxx:3260 # 修改
12 iqn: iqn.2000-01.com.synology:xxx.Target-1.21xxxxx344 # 修改
13 lun: 1
iscsi-pvc.yaml
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: iscsi-pv
5spec:
6 capacity:
7 storage: 500Gi
8 accessModes:
9 - ReadWriteOnce
10 iscsi:
11 targetPortal: 10.12.12.xxx:3260 # 修改
12 iqn: iqn.2000-01.com.synology:xxx.Target-1.21xxxxx344 # 修改
13 lun: 1
hostPath
hostPath
卷能将主机节点文件系统上的文件或目录挂载到你的 Pod
中。 虽然这不是大多数 Pod
需要的,但是它为一些应用程序提供了强大的逃生舱。
- 运行一个需要访问 Docker 内部机制的容器;可使用
hostPath
挂载/var/lib/docker
路径。 - 在容器中运行
cAdvisor
时,以hostPath
方式挂载/sys
。 - 允许
Pod
指定给定的hostPath
在运行Pod
之前是否应该存在,是否应该创建以及应该以什么方式存在。
1apiVersion: v1
2kind: Pod
3metadata:
4 name: test-pd
5spec:
6 containers:
7 - image: registry.k8s.io/test-webserver
8 name: test-container
9 volumeMounts:
10 - mountPath: /test-pd
11 name: test-volume
12 volumes:
13 - name: test-volume
14 hostPath:
15 # 宿主上目录位置
16 path: /data
17 # 此字段为可选
18 type: Directory
注意:
FileOrCreate
模式不会负责创建文件的父目录。 如果欲挂载的文件的父目录不存在,Pod 启动会失败。 为了确保这种模式能够工作,可以尝试把文件和它对应的目录分开挂载,如FileOrCreate
配置 所示。
hostPath FileOrCreate 配置示例
1apiVersion: v1
2kind: Pod
3metadata:
4 name: test-webserver
5spec:
6 containers:
7 - name: test-webserver
8 image: registry.k8s.io/test-webserver:latest
9 volumeMounts:
10 - mountPath: /var/local/aaa
11 name: mydir
12 - mountPath: /var/local/aaa/1.txt
13 name: myfile
14 volumes:
15 - name: mydir
16 hostPath:
17 # 确保文件所在目录成功创建。
18 path: /var/local/aaa
19 type: DirectoryOrCreate
20 - name: myfile
21 hostPath:
22 path: /var/local/aaa/1.txt
23 type: FileOrCreate