一、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