ローカル記憶域は、ホストノードのファイルシステム上のファイルまたはディレクトリを、Enterprise Distributed Application Service (EDAS) Kubernetes クラスター内で実行中の Pod にマウントします。これにより、コンテナはネットワークオーバーヘッドなしでホストのファイルシステムに直接アクセスでき、高速なファイル I/O が可能になります。この機能は、ホストレベルのログの読み取り、Pod 内の複数コンテナ間での一時データ共有、ノード固有の設定ファイルへのアクセスなどに役立ちます。
ローカル記憶域の仕組み
EDAS で管理される Container Service for Kubernetes (ACK) クラスターでは、ローカル記憶域は Kubernetes の hostPath ボリュームを使用して、ホストのファイルシステムパスをコンテナ内にマウントします。
EDAS は以下の 2 種類のローカル記憶域をサポートしています。
| Type | Kubernetes volume | Use case | Data lifecycle |
|---|---|---|---|
| Local File of Host | hostPath | ホストノード上の特定のファイルやディレクトリ(例:システムログやノードレベルの設定ファイル)にアクセスする場合 | データは Pod のライフサイクルとは独立してホスト上に保持されます |
| emptyDir | emptyDir | 同一 Pod 内のコンテナ間で一時データを共有する場合(例:スクラッチ領域、キャッシュ、コンテナ間データ交換) | Pod がノード上で開始された際に作成され、Pod がノードから削除されると永続的に削除されます |
hostPath ボリュームはホストのファイルシステムをコンテナに公開するため、セキュリティリスクがあります。ホストファイルシステムへのアクセス権を持つコンテナは、kubelet の認証情報などの特権的な認証情報を読み取る可能性があるほか、コンテナランタイムのソケットをエクスプロイトしてコンテナエスケープを引き起こす可能性があります。永続ストレージが必要な場合は、代わりに local PersistentVolume を使用してください。hostPath を使用する必要がある場合は、可能な限り読み取り専用でマウントするように制限してください。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
EDAS コンソール へのアクセス権を持つ EDAS アカウント
EDAS に登録済みの Kubernetes クラスター (ACK)
アプリケーション用の利用可能な名前空間およびリージョン
新規アプリケーションへのローカル記憶域の追加
EDAS コンソール にログインします。左側のナビゲーションウィンドウで、アプリケーション管理 > アプリケーション を選択します。
上部のナビゲーションバーでリージョンを選択し、ページ上部で名前空間を選択します。左上隅で、アプリケーションの作成 をクリックします。
基本情報 ステップで、以下のパラメーターを設定し、次へ をクリックします。
Parameter Description クラスタータイプ Kubernetes クラスター アプリケーション実行環境 アプリケーションに合ったランタイムを選択します。「アプリケーションランタイムオプション」をご参照ください 構成 ステップで、環境情報、基本情報、デプロイ方法、リソースパラメーターを設定します。次へ をクリックします。
詳細設定 ステップで、ローカル記憶域 を展開し、ボリュームタイプを設定します。
ホストパスをマウントする場合は、「Local File of Host パラメーター」をご参照ください。
一時的な共有ボリュームを作成する場合は、「emptyDir パラメーター」をご参照ください。
アプリケーションの作成 をクリックします。
作成完了 ページで、基本情報、構成、詳細設定 の各セクションの設定内容を確認し、アプリケーションの作成 をクリックして確定します。
アプリケーション概要 ページで、詳細を表示 をクリックします。変更履歴 ページでデプロイの進捗をモニターします。変更が完了したら、アプリケーション概要 ページの 基本情報 セクションを確認します。実行中の Pod が表示されていれば、デプロイは成功しています。
既存アプリケーションのローカル記憶域の更新
これらの変更を保存すると、アプリケーションが再起動します。オフピーク時間帯にこの操作を実行してください。
EDAS コンソールにログインします。左側のナビゲーションウィンドウで、アプリケーション管理 > アプリケーション を選択します。
上部のナビゲーションバーでリージョンを選択し、ページ上部で名前空間を選択します。クラスタータイプ ドロップダウンリストから、Container Service または Serverless Kubernetes クラスター を選択します。
対象のアプリケーションを見つけ、その名前をクリックします。
概要 または 基本情報 ページの右上隅で、デプロイ > デプロイ を選択します。
デプロイモードの選択 ページでデプロイモードを選択し、デプロイを開始 をクリックします。
環境とデプロイメントパッケージを設定した後、ローカル記憶域 を展開し、ボリュームパラメーターを設定します。
ホストパスをマウントする場合は、「Local File of Host パラメーター」をご参照ください。
一時的な共有ボリュームを作成する場合は、「emptyDir パラメーター」をご参照ください。
OK をクリックします。
ローカル記憶域パラメーター
Local File of Host パラメーター
Local File of Host オプションは Kubernetes の hostPath ボリュームに対応しており、ホストノード上のファイルまたはディレクトリをコンテナ内にマウントします。
type フィールドは、マウント前に Kubernetes がホスト上のパスを検証または作成するかどうかを制御します。
| File type | Value | Behavior |
|---|---|---|
| デフォルト | 空文字列 | 検証せずにパスをマウントします。マウント前にチェックは行われません |
| (作成) ファイルディレクトリ | DirectoryOrCreate | パスが存在しない場合、権限 0755 で空のディレクトリを作成します。ディレクトリは kubelet のグループおよび所有権を継承します |
| ファイルディレクトリ | Directory | 指定パスにディレクトリがすでに存在している必要があります。ディレクトリが存在しない場合、コンテナの起動に失敗します |
| (作成) ファイル | FileOrCreate | パスが存在しない場合、権限 0644 で空のファイルを作成します。ファイルは kubelet のグループおよび所有権を継承します |
| ファイル | File | 指定パスにファイルがすでに存在している必要があります。ファイルが存在しない場合、コンテナの起動に失敗します |
| ソケット | Socket | 指定パスに UNIX ソケットがすでに存在している必要があります。ソケットが存在しない場合、コンテナの起動に失敗します |
| キャラクターデバイス | CharDevice | 指定パスにキャラクターデバイスがすでに存在している必要があります(Linux ノードのみ)。デバイスが存在しない場合、コンテナの起動に失敗します |
| ブロックデバイス | BlockDevice | 指定パスにブロックデバイスがすでに存在している必要があります(Linux ノードのみ)。デバイスが存在しない場合、コンテナの起動に失敗します |
FileOrCreate は親ディレクトリを作成しません。対象ファイルの親ディレクトリが存在しない場合、Pod の起動に失敗します。この問題を回避するには、まず DirectoryOrCreate を使用して親ディレクトリをマウントし、その後ファイルをマウントしてください。
Local File of Host の追加パラメーターは以下のとおりです。
| Parameter | Description |
|---|---|
| マウントパス | ホストのファイルまたはディレクトリをマウントするコンテナ内のパス |
| ホストパス | コンテナにマウントするホストノード上のパス |
| マウントモード | ボリュームのアクセスモード。有効な値:読み取り/書き込み および 読み取り専用。セキュリティリスクを低減するため、可能な限り 読み取り専用 を使用してください |
| subPathExpr | ボリューム内のサブディレクトリ名を構築するために使用されるフィールドリファレンス式。各コンテナまたは Pod インスタンスに独自のディレクトリを提供する場合に便利です |
emptyDir パラメーター
emptyDir ボリュームは、Pod がノードに割り当てられた際に作成されます。Pod 内のすべてのコンテナは、同じ emptyDir ボリュームに対して読み取りおよび書き込みが可能です。この特性により、スクラッチ領域、キャッシュ、コンテナ間データ交換などの用途に適しています。Pod がクラッシュ、スケールダウン、再デプロイなど何らかの理由でノードから削除された場合、emptyDir ボリューム内のデータは永続的に削除されます。
| Parameter | Description |
|---|---|
| マウントモード | ボリュームのアクセスモード。有効な値:読み取り/書き込み および 読み取り専用 |
| マウントパス | コンテナ内に emptyDir ボリュームをマウントするパス |
| subPathExpr | ボリューム内のサブディレクトリ名を構築するために使用されるフィールドリファレンス式。各コンテナまたは Pod インスタンスに独自のディレクトリを提供する場合に便利です |
設定の確認
デプロイが完了したら、以下のいずれかの方法でローカル記憶域の設定が正しく行われているかを確認します。
変更履歴の確認
アプリケーション詳細ページの左側ナビゲーションウィンドウで、変更履歴 をクリックします。変更ステータス 列に Success と表示されていれば、ストレージ設定が有効になっています。
Pod ステータスの確認
アプリケーション概要 ページで、実行状態 の横にある 実行中の Pod (クリックして表示) をクリックします。Pod セクションの ステータス 列で、緑色のドットが表示されていれば、Pod は正常に実行されており、設定が反映されています。
本番運用時の注意点
本番環境でローカル記憶域を使用する際は、以下の点にご注意ください。
セキュリティ:
hostPathボリュームはコンテナの隔離境界をバイパスします。マウントパスは必要な最小限の範囲に制限し、可能な限り 読み取り専用 モードでマウントしてください。/、/etc、/var/runなどの機密性の高いパスのマウントは避けてください。Pod スケジューリング:
hostPathデータは特定のノードに紐付いています。Pod が別のノードに再スケジュールされた場合、以前のホストのデータにはアクセスできません。ノードの変更をまたいでデータを保持する必要がある場合は、localPersistentVolume またはネットワーク接続型ストレージを使用してください。ディスク圧迫:
hostPathボリュームの使用量は、Kubernetes の一時ストレージ管理によってトラッキングされません。コンテナによるhostPathマウントへの書き込みによって引き起こされるディスク圧迫を防ぐため、ホストノードのディスク使用率をモニターしてください。emptyDir のサイズ:
emptyDirボリュームはノードのディスク領域(またはtmpfsでバックアップされている場合はメモリ)を消費します。単一の Pod が大量のデータをemptyDirに書き込むと、ノードのディスク圧迫を引き起こす可能性があります。データ損失:
emptyDirデータは Pod が削除されると同時に削除されます。Pod の再起動後も保持する必要のあるデータは、emptyDirボリュームに保存しないでください。
アプリケーションランタイムオプション
アプリケーションの種類およびパッケージ形式に応じて、実行環境を選択します。
| Runtime | Option | Use when |
|---|---|---|
| Java | カスタム | カスタムコンテナイメージを使用してデプロイする場合 |
| Java | Java | JAR パッケージを使用して Dubbo または Spring Boot アプリケーションをデプロイする場合。選択後に Java 環境 を設定します |
| Java | Tomcat | WAR パッケージを使用して Dubbo または Spring アプリケーションをデプロイする場合。選択後に Java 環境 および コンテナバージョン を設定します |
| Java | EDAS-Container (HSF) | WAR または FatJar パッケージを使用して High-speed Service Framework (HSF) アプリケーションをデプロイする場合。選択後に Java 環境、Pandora バージョン、および Ali-Tomcat バージョン を設定します |
| PHP | PHP | Apache HTTP Server 上で PHP アプリケーションを実行する場合 |
| マルチ言語 | Node.js、C++、Go およびその他の言語 | カスタムコンテナイメージを使用してデプロイする場合 |