【问题标题】:Kubernetes, how to link a PersistentVolume to a volumeClaimKubernetes,如何将 PersistentVolume 链接到 volumeClaim
【发布时间】:2026-01-17 11:10:02
【问题描述】:

我是 Kubernetes 领域的新手,我试图弄清楚如何将 StatefulSet 中定义的 volumeClaim 或 volumeClaimTemplates 链接到特定的 PersistentVolume。

我已经按照一些教程来了解和设置本地 PersistentVolume。如果我以 Elasticsearch 为例,当 StatefulSet 启动时,PersistantVolumeClaim 会绑定到 PersistantVolume。

如您所知,对于本地 PersistentVolume,我们必须定义存储目标的本地路径。

对于 Elasticsearch,我已经定义了类似的东西

local:
  path: /mnt/kube_data/elasticsearch

但在实际项目中,存在不止一个持久性卷。因此,我将在路径 /mnt/kube_data 中有多个文件夹。 Kubernetes 如何为持久卷声明选择正确的持久卷?

我不希望 Kubernetes 将数据库数据放在为另一个服务创建的持久卷中。

这是 Elasticsearch 的配置:

---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: elasticsearch-sts
spec:
  serviceName: elasticsearch
  replicas: 1
[...]
    containers:
    - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:6.4.2
        volumeMounts:
        - name: elasticsearch-data
        mountPath: /usr/share/elasticsearch/data
volumeClaimTemplates:
- metadata:
    name: elasticsearch-data
  spec:
    accessModes: [ "ReadWriteOnce" ]
    storageClassName: local-storage
    resources:
        requests:
        storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-elasticsearch
spec:
  capacity:
    storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
    path: /mnt/elasticsearch
nodeAffinity:
    required:
    nodeSelectorTerms:
    - matchExpressions:
        - key: node-role.kubernetes.io/master
        operator: Exists
---

【问题讨论】:

    标签: kubernetes persistent-volumes persistent-volume-claims


    【解决方案1】:

    在持久卷定义中需要具有您想要绑定 PV 的 PVC 名称的 ClaimRef。此外,PV 中的 ClaimRef 应该具有 PVC 所在的命名空间名称,因为 PV 独立于命名空间,而 PVC 不是。因此同名 PVC 可以存在于两个不同的命名空间中,因此即使 PVC 位于默认命名空间中,也必须提供命名空间和 PVC 名称。

    您可以参考以下关于 PV、PVC 和 statefulset yaml 文件的本地存储答案。

    Is it possible to mount different pods to the same portion of a local persistent volume?

    希望这会有所帮助。

    【讨论】:

    • 我尝试使用 ClaimRef,但 kubenetes 没有将 PersistantVolume 与 volumeClaimTemplates 绑定。
    • 您能分享一下您在 statefulsets 中定义的 PV yaml 和 volumeClaimTemplates 吗?