volume

2020-09-09  本文已影响0人  麟之趾a

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.png

PVC向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 (了解)

上一篇下一篇

猜你喜欢

热点阅读