volume
volume
Pod的存储卷,不应该在某台Node上,而是在共享存储中(NFS,MFS)
在Pod上有一个基础容器pause,所有加入到这个Pod的容器,都共享pause容器的Net,UTS,IPC。
Pause也可以接入volume,pause接入时,必须要识别此volume从哪种操作系统上过来,例是NFS还是MFS,节点做了桥接
k8s内置了许多标准的存储接口,也提供给用户CSI(container stroage interface)用户自定义接口
kubectl explain pods.spec.volumes
k8s提供的存储类型
云存储: awsElasticBlockstorage、azureDisk、azureFile
分布式存储:cephfs,glusterfs,rbd
网络存储:nfs,iscsi,fc
临时存储:emptyDir,gitRepo (Pod生命周期结束,此存储也会消失)
本地存储:hostPath,local (跟随Node的生命周期结束)
特殊存储:configMap,secret,downwardAPI
自定义存储:csi
持久存储:persistentVolumeClain,pvc
image.png
存储卷使用示例
https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
kubectl explain pods.spec.volumes.hostPath
[root@k8s-master basic]# cat vol-daemon.yaml
apiVersion: v1
kind: Namespace
metadata:
name: vol
---
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: vol
labels:
app: myapp
spec:
nodeName: k8s-node-01
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: webstor
mountPath: /usr/share/nginx/html
readOnly: true
volumes:
- name: webstor
hostPath:
path: /volumes/myapp
type: DirectoryOrCreate
kubectl apply -f pod-daemon.yaml
kubectl describe pods myapp -n vol
kubectl get pods -n vol -o wide
kubectl explain pods.spec.nodeName 绑定Pod在某个节点上
临时存储
emptyDir,Pod一终止,此目录就会删除
kubectl explain pods.spec.volumes.emptyDir
medium 空值或Memory
sizeLimit 当medium 为Memory 时,必须设定此值,如果emptyDir不使用任何值,即medium是空值,sizeLimit不限制,yml 中应使应用emptyDir:{}
网络存储
nfs服务器
mkdir /vols/v{1,2,3,4,5} -p
vim /etc/exports
/vols/v1 10.0.0.0/24(rw,no_root_squash) //no_root_squash 加上,否则Pod可能会挂载失败
systemctl start nfs
systemctl enable nfs
k8s节点 测试挂载
mount -t nfs 10.0.0.104:/vols/v1 /mnt
mount 查看挂载情况
umount /mnt 卸载
kubectl explain pods.spec.volumes.nfs
path: nfs服务器上的目录
server: nfs服务器上的地址和端口,端口可以不给
存储卷示例
volumes:
- name: redisdata
nfs:
server: 172.18.0.69
path: /vols/v1
# Pod 存储卷
1. 定义存储卷
kubectl explain pods.spec.volumes
2.在容器中挂载存储卷
kubectl explain pods.spec.containers.volumeMounts
image.png
PV为一个中间件,是k8s上的一个资源。与后台存储系统提供的存储逻辑单元--对应,我们只需要把存储单元映射成一个个PV,提供给k8s使用
pv是集群级别的资源
Pod要使用pv,而Pod是名称空间级别资源。我们要把pv映射成名称空间,且一个pv对应一个名称空间。(一对一进行绑定)
image.png
要让名称空间与PV绑定,需要名称空间的pvc与pv1绑定,此时pv1是binding状态,其余pv是available状态
因此使用Pod pvc类型做存储卷时,应直接使用
kubectl explain pods.spec.volumes.persistentVolumeClaim
在Pod的容器中要挂载PVC,如果一段时间内Pod被删除了,这个PVC应该会在名称空间,另一个Pod挂载这个PVC,会应该共享此PVC的数据
如果有两个Pod来同时挂载这个PVC,PVC是否支持,取决于底层存储是否支持。
如果底层存储设备,是块读写,则不支持。如果一个名称空间,所有Pod都回收了,PVC也删了,但对应的PV不会删,其上面还有数据。PV一旦删了,其数据也没有了。因为PV对应的存储设备的存储单元,pv 处于 reclaim(可回收状态)
PV如何来的
1、静态,由管理员手动创建
2、动态
1.在名称空间创建PVC,此时存储设备上有多个逻辑单元。PVC发送请求,创建PV。在存储空间没有逻辑单元,创建PVC发送请求,调用存储设备的管理界面的API接口,创建存储设备的存储逻辑单元,再创建PV
PV的生命周期(lifecycle)
provisioning 创建
Binding
Using
Reclaiming 回收
pv的回收策略
Delete(删除这个pv)
Recycle(删除pv上的数据)
Retain(保留这个PV和PV上的数据)
PV 如何动态创建
image.pngPVC向sc发送请求,sc定义了向存储设备的API,即创建逻辑单元,并且在sc中创建了pv。
pvc和pv只属于sc。pvc不能跨sc创建pv,即pvc和pv要么属于一个sc,要不都不属于一个sc
存储逻辑
image.png注意:PV不属于名称空间,不能定义namespace
1.先定义存储空间
NFS
vim /etc/exports
/vols/v1 172.18.0.0/16(rw,no_root_squash)
/vols/v2 172.18.0.0/16(rw,no_root_squash)
/vols/v3 172.18.0.0/16(rw,no_root_squash)
/vols/v4 172.18.0.0/16(rw,no_root_squash)
/vols/v5 172.18.0.0/16(rw,no_root_squash)
exports -rav
kubectl explain pv
kubectl explain pv.spec
access-mode:访问模型,单路读写,多路只读,多路读写
RWO(单路读写) Readwriteonce
ROX(多路只读)ReadOnlyMany
RWX(多路读写)ReadWriteMany
[root@k8s-master basic]# cat pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-v1
labels:
storages: nfs
spec:
accessModes: ["ReadWriteOnce","ReadWriteMany","ReadOnlyMany"] //这里的accessModes 的特性一定不能超过底层存储系统支持的特性
capacity:
storage: 5Gi //定义存储空间
volumeMode: Filesystem //有两种存储类型,一种是块存储,一种是文件系统存储
persistentVolumeReclaimPolicy: Retain //PVC删除后,PV的回收策略
nfs:
server: 10.0.0.104
path: /vols/v2
kubectl apply -f pv-daemon.yaml
[root@k8s-master basic]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-data
namespace: develop
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 3Gi //此处pv一定要有3G以上的空间
kubectl get pvc -n develop
# Pod使用pvc
[root@k8s-master basic]# cat pod-pvc.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-pvc
namespace: develop
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
volumes:
- name: data
persistentVolumeClaim:
claimName: redis-data
kubectl apply -f pod-pvc.yaml
kubectl describe pods pod-pvc -n develop
查看 volumes
pv和pvc的存储保护
如果Pod在使用PVC,如果删了PVC。此请求可以正常发出,但pvc不会被真正删除。直到使用此pvc的Pod被删除,这个PV才会被删除。当PVC删除后,绑定的pv为Released状态,不能再被pvc绑定(pv为avaiable时,才可以被绑定)
kubectl delete pv ... 切换到pv所在的存储逻辑单元,删除数据
sc存储类
假设一个公司有多种存储类型设备,可以把相同的类型设备归为一类
image.png
当pvc申请pv时,也要向存储类进行申请,在存储类中应有pv
kubectl explain sc (了解)