一、PVC绑定PV¶
在工作场景中,k8s管理员会碰到两种场景:
- 场景一:k8s管理员成功创建好PV,请求开发人员申请该PV并创建PVC配置到Volumes配置一个PVC类型的存 储,并指定PVC的名字是xxx即可
- 场景二:k8s管理员成功创建好PV和PVC,请求开发人员在Volumes指定PVC的名字是xxx即可

注意:PVC和PV进行绑定的前提条件是一些参数必须匹配,比如accessModes、storageClassName、volumeMode都需要相同,并且PVC的storage需要小于等于PV的storage配置。
下面进行PVC挂载示例:
首先创建PV
1.定义一个yaml文件
[root@k8s-master01 pv]# vim pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs-slow
nfs:
path: /data/nfs/test_nfs
server: 192.168.1.34
上面参数说明:
- capacity:容量配置
- volumeMode:卷的模式,目前支持Filesystem (文件系统) 和 Block(块),其中Block类型需 要后端存储支持,默认为文件系统
- accessModes:该PV的访问模式,这里设置为RWO,可以被单节点以读写模式挂载
- storageClassName:PV的类,一个特定类型的PV 只能绑定到特定类别的PVC
- persistentVolumeReclaimPolicy:回收策略
- nfs:NFS服务配置,包括以下两个选项:path:NFS上的共享目录;server:NFS的IP地址
2.部署
[root@k8s-master01 pv]# kubectl create -f pv-nfs.yaml
3.结果验证
[root@k8s-master01 pv]# kubectl get -f pv-nfs.yaml
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 5Gi RWO Recycle Available nfs-slow 16s
其次创建PVC
1.定义一个名为pvc-nfs.yaml 的yaml文件
[root@k8s-master01 pv]# vim pvc-nfs.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs-pvc-claim
spec:
storageClassName: nfs-slow #要求PV一致
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi #小于等于PV大小
注意:PVC有命名空间限制,这里默认是default空间
2.部署
[root@k8s-master01 pv]# kubectl create -f pvc-nfs.yaml
3.结果验证,观察到状态已更改为Bound,但此时并不代表可用
[root@k8s-master01 pv]# kubectl get -f pvc-nfs.yaml
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc-claim Bound pv-nfs 5Gi RWO nfs-slow 60s
4.查看PV状态,此时PV状态由原来的Available变为Bound ,但此时并不代表可用
[root@k8s-master01 pv]# kubectl get pv pv-nfs
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-nfs 5Gi RWO Recycle Bound default/nfs-pvc-claim nfs-slow 79m
最后,创建Pod
1.在k8s-master01上定义一个名为pvc-nfs-pod.yaml的yaml文件
[root@k8s-master01 pv]# vim pvc-nfs-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: nfs-pvc-claim
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
imagePullPolicy: IfNotPresent
name: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
2.在k8s-master01上开始部署
[root@k8s-master01 pv]# kubectl create -f pvc-nfs-pod.yaml
3.在k8s-master01上查看pod状态
[root@k8s-master01 pv]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-59fdd74bd4-2c2hk 1/1 Running 0 19s
nginx-59fdd74bd4-dlfgf 1/1 Running 0 19s
4.在k8s-master01上以容器的方式进入pod,修改文件内容,用于测试另一个Pod是否会同步
[root@k8s-master01 pv]# kubectl exec -it nginx-59fdd74bd4-2c2hk -- sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # echo "test_nfs" > /usr/share/nginx/html/index.html
/usr/share/nginx/html # cat /usr/share/nginx/html/index.html
test_nfs
5.继续在k8s-master01上以容器的方式进入另一个pod后,查看已经同步
[root@k8s-master01 pv]# kubectl exec nginx-59fdd74bd4-dlfgf -- cat /usr/share/nginx/html/index.html
test_nfs
2.8 PVC创建和挂载失败的原因¶
2.8.1 PVC一直Pending的原因¶
1.PVC的空间申请大小大于PV的大小 2.PVC的StorageClassName没有和PV的一致 3.PVC的accessModes和PV的不一致
2.8.2 挂载PVC的Pod一直处于Pending¶
1.PVC没有创建成功/PVC不存在 2.PVC和Pod不在同一个Namespace