kubernetes对象Volume用法详解
服務器
概述
Volume是對各種存儲資源的抽象、虛擬化。為管理、控制、使用存儲資源提供統一接口。Openstack中的volume為虛擬機提供存儲,Docker中的volume為容器提供存儲。因為在kubernetes中可部署運行最小單位是pod ,所以kubernetes的volume為pod提供存儲。當然在部署pod時可以不為其提供volume,pod中的容器使用所在節點的硬盤,能同時讀寫數據的地方稱為可讀寫層。這種存儲是容器級的臨時存儲,不是pod級。其生命周期與容器相同,如果容器crash后被重啟,也就是舊容器被刪除而新容器啟動,則舊容器的可讀寫層與容器一起被刪除,其上數據丟失。同理如果pod在節點之間遷移調度,容器的可讀寫層并不會遷移調度。因此,kubernetes需要提供pod級volume,本文中的volume特指kubernetes。
Volume類型
Volume是抽象概念,有很多種具體實現,每種實現各具目的、特點、特性。差不多什么東西都可以當成volume,類型如下:
awsElasticBlockStore
azuRedisk
azureFile
cephfs
configMap
csi
downwardAPI
emptyDir
fc (fibre channel)
flocker
gcePersistentDisk
gitRepo (deprecated)
glusterfs
hostPath
iscsi
local
nfs
persistentVolumeClaim
projected
portworxVolume
quobyte
rbd
scaleIO
secret
storageos
vsphereVolume
這里不對以上所有類型一一介紹,只對目前可能會用到的本地磁盤存儲和分布式存儲做簡單介紹說明
常見存儲類型說明及示例
cephfs
cephfs是一款優秀、流行的云環境存儲解決方案,原因是它開源、高可用、彈性伸縮,對操作系統、硬件無特殊要求,用戶很容易搭建,使用它的節點也無特別要求。它具備awsElasticBlockStore陳述之所有特點,并且單個voluem可以被多個節點同時使用。用戶首先搭建自己的cephfs環境,然后配置kubernetes集群與其對接,最后在pod中使用其提供的volume,詳細參考這里。
configMap
用戶首先創建configMap并創建數據保存其中,此時數據保存在kubernetes的etcd數據庫中,volume還不存在。當用戶在pod中引用創建的configMap時,系統首先在節點上創建volume并將數據保存其中,這個volume占用的是節占的存儲空間。此后就可以像使用普通volume一樣使用它。
configMap是kubernetes中的一種對象類型,核心本質是以volume的方式將單獨管理的配置信息傳遞給pod中的容器,并非用來存儲持久化數據。詳細參考這里。
downwardAPI
與configMap類似,以volume的方式向pod中的容器傳遞信息。configMap中的信息由用戶在創建對象時傳遞,而downwardAPI的信息就來自pod對象本身,downwardAPI不需要創建,它是pod Spec中的一個字段,內容指向pod對象本身的其它字段,如pod的metadata、image等信息。在創建pod時系統首先將指向的字段提取出來,然后創建volume并保存提取出來的字段并掛載,容器就可以讀取這些字段了。
downwardAPI的目的是為將pod本身的字段信息如label、annotation等傳遞給容器的一種手段。詳細參考這里。
emptyDir
在節點上運行pod實例時才會創建emptyDir volume。它首先是節點上的一個空目錄,pod中的任何容器都可以用volume的形式掛載使用它。如果容器因為某種原因被刪除并重新啟動,創建的emptyDir不會刪除也不會被清空。當pod實例離開節點調度到其它節點或因為縮容被刪除時,emptyDir被刪除,相當于pod還在但數據丟了。示例:
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: {}
glusterfs
與cephfs一樣,流行的云環境下的存儲解決方案
hostPath
apiVersion: v1 kind: Pod metadata: name: test-pd spec: containers: - image: k8s.gcr.io/test-webserver name: test-container volumeMounts: - mountPath: /test-pd name: test-volume volumes: - name: test-volume hostPath: # directory location on host path: /data # this field is optional type: Directory
iscsi
互聯網小型計算機系統接口,其特點是便宜。
local
與emptyDir相似,它也占用節點的存儲空間。不同點是它是kubernetes中的一種對象類型,用戶可以像管理普通對象一樣管理它。emptyDir在pod實例開時運行時分配,當pod離節點時刪除。local類型的volume則由用戶創建,系統在合適的節點上為其分配資源,調度到這個節點上的pod可以掛載它,pod離開時它也不會消失,除非用戶刪除。示例:
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 100Gi
# volumeMode field requires BlockVolume Alpha feature gate to be enabled.
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: local-storage
local:
path: /mnt/disks/ssd1
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- example-node
nfs
nfs
網絡文件系統
persistentVolumeClaim
與flocker相似,用來屏蔽不同云環境
projected
如果一個容器需要掛開多個已經存在的volume比如Secret、ConfigMap、DownwardAPI等,原本每個這種類型的volume需要各自占用一個掛載目錄,而projected能將它們整合在一起,并只掛開到一個目錄下,示例:
apiVersion: v1
kind: Pod
metadata:
name: volume-test
spec:
containers:
- name: container-test
image: busybox
volumeMounts:
- name: all-in-one
mountPath: /projected-volume
readOnly: true
volumes:
- name: all-in-one
projected:
sources:
- secret:
name: mysecret
items:
- key: username
path: my-group/my-username
- downwardAPI:
items:
- path: labels
fieldRef:
fieldPath: metadata.labels
- path: cpu_limit
resourceFieldRef:
containerName: container-test
resource: limits.cpu
- configMap:
name: myconfigmap
items:
- key: config
path: my-group/my-config
總結
以上是生活随笔為你收集整理的kubernetes对象Volume用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 新增从数据库_从零开始学 M
- 下一篇: imx6q 开发板_mplayer移植-