容器中的文件在磁盤上是臨時存放,容器崩潰重啓後,容器將被以乾淨狀態重建,崩潰以前建立的文件將被清除。html
K8S 使用卷的概念來管理容器生成的需持久化的文件,卷也可用於同一個 Pod 中多個容器之間共享文件。mysql
示例linux
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: nginx name: test-container volumeMounts: - mountPath: /cache name: cache-volume volumes: - name: cache-volume emptyDir: {}
persistentVolumeClaim 卷用來將持久卷(PersistentVolume)掛載到 Pod 中。
持久卷(PV)是用戶在不知道特定雲環境細節的狀況下"申領"持久存儲(例如 NFS 或者 iSCSI 卷)的一種方法。nginx
示例sql
apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: test image: busybox volumeMounts: - name: config-vol mountPath: /etc/config volumes: - name: config-vol configMap: name: log-config items: - key: log_level path: log_level
ConfigMap 中 key log_level 中的內容將被掛載到 Pod 路徑 /etc/config/log_level 中api
路徑由 spec.containers 中參數 volumeMounts.mountpath 和 volumes 中參數 items.path 拼接而成安全
secret 卷用來給 Pod 傳遞敏感信息,例如密碼。服務器
能夠將 secret 存儲在 Kubernetes API 服務器上,而後以文件的形式掛在到 Pod 中,實現與 Pod 解耦。微信
secret 卷由 tmpfs(基於內存的文件系統)提供存儲,所以它們永遠不會被寫入持久化的存儲器。網絡
容器以 subPath 卷的方式掛載 Secret 時,它將沒法實時獲取 Secret 的更新。
nfs 卷能將 NFS (網絡文件系統) 掛載到您的 Pod 中。
不像 emptyDir 那樣會在刪除 Pod 的同時也會被刪除,nfs 卷的內容在刪除 Pod 時會被保存,卷只是被卸載掉了。
這意味着 nfs 卷能夠被預先填充數據,而且這些數據能夠在 Pod 之間"傳遞"。
hostPath 卷能將主機節點文件系統上的文件或目錄掛載到 Pod 中。
當 Pod 漂移到其餘節點後,數據沒法複用,僅適用於開發和測試環境。
引用卷的時候,默認會將卷的根目錄掛載到指定路徑中。
能夠經過 subPath 掛載卷的子目錄,而不是根目錄。
示例
apiVersion: v1 kind: Pod metadata: name: my-lamp-site spec: containers: - name: mysql image: mysql volumeMounts: - mountPath: /var/lib/mysql name: site-data subPath: mysql volumes: - name: site-data persistentVolumeClaim: claimName: my-lamp-site-data
將掛載 site-data 卷的子目錄 mysql 到容器目錄 /var/lib/mysql 中
emptyDir、hostPath 卷能夠消耗的磁盤資源不受限制,就是說可能會寫滿磁盤。
卷比 Pod 中運行的任何容器的存活期都長,在容器從新啓動時數據也會獲得保留。
使用卷時, Pod 聲明中須要提供卷的類型 (.spec.volumes)和卷掛載的位置 (.spec.containers.volumeMounts)。
容器中的進程能看到由它們的 Docker 鏡像和卷組成的文件系統視圖。
Docker 鏡像位於文件系統層次結構的根部,而且任何 Volume 都掛載在鏡像內的指定路徑上。
卷不能掛載到其餘卷,也不能與其餘卷有硬連接。
微信公衆號:zuolinux_com