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需要看回收策略是否影响数据持久化

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐