一、pv和pvc
pv
pv:Persistent volume
是k8s虚拟化的存储资源,实际上就是存储,例如本地的硬盘,网络文件系统(nfs)
lvm RAID oss(ceph) 云存储。
pvc
pvc:Persistent volume claim
用户对存储资源的请求,定义了需要存储的空间大小,以及对存储空间的访问模式。
有了pvc请求之后 ,和pv进行匹配,匹配到了之后绑定,绑定成功,就可以使用pv的存储空间。
1.1、静态-----手动创建pv
1.2、动态----自动创建pv
1.3、pv和pvc的生命周期
1、配置 定义pvc的请求详细情况-------匹配pv------绑定-------使用--------释放--------pv回收
pv的状态有四种:
1、Available:可用的,可以被pvc匹配。未绑定状态。
2、bound:已绑定,pv已经被pvc绑定,正在使用。
3、released:已释放,pvc以及被删除,但是pv的资源还没有被回收,pv不可用的状态。
4、failed失败 pv自动回收失败,pv不可用。
1.4、pvc在请求的过程中支持的权限控制选项:
ReadWriteOnce RWO : 存储目录可读,可写,但是这个目录只能被一个pod挂载。
ReadOnlyMany:ROX 存储可以以只读的方式被多个pod挂载
ReadWriteMany:RWX 存储目录可以读写的方式被多个pod挂载
NFS支持以上三种所有模式。
hostPath只支持ReadWriteOnce: 存储目录可读,可写,但是这个目录只能被一个pod挂载。
云存储(对象存储可以支持动态扩缩容)
ISCSI不支持ReadWriteMany
ISCSI是一种在网络上运行SCSI协议的网络存储技术
[root@master01 k8s-yaml]# lsscsi
[0:0:0:0] disk VMware, VMware Virtual S 1.0 /dev/sda
[2:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0
1.5、pv的回收策略:
Retain: 保留
虽然pvc被删除了,但是pv还是处于released的状态,即使恢复到available状态,上一个挂载的数据也不会丢失。
Delete:删除
虽然pvc被删除了,但是pv还是处于released的状态,即使恢复到available状态,数据全部删除
Recycle回收:
虽然pvc被删除了,但是pv还是处于released的状态,pv会自动的对资源进行回收,删除数据,然后pv自动回到available状态。
我们使用的文件系统是nfs共享
nfs共享文件
[root@k8s5 ~]# vim /etc/exports
/data/v1 192.168.168.0/24(rw,no_root_squash)
/data/v2 192.168.168.0/24(rw,no_root_squash)
/data/v3 192.168.168.0/24(rw,no_root_squash)
[root@k8s5 /]# rm -rf data
[root@k8s5 /]# mkdir -p /data/v{1,2,3}
[root@k8s5 /]# cd data
[root@k8s5 data]# ls
v1 v2 v3
[root@k8s5 data]# systemctl restart rpcbind
[root@k8s5 data]# systemctl restart nfs
[root@k8s5 data]# showmount -e
Export list for k8s5:
/data/v3 192.168.168.0/24
/data/v2 192.168.168.0/24
/data/v1 192.168.168.0/24
[root@master01 k8s-yaml]# showmount -e 192.168.168.85
Export list for 192.168.168.85:
/data/v3 192.168.168.0/24
/data/v2 192.168.168.0/24
/data/v1 192.168.168.0/24
pv指定
[root@master01 k8s-yaml]# kubectl explain pv
KIND: PersistentVolume
[root@master01 k8s-yaml]# vim pv.yaml
#我们定义3个pv,定义目录的路径,访问模式,pv的大小
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
#定义pv使用的文件系统
server: 192.168.168.85
path: /data/v1
#如果请求匹配到这个pv,使用的是目标主机的/data/v1
accessModes: ["ReadWriteOnce"]
#定义访问模式
capacity:
storage: 1Gi
#Mi Gi Ti
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
server: 192.168.168.85
path: /data/v2
accessModes: ["ReadWriteMany"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
server: 192.168.168.85
path: /data/v3
accessModes: ["ReadOnlyMany"]
capacity:
storage: 3Gi
[root@master01 k8s-yaml]# kubectl apply -f pv.yaml
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
[root@master01 k8s-yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 1Gi RWO Retain Available 49m
pv002 2Gi RWX Retain Bound default/mypvc 49m
pv003 3Gi ROX Retain Available
pvc
[root@master01 k8s-yaml]# kubectl explain pvc
KIND: PersistentVolumeClaim
[root@master01 k8s-yaml]# vim pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 2Gi
#我需要pv,权限ReadWriteMany,空间是2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
labels:
app: nginx1
spec:
replicas: 3
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.22
volumeMounts:
- name: xy102
mountPath: /usr/share/nginx/html/
volumes:
- name: xy102
persistentVolumeClaim:
#直接使用pvc的请求把容器内目录挂载pv请求对应的目录。
claimName: mypvc
[root@master01 k8s-yaml]# kubectl apply -f pvc.yaml
persistentvolumeclaim/mypvc unchanged
deployment.apps/nginx1 created
[root@master01 k8s-yaml]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 1Gi RWO Retain Available 23m
pv002 2Gi RWX Retain Bound default/mypvc 23m
pv003 3Gi ROX Retain Available 23m
[root@master01 k8s-yaml]# kubectl exec -it nginx1-7fd846678-jfs42 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx1-7fd846678-jfs42:/# cd /usr/share/nginx/
root@nginx1-7fd846678-jfs42:/usr/share/nginx# ls
html
root@nginx1-7fd846678-jfs42:/usr/share/nginx# cd html/
root@nginx1-7fd846678-jfs42:/usr/share/nginx/html# ls
index.html
root@nginx1-7fd846678-jfs42:/usr/share/nginx/html# cat index.html
123
[root@master01 k8s-yaml]# kubectl expose deployment nginx1 --port=80 --target-port=80 --type=NodePort
service/nginx1 exposed ##开启主机和service服务
[root@master01 k8s-yaml]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 9d
nginx1 NodePort 10.96.38.241 <none> 80:30972/TCP 21s
[root@mas