PersistentVolume、PersistentVolumeClaimとSTORAGECLASS概念関係オブジェクトKubernetes

永続データへのKubernetesコンテナ、ボリュームを分離することはできませんが、ボリュームとボリュームのドッカーネイティブ概念をK8S使用されるいくつかのオブジェクトPersistentVolume K8S永続データ、二次明確には、そこにいくつかの違いがありますが、今回はこれを話すことはありません。これがあることから、PersistentVolumeClaimとSTORAGECLASSは、最初に明確なK8Sオブジェクトは、APIを介して作成することができます。

        K8SなEなど多くの種類ありますが、サポートの量がmptyDir、H それがあることがある、理解することは比較的容易であるなどostPath、NFS、ersistentVolumeClaimは、ちょうど非常に理解していて使い始める時は、どのようにこのオブジェクトの使用は、これが導入されましたersistentVolumeClaimは、関連概念および使用方法。

        あなたは言及し始めPersistentVolume(PV)オブジェクト、我々ことを意味記憶領域のクラスタですが、Kubernetesは、クラスタノードに似PersistentVolume抽象クラスタリソース、となります(ノード)オブジェクトとしてPersistentVolumeとボリュームをPersistentVolumeオブジェクトはKubernetesのAPIを使用して作成することができます。最大の違いのPVとPVボリュームはポッドとは独立したライフサイクルを持っています。

        PVのリソースに対するユーザーの要求に代わってPersistentVolumeClaim(PVC)。ユーザーは、PVのリソースを使用する必要がある場合には、単に(どのようなストレージリソースの種類、どのように多くのGB、PVやその他の情報どのようなモードでの使用の指定を含む)、PVCオブジェクトを作成し、Kubernetes自動的に割り当てPV私たちは私たちのために必要です。クラスタノードにPersistentVolumeアナロジー場合、PersistentVolumeClaim等価クラスタポッド、Kubernetesは、利用可能なポッドノードを割り当てる類似PersistentVolume PersistentVolumeClaimが利用可能割り当てるように、理解することができます。

PVを作成するには、1、静的オブジェクト

直接主なパラメータは以下の通りPVを作成するには、PVCの使用のためのストレージとして静的PVオブジェクトを作成することができます

accessModesアクセスモード、以下の3つがあります。

  •      ReadWriteOnce(RWOは):読み書き可能な、最も基本的な方法ですが、唯一のサポートはポッド搭載されています。
  •      ReadOnlyMany(ROX):読み取り専用モードは、ポッドを複数搭載してもよいです。
  •      ReadWriteMany(RWX):読み書き可能な、ポッドの複数実装されてもよいです。
persistentVolumeReclaimPolicy回復戦略、すなわちボリュームPV PVCはどのようにして離すと、次の三つがあります。
  •      あなたはPVCを削除すると、クリーンアップしません、保持し、PVはまだ存在して(必要が手動でクリーンアップする必要性を削除する場合)「をリリース」としてマークされています
  •      クリーンアップを実行し、データを削除し、リサイクル(RM -rf / thevolume / *)ボリュームに、そしてそれが新しいインデックスに再使用することができます(のみNFSとホストパスをサポート)
  •      、削除するストレージリソースを削除し、それがPV Kubernetesオブジェクトから削除され、ならびにAWS EBS、GCE PD、アズールディスクまたはボリューム燃えがらなどの外部インフラ関連するストレージ資産
#静态创建PVの
apiVersion:v1の 種類:PersistentVolumeの メタデータ: 名前:pv0003の 仕様: 容量: ストレージ:5Gi volumeMode:ファイルシステム accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy:リサイクル storageClassName:遅い mountOptions: -ハード - nfsvers = 4.1 NFS: パス:/ tmpに サーバー:172.17.0.2

    PVの定義は、我々は、ストレージの基礎となるNFSを使用して作成した上で、このようなPVなど、基盤となるストレージのタイプを指定する必要があり、このようなようにawsElasticBlockStore、FC、NFS、RBD、CephFS、ホストパス、StorageOSとなど多くの種類をサポートし、あなたは公式を表示することができますドキュメント。

    あなたは、オブジェクト、kubectl GET PersistentVolume --all-の名前空間を作成してPVの現在のクラスタを表示することができます

PVCを作成するには、2、静的オブジェクト

    あなたはPV PVCを作成し、最終的にはポッドとポッド内のPVCの使用を指定し、PVの関係を確立する必要があり、これを使用したい場合はPVを作成し、いないの後、使用されています。

#静态创建PVC 
apiVersion:v1の 種類:PersistentVolumeClaimの メタデータ: 名前:myclaim スペック: accessModes: - ReadWriteOnce
volumeMode:ファイルシステムの リソース: リクエスト: ストレージ:8Gi storageClassName:遅い セレクター: matchLabels: リリース: "安定"
#pod使用PVCの
種類:ポッド
apiVersion:V1の
メタデータ:
  名前:mypodの
仕様:
  コンテナ:
    -名前:myfrontendの
      画像:dockerfile / nginxの
      volumeMounts:
      - MOUNTPATH: "/ var / www / htmlと設定" 
        名前:mypd 
  ボリューム:
    -名前:mypd 
      persistentVolumeClaim:
        claimName:myclaim

    上記のコードを分析します。

  • 创建PVC时指定了accessModes = ReadWriteOnce。这表明这个PVC希望使用accessModes = ReadWriteOnce的PV。
  • 创建PVC时指定了volumeMode= Filesystem。这表明这个PVC希望使用volumeMode= Filesystem的PV。
  • 指定された場合、あなたがPVCを作成しstorageClassName: slow、この構成では、PVCを使用することを意味PVCやPV、結合するために使用されたstorageClassName=slowPVにします。私たちは、あなたがトップPVを作成するときにも含まれていることがわかりますstorageClassName=slow設定を。
  • PVCはまたPVは、このようなマッチングセレクタを追加するなど、ラベルを満たさなければならない指定することができますmatchLabels: release: "stable":これは、このPVCのラベルを使用することを示しrelease: "stable"PVを。
  • 最後に、リソース文は、ポッドのような文は、リソースの特定の番号を使用することができ、storage: 8GiそれがこのPVCは、リソースの8Gボリュームを使用することを示しています。

      上記の分析を通じて、我々は単にラベルによって行われていない、バインドPVCやPVを見ることができます。しかし、総合的storageClassNameに、accessModes、matchLabelsおよびストレージは、資格のPVバインドを一致させます。

3、PV動的に作成されたオブジェクト

    我々は、ファイルのPVが完成記述し、ポッドが結合することによって、静的オブジェクトを作成する上で、PVは、この方法が記述ファイルから直接静的と呼ばれる作成し、私たちはPVを作成した場合とき50Gの大きさを指定する方法を作成するには欠点が存在する、とPV 80GのPVC要求は、その後、PVCは、バインドするために適切なPVを見つけることができません。そのため、より多くの利用の実際の生産は、動的にPVを作成します。

    PVはSTORAGECLASS動的に作成されたオブジェクトに依存します。私たちは、あなたが情報STORAGECLASSクラスタを、kubectl GET STORAGECLASS --all-名前空間を表示することができ、すべての作業は、私たちのためにSTORAGECLASSによって行われ、手動で任意のPVを作成する必要はありません

 

apiVersion:storage.k8s.io/v1 
種類:STORAGECLASS 
メタデータ:
  名前:遅い
プロビジョニング:kubernetes.io/glusterfsの
パラメータ:
  resturl: "http://192.168.10.100:8080" 
  restuser: "" 
  secretNamespace: "" 
  secretName: " 「
reclaimPolicy:保持
allowVolumeExpansionを:真

 

 この例では、glusterfs STORAGECLASSに基づいて分散ストレージを作成し使用するのみときallowVolumeExpansion = teue、PVCを拡大するためにPVCなどのより大きなボリュームを要求するために、PVC編集オブジェクトをより大きなサイズを指定し、基礎となるPersistentVolumeをトリガしますボリュームを拡張します。決して新しいを作成していないが、既存のボリュームのサイズを調整します。

STORAGECLASS定義は、4つの部分から成ります。

  • プロビジョニング:ボリューム指定ビルトイン(例えばkubernetes.io/glusterfs、を含むウィジェットタイプ、kubernetes.io/aws-ebs)と外部(外部記憶装置として設けceph.com/cephfs)プラグ。
  • パラメータ:そのようglusterfsサポートresturl、restuserおよびその他のパラメータとして、プロビジョニング・オプションを指定します。
  • mountOptions:PV指定されたオプションは直接失敗サポートされていない場合は、マウントオプションを指定します。このようなNFSサポートハードとnfsvers = 4.1およびその他のオプションとして。
  • reclaimPolicy:PVのリサイクル戦略で、回復戦略を指定します。

        手动创建的PV时,我们指定了storageClassName=slow的配置项,然后Pod定义中也通过指定storageClassName=slow,从而完成绑定。而通过StorageClass实现动态PV时,我们只需要指定StorageClass的metadata.name即可,这个名称非常重要,用户通过名称类请求特定的存储类,储类的对象一旦被创建,name将不能再更改。
        回到上文中创建PVC的例子,此时PVC指定了storageClassName=slow。那么Kubernetes会在集群中寻找是否存在metadata.name=slow的StorageClass,如果存在,此StorageClass会自动为此PVC创建一个accessModes = ReadWriteOnce,并且大小为8GB的PV。

 

或者直接写到一起

#上面的部分省略了
        volumeMounts:
        - name: data-dir
          mountPath: /var/mysql/data
      #volumes:
      #- name: data-dir
      #  hostPath:
      #    path: /opt/mysql

  volumeClaimTemplates:
  - metadata:
#annotations: volume.alpha.kubernetes.io/storage-class: xxxx creationTimestamp: null name: data-dir spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: slow volumeMode: Filesystem status: phase: Pending

 

        下面是参考官方的一种比较通用的写法,基于helm的,直接将PVC的代码写到volumes的后面,根据values.yaml中的参数生成是挂载PVC的存储还是其他存储,可以作为以后自己写脚本的参考

      volumes:
      - name: config
        configMap:
          name: {{ template "redis-ha.fullname" . }}-configmap
      - name: probes
        configMap:
          name: {{ template "redis-ha.fullname" . }}-probes
      {{- if .Values.sysctlImage.mountHostSys }}
      - name: host-sys
        hostPath:
          path: /sys
      {{- end }}
{{- if .Values.persistentVolume.enabled }}
  volumeClaimTemplates:
  - metadata:
      name: data
      annotations:
      {{- range $key, $value := .Values.persistentVolume.annotations }}
        {{ $key }}: {{ $value }}
      {{- end }}
    spec:
      accessModes:
      {{- range .Values.persistentVolume.accessModes }}
        - {{ . | quote }}
      {{- end }}
      resources:
        requests:
          storage: {{ .Values.persistentVolume.size | quote }}
    {{- if .Values.persistentVolume.storageClass }}
    {{- if (eq "-" .Values.persistentVolume.storageClass) }}
      storageClassName: ""
    {{- else }}
      storageClassName: "{{ .Values.persistentVolume.storageClass }}"
    {{- end }}
    {{- end }}
{{- else if .Values.hostPath.path }}
      - name: data
        hostPath:
          path: {{ tpl .Values.hostPath.path .}}
{{- else }}
      - name: data
        emptyDir: {}
{{- end }}

 

总结一下整个过程

1)集群管理员预先创建存储类(StorageClass);

2)用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);

3)存储持久化声明通知系统,它需要一个持久化存储(PV: PersistentVolume);

4)系统读取存储类的信息;

5)系统基于存储类的信息,在后台自动创建PVC需要的PV;

6)用户创建一个使用PVC的Pod;

7)Pod中的应用通过PVC进行数据的持久化;

8)而PVC使用PV进行数据的最终持久化处理。

 

官方文档 https://kubernetes.io/docs/concepts/storage/persistent-volumes/

 

おすすめ

転載: www.cnblogs.com/yanh0606/p/11269142.html