在minikube中,默认情况下您应该有默认的StorageClass:
每个StorageClass都包含provisioner、parameters和reclaimPolicy字段,当属于该类的PersistentVolume需要动态配置时会使用这些字段。
例如,NFS不提供内部provisioner,但可以使用外部provisioner。还有一些情况是第三方存储供应商提供自己的外部provisioner。
更改默认的StorageClass
在您的示例中,此属性可能会导致问题。
要列出minikube中启用的插件,请使用以下命令:
minikube addons list
要列出集群中的所有StorageClasses,请使用以下命令:
kubectl get sc
NAME PROVISIONER
standard (default) k8s.io/minikube-hostpath
请注意,最多只能将一个StorageClass标记为默认。如果有两个或更多的StorageClass被标记为默认,则无法创建未明确指定storageClassName的PersistentVolumeClaim。
在您的示例中,最可能的情况是您已经有了默认的StorageClass。应用这些资源会导致新的PV创建(没有StoraglClass),新的PVC创建(引用现有的默认StorageClass)。在这种情况下,您的自定义pv/pvc绑定之间没有引用。例如,请看一下:
kubectl get pv,pvc,sc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/nfs 3Gi RWX Retain Available 50m
persistentvolume/pvc-8aeb802f-cd95-4933-9224-eb467aaa9871 1Gi RWX Delete Bound default/pvc-nfs standard 50m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pvc-nfs Bound pvc-8aeb802f-cd95-4933-9224-eb467aaa9871 1Gi RWX standard 50m
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
storageclass.storage.k8s.io/standard (default) k8s.io/minikube-hostpath Delete Immediate false 103m
这个例子无法工作,原因如下:
- new persistentvolume/nfs已被创建(没有参考pvc)
- new persistentvolume/pvc-8aeb802f-cd95-4933-9224-eb467aaa9871使用默认的StorageClass被创建。在声明部分中,我们可以注意到此pv是由于使用默认的StorageClass参考default/pvc-nfs声明(persistentvolumeclaim/pvc-nfs)而创建的。
解决方案1。
根据评论中的信息:
我也能够在我的minikube和实际的ubuntu系统中连接它。
如果您能够从minikube主机内部挂载此nfs共享
如果您将nfs共享挂载到minikube节点中,请尝试直接从您的pod中使用hostpath卷的示例:
apiVersion: v1
kind: Pod
metadata:
name: test-shell
namespace: default
spec:
volumes:
- name: pv
hostPath:
path: /path/shares
containers:
- name: shell
image: ubuntu
command: ["/bin/bash", "-c", "sleep 1000 "]
volumeMounts:
- name: pv
mountPath: /data
解决方案2。
如果您正在使用PV/PVC方法:
kind: PersistentVolume
apiVersion: v1
metadata:
name: persistent-volume
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: ""
nfs:
path: "/nfsroot"
server: "3.128.203.245"
readOnly: false
claimRef:
name: persistent-volume-claim
namespace: default
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: persistent-volume-claim
namespace: default
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: ""
volumeName: persistent-volume
注意:
如果您没有引用与您的StorageClass相关联的任何提供程序,则可能需要使用卷类型的辅助程序来消耗集群中的PersistentVolume。在此示例中,PersistentVolume是NFS类型,需要helper程序/sbin/mount.nfs来支持挂载NFS文件系统。
请记住,在创建pvc kubernetes时,persistent-controller正在尝试将pvc与正确的pv绑定。在此过程中,会考虑不同的因素,例如:storageClassName(默认/自定义),accessModes,claimRef,volumeName。
在这种情况下,您可以使用:
PersistentVolume.spec.claimRef.name:persistent-volume-claim PersistentVolumeClaim.spec.volumeName:persistent-volume
注意:
控制平面可以将PersistentVolumeClaims绑定到集群中匹配的PersistentVolumes。但是,如果您想要PVC绑定到特定的PV,则需要预先绑定它们。
通过在PersistentVolumeClaim中指定PersistentVolume,您声明了该特定PV和PVC之间的绑定关系。如果PersistentVolume存在并且没有通过其claimRef字段保留PersistentVolumeClaims,则PersistentVolume和PersistentVolumeClaim将被绑定。
绑定发生的条件不受某些卷匹配标准(包括节点亲和性)的影响。控制平面仍会检查存储类、访问模式和请求的存储大小是否有效。
一旦创建了PV/PVC或者在PV/PVC绑定方面出现问题,请使用以下命令来查看当前状态:
kubectl get pv,pvc,sc
kubectl describe pv
kubectl describe pvc
kubectl describe pod
kubectl get events