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 分で理解する

推薦する

テンセントクラウド、南米初のデータセンターをブラジルのサンパウロに開設、海外クラウドサービスの展開を加速

11月25日、テンセントクラウドの南米初のクラウドコンピューティングデータセンターが正式に開設され、...

itldcはどうですか?マイアミデータセンターVPSの実体験!

itldcはどうですか? itldc マイアミ VPS はいかがでしょうか?マイアミはアメリカ南東部...

オランダのアムステルダムにおける gcore Basic VM の簡単なレビュー

gcoreはどうですか? gcore クラウド サーバーはどうですか? gcoreのクラウドサーバー...

タオバオオンラインストアが新しいメディアを活用して運営を支援する方法について簡単に説明します。

今は新メディア時代です。4つの伝統的なメディアの発展はインターネットの影響で疲労の兆候を見せており、...

LightInTheBox は成長のジレンマに陥っています: ウェディングドレスの代替品を見つける方法

シナテクノロジー トレーシー上場前から人気を集めていたラザダは、第2四半期の決算発表後に「財務報告の...

SEOから仕事の効率を理解する

ここ数ヶ月、時間の制約により、記事をほとんど書いていません。もちろん、時間的な要因に加えて、もう1つ...

zipvps-1g メモリ kvm/50g ハードディスク/1T トラフィック/G ポート/ニューヨーク/月額 6.5 ドル

zipvps はいくつかのプロモーションを行ってきました。ワンマン商人ホスト猫として、これまでここで...

SEOキーワード競争の難しさの判断アイデア

キーワード競争の難易度を判断することは、SEO 担当者が習得しなければならないスキルです。ランク付け...

dedipath Los Angeles OpenVZシリーズVPSの簡単なレビュー

最近、dedipath は米国のメモリアル デーに 50% オフの VPS と 39 ドルという低価...

#おすすめ# adman: ノボシビルスク VPS、50% オフ、オプションの Windows、無制限のトラフィック、PayPal 対応

ロシアのホスティング会社である Adman は、おそらく多くの中国人にとって馴染み深い存在です。Ad...

国内共同購入市場にマシュー効果が現れ、年内に利益の転換点を迎える可能性

昨年11月に株式を公開した共同購入のパイオニア、グルーポンが先日発表した財務報告によると、今年第1四...

INXY: Verizon CDN (アジアノードを含む) が 50% オフ、一部の専用サーバーも 50% オフ

inxy の Verizon CDN 事業はアジアでかなりの数のポップがあり、グローバル カバレッジ...

Big Bird Grassroots SEO チュートリアル: タイトルとキーワードの書き方

第1章第2節 頭が大きくて雨でも心配ない --- タイトルの書き方ビッグピッグ: 「ヘッダーって何?...

#11.11# MoeCloud: US cn2 gia VPS、299元/年、512Mメモリ/1コア/10gSSD/500Gトラフィック/1Gbps帯域幅

MoeCloudはダブルイレブンのプロモーションを逃しましたが、遅くてもやらないよりはましです。公式...