K8SのPV/PVC/StorageClassをわかりやすく説明する

K8SのPV/PVC/StorageClassをわかりやすく説明する

一言でまとめると、PV と PVC は、K8S がストレージ管理に使用するリソース オブジェクトです。ストレージ リソースの使用を制御可能になり、システムの安定性と信頼性が確保されます。 StorageClass は、手動の作業負荷を軽減するために PV を自動的に作成するコンポーネントです。すべてのポッドがストレージを使用するための原則は 1 つだけです。最初に計画し、次に適用し、次に使用する。

1. 理論

1. PVコンセプト

PV は、K8S ストレージ リソースの抽象化です。 PV は通常、コンテナ アプリケーションの運用および保守担当者によって作成および構成されます。

PV が利用可能になる前は、サーバー ディスクのパーティションの概念はありませんでした。 PV が利用可能になった後は、PV を介してサーバー ディスクをパーティション分割することと同等になりました。

2. PVCコンセプト

PVC は、Pod によるストレージ リソースの申請であり、主にストレージ スペースの申請、アクセス モードなどが含まれます。PV を作成した後、Pod は PVC を介して PV からディスク スペースを申請できます。これは、オペレーティング システムの D ドライブから 1G の使用領域を要求するアプリケーションに似ています。

PVC が正常に作成されると、Pod は PVC のストレージ リソースをストレージ ボリュームの形式で使用できるようになります。 PVC を使用する場合、Pod は PVC と同じ名前空間に存在する必要があります。

3. PVとPVCの関係

PV はディスクのパーティションに相当し、PVC はパーティション内で APP (アプリケーション) が適用するスペースの量に相当します。たとえば、WPS プログラムをインストールする場合、通常はインストールに必要なストレージ容量が通知され、特定のディスクにインストールすることを選択するように求められます。将来パーティション ディスクがいっぱいになった場合でも、他のパーティション ディスクの使用には影響しません。

PV が PVC にバインドされると、Pod は PVC を使用できるようになります。システム内に PVC の要件を満たす PV がない場合、適切な PV がシステム内に生成されるまで PVC は保留状態のままになります。

4. StorageClass の概念

K8S には、静的モードと動的モードの 2 つのストレージ リソース プロビジョニング モードがあります。リソース プロビジョニングの最終的な目標は、適切な PV を PVC にバインドすることです。

  • 静的モード: 管理者は事前にさまざまな PV を作成し、PVC が使用申請されるのを待ちます。
  • 動的モード: 管理者は事前に PV を作成する必要はありません。代わりに、StorageClass は自動的に PV を作成し、それを PVC にバインドします。

StorageClass は、PVC のニーズに基づいて適切な PV リソースを動的に作成し、オンデマンドのストレージ ボリュームの作成を実現する動的モードです。

一般的に、商用アプリケーションでは多数の Pod が使用されます。各 Pod がストレージ リソースを使用する必要がある場合、PV を随時手動で作成する必要があり、これも面倒です。解決策は、動的モードを使用することです。Pod が PVC を介してストレージ リソースを申請すると、対応するサイズの PV が StorageClass を介して動的に作成され、PVC にバインドされます。したがって、PV と PVC の間には基本的に 1 対 1 の関係があります。

5. プロビジョナーのコンセプト

PVC を作成するときは、StorageClass を指定する必要があります。 PVC が対応する StorageClass を選択すると、それに関連付けられた Provisioner コンポーネントが PV リソースを動的に作成します。

では Provisioner とは何でしょうか?実際、これはオペレーティング システムのディスク ドライバーに似た単なるストレージ ドライバーです。

StorageClass リソース オブジェクトの定義には、主に、名前、プロビジョナー、ストレージ関連のパラメータ構成、リサイクル ポリシーが含まれます。 StorageClass は一度作成されると変更することはできず、削除して再作成することしかできません。

PV と PVC のライフ サイクルには、リソースのプロビジョニング、リソースのバインド、リソースの使用、リソースの再利用の 4 つの段階が含まれます。まず、古いものにはリソース供給があります。簡単に言えば、ストレージ ドライバーが存在し、それが作成、バインド、使用、リサイクルされる必要があります。

6. PV/PVC使用前後の比較

6.1.説明による比較

PV と PVC が使用される前は、各 Pod はストレージ リソース (NFS など) にデータを自由に書き込むことができました。どのポッドでもディスク上で移動できます。長期的には、ディスク管理がますます混乱し、データ使用量が制限を超え、ディスクが爆発し、最終的にはディスク上のすべてのアプリケーションが停止することになります。

この問題を解決するために、PV と PVC の概念が導入され、Pod によって書き込まれるストレージ データのサイズが制限され、システムの可用性と安定性がより確実に確保されます。

PVC と PV では、すべてのポッドは、最初に計画し、後で適用し、後で使用するという原則に基づいてストレージ リソースを使用します。

すると、「StorageClass は自動的に PV を作成しますが、これは元の無秩序で制御不能なものと同じ効果があり、ストレージ リソースを自由に占有できます。」という疑問が湧くはずです。

実際、StorageClass を使用すると、PV の作成プロセスのみが自動化されますが、ストレージ制御可能なプロセスは実行されます。各ポッドが使用するストレージ容量は固定されています。 Pod がストレージ容量を超えることはなく、他のアプリケーションにも影響しません。障害が発生した場合、その原因は特定の Pod 自体のみになります。

6.2.写真で比較

PV と PVC が使用される前の状況を次の 2 つの図に示します。

PVとPVCを装着した後の状況は以下のようになります。

2. 練習

PV、PVC、StorageClass を実践する前に、読者は NFS サーバーを自分でインストールする必要があります。この記事では、YAML オーケストレーションを通じて NFS サーバー上に PV を自動的に作成する方法を説明します。

1. PodはPVとPVCを使用してストレージボリュームをマウントします

1.1、PV、PVC、ポッドマウントPVCのオーケストレーション

この記事では、Pod のディレクトリが NFS のディレクトリにマウントされることを示します。 nginx イメージを使用して、PV が配置されている NFS サーバーに HTML ファイルが書き込まれます。最後に、PV/PVC を使用して正常にマウントされていることがわかります。

yaml ファイルは次のとおりです。

 # PV编排apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv1 namespace: dev1 labels: pv: nfs-pv1 spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce # Recycle 删除PVC会同步删除PV | Retain 删除PVC不会同步删除PV persistentVolumeReclaimPolicy: Recycle nfs: path: /data/nfstest/share/pv1 server: 10.20.1.20 readOnly: false --- # PVC 编排,通过selector查找PV,K8S里的资源查找都是通过selector查找label标签apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc1 namespace: dev1 labels: pv: nfs-pvc1 spec: resources: requests: storage: 100Mi accessModes: - ReadWriteOnce selector: matchLabels: pv: nfs-pv1 --- # Pod挂载PVC,这里为了测试,直接通过node节点的hostPort暴露服务apiVersion: v1 kind: Pod metadata: name: webapp namespace: dev1 labels: app: webapp spec: containers: - name: webapp image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 hostPort: 8081 volumeMounts: - name: workdir mountPath: /usr/share/nginx/html volumes: - name: workdir persistentVolumeClaim: claimName: nfs-pvc1

次のように kubectl コマンドを実行して実際の結果を表示します。

次に、ポッドのステータスを確認し、次のようにポッドがまだ作成中であることを確認します。

そこで、ポッドのステータス kubectl describe pod webapp -n dev1 をチェックしたところ、次の異常な情報が見つかりました。

これは、フォルダーが NFS 上に作成されていないためです。 NFS 上にこのフォルダーを作成した後、Pod を再起動すると、すべて正常になります。次に、ポッドが配置されているノードを見つけます。 http://nodeip:port にアクセスすると、成功したインターフェースが表示されます。

 [root@k8s-master pv-pvc-storageclass]# kubectl get pods -n dev1 -owide | grep webapp webapp 1/1 Running 0 4m17s 10.21.69.214 k8s-worker-3 <none> <none>

現時点では、nginx 配下に HTML ページが存在しないため、内容を見ることができません。次に、NFS サーバーに対応するディレクトリ /data/nfstest/share/pv1 に移動し、index.html ページを追加して、ページを更新します。インターフェースは次のとおりです。

ポッドに入ってマウントが成功したかどうかを確認することもできます。

kubectl exec -it webapp -n dev1 -- /bin/sh コマンドを実行して Pod に入ると、次のページが表示されます。

2. PodはStorageClassを使用してストレージボリュームを自動的にマウントします

2.1.プロビジョナーをインストールする

この記事では、比較的簡単な helm 経由で nfs-subdir-external-provisioner をインストールすることを選択します。インストールドキュメントとインストールプロセスは次のとおりです。

  • インストールドキュメント:

https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/#nfs

https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

  • インストールプロセス:

以下の 3 つの手順に従って、nfs-subdir-external-provisioner のインストールを完了します。

  1. ヘルムをインストールします。この記事ではMacを例に説明します。
 brew install heml
  1. nfs-subdir-external-provisioner をインストールし、次の 2 つのコマンドを実行します。
 $ helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ $ helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner -n kube-system \ --set image.repository=dyrnq/nfs-subdir-external-provisioner \ --set nfs.server=10.20.1.20 \ --set nfs.path=/data/nfstest/nfs-storage

注目すべきパラメータをいくつか示します。

image.repository: イメージのアドレスが変更されました。デフォルトで使用される外部イメージが利用できない場合があります。

nfs.server: NFS サーバーのアドレス

nfs.path: ストレージディレクトリ

  1. helm インストールの結果を表示します。

helm インストールの結果を表示するには、コマンド helm list -A を実行します。

対応するポッドが作成されているかどうかを確認します。イメージ アドレスが変更されていない場合、次の図に示すように、プルは常に失敗します。

イメージ アドレスを変更すると、以下に示すように、Pod が正常に起動します。

2.2. StorageClassの使用

この記事では、Pod が StorageClass を使用して PV を自動的に作成し、対応するストレージ ディレクトリにファイルを作成し、データを書き込む方法を説明します。

yaml ファイルは次のとおりです。

 apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage-1 provisioner: cluster.local/nfs-subdir-external-provisioner parameters: # 设置为"false"时删除PVC不会保留数据,"true"则保留数据archiveOnDelete: "false" mountOptions: # 指定NFS版本,这个需要根据NFS Server版本号设置- nfsvers=4 --- # 创建PVC kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-storage-pvc-1 namespace: dev1 spec: storageClassName: nfs-storage-1 #需要与上面创建的storageclass的名称一致accessModes: - ReadWriteOnce resources: requests: storage: 10Mi --- kind: Pod apiVersion: v1 metadata: name: nfs-storage-pod-1 namespace: dev1 spec: containers: - name: nfs-storage-pod-1 image: busybox command: - "/bin/sh" args: - "-c" - "touch /mnt/teststorage && echo 111 > /mnt/teststorage && exit 0 || exit 1" ## 创建一个名称为"SUCCESS"的文件volumeMounts: - name: nfs-pvc mountPath: "/mnt" restartPolicy: "Never" volumes: - name: nfs-pvc persistentVolumeClaim: claimName: nfs-storage-pvc-1

kubectl コマンドを実行すると、次の結果が表示されます。

予想通り、storageClass を通じて PV が自動的に作成され、NFS に対応したストレージ ディレクトリにファイルが作成され、データが書き込まれます。

この時点で、練習プロセスは完了です。

結論

この記事では主にPV、PVC、StorageClassの理論と実践について説明します。

一言でまとめると、PV と PVC は、K8S がストレージ管理に使用するリソース オブジェクトです。ストレージ リソースの使用を制御可能になり、システムの安定性と信頼性が確保されます。 StorageClass は、手動の作業負荷を軽減するために PV を自動的に作成するコンポーネントです。すべてのポッドがストレージを使用するための原則は 1 つだけです。まず計画し、次に適用し、次に使用する。

<<:  IoTとエッジの関係

>>:  Ingress/IngressController/IngressClass の違いを 5 分で理解する

推薦する

中小企業向けウェブサイトのコンテンツ作成方法

昨日、a5 で高品質の記事の書き方に関する記事を見ました。彼が紹介した方法は、電子版の保存に特化した...

ホストオンはどうですか?ロサンゼルスの AMD Ryzen+NVMe シリーズ VPS のレビュー

現在、hosteons の AMD Ryzen+NVMe シリーズ VPS は 3 つのデータセンタ...

ウェブサイトの SEO 最適化のための 9 つのスパイダートラップ、私は最初の 1 つに陥りました

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスウェブサイトの最適化のプ...

二級都市における SEO はどの程度効果的でしょうか?

株洲SEO楊超は、株洲のローカルウェブサイトの最適化と百度キーワードランキングにサービスを提供してい...

注目すべきクラウドサービスとSaaS

クラウドサービスとSaaSについてお話しましょう。専門用語を知らないことは二次的な問題です。大切なの...

Vultrはどうですか? Vultr UK ロンドンデータセンター評価データ共有

Vultrはどうですか? Vultrはまだ使えますか? Vultr を一度も使用したことがない、また...

2018 年のクラウド障害トップ 10: あなたもその 1 人ですか?

今年最大のクラウド障害は、市場の 3 大プレーヤーである AWS、Microsoft Azure、G...

2020 年のブランド向けソーシャル メディア マーケティング トレンド 8 つ

過去1年間、私たちはさまざまなソーシャルメディアプラットフォームのニュースアップデートをまとめ、海外...

春節初日の旅行チケット購入体験:12306ウェブサイトサーバーが再び混雑

中国新聞社金融チャンネルの記者が、春節の旅行ラッシュ初日の列車の切符を予約するために12306のウェ...

なぜ新しいストレージとコンピューティングの分離が主流になるのでしょうか?

「世界は長い分裂の期間の後、最終的には統一され、長い統一の期間の後、最終的には分裂する」という古い格...

Baidu 8.25 アップデートへの対処方法: 外部リンク

A5に「8月25日の百度メジャーアップデートにSEOはどう対処すべきか:記事の内容」という記事があり...

モバイルインターネットチャネルのプロモーション方法

今月はたくさんお金を使ったのに効果がなかったと友人からよく聞かれます。それで、広告費はどこへ行ったの...

ウェブサイトの運用は専門的なデータ分析で行うべきでしょうか?

最近は私自身の個人的なことで忙しく、しばらくオンラインになっていませんでした。今日オンラインになった...