服務(wù)器
概述
Volume是對各種存儲資源的抽象、虛擬化。為管理、控制、使用存儲資源提供統(tǒng)一接口。Openstack中的volume為虛擬機提供存儲,Docker中的volume為容器提供存儲。因為在kubernetes中可部署運行最小單位是pod ,所以kubernetes的volume為pod提供存儲。當然在部署pod時可以不為其提供volume,pod中的容器使用所在節(jié)點的硬盤,能同時讀寫數(shù)據(jù)的地方稱為可讀寫層。這種存儲是容器級的臨時存儲,不是pod級。其生命周期與容器相同,如果容器crash后被重啟,也就是舊容器被刪除而新容器啟動,則舊容器的可讀寫層與容器一起被刪除,其上數(shù)據(jù)丟失。同理如果pod在節(jié)點之間遷移調(diào)度,容器的可讀寫層并不會遷移調(diào)度。因此,kubernetes需要提供pod級volume,本文中的volume特指kubernetes。
Volume類型
Volume是抽象概念,有很多種具體實現(xiàn),每種實現(xiàn)各具目的、特點、特性。差不多什么東西都可以當成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是一款優(yōu)秀、流行的云環(huán)境存儲解決方案,原因是它開源、高可用、彈性伸縮,對操作系統(tǒng)、硬件無特殊要求,用戶很容易搭建,使用它的節(jié)點也無特別要求。它具備awsElasticBlockStore陳述之所有特點,并且單個voluem可以被多個節(jié)點同時使用。用戶首先搭建自己的cephfs環(huán)境,然后配置kubernetes集群與其對接,最后在pod中使用其提供的volume,詳細參考這里。
configMap
用戶首先創(chuàng)建configMap并創(chuàng)建數(shù)據(jù)保存其中,此時數(shù)據(jù)保存在kubernetes的etcd數(shù)據(jù)庫中,volume還不存在。當用戶在pod中引用創(chuàng)建的configMap時,系統(tǒng)首先在節(jié)點上創(chuàng)建volume并將數(shù)據(jù)保存其中,這個volume占用的是節(jié)占的存儲空間。此后就可以像使用普通volume一樣使用它。
configMap是kubernetes中的一種對象類型,核心本質(zhì)是以volume的方式將單獨管理的配置信息傳遞給pod中的容器,并非用來存儲持久化數(shù)據(jù)。詳細參考這里。
downwardAPI
與configMap類似,以volume的方式向pod中的容器傳遞信息。configMap中的信息由用戶在創(chuàng)建對象時傳遞,而downwardAPI的信息就來自pod對象本身,downwardAPI不需要創(chuàng)建,它是pod Spec中的一個字段,內(nèi)容指向pod對象本身的其它字段,如pod的metadata、image等信息。在創(chuàng)建pod時系統(tǒng)首先將指向的字段提取出來,然后創(chuàng)建volume并保存提取出來的字段并掛載,容器就可以讀取這些字段了。
downwardAPI的目的是為將pod本身的字段信息如label、annotation等傳遞給容器的一種手段。詳細參考這里。
emptyDir
在節(jié)點上運行pod實例時才會創(chuàng)建emptyDir volume。它首先是節(jié)點上的一個空目錄,pod中的任何容器都可以用volume的形式掛載使用它。如果容器因為某種原因被刪除并重新啟動,創(chuàng)建的emptyDir不會刪除也不會被清空。當pod實例離開節(jié)點調(diào)度到其它節(jié)點或因為縮容被刪除時,emptyDir被刪除,相當于pod還在但數(shù)據(jù)丟了。示例:
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一樣,流行的云環(huán)境下的存儲解決方案
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
互聯(lián)網(wǎng)小型計算機系統(tǒng)接口,其特點是便宜。
local
與emptyDir相似,它也占用節(jié)點的存儲空間。不同點是它是kubernetes中的一種對象類型,用戶可以像管理普通對象一樣管理它。emptyDir在pod實例開時運行時分配,當pod離節(jié)點時刪除。local類型的volume則由用戶創(chuàng)建,系統(tǒng)在合適的節(jié)點上為其分配資源,調(diào)度到這個節(jié)點上的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
網(wǎng)絡(luò)文件系統(tǒng)
persistentVolumeClaim
與flocker相似,用來屏蔽不同云環(huán)境
projected
如果一個容器需要掛開多個已經(jīng)存在的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