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
建立
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資料卷掛載成功。
方式二:通過PV和PVC掛載HostPath
建立
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建立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資料卷運行正常。
應用於生產環境
強化安全隔離
掛載為唯讀模式:如果應用僅需讀取節點資料,請將其掛載為唯讀模式(
ReadOnlyMany),以防主機檔案被意外修改。遵循最小許可權:避免掛載宿主機根目錄(
/)或敏感系統目錄(如/etc、/var),應為HostPath使用專門目錄。
關注節點資源
HostPath會將Pod與特定節點的實體儲存體直接綁定,導致HostPath卷的資料與節點強相關,不具備跨節點的資料持久性。
不適用於需要高可用和持久化儲存的有狀態應用(如資料庫、緩衝)。
HostPath 卷的資料僅存在於單個節點。當 Pod 因故障或更新被重新調度到其他節點時,原有資料訪問將丟失。
授權 Pod 訪問宿主機檔案系統會打破容器的隔離邊界。若配置不當(如掛載根目錄
/)或容器自身存在漏洞,可能威脅節點安全和穩定性。
不適用於唯讀根檔案系統的節點,例如ContainerOS。
常見問題
如果Pod被刪除後重建,HostPath卷裡的資料還在嗎?
取決於Pod被調度到哪個節點。
調度回同一節點:新Pod會掛載節點上完全相同的目錄,可以訪問所有歷史資料。
調度到新節點:新Pod會掛載新節點上的一個空目錄。資料仍留在原節點上,但新Pod無法訪問。
=