すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:HostPath ボリュームの使用

最終更新日:Jun 24, 2026

ホストのファイルまたはディレクトリを 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 の直接マウント

  1. 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
  2. Pod をデプロイします。

    kubectl apply -f pod-hostpath-direct.yaml
  3. マウントを確認します。

    Pod 内にファイルを作成し、そのファイルがノード上に存在することを確認します。

    1. Pod にファイルを作成します。

      Pod の /test ディレクトリ (マウントポイント) に test.txt を作成します。

      kubectl exec test-pod -- sh -c 'echo "This file was created from within the Pod." > /test/test.txt'
    2. Pod が実行されているノード名を取得します。

      NODE_NAME=$(kubectl get pod test-pod -o jsonpath='{.spec.nodeName}')
      echo "Pod is running on node: $NODE_NAME"
    3. ノード上でファイルを確認します。

      ノードにログインし、ls /data を実行して、ファイルが /data ディレクトリに存在するかどうかを確認します。

      出力に test.txt が含まれている場合、HostPath ボリュームは正常にマウントされています。

方法 2: PV と PVC を使用したマウント

  1. 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
  2. PV、PVC、および Pod を作成します。

    kubectl apply -f pv-pvc-hostpath.yaml
  3. マウントを確認します。

    Pod 内にファイルを作成し、そのファイルがノード上に存在することを確認します。

    1. 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'
    2. Pod が実行されているノード名を取得します。

      NODE_NAME=$(kubectl get pod test-pod-pvc -o jsonpath='{.spec.nodeName}')
      echo "Pod is running on node: $NODE_NAME"
    3. ノード上でファイルを確認します。

      ノードにログインし、ls /data を実行して、ファイルが /data ディレクトリに存在するかどうかを確認します。

      出力に test.txt が含まれている場合、PV/PVC HostPath ボリュームは正常にマウントされています。

本番環境に関する考慮事項

  • セキュリティ分離の強化

    • 読み取り専用としてマウント:アプリケーションがノードデータを読み取るだけの場合は、volumeMounts セクションで readOnly: true を設定することで、ホストノードへの意図しない書き込みを防ぎます。

    • 最小権限の原則に従う:ルートディレクトリ (/) や、/etc/var などの機密ディレクトリのマウントは避けてください。専用のディレクトリを使用してください。

  • ノードリソースの監視

    • ホストディスクの監視:HostPath ボリュームに書き込むコンテナは、ノードのディスク領域を消費します。ディスク領域の枯渇を防ぐために、ディスクパーティションの監視アラートを設定してください。

    • I/O への影響の評価:HostPath ボリュームでの頻繁な読み書きは、ノードの I/O リソースを消費するため、他の Pod や kubelet の安定性に影響を与える可能性があります。本番環境で HostPath を使用する前に、I/O への影響を評価してください。

  • HostPath ボリュームは、Pod を特定のノードの物理ストレージにバインドします。データはそのノードに紐付けられるため、Pod が他のノードに再スケジューリングされると利用できなくなります。

    • データベースやキャッシュなど、高可用性を必要とするステートフルアプリケーションには適していません。

      • データは単一のノードにしか存在しないため、Pod が別のノードに再スケジューリングされると、元のデータへのアクセスは失われます。

      • ホストノードのファイルシステムにアクセスすると、コンテナの分離性が損なわれます。設定が間違っていたり (たとえば、ルートディレクトリ / をマウントするなど)、コンテナに脆弱性があったりすると、ノードのセキュリティと安定性が損なわれる可能性があります。

    • ContainerOS のような、読み取り専用のルートファイルシステムを持つノードには適していません。

よくある質問

Pod が再作成された場合、データは永続化されますか?

Pod がどのノードにスケジューリングされるかによります。

  • 同じノードにスケジューリングされた場合:Pod は同じディレクトリをマウントし、既存のすべてのデータにアクセスできます。

  • 異なるノードにスケジューリングされた場合:Pod は空のディレクトリをマウントします。データは元のノードに残りますが、アクセスできなくなります。

=