$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv-demo-nfs1 5Gi RWX Retain Available 8s pv-demo-nfs2 10Gi RWX Retain Available 8s pv-demo-nfs3 20Gi RWX Retain Available 8s
apiVersion:storage.k8s.io/v1 kind:StorageClass metadata: name:managed-nfs-storage provisioner:fuseim.pri/ifs# or choose another name, must match deployment's env PROVISIONER_NAME' parameters: archiveOnDelete:"true"
cd /opt/kubernetes/cfg/nfs-client && kubectl apply -f . # 查看 storageClass 持久卷 $ kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE managed-nfs-storage fuseim.pri/ifs Delete Immediate false 6m53s
# 查看 nfs-client Pod $ kubectl get pods -l app=nfs-client-provisioner NAME READY STATUS RESTARTS AGE nfs-client-provisioner-7b7646995b-kcrcf 1/1 Running 0 7m4s
# 虽然是 Running,但查看 logs后发现有错报 $ kubectl logs nfs-client-provisioner-7b7646995b-kcrcf I0406 07:54:00.066739 1 leaderelection.go:185] attempting to acquire leader lease default/fuseim.pri-ifs... E0406 07:54:17.589143 1 event.go:259] Could not construct reference to: '&v1.Endpoints{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"fuseim.pri-ifs", GenerateName:"", Namespace:"default", SelfLink:"", UID:"123105fb-6655-41fc-97b8-e2c4b3841102", ResourceVersion:"31704880", Generation:0, CreationTimestamp:v1.Time{Time:time.Time{wall:0x0, ext:63784814678, loc:(*time.Location)(0x1956800)}}, DeletionTimestamp:(*v1.Time)(nil), DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string{"control-plane.alpha.kubernetes.io/leader":"{\"holderIdentity\":\"nfs-client-provisioner-7b7646995b-kcrcf_b816ab3b-b57e-11ec-b44e-3264c14d265d\",\"leaseDurationSeconds\":15,\"acquireTime\":\"2022-04-06T07:54:17Z\",\"renewTime\":\"2022-04-06T07:54:17Z\",\"leaderTransitions\":2}"}, OwnerReferences:[]v1.OwnerReference(nil), Initializers:(*v1.Initializers)(nil), Finalizers:[]string(nil), ClusterName:""}, Subsets:[]v1.EndpointSubset(nil)}' due to: 'selfLink was empty, can't make reference'. Will not report event: 'Normal' 'LeaderElection' 'nfs-client-provisioner-7b7646995b-kcrcf_b816ab3b-b57e-11ec-b44e-3264c14d265d became leader' I0406 07:54:17.589344 1 leaderelection.go:194] successfully acquired lease default/fuseim.pri-ifs I0406 07:54:17.589599 1 controller.go:631] Starting provisioner controller fuseim.pri/ifs_nfs-client-provisioner-7b7646995b-kcrcf_b816ab3b-b57e-11ec-b44e-3264c14d265d! I0406 07:54:17.690180 1 controller.go:680] Started provisioner controller fuseim.pri/ifs_nfs-client-provisioner-7b7646995b-kcrcf_b816ab3b-b57e-11ec-b44e-3264c14d265d! I0406 07:55:20.666604 1 controller.go:987] provision "default/pvc-sc" class "managed-nfs-storage": started E0406 07:55:20.688072 1 controller.go:1004] provision "default/pvc-sc" class "managed-nfs-storage": unexpected error getting claim reference: selfLink was empty, can't make reference
Kubernetes 创建 pvc error getting claim reference: selfLink was empty, can‘t make refere
error: error validating "class.yaml": error validating data: [ValidationError(StorageClass.metadata): unknown field "parameters" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(StorageClass.metadata): unknown field "provisioner" in io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta, ValidationError(StorageClass): missing required field "provisioner" in io.k8s.api.storage.v1.StorageClass]; if you choose to ignore these errors, turn validation off with --validate=false
$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-sc Bound pvc-5c046797-553d-460d-8476-ffcdd8dfdd96 1Gi RWX managed-nfs-storage 99s
# 查看目前大小 1G kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-sc Bound pvc-1b34c518-cf9b-45d4-a5be-8136cf0c2097 1Gi RWX managed-nfs-storage 87m # 修改大小为2G vim demo.yaml ····· storage: 2Gi # PVC 改成2G 原先1G # 然后我们重新申明一下 kubectl apply -f demo.yaml pod/pod-demo-sc configured Error from server (Forbidden): error when applying patch: {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"PersistentVolumeClaim\",\"metadata\":{\"annotations\":{},\"name\":\"pvc-sc\",\"namespace\":\"default\"},\"spec\":{\"accessModes\":[\"ReadWriteMany\"],\"resources\":{\"requests\":{\"storage\":\"2Gi\"}},\"storageClassName\":\"managed-nfs-storage\"}}\n"}},"spec":{"resources":{"requests":{"storage":"2Gi"}}}} to: Resource: "/v1, Resource=persistentvolumeclaims", GroupVersionKind: "/v1, Kind=PersistentVolumeClaim" Name: "pvc-sc", Namespace: "default" for: "demo.yaml": persistentvolumeclaims "pvc-sc" is forbidden: only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize
# 查看storageclass ALLOWVOLUMEEXPANSION false 不允许 kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE managed-nfs-storage fuseim.pri/ifs Delete Immediate false 5h30m
修改 allowVolumeExpansion 为true 允许扩容
1 2 3 4 5 6 7 8 9
apiVersion:storage.k8s.io/v1 kind:StorageClass metadata: name:managed-nfs-storage provisioner:fuseim.pri/ifs# or choose another name, must match deployment's env PROVISIONER_NAME' allowVolumeExpansion:true parameters: archiveOnDelete:"true"
然后我们重新申明一下
1 2 3 4 5 6
# kubectl apply -f class.yaml storageclass.storage.k8s.io/nfs-client-storageclass configured # 查看StorageClass ALLOWVOLUMEEXPANSION 为true kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE managed-nfs-storage fuseim.pri/ifs Delete Immediate true 5h32m
kubectl apply -f demo.yaml pod/pod-demo-sc configured persistentvolumeclaim/pvc-sc configured # 发现并没有成功 kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pvc-sc Bound pvc-1b34c518-cf9b-45d4-a5be-8136cf0c2097 1Gi RWX managed-nfs-storage 92m # 查看详情 kubectl describe pvc pvc-sc Name: pvc-sc Namespace: default StorageClass: managed-nfs-storage Status: Bound Volume: pvc-1b34c518-cf9b-45d4-a5be-8136cf0c2097 Labels: <none> Annotations: pv.kubernetes.io/bind-completed: yes pv.kubernetes.io/bound-by-controller: yes volume.beta.kubernetes.io/storage-provisioner: fuseim.pri/ifs volume.kubernetes.io/storage-provisioner: fuseim.pri/ifs Finalizers: [kubernetes.io/pvc-protection] Capacity: 1Gi Access Modes: RWX VolumeMode: Filesystem Used By: pod-demo-sc Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning ExternalExpanding 2m14s volume_expand Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
报错信息为:没有找到可扩展的插件。 我上官方网站一看,原来人家已经说的很清楚了:Although the feature is enabled by default, a cluster admin must opt-in to allow users to resize their volumes. Kubernetes v1.11 ships with volume expansion support for the following in-tree volume plugins: AWS-EBS, GCE-PD, Azure Disk, Azure File, Glusterfs, Cinder, Portworx, and Ceph RBD.