【云原生】PV PVC原理及完整流程

50 阅读2分钟

一、PV和PVC

1.PV是什么

给pod存数据的硬盘

2.PVC是什么

pod向k8s要硬盘的申请单

3.PV和PVC的关系是什么

如果没有storageClass,pv是提前创建好的,pvc也是提前创建好的,k8s根据pvc找到pv
如果有storageClass,k8s会根据pvc的申请自动创建一个pv

二、NFS Provisioner

1.NFS是什么

Network File System 让多台电脑共享同一个文件夹的网络存储
网络存储:通常在一台专门的服务,其他电脑通过网络访问这些数据

2.Provisioner是什么

供应者 提供者

3.NFS Provisioner 的流程

1.pvc发起请求 并指定 storageClassName
2.storageClass 告诉k8s 用哪个provisoner
3.Provisoner自动在nfs上创建子目录,生成PV
4.PVC与PV绑定
5.pod挂载与PVC使用数据

4.Provisioner如何自动创建PV

1.Provisioner是一个控制器 它一直在监听pvc的创建
2.当有pvc时,它根据pvc的声明去调用底层接口命令创建pv
3.然后pvc和pv绑定

5.NFS proversioner如何实现

1.准备NFS服务器
2.通过yaml部署NFS Provisioner

三、PV,PVC,storageClass,Provisioner的全部流程

1.创建StorageClass

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs
provisioner: cluster.local/nfs-provisioner  # 必须与Provisioner的标识一致
parameters:
  archiveOnDelete: "false"  # 删除PVC时是否保留数据
mountOptions:
  - vers=4.1                # macOS必须指定NFS版本
  - noresvport
reclaimPolicy: Retain
volumeBindingMode: Immediate

2.创建nfs-provisioner的yaml

# nfs-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-provisioner
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccountName: nfs-provisioner
      containers:
      - name: nfs-provisioner
        image: k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
        env:
        - name: PROVISIONER_NAME
          value: cluster.local/nfs-provisioner  # 必须与StorageClass的provisioner字段一致
        - name: NFS_SERVER
          value: "host.docker.internal"         # macOS专用域名
        - name: NFS_PATH
          value: "/Users/Shared/nfs_k8s_data"   # 修改为您的共享目录路径
        volumeMounts:
        - name: nfs-client-root
          mountPath: /persistentvolumes
      volumes:
      - name: nfs-client-root
        nfs:
          server: host.docker.internal
          path: /Users/Shared/nfs_k8s_data      # 与NFS_PATH一致
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io

3.创建PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-pvc
spec:
  storageClassName: nfs  # 必须与StorageClass名称匹配
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

4.部署所有yaml文件,然后查看状态

kubectl apply -f test-pvc.yaml
kubectl get pvc test-pvc -w