1

我正在尝试在我的单节点集群(Docker Desktop Windows)中设置一个弹性集群。为此,我创建了 PV 如下(工作)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: elastic-pv-data
  labels:
    type: local
spec:
  storageClassName: elasticdata
  accessModes:   
    - ReadWriteOnce
  capacity:
    storage: 20Gi
  hostPath:
    path: "/mnt/data/elastic"

然后这里是配置:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: esnode
spec:
  selector:
    matchLabels:
      app: es-cluster # has to match .spec.template.metadata.labels
  serviceName: elasticsearch
  replicas: 2
  updateStrategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: es-cluster
    spec:
      securityContext:
        fsGroup: 1000
      initContainers:
      - name: init-sysctl
        image: busybox
        imagePullPolicy: IfNotPresent
        securityContext:
          privileged: true
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
      containers:
      - name: elasticsearch
        resources:
            requests:
                memory: 1Gi
        securityContext:
          privileged: true
          runAsUser: 1000
          capabilities:
            add:
            - IPC_LOCK
            - SYS_RESOURCE
        image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.7.1
        env:
        - name: ES_JAVA_OPTS
          valueFrom:
              configMapKeyRef:
                  name: es-config
                  key: ES_JAVA_OPTS
        readinessProbe:
          httpGet:
            scheme: HTTP
            path: /_cluster/health?local=true
            port: 9200
          initialDelaySeconds: 5
        ports:
        - containerPort: 9200
          name: es-http
        - containerPort: 9300
          name: es-transport
        volumeMounts:
        - name: es-data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
    - metadata:
        name: es-data
      spec:
        storageClassName: elasticdata
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 3Gi

结果是只有一个“pod”将其 pvc 绑定到 pv,另一个得到错误循环“0/1 个节点可用:1 个 pod 具有未绑定的立即 PersistentVolumeClaims”。这是kubectl get pv,pvc结果:

NAME                               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGE
persistentvolume/elastic-pv-data   20Gi       RWO            Retain           Bound    default/es-data-esnode-0   elasticdata             14m

NAME                                     STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/es-data-esnode-0   Bound    elastic-pv-data   20Gi       RWO            elasticdata    13m

如果我没有正确理解,我应该有第二个带有以下标识符的persistantolumeclaim:es-data-esnode-1 有什么我错过或不正确理解的吗?谢谢你的帮助

我在这里跳过不相关的部分(configmap、loadbalancer、..)

4

2 回答 2

0

当使用StatefulSetwith 时volumeClaimTemplates,它将PersistentVolumeClaim为每个副本创建一个。因此,如果您使用replicas: 2,将创建两个不同的 PersistentVolumeClaims,es-data-esnode-0并且es-data-esnode-1.

每个都PersistentVolumeClaim将绑定到一个唯一的PersistentVolume,因此在两个 PVC 的情况下,您将需要两个不同的PersistentVolumes. 但这并不容易在桌面设置中使用volumeClaimTemplatehostPath-volumes。

replicas: 2在这种情况下,您需要什么原因?它通常用于提供更好的可用性,例如使用多个节点。但是对于桌面环境中的本地设置,通常单个节点上的单个副本应该可以吗?我认为对您来说最简单的解决方案是使用replicas: 1.

于 2020-12-31T00:35:51.233 回答
0

让我为评论和乔纳斯的回答中已经说过的内容添加一些细节。

从评论中推断,您尚未定义StorageClass命名的elasticdata. 如果它不存在,则不能在PVand中引用它PVC

快速了解如何hostPath定义 aPersistentVolume以及如何在 a 中引用它PersistentVolumeClaim在这里您可以看到在示例storageClassName: manual中使用。Kubernetes 文档没有明确说明,但是如果您查看Openshift 文档,它会非常清楚地说明:

使用 hostPath 卷的 Pod 必须通过手动(静态)配置来引用。

它不仅仅是用于将PVC请求绑定到这个特定的一些值PV。因此,如果elasticdata StorageClass尚未定义,则不应在此处使用它。

第二件事。正如乔纳斯在他的评论中已经说过的那样,两者之间存在一对一的绑定PVCPV因此无论您PV仍然有足够的容量,它已经被另一个人声称PVC并且不再可用。正如您在官方文档中所读到的:

PVC 到 PV 的绑定是一对一的映射,使用 ClaimRef,它是 PersistentVolume 和 PersistentVolumeClaim 之间的双向绑定。

如果不存在匹配的卷,则声明将无限期保持不受约束。当匹配的数量可用时,索赔将受到约束。例如,配置有许多 50Gi PV 的集群不会匹配请求 100Gi 的 PVC。PVC 可以在 100Gi PV 添加到集群时进行绑定。

反之亦然。如果只有一个 100Gi PV,它将无法满足两个PVC声称每个 50Gi 的请求。请注意,在kubectl get pv,pvc您发布的结果中,尽管您在每个创建的模板中都请求,但两者PVPVC具有容量。20GiPVCPVC3Gi

您在这里不使用任何动态存储配置器,因此您需要手动提供尽可能多PersistentVolumes的使用案例所需的数量。

顺便说一句,hostPath我宁愿建议您使用local正确定义的音量,而不是使用StorageClass。它比HostPath. 此外,可以单独运行外部静态配置器,以改进对本地卷生命周期的管理

于 2020-12-31T21:53:21.790 回答