跳转至

25. 手动创建pv和pvc

1. 创建pv目录

mkdir /k8s/pv-nfs
cd /k8s/pv-nfs

2. 打开pv相关的官网书签

# https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#%E5%88%9B%E5%BB%BA-persistentvolume

3. 得到hostpath类型的pv模板(不用)

# 在本练习中,你将创建一个 hostPath 类型的 PersistentVolume。 Kubernetes 支持用于在单节点集群上开发和测试的 hostPath 类型的 PersistentVolume。 hostPath 类型的 PersistentVolume 使用节点上的文件或目录来模拟网络附加存储。

# 在生产集群中,你不会使用 hostPath。 集群管理员会提供网络存储资源,比如 Google Compute Engine 持久盘卷、NFS 共享卷或 Amazon Elastic Block Store 卷。 集群管理员还可以使用 StorageClasses 来设置动态提供存储。
apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

4. 创建nfs类型的pv(常用)

vim pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs
spec:
  capacity: 
    storage: 1Gi
  accessModes:
  - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs/sharefolder
    server: 81.70.4.171
kubectl create -f pv-nfs.yaml

5. 查看pv

kubectl get pv
root@k8s-master:/k8s/pv-nfs# kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
app-config   1Gi        ROX            Retain           Available                                   4d4h
pv-nfs       1Gi        RWX            Retain           Available                                   9s


# 一个 PV 的生命周期中,可能会处于4中不同的阶段:
    - Available(可用):表示可用状态,还未被任何 PVC 绑定
    - Bound(已绑定):表示 PV 已经被 PVC 绑定
    - Released(已释放):PVC 被删除,但是资源还未被集群重新声明
    - Failed(失败): 表示该 PV 的自动回收失败

6. 打开书签,得到pvc模板

# https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#%E5%88%9B%E5%BB%BA-persistentvolume
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

# 注意问题:
    # 1.访问模式,storage大小(pvc大小需要小于pv大小),以及 PV 和 PVC 的 storageClassName 字段必须一样,这样才能够进行绑定。
    # 2.PersistentVolumeController会不断地循环去查看每一个 PVC,是不是已经处于 Bound(已绑定)状态。如果不是,那它就会遍历所有的、可用的 PV,并尝试将其与未绑定的 PVC 进行绑定,这样,Kubernetes 就可以保证用户提交的每一个 PVC,只要有合适的 PV 出现,它就能够很快进入绑定状态。而所谓将一个 PV 与 PVC 进行“绑定”,其实就是将这个 PV 对象的名字,填在了 PVC 对象的 spec.volumeName 字段上。

7. 创建pvc

vim pvc-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nfs
  namespace: default
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
kubectl create -f pvc-nfs.yaml

8. 查看pvc

kubectl get pvc
root@k8s-master:/k8s/pv-nfs# kubectl get pvc
NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS      AGE
pv-volume   Pending                                      csi-hostpath-sc   4d4h
pvc-nfs     Bound     pv-nfs   1Gi        RWX                              3s
test-pvc    Pending                                      nfs               54m
root@k8s-master:/k8s/pv-nfs#
root@k8s-master:/k8s/pv-nfs# kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM             STORAGECLASS   REASON   AGE
app-config   1Gi        ROX            Retain           Available                                             4d4h
pv-nfs       1Gi        RWX            Retain           Bound       default/pvc-nfs                           8m47s

9. 查看nfs共享目录

ls /nfs/sharefolder
#看样子直接把整个目录当成pv了!!!
root@k8s-master:/k8s/pv-nfs# ls /nfs/sharefolder
test1.txt  test.dd  test.txt

最后更新: 2022-02-22 04:55:01