全部產品
Search
文件中心

Container Service for Kubernetes:使用HostPath資料卷

更新時間:Sep 30, 2025

HostPath 資料卷可以將宿主機(節點)上的檔案或目錄直接掛載到 Pod 中,使Pod能夠直接讀寫節點的檔案系統,適用於需要讀取節點日誌、訪問特定設定檔,在開發環境中快速共用資料等情境。

工作原理

流程介紹

Pod被調度到目標節點後,該節點的kubelet會在容器啟動前,執行Hostpath的掛載操作。kubelet會根據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:通過獨立 PV 定義hostPath,再由Pod通過PVC申請。儲存與應用解耦,可獨立管理底層儲存,無需改動應用Pod配置。

方式一:在Pod中直接掛載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資料卷掛載成功。

方式二:通過PV和PVC掛載HostPath

  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
      # 使用selector確保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資料卷運行正常。

應用於生產環境

  • 強化安全隔離

    • 掛載為唯讀模式:如果應用僅需讀取節點資料,請將其掛載為唯讀模式(ReadOnlyMany),以防主機檔案被意外修改。

    • 遵循最小許可權:避免掛載宿主機根目錄(/)或敏感系統目錄(如/etc/var),應為HostPath使用專門目錄。

  • 關注節點資源

    • 監控主機磁碟:容器寫入HostPath會消耗節點磁碟。對磁碟分割進行監控警示,防止節點因磁碟耗盡而故障。

    • 評估I/O影響:對HostPath的高頻讀寫會佔用節點I/O資源,可能影響節點上其他業務Pod甚至kubelet的穩定性。應評估其效能影響。

  • HostPath會將Pod與特定節點的實體儲存體直接綁定,導致HostPath卷的資料與節點強相關,不具備跨節點的資料持久性。

    • 不適用於需要高可用和持久化儲存的有狀態應用(如資料庫、緩衝)。

      • HostPath 卷的資料僅存在於單個節點。當 Pod 因故障或更新被重新調度到其他節點時,原有資料訪問將丟失。

      • 授權 Pod 訪問宿主機檔案系統會打破容器的隔離邊界。若配置不當(如掛載根目錄 /)或容器自身存在漏洞,可能威脅節點安全和穩定性。

    • 不適用於唯讀根檔案系統的節點,例如ContainerOS

常見問題

如果Pod被刪除後重建,HostPath卷裡的資料還在嗎?

取決於Pod被調度到哪個節點。

  • 調度回同一節點:新Pod會掛載節點上完全相同的目錄,可以訪問所有歷史資料。

  • 調度到新節點:新Pod會掛載新節點上的一個空目錄。資料仍留在原節點上,但新Pod無法訪問。

=