卷類型之hostPath
hostPath類型的卷可以把宿主機節點上的文件或文件夾掛載到pod中
先來看看hostPath類型的卷如何配置:
apiVersion: v1 kind: Pod metadata: name: test-pd spec: volumes: - name: test-volume hostPath: path: /data type: Directory containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - name: test-volume mountPath: /test-pd mountPropagation: None readOnly: true subPath: test.txt subPathExpr:
這里針對每一個配置項逐一解釋:
sepc.volumes: 配置宿主機節點上的掛載目錄
配置項名稱 | 是否必須 | 說明 |
---|---|---|
name | 必須 | 卷的名稱,在pod內必須唯一 |
hostPath.path | 必須 | 宿主機上的目錄路徑,如果是符號鏈接,它將根據符號鏈接追蹤到實際路徑 |
hostPath.type | 可選 | hostPath卷的類型,默認為“” |
hostPath.type的枚舉值有:
取值 | 說明 |
DirectoryOrCreate | 如果給定路徑不存在,將根據需要在那里創建一個空目錄,權限設置為755,與Kubelet具有相同的組和所有權。 |
Directory | 給定的目錄路徑必須存在 |
FileOrCreate | 如果給定路徑不存在,將根據需要在那里創建一個空文件,權限設置為644,與Kubelet具有相同的組和所有權。 |
File | 給定路徑上必須存在對應文件 |
Socket | 給定路徑上必須存在一個UNIX socket |
CharDevice | 給定路徑上必須存在字符設備 |
BlockDevice | 給定路徑上必須存在塊設備 |
使用type字段時需要注意: 由於節點上的文件不同,具有相同配置(如從podTemplate創建的)的Pods在不同節點上的行為可能不同 當Kubernetes按照計划添加資源感知調度(?)時,它將不會使用hostPath聲明的資源 在主機上創建的文件或目錄只能由根用戶寫。你需要在一個有特權的容器中以root身份運行進程,或者修改主機上的文件權限,以便能夠寫入hostPath卷
containers.volumeMounts: 配置掛載到pod里的路徑
配置項名稱 | 是否必須 | 說明 |
name | 必須 | 此處卷的名稱必須和spec.volumes下的某個卷的名稱一致 |
mountPath | 必須 | 掛載到容器里的路徑,不能包含英文冒號‘:’ |
mountPropagation | 可選 | 該參數決定如何將掛載從主機傳播到容器,反之亦然。默認為None |
readOnly | 可選 | 是否只讀,默認為可讀寫 |
subPath | 可選 | 將spec.volumes中的子目錄掛載到容器中不同的位置,默認為“”,也就是掛載到spec.volumes定義的根目錄 |
subPathExpr | 可選 | 與subPath類似,但是路徑中可以支持從環境變量取值:${VAR_NAME},默認為“”,也就是spec.volumes定義的根目錄。和subPath只能有一個出現 |
mountPropagation的取值有:
None:默認值,卷在容器中以及宿主機上的后續掛載相互隔離
HostToContainer:任何在宿主機上創建的卷掛載在容器中都是可見的
Bidirectional:任何在容器中創建的卷掛載都會傳播到宿主機,然后傳播到所有使用此掛載的pod中的容器里