0

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

所以我创建了一个默认的 StorageClass (kubernetes.io/gce-pd / pd-standard) 并在 apiserver 中激活了 DefaultStorageClass 准入插件以启用动态配置。但这仍然行不通。pod 仍然有 FailedBinding 事件“没有可用于此声明的持久卷并且没有设置存储类”。

我检查了 elasticsearch 的掌舵图,它没有为其 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

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

4

2 回答 2

0

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

于 2019-12-23T17:56:17.260 回答
0

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

我无法理解 kubernetes 将在磁盘上分配 PV 的位置,我从未在任何地方配置它。而且它也不在 StorageClass 中。

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

  1. 存储类
  2. PersistentVolumeClaim(在该存储类上)
  3. volumes:部署中的字段(例如)

例子:

$ 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 中创建一个新的存储类。

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

$ 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

重要的是我们已经minio-diskannotations. 在那之后,我们可以看到,创建了 minio-claim PVC 并且 Phase 被“绑定”了。

在此处输入图像描述

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

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

我很好奇如何让这个错误更明显和更容易理解。

如果您看到您的 PVC 为“待处理”,您可以通过以下方式对其进行故障排除: $ 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

这可以深入了解创建出了什么问题(存储类定义中的无效选项)

希望有帮助:)

于 2019-12-24T12:45:43.897 回答