默认 StorageClass:要检查什么?

Default StorageClass: what to check?

我被这个问题困住了: 我配置了 kubeadm(目前集群在一台专用服务器上)。 我使用 helm 安装了 elasticsearch。它几乎可以正常工作,除了存储。该图表使用默认的 StorageClass 来动态配置 PV。

所以我创建了一个默认的 StorageClass (kubernetes.io/gce-pd / pd-standard) 并在 apiserver 中激活了 DefaultStorageClass 准入插件以启用动态配置。 但这仍然行不通。 pods 仍然有 FailedBinding 事件 "no persistent volumes available for this claim and no storage class is set"。

我检查了 elasticsearch 的 helm chart,它没有为其 PVC 指定 StorageClass,所以它应该可以工作。 另外,我还遗漏了其他东西:我不明白 kubernetes 将在磁盘上分配 PV,我从来没有在任何地方配置它。而且它也不在 StorageClass 中。

我已检查动态配置是否正常工作,因为它在 PVC 定义中插入了默认的 StorageClass:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  annotations:
    volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd
  creationTimestamp: "2019-12-19T10:37:04Z"
  finalizers:
  - kubernetes.io/pvc-protection
  labels:
    app: kibanaelastic-master
  name: kibanaelastic-master-kibanaelastic-master-0
  namespace: elasticsearch
  resourceVersion: "360956"
  selfLink: /api/v1/namespaces/elasticsearch/persistentvolumeclaims/kibanaelastic-master-kibanaelastic-master-0
  uid: 22b1c23a-312e-4b56-a0bb-17f2da372509
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi
  storageClassName: slow
  volumeMode: Filesystem
status:
  phase: Pending

那么我还应该检查什么?
有什么线索吗?

别介意,我发现了错误。我在默认存储 class 中使用了错误的配置器。并且未配置此供应商。我很好奇如何让这个错误更明显和更容易理解。

让我在这里宣传我的 5 美分 :)。

I can't understand where kubernetes will allocate the PV on disks, i never configured it anywhere. And it's not in the StorageClass too.

假设我们使用的是 GCP,整个存储 Classes,PV 声明预计将以下列方式工作:

  1. 存储空间Class
  2. PersistentVolumeClaim(在该存储 Class 上)
  3. volumes: Deployment 字段(例如)

示例:

$ cat minio-storage-class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: minio-disk
provisioner: kubernetes.io/gce-pd
parameters:
    type: pd-standard
reclaimPolicy: Delete
volumeBindingMode: Immediate

在 GCP 中创建新存储 class。

然后我们使用该存储 class 参数声明我们的持久卷:

$ cat minio-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: minio-claim
  namespace: default
  annotations:
    volume.beta.kubernetes.io/storage-class: minio-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

重要的是我们在annotations中指定了minio-disk存储class。 之后我们可以看到,创建了 minio-claim PVC,Phase 为 "bound" .

之后我们可以在部署中使用它(为清楚起见,我省略了文件的 3/4):

cat minio-deploy.yaml 
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: minio
  ...
spec:
  ...
  template:
    ...
    spec:
      volumes:
      - name: storage
        persistentVolumeClaim:
          claimName: minio-claim
     ...

I'm curious how i could get this error more visible and understandable.

如果您看到您的 PVC 为 "Pending",您可以使用以下方法对其进行故障排除: $ kubectl describe persistentvolumeclaim <your-pvc-name>

在我的例子中它看起来像:

$ kubectl describe persistentvolumeclaim minio-claim-broken

Name:          minio-claim-broken
Namespace:     default
StorageClass:  minio-disk-1
Status:        Pending
Volume:        
Labels:        <none>
Annotations:   volume.beta.kubernetes.io/storage-class: minio-disk-1
               volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/gce-pd
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By:    <none>
Events:
  Type     Reason              Age                   From                         Message
  ----     ------              ----                  ----                         -------
  Warning  ProvisioningFailed  61s (x10 over 6m47s)  persistentvolume-controller  Failed to provision volume with StorageClass "minio-disk-1": invalid option "diskformat" for volume plugin kubernetes.io/gce-pd

这让您深入了解创建过程中出了什么问题(存储 Class 定义中的选项无效)

希望对您有所帮助:)