需为有状态应用配置LocalPersistentVolume:先挂载独立SSD至固定路径并写入fstab;再创建禁用provisioner、启用WaitForFirstConsumer的StorageClass;接着手动创建带节点亲和性的PV;最后创建PVC完成绑定。

在 Kubernetes 集群中为有状态应用(如 MySQL、Elasticsearch)配置 LocalPersistentVolume,使其稳定绑定到某台 worker 节点的本地 SSD 盘上,需确保 PV 明确指向该盘挂载路径并强制 Pod 调度到对应节点,否则 Pod 启动失败或数据无法访问。
准备本地 SSD 并挂载到固定路径
登录目标 worker 节点(例如 worker233),确认 SSD 设备名(如 /dev/nvme0n1)。不要直接使用根盘或系统盘——【Local PV 必须使用额外挂载的独立物理盘】,否则 I/O 干扰会导致节点失稳。
执行格式化与挂载:mkfs.xfs -f /dev/nvme0n1 → mkdir -p /mnt/ssd-local → mount /dev/nvme0n1 /mnt/ssd-local。
写入 /etc/fstab 实现开机自挂载:运行 echo "/dev/nvme0n1 /mnt/ssd-local xfs defaults 0 0" >> /etc/fstab。这一步漏掉会导致节点重启后目录为空,PV 状态变为 Failed。
创建 Local StorageClass
Local PV 不支持动态供应,必须禁用 provisioner 并启用延迟绑定。新建文件 local-ssd-sc.yaml:
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: local-ssdprovisioner: kubernetes.io/no-provisionervolumeBindingMode: WaitForFirstConsumerreclaimPolicy: Delete
执行 kubectl apply -f local-ssd-sc.yaml。注意 WaitForFirstConsumer 是关键——它让调度器先看 PVC 请求,再决定 Pod 落在哪台节点,而不是反向硬绑。
手动创建 PV 并声明节点亲和性
第一步:确认节点 hostname,运行 hostname,记下输出(如 worker233)。
第二步:编写 PV 清单 ssd-pv.yaml,严格按以下结构填写:
apiVersion: v1kind: PersistentVolumemetadata: name: ssd-pv-worker233 labels: type: local-ssdspec: capacity: storage: 500Gi accessModes: - ReadWriteOnce volumeMode: Filesystem storageClassName: local-ssd local: path: /mnt/ssd-local nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - worker233
第三步:应用该 PV:kubectl apply -f ssd-pv.yaml。检查状态:kubectl get pv ssd-pv-worker233,输出中 STATUS 必须为 【Available】 才可被 PVC 绑定。
创建 PVC 并验证绑定
新建 ssd-pvc.yaml,内容如下:
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: ssd-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: local-ssd
执行 kubectl apply -f ssd-pvc.yaml。等待数秒后运行 kubectl get pvc ssd-pvc,若 STATUS 变为 Bound 且 VOLUME 列显示 ssd-pv-worker233,说明绑定成功。
此时即可在 Pod 或 StatefulSet 的 volumes 中引用该 PVC,Pod 将自动调度至 worker233 节点并挂载本地 SSD。











