ホストのファイルまたはディレクトリを Pod にマウントして、ノードのログ、設定ファイル、または共有開発データに直接アクセスします。
仕組み
プロセスの概要
Pod がノードにスケジューリングされると、kubelet はコンテナの開始前に HostPath ボリュームをマウントします。hostPath 設定の type に基づいて、path で定義されたホストパスを検証して準備します。
-
DirectoryOrCreate:ホストのpathが存在するかどうかを確認します。存在しない場合は、権限が 0755 で、kubelet と同じ所有権とグループを持つ空のディレクトリを作成します。 -
Directory:ホストのpathが存在し、それがディレクトリであることを確認します。ディレクトリでない場合、Pod の起動は失敗します。 -
FileOrCreate:ホストのpathが存在するかどうかを確認します。存在しない場合は、権限が 0644 で、kubelet と同じ所有権とグループを持つ空のファイルを作成します。 -
File:ホストのpathが存在し、それがファイルであることを確認します。ファイルでない場合、Pod の起動は失敗します。
検証が完了すると、kubelet はホストの path をコンテナにバインドマウントします。マウントポイントでのすべての読み取りおよび書き込み操作は、ホストノードのファイルシステムに直接行われます。
使用方法
-
Pod で HostPath ボリュームを直接マウントします:Pod マニフェストの
volumesセクションでhostPathを直接定義します。シンプルですが、ストレージとアプリケーションが密結合になります。長期的なメンテナンスやストレージの変更が見込まれる本番環境のワークロードには推奨されません。 -
PV と PVC を使用して HostPath ボリュームをマウントします:スタンドアロンの PersistentVolume (PV) で
hostPathを定義し、Pod は PersistentVolumeClaim (PVC) を介してボリュームを要求します。これにより、ストレージをアプリケーションから分離でき、Pod の設定を変更することなくストレージを個別に管理できます。
適用性
Elastic Compute Service (ECS) ノードでのみサポートされます。ECI や ACS などのサーバーレスコンピューティングリソースでは利用できません。ローカルディスクでの使用は推奨されません。
方法 1: HostPath の直接マウント
-
pod-hostpath-direct.yamlという名前のファイルを作成します。ノードの
/dataディレクトリを Pod の/testにマウントします。apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 name: test-container volumeMounts: - mountPath: /test name: test-volume volumes: - name: test-volume hostPath: # ホストノード上のパスを指定します。 path: /data # ボリュームタイプを指定します。 type: DirectoryOrCreate -
Pod をデプロイします。
kubectl apply -f pod-hostpath-direct.yaml -
マウントを確認します。
Pod 内にファイルを作成し、そのファイルがノード上に存在することを確認します。
-
Pod にファイルを作成します。
Pod の
/testディレクトリ (マウントポイント) にtest.txtを作成します。kubectl exec test-pod -- sh -c 'echo "This file was created from within the Pod." > /test/test.txt' -
Pod が実行されているノード名を取得します。
NODE_NAME=$(kubectl get pod test-pod -o jsonpath='{.spec.nodeName}') echo "Pod is running on node: $NODE_NAME" -
ノード上でファイルを確認します。
ノードにログインし、
ls /dataを実行して、ファイルが/dataディレクトリに存在するかどうかを確認します。出力に
test.txtが含まれている場合、HostPath ボリュームは正常にマウントされています。
-
方法 2: PV と PVC を使用したマウント
-
pv-pvc-hostpath.yamlという名前のファイルを作成します。ホストの
/dataディレクトリを指す PV、ストレージを要求する PVC、および PVC を使用する Pod を作成します。# --- PersistentVolume の定義 --- apiVersion: v1 kind: PersistentVolume metadata: name: hostpath-pv labels: type: local spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: "/data" --- # --- PersistentVolumeClaim の定義 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: hostpath-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi # セレクターを使用して、PVC を以前に作成した PV にバインドします。 selector: matchLabels: type: local --- # --- Pod の定義 --- apiVersion: v1 kind: Pod metadata: name: test-pod-pvc spec: containers: - name: test-container image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: storage volumes: - name: storage persistentVolumeClaim: # 以前に定義した PVC を参照します。 claimName: hostpath-pvc -
PV、PVC、および Pod を作成します。
kubectl apply -f pv-pvc-hostpath.yaml -
マウントを確認します。
Pod 内にファイルを作成し、そのファイルがノード上に存在することを確認します。
-
Pod にファイルを作成します。
Pod の
/usr/share/nginx/htmlディレクトリ (マウントポイント) にtest.txtを作成します。kubectl exec test-pod-pvc -- sh -c 'echo "File from PV/PVC Pod." > /usr/share/nginx/html/test.txt' -
Pod が実行されているノード名を取得します。
NODE_NAME=$(kubectl get pod test-pod-pvc -o jsonpath='{.spec.nodeName}') echo "Pod is running on node: $NODE_NAME" -
ノード上でファイルを確認します。
ノードにログインし、
ls /dataを実行して、ファイルが/dataディレクトリに存在するかどうかを確認します。出力に
test.txtが含まれている場合、PV/PVC HostPath ボリュームは正常にマウントされています。
-
本番環境に関する考慮事項
-
セキュリティ分離の強化
-
読み取り専用としてマウント:アプリケーションがノードデータを読み取るだけの場合は、
volumeMountsセクションでreadOnly: trueを設定することで、ホストノードへの意図しない書き込みを防ぎます。 -
最小権限の原則に従う:ルートディレクトリ (
/) や、/etcや/varなどの機密ディレクトリのマウントは避けてください。専用のディレクトリを使用してください。
-
-
ノードリソースの監視
-
HostPath ボリュームは、Pod を特定のノードの物理ストレージにバインドします。データはそのノードに紐付けられるため、Pod が他のノードに再スケジューリングされると利用できなくなります。
-
データベースやキャッシュなど、高可用性を必要とするステートフルアプリケーションには適していません。
-
データは単一のノードにしか存在しないため、Pod が別のノードに再スケジューリングされると、元のデータへのアクセスは失われます。
-
ホストノードのファイルシステムにアクセスすると、コンテナの分離性が損なわれます。設定が間違っていたり (たとえば、ルートディレクトリ
/をマウントするなど)、コンテナに脆弱性があったりすると、ノードのセキュリティと安定性が損なわれる可能性があります。
-
-
ContainerOS のような、読み取り専用のルートファイルシステムを持つノードには適していません。
-
よくある質問
Pod が再作成された場合、データは永続化されますか?
Pod がどのノードにスケジューリングされるかによります。
-
同じノードにスケジューリングされた場合:Pod は同じディレクトリをマウントし、既存のすべてのデータにアクセスできます。
-
異なるノードにスケジューリングされた場合:Pod は空のディレクトリをマウントします。データは元のノードに残りますが、アクセスできなくなります。
=