1

単一ノード クラスター (Docker デスクトップ 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

その結果、PVC が pv にバインドされた「ポッド」が 1 つだけになり、他のポッドは「0/1 ノードが使用可能です: 1 つのポッドにはバインドされていない即時の 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

私が正しく理解できなかった場合、次の識別子を持つ 2 番目の persistantolumeclaim が必要です: es-data-esnode-1 ご協力いただきありがとうございます

ここでは、関連のない部分 (configmap、loadbalancer など) はスキップします。

4

2 に答える 2

0

コメントとジョナスの回答の両方ですでに述べたことに、いくつかの詳細を追加させてください。

コメントから推測すると、StorageClass名前付きを定義していませんelasticdata。存在しない場合は、PVandで参照できませんPVC

hostPathを定義するために がどのように使用され、PersistentVolumeでどのように参照されるかを簡単に見てみましょうPersistentVolumeClaimここでは、例で が使用されていることがわかりますstorageClassName: manual。Kubernetes のドキュメントには明確に記載されていませんが、Openshift のドキュメントを見ると、次のように明確に記載されています。

hostPath ボリュームを使用する Pod は、手動 (静的) プロビジョニングで参照する必要があります。

PVCリクエストをこの特定の にバインドするために使用される値だけではありませんPV。したがって、elasticdata StorageClassが定義されていない場合は、ここで使用しないでください。

2番目のこと。Jonasが彼のコメントで既に述べたように、 と の間には 1 対 1 のバインディングがあるPVCためPVPVまだ十分な容量があっても、別のユーザーによって既に要求されており、PVC利用できません。公式ドキュメントで読むことができるように:

PVC から PV へのバインディングは 1 対 1 のマッピングであり、PersistentVolume と PersistentVolumeClaim 間の双方向バインディングである ClaimRef を使用します。

一致するボリュームが存在しない場合、請求は無期限に拘束されないままになります。請求は、一致するボリュームが利用可能になるとバインドされます。たとえば、多数の 50Gi PV でプロビジョニングされたクラスターは、100Gi を要求する PVC と一致しません。100Gi PV がクラスターに追加されると、PVC をバインドできます。

およびその逆。100Gi PV が 1 つしかない場合、それぞれ 50Gi を要求する 2 つPVCの s からの要求を満足させることはできません。なお、kubectl get pv,pvc投稿した結果、テンプレートから作成したそれぞれでリクエストしたものの、PVとの両方PVCの容量があります。20GiPVCPVC3Gi

ここでは動的ストレージ プロビジョナーをPersistentVolumes使用しないため、ユース ケースに必要な数を手動で提供する必要があります。

ちなみに、 を使用する代わりに、適切に定義された volume をhostPath使用することをお勧めします。よりもいくつかの利点があります。さらに、ローカル ボリュームのライフサイクルの管理を改善するために、外部の静的プロビジョナーを個別に実行できます。localStorageClassHostPath

于 2020-12-31T21:53:21.790 に答える