kubernetes :创建块存储持久卷

kubernetes : create a Block storage persistent volume

我是 kubernetes 卷管理的新手。 我需要使用带有以下 pod 的块 pvc:

apiVersion: v1
kind: Pod
metadata:
  name: buggypod
spec:
  containers:
  - name: container
    image: ubuntu
    command: [ "bash" ]
    volumeDevices:
    - devicePath: /tmp
      name: podpvc
################
  restartPolicy: Never
  terminationGracePeriodSeconds: 0
  volumes:
  - name: podpvc
    persistentVolumeClaim:
      claimName: kubepvc

我创建以下pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: kubepvc
spec:
  storageClassName: testvolume
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  volumeMode: Block

和 pv :

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kubepv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: testvolume
  hostPath:
    path: "/pvdata"

在我部署完所有 pvc 之后:

$ kubectl describe  pvc kubepvc
Events:
  Type     Reason              Age   From                         Message
  ----     ------              ----  ----                         -------
  Warning  ProvisioningFailed  6s    persistentvolume-controller  storageclass.storage.k8s.io "testvolume" not found

当然存在 testvolume pv :

kubectl get pods,pv,pvc -o wide    
NAME           READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
pod/buggypod   0/1     Pending   0          30m   <none>   <none>   <none>           <none>

NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE     VOLUMEMODE
persistentvolume/kubepv   10Gi       RWO            Retain           Available           testvolume              3m57s   Filesystem

NAME                            STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
persistentvolumeclaim/kubepvc   Pending                                      testvolume     90s   Block

但我猜是因为 pv 类型是 fileSystem 导致的错误:

$ kubectl describe  pv kubepv
Name:            kubepv
Labels:          <none>
Annotations:     <none>
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    testvolume
Status:          Available
Claim:
Reclaim Policy:  Retain
Access Modes:    RWO
VolumeMode:      Filesystem
Capacity:        10Gi
Node Affinity:   <none>
Message:
Source:
    Type:          HostPath (bare host directory volume)
    Path:          /pvdata
    HostPathType:
Events: 

       <none>

所以,我的问题是如何创建块 PV 来使一切正常工作?

提前致谢

请记住 PersistentVolumeClaim 正在“请求”来自 PersistentVolume 的东西。

简而言之,PV 必须完成一些 PVC 请求。在您的 YAML 中 PV 满足 PVC 请求,例如:

  • Storage: PV 有 10Gi,PVC 请求 5Gi。请求履行者。 (此外,一旦 PV 和 PVC 绑定,资源将仅使用请求的存储,因此在这种情况下 5Gi 将被浪费。最好在 PV 中也使用 5Gi 或在 PVC 中使用 10Gi)。
  • AccessMode:两者都有ReadWriteOnce.
  • storageClassName: 测试量

配置错误

您的 PVC 正在寻找 PVvolumeMode: Block。因为你现在的PV没有,所以不会被bounded.

解决方案

volumeMode: Block 添加到您的 PV 配置中,PVC 将绑定 PV

测试

正如您所描述的那样,PV您可以找到以下信息:

VolumeMode:      Filesystem

虽然 $ kubectl describe pvc kubepvc 有:

VolumeMode:    Block

当您将 VolumeMode: Block 添加到您的 PV 清单时,它将起作用。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: kubepv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  storageClassName: testvolume
  hostPath:
    path: "/pvdata"

备注

请记住 volumeModeimmutable 字段,因此您需要重新创建此资源,它无法编辑。

The PersistentVolume "kubepv" is invalid: volumeMode: Invalid value: "Block": field is immutable

关于 storageClass,话题很广泛,但简而言之,storageClassNamePVPVC 中是相同的(至少在 Kubeadm).

$ kubectl get storageclass -A
No resources found
user@kubeadm:~$ kubectl get pv,pvc
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
persistentvolume/kubepv   10Gi       RWO            Retain           Bound    default/kubepvc   testvolume              38s

NAME                            STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/kubepvc   Bound    kubepv   10Gi       RWO            testvolume     45s

有用的文档