本地持久化存储为 Kubernetes 提供了高性能、低延迟的数据访问能力,但需要结合节点亲和、卷管理和生命周期策略,才能实现安全可靠的生产级存储方案。
本地持久化卷允许用户通过标准 PVC 接口以简单便携的方式访问本地存储。PV 中包含系统用于将 Pod 调度到正确节点的节点亲和性信息。
本地存储与传统网络存储不同,它提供了更好的性能但需要特殊的管理方式。外部静态配置器(provisioner)可用于帮助简化本地存储管理,但它不支持动态配置,需要管理员预先在每个节点上配置本地卷。
本地存储配置器支持两种卷模式,适应不同类型的应用需求。
使用本地持久化存储需要满足以下要求:
不同版本的配置器与 Kubernetes 版本的兼容性如下。
| 配置器版本 | Kubernetes 版本 | 主要特性 |
|---|---|---|
| 2.3.0+ | 1.14+ | 稳定版 API,完整功能支持 |
| 2.1.0 | 1.10 | Beta API 默认启用,支持块存储 |
| 2.0.0 | 1.8, 1.9 | 挂载传播支持 |
| 1.0.1 | 1.7 | 初始 Alpha 版本 |
Kubernetes 本地存储功能不断演进,以下为主要阶段特性。
PV.NodeAffinity 字段正式可用volumeBindingMode 特性稳定PV.NodeAffinity 字段,弃用 Alpha 版本的 NodeAffinity annotation,Alpha 支持原始块设备volumeBindingMode 参数,支持延迟绑定local PersistentVolume 源,支持具有节点亲和性的目录或挂载点在生产或测试环境中部署本地持久化存储需按以下步骤操作。
对于 Kubernetes 1.14+ 版本,本地持久化存储已默认启用。如需使用原始块设备功能:
# 对于较旧版本可能需要启用特性门控
export KUBE_FEATURE_GATES="BlockVolume=true"
VolumeBindingChecker(1.9+)或 NoVolumeBindConflict(1.9 之前)。# 创建发现目录
mkdir /mnt/disks
# 创建多个测试卷(使用 tmpfs 模拟)
for vol in vol1 vol2 vol3; do
mkdir /mnt/disks/$vol
mount -t tmpfs $vol /mnt/disks/$vol
done
创建支持延迟绑定的 StorageClass:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
WaitForFirstConsumer 模式确保 PVC 绑定会延迟到 Pod 被调度时,这对于本地存储至关重要。
# 使用默认配置
helm template local-volume-provisioner \
--namespace kube-system \
./helm/provisioner > provisioner.yaml
# 或使用自定义配置
helm template local-volume-provisioner \
--namespace kube-system \
--values custom-values.yaml \
./helm/provisioner > provisioner.yaml
kubectl apply -f provisioner.yaml
创建配置器的 ConfigMap:
apiVersion: v1
kind: ConfigMap
metadata:
name: local-provisioner-config
namespace: kube-system
data:
storageClassMap: |
local-storage:
hostDir: /mnt/disks
mountDir: /mnt/disks
部署配置器后,检查自动发现的本地卷:
# 查看创建的 PV
kubectl get pv
# 查看 PV 详细信息
kubectl describe pv <pv-name>
成功创建的 PV 示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv-node1-vol1
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/vol1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node1
以下为典型的 PVC 和 Pod 使用本地存储的配置方式。
文件系统模式 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-storage-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-storage
resources:
requests:
storage: 5Gi
块设备模式 PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: local-block-claim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Block
storageClassName: local-storage
resources:
requests:
storage: 5Gi
apiVersion: v1
kind: Pod
metadata:
name: local-storage-pod
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: local-vol
mountPath: /usr/share/nginx/html
volumes:
- name: local-vol
persistentVolumeClaim:
claimName: local-storage-claim
结合实际生产需求,建议遵循以下最佳实践。
文件系统卷建议在 fstab 和目录名中使用 UUID 标识
# 查看磁盘 UUID
ls -l /dev/disk/by-uuid
# fstab 示例
UUID=12345678-1234-1234-1234-123456789012 /mnt/disks/vol1 ext4 defaults 0 2
块设备卷建议用唯一 ID 作为符号链接名称
# 基于硬件序列号创建符号链接
ln -s /dev/sda1 /mnt/disks/disk-serial-ABC123
本地卷的生命周期管理需严格遵循规范,确保数据安全。
删除 PVC
kubectl delete pvc local-storage-claim
手动删除对应的 PV
kubectl delete pv local-pv-name
监控本地存储的健康和使用状态,有助于及时发现和解决问题。
检查配置器状态
kubectl logs -n kube-system -l app=local-volume-provisioner
验证节点亲和性
kubectl describe pv <pv-name> | grep -A 10 NodeAffinity
检查 StorageClass 配置
kubectl describe storageclass local-storage
本地持久化存储为 Kubernetes 提供了高性能、低延迟的数据访问能力,但需结合节点亲和、卷管理和生命周期策略,才能实现安全可靠的生产级存储方案。建议结合实际业务需求,合理规划卷分配、监控和备份策略,提升集群的稳定性和数据安全性。