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 中阅读更多信息。
我已经创建了一个持久卷:
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 中阅读更多信息。