K8s存储卷、pv和pvc的使用
emptyDIR 临时目录
hostPath :使用主机的路径
网络存储:
传统的设备存储:NAS,SAN
分布式存储:glusterfs,rbd,cephfs
云存储:EBS,Azure,阿里云的
一、emptyDir 的类型:一个pod里面2个容器,挂载同一个目录,
注意:emptyDir的生命周期同pod周期,简单来说,pod删除了,emptyDir也随之删除
apiVersion: v1 kind: Pod metadata: name: pod-demo namespace: default labels: app: myapp tier: frontend spec: containers: - name: myapp image: ikubernetes/myapp:v1 ports: - name: http containerPort: 80 volumeMounts: #容器挂载 - name: html mountPath: /data/web/html/ - name: busybox image: busybox:latest command: ["/bin/sh" ,"-c","sleep 3600"] volumeMounts: #容器挂载 - name: html mountPath: /data/ volumes: #定义存储 - name: html emptyDir: {}
二、hostPath 类型存储(pod删除后,hostPa存储数据仍然存在)
apiVersion: v1 kind: Pod metadata: name: nginx-volume namespace: default spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ #Pod内容器中被挂载的目录 volumes: - name: html hostPath: path: /data/nginx/v1/ #宿主机path type: DirectoryOrCreate
三、nfs 类型存储
首先要准备好nfs,我在172.17.1.36的机器上安装nfs,到处的目录为/nfs/data
yum install nfs-utils
vim vim /etc/exports
/nfs/data/ 172.17.0.0/16(rw,no_root_squash)
systemctl start nfs
nfs准备好了,注意,在pod的节点机器要一定确定可以挂载nfs类型的,否则创建pod会出错。执行yum install nfs-utils 就可以挂载了
nfs pod 的yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: nginx-volume-nfs
namespace: default
spec:
containers:
- name: nginx-nfs
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
nfs:
path: /nfs/data/
server: 172.17.1.36
四、pv,pvc的使用
对于pv和pvc,首先要准备存储的,我用的是nfs,在172.17.1.36的节点上划分了5个路径作为存储的设备。
mkdir /data/{v1,v2,v3,v4,v5} -pv
vim /etc/exports
添加如下的内容:
/data/v1 172.17.0.0/16(rw,no_root_squash)
/data/v2 172.17.0.0/16(rw,no_root_squash)
/data/v3 172.17.0.0/16(rw,no_root_squash)
/data/v4 172.17.0.0/16(rw,no_root_squash)
/data/v5 172.17.0.0/16(rw,no_root_squash)
保存,导出下。
exportfs -avr
查看下是否正常。
nfs的存储的好了。下一步要先创建pv,yaml文件如下
apiVersion: v1 kind: PersistentVolume metadata: name: pv01 labels: name: pv01 spec: nfs: path: /data/v1/ server: 172.17.1.36 accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 5Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv02 labels: name: pv02 spec: nfs: path: /data/v2/ server: 172.17.1.36 accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 3Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv03 labels: name: pv03 spec: nfs: path: /data/v3/ server: 172.17.1.36 accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 5Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv04 labels: name: pv04 spec: nfs: path: /data/v4/ server: 172.17.1.36 accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 10Gi --- apiVersion: v1 kind: PersistentVolume metadata: name: pv05 labels: name: pv05 spec: nfs: path: /data/v5/ server: 172.17.1.36 accessModes: ["ReadWriteOnce","ReadWriteMany"] capacity: storage: 10Gi
kubectl apply -f pv-nfs.yaml
显示,pv创建完成
接下来创建pvc 和pod,yaml文件如下
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc namespace: default spec: accessModes: ["ReadWriteMany"] resources: requests: storage: 5Gi #到这里是创建pvc的 --- apiVersion: v1 kind: Pod metadata: name: nginx-volume-pvc namespace: default spec: containers: - name: nginx-pvc image: nginx ports: - containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ volumes: #这里是选择volume的类型 - name: html persistentVolumeClaim: claimName: mypvc
显示pvc创建好了,同时pvc绑定了一个pv,到此pv和pvc的安装部署完成。
注意:pv和pvc是一对一绑定的。但是多个pod可以挂载同一个pvc。而且处于绑定状态下的pv无法直接被删除,如果需要删除被绑定的pv,需要先删除申请绑定的PVC
通常使用的流程是,首先创建存储,在创建pv,接着创建pvc,pod挂载到相应的pvc。
-----------------------------------------------------------------------------------------------------------
PV对第三方存储的访问模式支持:
访问模式
PV可以使用存储资源提供商支持的任何方法来映射到host中。如下的表格中所示,提供商有着不同的功能,每个PV的访问模式被设置为卷支持的指定模式。比如,NFS可以支持多个读/写的客户端,但可以在服务器上指定一个只读的NFS PV。每个PV有它自己的访问模式。
访问模式包括:
▷ ReadWriteOnce —— 该volume只能被单个节点以读写的方式映射
▷ ReadOnlyMany —— 该volume只能被多个节点以只读方式映射
▷ ReadWriteMany —— 该volume可以被多个节点以读写的方式映射
在CLI中,访问模式可以简写为:
▷ RWO - ReadWriteOnce
▷ ROX - ReadOnlyMany
▷ RWX - ReadWriteMany
注意:即使volume支持很多种访问模式,但它同时只能使用一种方式来映射。比如,GCEPersistentDisk可以被单个节点映射为ReadWriteOnce,或者多个节点映射为ReadOnlyMany,但不能同时使用这两种方式来映射。
Volume Plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
AWSElasticBlockStore | ✓ | - | - |
AzureFile | ✓ | ✓ | ✓ |
AzureDisk | ✓ | - | - |
CephFS | ✓ | ✓ | ✓ |
Cinder | ✓ | - | - |
FC | ✓ | ✓ | - |
FlexVolume | ✓ | ✓ | - |
Flocker | ✓ | - | - |
GCEPersistentDisk | ✓ | ✓ | - |
Glusterfs | ✓ | ✓ | ✓ |
HostPath | ✓ | - | - |
iSCSI | ✓ | ✓ | - |
PhotonPersistentDisk | ✓ | - | - |
Quobyte | ✓ | ✓ | ✓ |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
VsphereVolume | ✓ | - | - |
PortworxVolume | ✓ | - | ✓ |
ScaleIO | ✓ | ✓ | - |