Menu

本地持久化存储为 Kubernetes 提供了高性能、低延迟的数据访问能力,但需要结合节点亲和、卷管理和生命周期策略,才能实现安全可靠的生产级存储方案。

本地持久化卷允许用户通过标准 PVC 接口以简单便携的方式访问本地存储。PV 中包含系统用于将 Pod 调度到正确节点的节点亲和性信息。

本地存储与传统网络存储不同,它提供了更好的性能但需要特殊的管理方式。外部静态配置器(provisioner)可用于帮助简化本地存储管理,但它不支持动态配置,需要管理员预先在每个节点上配置本地卷。

存储模式

本地存储配置器支持两种卷模式,适应不同类型的应用需求。

配置要求

使用本地持久化存储需要满足以下要求:

版本兼容性

不同版本的配置器与 Kubernetes 版本的兼容性如下。

本地存储配置器与 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 本地存储功能不断演进,以下为主要阶段特性。

当前状态(1.14+):稳定版

历史版本特性

部署指南

在生产或测试环境中部署本地持久化存储需按以下步骤操作。

环境准备

功能特性启用

对于 Kubernetes 1.14+ 版本,本地持久化存储已默认启用。如需使用原始块设备功能:

# 对于较旧版本可能需要启用特性门控
export KUBE_FEATURE_GATES="BlockVolume=true"

集群环境配置

# 创建发现目录
mkdir /mnt/disks

# 创建多个测试卷(使用 tmpfs 模拟)
for vol in vol1 vol2 vol3; do
   mkdir /mnt/disks/$vol
   mount -t tmpfs $vol /mnt/disks/$vol
done

StorageClass 配置

创建支持延迟绑定的 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 部署(推荐)

# 使用默认配置
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 创建验证

部署配置器后,检查自动发现的本地卷:

# 查看创建的 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

文件系统模式 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

Pod 中使用本地存储

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

最佳实践

结合实际生产需求,建议遵循以下最佳实践。

性能优化

高可用性配置

节点管理

生命周期管理

本地卷的生命周期管理需严格遵循规范,确保数据安全。

卷回收流程

  1. 停止所有使用该卷的 Pod
  2. 删除 PVC

    kubectl delete pvc local-storage-claim
    
  3. 从节点卸载或移除物理卷
  4. 手动删除对应的 PV

    kubectl delete pv local-pv-name
    

故障恢复

监控和故障排除

监控本地存储的健康和使用状态,有助于及时发现和解决问题。

常用监控指标

故障排除步骤

  1. 检查配置器状态

    kubectl logs -n kube-system -l app=local-volume-provisioner
    
  2. 验证节点亲和性

    kubectl describe pv <pv-name> | grep -A 10 NodeAffinity
    
  3. 检查 StorageClass 配置

    kubectl describe storageclass local-storage
    

总结

本地持久化存储为 Kubernetes 提供了高性能、低延迟的数据访问能力,但需结合节点亲和、卷管理和生命周期策略,才能实现安全可靠的生产级存储方案。建议结合实际业务需求,合理规划卷分配、监控和备份策略,提升集群的稳定性和数据安全性。

参考文献


Menu