文章目錄
Volume
容器中的文件在磁盤上是臨時存放的,這給容器中運行的特殊應用程序帶來一些問題。 首先,當容器崩潰時,kubelet 將重新啓動容器,容器中的文件將會丟失——因爲容器會以乾淨的狀態重建。 其次,當在一個 Pod 中同時運行多個容器時,常常需要在這些容器之間共享文件。 Kubernetes 抽象出 Volume 對象來解決這兩個問題。
Kubernetes 支持下列類型的卷:
awsElasticBlockStore、 azureDisk、 azureFile、 cephfs、 cinder、configMap
、csi、downwardAPI、emptyDir
、fc (fibre channel)、flexVolume、flocker、gcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath
、iscsi、local
、nfs、persistentVolumeClaim
、projected
、portworxVolume、quobyte、rbd、scaleIO、secret
、storageos、vsphereVolume
1.1 emptyDir
當 Pod 指定到某個節點上時,首先創建的是一個 emptyDir 卷,並且只要 Pod 在該節點上運行,卷就一直存在。 就像它的名稱表示的那樣,卷最初是空的。 儘管 Pod 中的容器掛載 emptyDir 卷的路徑可能相同也可能不同,但是這些容器都可以讀寫 emptyDir 卷中相同的文件。 當 Pod 因爲某些原因被從節點上刪除時,emptyDir 卷中的數據也會永久刪除。
emptyDir
的一些用途:
- 緩存空間,例如基於磁盤的歸併排序。
- 爲耗時較長的計算任務提供檢查點,以便任務能方便地從崩潰前狀態恢復執行。
- 在 Web 服務器容器服務數據時,保存內容管理器容器獲取的文件。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
1.2 configMap
configMap
資源提供了向 Pod 注入配置數據的方法。 ConfigMap 對象中存儲的數據可以被 configMap 類型的卷引用,然後被應用到 Pod 中運行的容器化應用。
當引用 configMap 對象時,你可以簡單的在 Volume 中通過它名稱來引用。 還可以自定義 ConfigMap 中特定條目所要使用的路徑。 例如,要將名爲 log-config 的 ConfigMap 掛載到名爲 configmap-pod 的 Pod 中,您可以使用下面的 YAML:
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
log-config
ConfigMap 是以卷的形式掛載的, 存儲在 log_level 條目中的所有內容都被掛載到 Pod 的 “/etc/config/log_level” 路徑下。 請注意,這個路徑來源於 Volume 的 mountPath 和 log_level 鍵對應的 path。
1.3 hostPath
hostPath
卷能將主機節點文件系統上的文件或目錄掛載到您的 Pod 中。 雖然這不是大多數 Pod 需要的,但是它爲一些應用程序提供了強大的逃生艙。
例如,hostPath
的一些用法有:
- 運行一個需要訪問 Docker 引擎內部機制的容器;請使用 hostPath 掛載 /var/lib/docker 路徑。
- 在容器中運行 cAdvisor 時,以 hostPath 方式掛載 /sys。
- 允許 Pod 指定給定的 hostPath 在運行 Pod 之前是否應該存在,是否應該創建以及應該以什麼方式存在。
取值 | 行爲 |
---|---|
空字符串(默認)用於向後兼容,這意味着在安裝 hostPath 卷之前不會執行任何檢查。 | |
DirectoryOrCreate | 如果在給定路徑上什麼都不存在,那麼將根據需要創建空目錄,權限設置爲 0755,具有與 Kubelet 相同的組和所有權。 |
Directory | 在給定路徑上必須存在的目錄。 |
FileOrCreate | 如果在給定路徑上什麼都不存在,那麼將在那裏根據需要創建空文件,權限設置爲 0644,具有與 Kubelet 相同的組和所有權。 |
File | 在給定路徑上必須存在的文件。 |
Socket | 在給定路徑上必須存在的 UNIX 套接字。 |
CharDevice | 在給定路徑上必須存在的字符設備。 |
BlockDevice | 在給定路徑上必須存在的塊設備。 |
當使用這種類型的卷時要小心,因爲:
- 具有相同配置(例如從 podTemplate 創建)的多個 Pod 會由於節點上文件的不同而在不同節點上有不同的行爲。
- 當 Kubernetes 按照計劃添加資源感知的調度時,這類調度機制將無法考慮由 hostPath 使用的資源。
- 基礎主機上創建的文件或目錄只能由 root 用戶寫入。您需要在 特權容器 中以 root 身份運行進程,或者修改主機上的文件權限以便容器能夠寫入 hostPath 卷。
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- name: test-volume
mountPath: /test-pd
volumes:
- name: test-volume
hostPath:
# directory location on host
path: /data
# this field is optional
type: Directory
1.4 local
local
卷指的是所掛載的某個本地存儲設備,例如磁盤、分區或者目錄。
local
卷只能用作靜態創建的持久卷。尚不支持動態配置。
相比 hostPath
卷,local
卷可以以持久和可移植的方式使用,而無需手動將 Pod 調度到節點,因爲系統通過查看 PersistentVolume 所屬節點的親和性配置,就能瞭解卷的節點約束。
1.5 persistentVolumeClaim (PVC)
persistentVolumeClaim
卷用來將持久卷(PersistentVolume)掛載到 Pod 中。 持久卷是用戶在不知道特定雲環境細節的情況下"申領"持久存儲(例如 GCE PersistentDisk 或者 iSCSI 卷)的一種方法。
1.5.1 創建 hostPath
類型的 PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
查看
[root@harbor ~]# kubectl get pv task-pv-volume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 10Gi RWO Retain Available manual 79s
1.5.2 創建 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
再次查看pv
[root@harbor ~]# kubectl get pv task-pv-volume
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 10Gi RWO Retain Bound default/task-pv-claim manual 4m9s
查看pvc
[root@harbor ~]# kubectl get pvc task-pv-claim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
task-pv-claim Bound task-pv-volume 10Gi RWO manual 22s
1.5.3 創建Pod使用pvc
注:Pod 的配置文件指定了 PersistentVolumeClaim,而不是指定 PersistentVolume。
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
1.6 projected
projected 卷類型能將若干現有的捲來源映射到同一目錄上。
目前,可以映射的捲來源類型如下:
- secret
- downwardAPI
- configMap
- serviceAccountToken
所有的捲來源需要和 Pod 處於相同的命名空間。
apiVersion: v1
kind: Pod
metadata:
name: test-projected-volume
spec:
containers:
- name: test-projected-volume
image: busybox
args:
- sleep
- "86400"
volumeMounts:
- name: all-in-one
mountPath: "/projected-volume"
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: user
- secret:
name: pass