PVC 的使用
在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在Node 上而已,
准备工作
在使用 PVC 之前,我们还得把其他节点上的 nfs 客户端给安装上
我们需要在所有节点安装 nfs 客户端程序,安装方法和上节课的安装方法一样的。必须在所有节点都安装 nfs 客户端,否则可能会导致 PV 挂载不上的问题
新建 PVC
新建一个数据卷声明,请求 1Gi 的存储容量,访问模式也是ReadWriteOnce,YAML 文件如下:(pvc-nfs.yaml)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1-nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
可以看到我们这里的声明方法几乎和新建 PV 是一样的,在新建 PVC 之前,我们可以看下之前创建的 PV 的状态:
[root@master ~]# kubectl get pv
pv1 1Gi RWO Recycle Available 93m
我们可以看到当前 pv1 是在 Available 的一个状态,所以这个时候我们的 PVC 可以和这个 PV 进行绑定:
[root@master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-nfs Bound pv1 1Gi RWO 5m13s
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv1 1Gi RWO Recycle Bound default/pvc-nfs 97m
可以看到 PV 也是 Bound 状态了,对应的声明是 default/pvc-nfs,就是 default 命名空间下面的 pvc-nfs,证明我们刚刚新建的 pvc-nfs和我们的 pv-nfs 绑定成功了。
系统自动匹配pv\pvc
他会根据我们的声明要求去查找处于 Available 状态的 PV,如果没有找到的话那么我们的 PVC 就会一直处于 Pending 状态,找到了的话当然就会把
新建没有合适的pv看下状态会是什么样子的
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1-nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
selector:
matchLabels:
app: nfs
[root@master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc2-nfs Pending 5s
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 1Gi RWO Recycle Bound default/www-web-0 22h
pv002 1Gi RWO Recycle Bound default/www-web-1 22h
pv1 1Gi RWO Recycle Bound default/pvc-nfs 164m
pvc-558f0315-7994-4b22-a32a-c3978c7794ce 5Gi RWX Delete Bound default/www-test-pvc-0 course-nfs-storage 8d
pvc-fe7e15b0-da47-4f2c-a43a-aba53b1f8a87 1Gi RWX Delete Bound default/test-pvc course-nfs-storage 8d
可以看到没有匹配PVC2的pv所以PVC2会一直处于pending状态,直到有符合的PV才会bound
创建一个符合PVC2的pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pvc2-pv
labels:
app: nfs
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 192.168.0.38
path: /data/k8s
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc2-pv 2Gi RWO Recycle Bound default/pvc2-nfs 15s
[root@master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc2-nfs Bound pvc2-pv 2Gi RWO 7m18s
可以看到正常绑定
需要注意的是不管PVC多大只要没有超过PV容量大小都正常绑定PV,PV有多大的容量空间就可以使用多大容量的空间。
使用 PVC
apiVersion: apps/v1
kind: Deployment
metadata:
name: pvc-nginx
spec:
selector:
matchLabels:
app: pvc-nginx
replicas: 2
template:
metadata:
labels:
app: pvc-nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- name: web
containerPort: 80
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
subPath: html
volumes:
- name: www
persistentVolumeClaim:
claimName: pvc2-nfs
---
apiVersion: v1
kind: Service
metadata:
name: pvc-nginx
spec:
type: NodePort
ports:
- name: web
port: 80
targetPort: 80
selector:
app: pvc-nginx
[root@master ~]# kubectl get svc,pv,pvc
service/pvc-nginx NodePort 10.100.178.66 <none> 80:30054/TCP 13m
persistentvolume/pvc2-pv 2Gi RWO Recycle Bound default/pvc2-nfs 14m
persistentvolumeclaim/pvc2-nfs Bound pvc2-pv 2Gi RWO 13m
[root@master k8s]# pwd
/data/k8s
[root@master k8s]# ll html/
总用量 4
-rw-r--r--. 1 root root 12 3月 13 15:45 index.html
访问nginx
注意:
删除顺序 pod>pvc>pv
如果删除PV则不影响已挂载的pod但影响新建的pod挂载
删除PVC需要看回收策略是否影响数据持久化