繁体   English   中英

Digital Ocean 管理的 Kubernetes 卷在待处理 state

[英]Digital Ocean managed Kubernetes volume in pending state

它不是特定于数字海洋的,如果这是否是预期的行为,将会非常好。

我正在尝试在 DO 管理的 Kubernetes 集群上设置 ElasticSearch 集群,并使用 ElasticSearch 本身的舵图

他们说我需要在volumeClaimTemplate storageClassName使用托管 kubernetes 服务提供的卷。 对于 DO,根据他们的文档,它是do-block-storages 似乎也没有必要定义PVC,舵图应该自己做。

这是我正在使用的配置

# Specify node pool
nodeSelector:
    doks.digitalocean.com/node-pool: elasticsearch

# Shrink default JVM heap.
esJavaOpts: "-Xmx128m -Xms128m"

# Allocate smaller chunks of memory per pod.
resources:
  requests:
    cpu: "100m"
    memory: "512M"
  limits:
    cpu: "1000m"
    memory: "512M"

# Specify Digital Ocean storage
# Request smaller persistent volumes.
volumeClaimTemplate:
  accessModes: [ "ReadWriteOnce" ]
  storageClassName: do-block-storage
  resources:
    requests:
      storage: 10Gi
extraInitContainers: |
  - name: create
    image: busybox:1.28
    command: ['mkdir', '/usr/share/elasticsearch/data/nodes/']
    volumeMounts:
    - mountPath: /usr/share/elasticsearch/data
      name: elasticsearch-master
  - name: file-permissions
    image: busybox:1.28
    command: ['chown', '-R', '1000:1000', '/usr/share/elasticsearch/']
    volumeMounts:
    - mountPath: /usr/share/elasticsearch/data
      name: elasticsearch-master

我正在使用 terraform 设置 Helm 图表,但无论如何都没关系,您将采用哪种方式:

resource "helm_release" "elasticsearch" {
  name      = "elasticsearch"
  chart     = "elastic/elasticsearch"
  namespace = "elasticsearch"

  values = [
    file("charts/elasticsearch.yaml")
  ]
}

这是我在检查 pod 日志时得到的信息:

51s         Normal    Provisioning           persistentvolumeclaim/elasticsearch-master-elasticsearch-master-2   External provisioner is provisioning volume for claim "elasticsearch/elasticsearch-master-elasticsearch-master-2"
2m28s       Normal    ExternalProvisioning   persistentvolumeclaim/elasticsearch-master-elasticsearch-master-2   waiting for a volume to be created, either by external provisioner "dobs.csi.digitalocean.com" or manually created by system administrator

我很确定问题出在音量上。 它应该由 kubernetes 自动提供。 描述持久存储给出了这个:

holms@debian ~/D/c/s/b/t/s/post-infra> kubectl describe pvc elasticsearch-master-elasticsearch-master-0 --namespace elasticsearch
Name:          elasticsearch-master-elasticsearch-master-0
Namespace:     elasticsearch
StorageClass:  do-block-storage
Status:        Pending
Volume:        
Labels:        app=elasticsearch-master
Annotations:   volume.beta.kubernetes.io/storage-provisioner: dobs.csi.digitalocean.com
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By:    elasticsearch-master-0
Events:
  Type    Reason                Age                    From                                                                              Message
  ----    ------                ----                   ----                                                                              -------
  Normal  Provisioning          4m57s (x176 over 14h)  dobs.csi.digitalocean.com_master-setupad-eu_04e43747-fafb-11e9-b7dd-e6fd8fbff586  External provisioner is provisioning volume for claim "elasticsearch/elasticsearch-master-elasticsearch-master-0"
  Normal  ExternalProvisioning  93s (x441 over 111m)   persistentvolume-controller                                                       waiting for a volume to be created, either by external provisioner "dobs.csi.digitalocean.com" or manually created by system administrator

我已经用谷歌搜索了所有内容,似乎一切都是正确的,并且音量应该在 DO 方面没有问题,但它挂在待处理的 state 中。 这是预期的行为还是我应该要求 DO 支持人员检查他们的情况?

是的,这是预期的行为。 此图表可能与 Digital Ocean Kubernetes 服务不兼容。

Digital Ocean文档在已知问题部分包含以下信息:

  • Kubernetes 中对调整 DigitalOcean 块存储卷大小的支持尚未实现。

  • 在 DigitalOcean 控制面板中,集群资源(工作节点、负载平衡器和块存储卷)列在 Kubernetes 页面之外。 如果您在控制面板中重命名或以其他方式修改这些资源,您可能会使它们对集群不可用或导致协调器提供替换资源。 为避免这种情况,请使用kubectl或从控制面板的 Kubernetes 页面专门管理您的集群资源。

chart/stable/elasticsearch中提到了具体要求:

先决条件详细信息

  • Kubernetes 1.10+
  • 对底层基础设施的 PV 动态配置支持

您可以向 Digital Ocean 支持寻求帮助或尝试在没有 helm chart 的情况下部署 ElasticSearch。

github上甚至提到:

此图表的自动化测试目前仅针对 GKE(Google Kubernetes 引擎)运行。


更新:

我的 kubeadm ha 集群上也存在同样的问题。

但是,我设法通过为我的storageclass手动创建PersistentVolumes来使其正常工作。

我的存储类定义: storageclass.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: ssd
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: pd-ssd

$ kubectl apply -f storageclass.yaml
$ kubectl get sc
NAME   PROVISIONER   AGE
ssd    local         50m

我的 PersistentVolume 定义: pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: ssd
  capacity:
    storage: 30Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - <name of the node>
kubectl apply -f pv.yaml

之后我运行了舵图:

helm install stable/elasticsearch --name my-release --set data.persistence.storageClass=ssd,data.storage=30Gi --set data.persistence.storageClass=ssd,master.storage=30Gi

PVC终于被绑定了。

$ kubectl get pvc -A
NAMESPACE   NAME                                     STATUS    VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
default     data-my-release-elasticsearch-data-0     Bound     task-pv-volume2   30Gi       RWO            ssd            17m
default     data-my-release-elasticsearch-master-0   Pending                                                              17m

请注意,我仅手动满足单个 pvc 和 ElasticSearch 手动卷配置可能非常低效。

我建议联系 DO 支持以获取自动卷配置解决方案。

多么奇怪的情况,在我将10Gi更改为10G后它开始工作。 也许它必须与存储 class 它本身有关,但它开始起作用了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM