Kubernetes,如何将PersistentVolume链接到volumeClaim?

3

我是 Kubernetes 领域的新手,正在尝试弄清楚如何将 StatefulSet 中定义的 volumeClaim 或 volumeClaimTemplates 与特定的 PersistentVolume 相关联。

我已经按照一些教程理解并设置了本地 PersistentVolume。以 Elasticsearch 为例,当 StatefulSet 启动时,PersistentVolumeClaim 会绑定到 PersistentVolume 上。

如您所知,对于本地 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
---
1个回答

2
您需要在持久卷定义中添加ClaimRef,它应该包含您想要绑定PV的PVC名称。此外,PV中的ClaimRef应该包含PVC所在的命名空间名称,因为PV独立于命名空间,而PVC不是。因此,即使PVC位于默认命名空间中,也必须提供命名空间和PVC名称。同名的PVC可以存在于两个不同的命名空间中,这是强制性的。
您可以参考以下答案,了解本地存储的PV、PVC和有状态集yaml文件。 是否可以将不同的Pod挂载到本地持久卷的同一部分? 希望这可以帮助您。

我尝试使用ClaimRef,但是Kubernetes没有将PersistantVolume与volumeClaimTemplates绑定在一起。 - Waldo
请问您能分享一下在StatefulSets中定义的PV YAML和volumeClaimTemplates吗? - Prafull Ladha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接