目录
一、Volume概述
二、emptyDir卷
[root@server2 volumes]# cat vol1.yaml
apiVersion: v1
kind: Pod #资源类型是pod
metadata:
name: vol1
spec:
containers: #创建两个容器
- image: busyboxplus
name: vm1
command: ["sleep", "300"]
volumeMounts:
- mountPath: /cache #容器vm1挂载的目录
name: cache-volume
- name: vm2
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx/html #容器vm2挂载的目录
name: cache-volume
volumes:
- name: cache-volume
emptyDir: #创建empty卷
medium: Memory #基于内存
sizeLimit: 100Mi #限制大小100M
进入第一个容器挂载目录下写入文件。进入另一个容器的挂载目录,可以看到我们在vm1容器里写入的文件,说明卷是共享的
配置文件里限制卷大小为100M,生成一个200M的空文件,卷被“撑爆”,容器停止运行。
可以看到文件超过sizeLimit,则一段时间后(1-2分钟)会被kubelet evict掉。之所以不是“立即”被evict,是因为kubelet是定期进行检查的,这里会有一个时间差。
emptydir缺点
:
不能及时禁止用户使用内存。虽然过1-2分钟kubelet会将Pod挤出,但是这个时间内,其实对node还是有风险的;
影响kubernetes调度,因为empty dir并不涉及node的resources,这样会造成Pod“偷偷”使用了node的内存,但是调度器并不知晓;
用户不能及时感知到内存不可用
三、HostPath 卷
- 当使用这种类型的卷时要小心,因为:
具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。
[root@server2 volumes]# cat host.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: DirectoryOrCreate
server3上自动创建data:
在server2里写入文件,在server3/data目录下也能看到
四、NFS共享文件
在server1、2、3、4都下载nfs组件,开启
yum install -y nfs-utils.x86_64
systemctl enable --now nfs
更改server1的配置文件/etc/exports
[root@server1 mnt]# cat /etc/exports
/mnt/nfs *(rw,no_root_squash)
server2访问server1的nfs
[root@server2 volumes]# showmount -e 172.25.51.1
Export list for 172.25.51.1:
/mnt/nfs *
应用配置文件,查看pod的详细信息,共享成功
[root@server2 volumes]# cat nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: test-container
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-volume
volumes:
- name: test-volume
nfs:
server: 172.25.51.1
path: /mnt/nfs
在server1的nfs数据目录下写入文件
server2中看到的一样
五、PersistentVolume持久卷(PV)
-
PersistentVolume(持久卷,简称
PV
)是集群内,由管理员提供的网络存储的一部分。就像集群中的节点一样,PV也是集群中的一种资源。它也像Volume一样,是一种volume插件,但是它的生命周期却是和使用它的Pod相互独立的。PV这个API对象,捕获了诸如NFS、ISCSI、或其他云存储系统的实现细节。 -
PersistentVolumeClaim(持久卷声明,简称
PVC
)是用户的一种存储请求。它和Pod类似,Pod消耗Node资源,而PVC消耗PV资源。Pod能够请求特定的资源(如CPU和内存)。