简介
K8s支持多种存储方案以便满足各种不同Pod类型的需求,如:对本机目录挂载(HostPath),远程共享目录( NFS,MFS),Pod之间目录共享(emptyDir),性能较强的(iscsi)等等
EmptiDir
介绍
当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上云巽宫,该卷就会存在,最初是空的状态,Pod中的容器可以读取和写入emptyDir卷中的相同文件,改卷可以挂载到每个容器中的相同或不同路径上,当出于任何原因从节点中删除Pod时,emptyDir中的数据将被永久删除。
用法
- 暂存空间,例如用于基于磁盘的合并排序
- 用作长时间计算奔溃恢复时的检查点
- Web服务容器提供数据时,保存内容管理器容器提取的文件
eg:
apiVersion: v1
kind: Pod
metadata:
name: test
name: default
spec:
containers:
- name: nginx
image: test/nginx:v1
ports:
- containerPort: 80
volumeMounts:
- mountPath: /test
name: nginx-test
volumes:
- name: nginx-test
emptyDir: {}
HostPath
介绍
就是Pod与Pod运行所在的Node上目录进行绑定
卷的type类型
值 | 行为 |
空字符串(默认)用于向后兼容,这意味着在挂载hostPath卷之前不会执行任何检查 | |
DirectoryOrCreate | 如果在给定的路径上没有任何东西存在,那么将根据需要在那里创建一个空目录,权限设置为0755,与Kubelet具有相同的组和所有权 |
Directory | 给定的路径下必须存在目录 |
FileOrCreate | 如果在给定的路径上没有任何东西存在,那么会更具需要创建一个空文件,权限设置为0644,与Kubelet具有相同的组和所有权 |
File | 给定的路径下必须存在文件 |
Socket | 给定的路径先必须存在UNIX套接字 |
CharDevice | 给定的路径下必须存在字符设备 |
BlockDevice | 给定的路径下必须存在块设备 |
注意
- 无法确定Pod运行在哪个Node节点上,所以需要所有Node节点拥有挂载目录,否则Pod启动失败
- Pod没有对该目录大小感知度,所以使用时目录没有大小限制内容将会一直叠加
- 注意目录权限问题
eg:
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: default
spec:
containers:
- name: nginx-test
image: test/nginx:v1
ports:
- containerPort: 80
volumeMounets:
- mountPath: /usr/share/nginx/html
name: nginx-test
volumes:
- name: nginx-test
hostPath:
path: /www/html
type: Directory
PV/PVC
PV
是Volume之类的卷插件,但是具有独立使用PV的Pod的生命周期,PVC可以通过对PV类型添加的标签类型来自动选择适合的PV进行绑定后再挂载到Pod中
PVC
相当与连接Pod与PV之间的中间件,可以根据Pod选取PV的标准自动选择合适的PV进行绑定挂载到Pod中,可以声明请求资源的最大值,以及请求的访问控制
PV访问模式(accessModes)
访问模式 | 简写 | 意义 |
ReadWriteOnce | RWO | 该卷可以被单个接待你以读/写模式挂载 |
ReadOnlyMany | ROX | 该卷可以被多个节点以只读模式挂载 |
ReadWriteMany | RWX | 改卷可以被多个节点以读/写模式挂载 |
PV回收策略(persistentVolumeReclaimPolicy)
- Retain(保留):手动回收
- Recycle(回收):基本擦除(rm -rf /thevolime/*)
- Delete(删除):关联的存储资产将被删除(AWS EBS,GCE PD)
eg:
部署PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfspv1
namespace: default
spec:
capacity:
storage: 5Gi #pv上限
accessModes: #pv访问策略
- ReadWriteOnec
presistentVolumeReclaimPolicy: Retain #pv回收策略
storageClassName: nfs #pv类型
部署PVC以及Deployment
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-depoyment
namespace: test
labels:
app: test
spec:
replicas: 3
selector:
matchLabels:
app: test
template:
metadata:
name: test
namespace: test
labels:
app: test
spec:
containers:
- name: test-nginx
ports:
- containerPort: 80
image: ntp.weijiayu.club/myapp/nginx:v3
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-html
volumeClaimTemplates:
- metadata:
name: test-html
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs"
resources:
requests:
storage: 1Gi