前言
容器中的檔案在磁盤上是臨時存放,容器崩潰重啟后,容器將被以干凈狀態重建,崩潰之前創建的檔案將被清除,
K8S 使用卷的概念來管理容器生成的需持久化的檔案,卷也可用于同一個 Pod 中多個容器之間共享檔案,
更新歷史
- 20200708 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/07/08/about-storage-volume.html
Volume 的型別
emptyDir 卷
- 容器崩潰并不會導致 Pod 被從節點上移除,因此容器崩潰時 emptyDir 卷中的資料是安全的,
- 當 Pod 因為某些原因被從節點上洗掉時,emptyDir 卷中的資料也會永久洗掉,
示例
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 卷
persistentVolumeClaim 卷用來將持久卷(PersistentVolume)掛載到 Pod 中,
持久卷(PV)是用戶在不知道特定云環境細節的情況下"申領"持久存盤(例如 NFS 或者 iSCSI 卷)的一種方法,
cephfs 卷
- cephfs 允許您將現存的 CephFS 卷掛載到 Pod 中,
- cephfs 卷的內容在洗掉 Pod 時會被保留,卷只是被卸載掉了,
- 這意味著 CephFS 卷可以被預先填充資料,并且這些資料可以在 Pod 之間"傳遞",
- CephFS 卷可同時被多個寫者掛載,
configMap 卷
- ConfigMap 資源提供了向 Pod 注入配置資料的方法,
- ConfigMap 物件中存盤的資料可以被 configMap 型別的卷參考,然后被應用到 Pod 中運行的容器,
- 可以在 volumes 欄位中參考 configMap 名稱來生成一個卷,
- 可以自定義 ConfigMap 中特定條目所要使用的路徑,
- 如果容器以 subPath 卷掛載方式使用 ConfigMap 時,將無法接收 ConfigMap 的更新,
示例
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 中
路徑由 spec.containers 中引數 volumeMounts.mountpath 和 volumes 中引數 items.path 拼接而成
secret 卷
secret 卷用來給 Pod 傳遞敏感資訊,例如密碼,
可以將 secret 存盤在 Kubernetes API 服務器上,然后以檔案的形式掛在到 Pod 中,實作與 Pod 解耦,
secret 卷由 tmpfs(基于記憶體的檔案系統)提供存盤,因此它們永遠不會被寫入持久化的存盤器,
容器以 subPath 卷的方式掛載 Secret 時,它將無法實時獲取 Secret 的更新,
nfs 卷
nfs 卷能將 NFS (網路檔案系統) 掛載到您的 Pod 中,
不像 emptyDir 那樣會在洗掉 Pod 的同時也會被洗掉,nfs 卷的內容在洗掉 Pod 時會被保存,卷只是被卸載掉了,
這意味著 nfs 卷可以被預先填充資料,并且這些資料可以在 Pod 之間"傳遞",
hostPath 卷
hostPath 卷能將主機節點檔案系統上的檔案或目錄掛載到 Pod 中,
當 Pod 漂移到其他節點后,資料無法復用,僅適用于開發和測驗環境,
使用 subPath
參考卷的時候,默認會將卷的根目錄掛載到指定路徑中,
可以通過 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

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/78502.html
標籤:其他
