kubernetes 忽略持久卷

kubernetes ignoring persistentvolume

我已经创建了一个持久卷:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "C:/Users/xxx/Desktop/pv"

并且想做save​​ mysql statefulset pods的东西就可以了。 所以,我写了 volumeclaimtemplate:

  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi

认为这会从我拥有的唯一持久卷请求持久存储。相反,这是发生了什么:

StatefulSets 要求您使用存储 classes 以便将正确的 PV 与正确的 PVC 绑定。

使 StatefulSets 挂载本地存储的正确方法是使用本地类型的卷,请查看以下过程。


首先,您为本地卷创建一个存储class。类似于以下内容:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

它有 no-provisioner 所以它不能自动提供 PV,你需要手动创建它们,但这正是你想要的本地存储。

其次,创建本地PV,内容如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: "C:/Users/xxx/Desktop/pv"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - the-node-hostname-on-which-the-storage-is-located

这个定义告诉节点上的本地路径,但也强制在特定节点(匹配nodeSelectorTerms)上使用PV。

它还将此 PV links 存储到先前创建的 class 中。这意味着现在,如果 StatefulSets 需要具有该存储 class 的存储,它将接收此磁盘(当然,如果所需的 space 小于或等于)

第三,你现在可以link StatefulSet:

volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "local-storage"
      resources:
        requests:
          storage: 5Gi

第一次需要调度StatefulSet Pod时,会发生以下情况:

  • 将创建一个 PVC,它将与您刚刚创建的 PV 绑定
  • Pod 会被调度到 运行 有界 PV 被限制在 运行
  • 的节点上

更新:

如果您想使用 hostPath 存储而不是本地存储(因为例如您在 minikube 上并且直接支持开箱即用,所以它更容易)您需要稍微更改 PV 声明,如下所示:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-volume
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  hostPath:
    path: /data/pv0001/

现在,/data 目录及其所有内容都保留在主机上(因此如果 minikube 重新启动,它仍然存在)但是如果你想挂载主机的特定目录,你需要使用minikube挂载,例如:

minikube mount <source directory>:<target directory>

例如,您可以这样做:

minikube 挂载 C:/Users/xxx/Desktop/pv:/host/my-special-pv

然后你可以使用 /host/my-special-pv 作为 PV 声明中的 hostPath

可以在 docs 中阅读更多信息。