永続データへの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):読み書き可能な、ポッドの複数実装されてもよいです。
- あなたは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=slow
PVにします。私たちは、あなたがトップ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/