Kubernetesボリュームは、Kubernetesポッド内のコンテナからアクセスできるデータを含むディレクトリです。ディレクトリの場所、ディレクトリをサポートするストレージ メディア、およびその内容は、使用するボリュームのタイプによって異なります。
ポッド内のコンテナ内で実行されているプロセスには、以下で構成されるファイルシステムビューが表示されます:
ボリュームは、ポッド テンプレートの .spec.containers[*].volumeMounts フィールドで定義されます。ポッドごと、およびポッド内の各コンテナ イメージについて、マウントするボリュームとそのパス(パスはコンテナごとに異なる場合があります)を指定する必要があります。
Kubernetesにはいくつかの種類のボリュームがあります。最も重要なのは、Kubernetesノード上にローカルに格納され、Podが再起動すると削除されるエフェメラル ボリュームと、Podがシャットダウンしたあともデータを保持するKubernetes Persistent Volume (PV)です。
この記事の内容:
Kubernetesはさまざまなボリュームをサポートしているため、各ポッドが複数のボリューム タイプを同時に使用できます。エフェメラル ボリュームはポッドの存続期間に縛られますが、永続的ボリュームはポッドの存続期間を超えて保持できます。つまり、Kubernetesはポッドが存在しなくなるとエフェメラル ボリュームを破棄し、永続的ボリュームのデータを保持します。
Kubernetesは、ストレージ プロビジョニングと消費を抽象化するAPIを備えたPersistentVolumeサブシステムを提供します。PersistentVolume(PV)とPersistentVolumeClaim(PVC)という2つのAPIリソースと連携します。
PersistentVolume (PV)
PVは、クラスタ内に配置されるストレージ リソースです。管理者は手動でPVをプロビジョニングでき、Kubernetesはストレージ クラスを使用してPVを動的にプロビジョニングできます。PVもボリュームと同じくプラグインですが、そのライフサイクルはPVを使用するPodから独立しています。
PVは、iSCSI、NFS、クラウド プロバイダ ストレージ システムなど、ストレージ実装の詳細を取得するAPIオブジェクトとして機能します。ノードと同様の働きをしますが、コンピューティングではなくストレージ リソースを提供します。
PersistentVolumeClaim (PVC)
PVC は、ユーザーによって行われたストレージ要求です。ポッドと同じように機能しますが、ノード リソースではなく PV リソースを消費します。PVC は、ReadWriteOnce、ReadWriteMany、ReadOnlyMany などのサイズ アクセス モードを指定して、特定のストレージ リソースを要求できます。
PVCを使用すると、ユーザは抽象的なストレージ リソースを利用できますが、ユーザは通常、さまざまな問題に対してさまざまなプロパティを持つPVを必要とします。このため、クラスタ管理者は、多くの場合、サイズやアクセス モード以外の点でも異なるさまざまなPVを提供する必要があります。これは、StorageClassリソースを通じてユーザに実装の詳細を公開することなく行うことができます。
関連コンテンツ:Kubernetes PVCのガイドをお読みください
エフェメラル ボリュームでは、再起動後もデータは永続的に格納されません。これらのボリュームはPodの存続期間にバインドされており、Podと一緒に作成および削除されます。永続的ボリュームの可用性に制限されることなく、Podの停止と再起動が可能になります。
エフェメラル ボリュームは、導入や管理が簡単です。ポッド仕様でインラインで指定できます。エフェメラル ボリュームは、キャッシュ サービスなど、永続的なストレージを必要としないアプリケーションに最適です。
emptyDir ボリュームは、Kubernetes が Pod をノードに割り当てると作成されます。このボリュームのライフサイクルは、その特定のノードに存在する Pod のライフサイクルに関連付けられています。コンテナが再起動またはクラッシュしたときに emptyDir ボリュームが再作成されます。ただし、Pod がノードから削除されたとき、クラッシュしたとき、または停止したとき、このボリューム内のデータは削除され、失われます。
emptyDir ボリュームを作成したら、ボリューム タイプ名をポッド マニフェスト ファイルのフィールドとして宣言できます。ボリューム プロパティ セクションの下に、値として空の中括弧{}が表示されます。EmptyDir ボリュームは主に一時的なデータ ストレージに適しています。たとえば、ディスクベースのマージなどのスクラッチ領域に使用できます。
emptyDirボリュームは、ノードをバックアップするメディアに格納できます。たとえば、ネットワーク ストレージやSSDを使用できます。または、emptyDir.mediumフィールドに「memory」を設定すると、KubernetesがRAMベースのファイルシステム(tmpfs)をマウントします。Kubernetesはノードのリブート時にtmpfsをクリアすることに注意してください。
hostPath ボリュームは、ホスト ノードのファイルシステムからポッドにディレクトリまたはファイルをマウントします。
hostPath ボリュームの主なユースケースは次のとおりです:
HostPathボリュームのセキュリティ
HostPathボリュームは、多くのセキュリティ リスクをもたらします。これらの使用は可能な限り避けてください。HostPathボリュームを使用する必要がある場合は、必要なディレクトリまたはファイルだけを対象にスコープを設定し、ReadOnlyとしてマウントしてください。
主なセキュリティリスクは次のとおりです:
AdmissionPolicyを使用して、特定のディレクトリへのHostPathアクセスを制限できます。ただし、このポリシーは、volumeMountsがreadOnlyマウントを使用する必要がある場合にのみ有効です。
ConfigMapにより、構成データをポッドに挿入できます。ConfigMap内に格納されたデータは、configMapボリューム タイプで参照し、ポッドで実行されるコンテナ化されたアプリケーションによって利用することができます。ConfigMapを参照する場合は、ボリューム内のConfigMapの名前を指定する必要があります。Kubernetesでは、ConfigMap内の特定のエントリのパスをカスタマイズできます。
Kubernetesには、Kubernetesクラスタに導入されたストレージ デバイスへのアクセスを提供するストレージ プラグインが複数用意されています。これらは、StorageClassオブジェクトを使用して実装されます。
Kubernetesで現在サポートされている主なプラグインには、GCEPersistentDisk、AWSElasticBlockStore、AzureDisk、Glusterfs、NFS、iSCSIなどがあります。これらのプラグインの詳細については、StorageClassのドキュメントを参照してください。
2 つの注目すべきストレージ プラグインを詳しく見てみましょう。
Network File System(NFS)は、ストレージ デバイスをローカル ドライブとしてマウントするための標準プロトコルです。Kubernetesでは、NFSボリュームをローカル ドライブとしてコンテナにマウントできます。レガシー コードはNFS経由でデータにアクセスすることが多いため、このプラグインはレガシー ワークロードをKubernetesに移行する場合に非常に役立ちます。
NFSとKubernetesを経由してデータにアクセスする方法は2つあります:
コンテナ ストレージ インターフェイス(CSI)は、コンテナ オーケストレーション ツールが管理するコンテナにストレージ システムを公開するための標準インターフェイスです。CSIでは、ストレージ ベンダーがプラグインを「アウト オブ ツリー」、つまりKubernetesコード リポジトリにチェックインする必要がなく、Kubernetesに付属していないプラグインを作成できます。
CSI をベースとした Out-of-Tree プラグインは数多く存在し、ストレージ ベンダーが直接提供しています。CSI の登場により、ストレージ テクノロジによる Kubernetes のサポートが格段に容易になりました。
関連コンテンツ:Container Storage Interfaceのガイドを読む
ボリュームを作成してポッドからアクセス可能にするには、次の2つの手順が必要です。
これらのステップは密接に関連しています。ボリュームを作成するときは、コンテナにもマウントする必要があり、ポッド テンプレートで宣言せずにボリュームをマウントすることはできません。
以下は、ポッド テンプレートの YAML 構成でのボリュームの作成とマウントの両方を示す例です:
spec: containers: —name:my-app image:nginx volumeMounts: —name:my-volume mountPath:/app/config volumes: —name:my-volume
このコードでは:
Kubernetes ボリュームを作成するには、ボリュームを宣言する 1 つ以上のポッドをデプロイします。これを行う一般的な方法は、Deployment オブジェクトを使用することです。次の処理を行う Deployment マニフェストの例を次に示します:
apiVersion:apps/v1 kind:Deployment metadata: name:pods-with-volumes spec: replicas:3 selector: matchLabels: app:demo template: metadata: labels: app:demo spec: containers: —name:my-container image:nginx:1.14.2 volumeMounts: —mountPath:/ name:my-volume volumes: —name:my-volume emptyDir:{}
この Deployment の名前は pods-with-volumes で定義されています。これは、Kubernetes 環境でこの Deployment を参照する方法です。
前のセクションで説明したように、この Deployment オブジェクトはボリュームの作成に必要な 2 つのアクションを実行します:
この YAML ファイルが my-deployment.yaml という名前で保存されているとします。次のコマンドを使用して、Kubernetes クラスタに Deployment を作成できます:
kubectl apply -f my-deployment.yaml
Deployment が想定されるボリュームで正しく実行されていることを確認するには、次のコマンドを実行します:
kubectl describe pods pods-with-volumes
すべてが正常に機能した場合、出力には、各ポッドに要求されたマウント ポイントを持つ my-container という名前のコンテナがあることが示されます:
マウント: / from my-volume (rw)
出力には、各ポッドで実行されているボリュームも表示されます:
Volumes: my-volume: Type: EmptyDir(Podのライフタイムを共有する一時ディレクトリ)
NetApp Cloud Volumes ONTAPは業界をリードするエンタープライズクラスのストレージ管理ソリューションであり、AWS、Azure、Google Cloudでセキュアで実証済みのストレージ管理サービスを提供します。Cloud Volumes ONTAP容量はペタバイト規模まで拡張でき、ファイルサービス、データベース、DevOpsなどのさまざまなユースケースや、その他のエンタープライズ ワークロードをサポートし、高可用性、データ保護、Storage Efficiency、Kubernetes統合などの強力な機能セットを提供します。
特に、Cloud Volumes ONTAPは、コンテナ化されたワークロードのKubernetes永続ボリュームのプロビジョニングと管理 要件をサポートしています。
Cloud Volumes ONTAP がコンテナ化されたアプリケーションの課題にどのように対処するかについては、これらの Kubernetes Workloads with Cloud Volumes ONTAP Case Studies をご覧ください。