假设有如下三个节点的 K8S 集群:
k8s31master 是控制节点
k8s31node1、k8s31node2 是工作节点
容器运行时是 containerd
一、背景分析
阅读本文,默认您有 PV-PVC、hostPath 相关知识。
由于安全方面的考虑,K8S 官方并不推荐 hostPath + 节点选择器 来作为 Pod 的持久化方案。

转而提倡 local 持久卷的方式。我们今天就来实践一下 local 持久卷。
二、no-provisioner 方式(无供应商方式)
1)创建 StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage # 名称需与 PV 中的 storageClassName 对应
provisioner: kubernetes.io/no-provisioner # 关键:本地卷不支持动态供应
volumeBindingMode: WaitForFirstConsumer # 关键:延迟绑定直到 Pod 调度
reclaimPolicy: Delete # 卷回收策略(Retain/Delete)
provisioner=kubernetes.io/no-provisioner:本地卷还不支持动态制备; 然而还是需要创建 StorageClass 以延迟卷绑定,直到 Pod 被实际调度到合适的节点。
volumeBindingMode=WaitForFirstConsumer:延迟 PVC 与 PV 的绑定。延迟卷绑定使得调度器在为 PersistentVolumeClaim 选择一个合适的 PersistentVolume 时能考虑到所有 Pod 的调度限制。

2)创建挂载目录
因为本地卷不支持动态制备,所以需要在每个工作节点上手工创建挂载目录。
# node1 创建
[root@k8s31node1 ~]# mkdir -p /data/local_storage
# node2 创建
[root@k8s31node2 ~]# mkdir -p /data/local_storage
3)创建 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-rwo-pv
labels:
type: local
spec:
capacity:
storage: 1Gi # 定义存储容量
volumeMode: Filesystem # 可选:Filesystem 或 Block
accessModes:
- ReadWriteOnce # 关键:仅允许单节点读写挂载
persistentVolumeReclaimPolicy: Delete # 可选:Retain/Recycle/Delete
storageClassName: local-storage # 引用上面创建的存储类
local:
path: /data/local_storage # 节点上的实际路径
nodeAffinity: # 限制卷只能被特定节点使用
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s31node1 # 替换为你的节点名
accessModes=ReadWriteOnce:因为是本地存储,所以只允许单节点挂载。
nodeAffinity:节点亲和性,限制卷只能被具有标签 kubernetes.io/hostname 且值为 k8s31node1 的节点使用。可以通过命令 kubectl get node --show-labels 查看节点标签。
- 查看 pv

STATUS=Available:实现可用状态。
4)创建 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-rwo-pvc
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
- 查看 pv,pvc

因为是延迟绑定,所以 PVC 显示为 Pending 状态。


最低0.47元/天 解锁文章
3432

被折叠的 条评论
为什么被折叠?



