kubernetes對(duì)象Volume用法詳解
概述
Volume是對(duì)各種存儲(chǔ)資源的抽象、虛擬化。為管理、控制、使用存儲(chǔ)資源提供統(tǒng)一接口。Openstack中的volume為虛擬機(jī)提供存儲(chǔ),Docker中的volume為容器提供存儲(chǔ)。因?yàn)樵趉ubernetes中可部署運(yùn)行最小單位是pod ,所以kubernetes的volume為pod提供存儲(chǔ)。當(dāng)然在部署pod時(shí)可以不為其提供volume,pod中的容器使用所在節(jié)點(diǎn)的硬盤,能同時(shí)讀寫數(shù)據(jù)的地方稱為可讀寫層。這種存儲(chǔ)是容器級(jí)的臨時(shí)存儲(chǔ),不是pod級(jí)。其生命周期與容器相同,如果容器crash后被重啟,也就是舊容器被刪除而新容器啟動(dòng),則舊容器的可讀寫層與容器一起被刪除,其上數(shù)據(jù)丟失。同理如果pod在節(jié)點(diǎn)之間遷移調(diào)度,容器的可讀寫層并不會(huì)遷移調(diào)度。因此,kubernetes需要提供pod級(jí)volume,本文中的volume特指kubernetes。
Volume類型
Volume是抽象概念,有很多種具體實(shí)現(xiàn),每種實(shí)現(xiàn)各具目的、特點(diǎn)、特性。差不多什么東西都可以當(dāng)成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
- 這里不對(duì)以上所有類型一一介紹,只對(duì)目前可能會(huì)用到的本地磁盤存儲(chǔ)和分布式存儲(chǔ)做簡(jiǎn)單介紹說(shuō)明
常見存儲(chǔ)類型說(shuō)明及示例
cephfs
cephfs是一款優(yōu)秀、流行的云環(huán)境存儲(chǔ)解決方案,原因是它開源、高可用、彈性伸縮,對(duì)操作系統(tǒng)、硬件無(wú)特殊要求,用戶很容易搭建,使用它的節(jié)點(diǎn)也無(wú)特別要求。它具備awsElasticBlockStore陳述之所有特點(diǎn),并且單個(gè)voluem可以被多個(gè)節(jié)點(diǎn)同時(shí)使用。用戶首先搭建自己的cephfs環(huán)境,然后配置kubernetes集群與其對(duì)接,最后在pod中使用其提供的volume,詳細(xì)參考這里。
configMap
用戶首先創(chuàng)建configMap并創(chuàng)建數(shù)據(jù)保存其中,此時(shí)數(shù)據(jù)保存在kubernetes的etcd數(shù)據(jù)庫(kù)中,volume還不存在。當(dāng)用戶在pod中引用創(chuàng)建的configMap時(shí),系統(tǒng)首先在節(jié)點(diǎn)上創(chuàng)建volume并將數(shù)據(jù)保存其中,這個(gè)volume占用的是節(jié)占的存儲(chǔ)空間。此后就可以像使用普通volume一樣使用它。
configMap是kubernetes中的一種對(duì)象類型,核心本質(zhì)是以volume的方式將單獨(dú)管理的配置信息傳遞給pod中的容器,并非用來(lái)存儲(chǔ)持久化數(shù)據(jù)。詳細(xì)參考這里。
downwardAPI
與configMap類似,以volume的方式向pod中的容器傳遞信息。configMap中的信息由用戶在創(chuàng)建對(duì)象時(shí)傳遞,而downwardAPI的信息就來(lái)自pod對(duì)象本身,downwardAPI不需要?jiǎng)?chuàng)建,它是pod Spec中的一個(gè)字段,內(nèi)容指向pod對(duì)象本身的其它字段,如pod的metadata、image等信息。在創(chuàng)建pod時(shí)系統(tǒng)首先將指向的字段提取出來(lái),然后創(chuàng)建volume并保存提取出來(lái)的字段并掛載,容器就可以讀取這些字段了。
downwardAPI的目的是為將pod本身的字段信息如label、annotation等傳遞給容器的一種手段。詳細(xì)參考這里。
emptyDir
在節(jié)點(diǎn)上運(yùn)行pod實(shí)例時(shí)才會(huì)創(chuàng)建emptyDir volume。它首先是節(jié)點(diǎn)上的一個(gè)空目錄,pod中的任何容器都可以用volume的形式掛載使用它。如果容器因?yàn)槟撤N原因被刪除并重新啟動(dòng),創(chuàng)建的emptyDir不會(huì)刪除也不會(huì)被清空。當(dāng)pod實(shí)例離開節(jié)點(diǎn)調(diào)度到其它節(jié)點(diǎn)或因?yàn)榭s容被刪除時(shí),emptyDir被刪除,相當(dāng)于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)境下的存儲(chǔ)解決方案
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)小型計(jì)算機(jī)系統(tǒng)接口,其特點(diǎn)是便宜。
local
與emptyDir相似,它也占用節(jié)點(diǎn)的存儲(chǔ)空間。不同點(diǎn)是它是kubernetes中的一種對(duì)象類型,用戶可以像管理普通對(duì)象一樣管理它。emptyDir在pod實(shí)例開時(shí)運(yùn)行時(shí)分配,當(dāng)pod離節(jié)點(diǎn)時(shí)刪除。local類型的volume則由用戶創(chuàng)建,系統(tǒng)在合適的節(jié)點(diǎn)上為其分配資源,調(diào)度到這個(gè)節(jié)點(diǎn)上的pod可以掛載它,pod離開時(shí)它也不會(huì)消失,除非用戶刪除。示例:
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相似,用來(lái)屏蔽不同云環(huán)境
projected
如果一個(gè)容器需要掛開多個(gè)已經(jīng)存在的volume比如Secret、ConfigMap、DownwardAPI等,原本每個(gè)這種類型的volume需要各自占用一個(gè)掛載目錄,而projected能將它們整合在一起,并只掛開到一個(gè)目錄下,示例:
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
相關(guān)文章
Docker 教程之獲取鏡像基礎(chǔ)知識(shí)詳解
這篇文章主要介紹了Docker 教程之獲取鏡像詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
啟動(dòng)桌面Docker提示虛擬服務(wù)未啟動(dòng)兩種解決方案
Docker 是?個(gè)開源的應(yīng)用容器引擎,可以實(shí)現(xiàn)虛擬化,這篇文章主要介紹了在啟動(dòng)Docker?Desktop時(shí)遇到的錯(cuò)誤,并提供了解決方案,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
Docker如何實(shí)現(xiàn)容器間的安全通信方式
文章介紹了使用自定義網(wǎng)絡(luò)、網(wǎng)絡(luò)訪問(wèn)控制、數(shù)據(jù)加密、認(rèn)證與授權(quán)機(jī)制、安全更新與漏洞管理等方法來(lái)提升Docker容器的安全性2024-11-11
IDEA使用Docker插件遠(yuǎn)程部署項(xiàng)目到云服務(wù)器的方法步驟
這篇文章主要介紹了IDEA使用Docker插件遠(yuǎn)程部署項(xiàng)目到云服務(wù)器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
docker鏡像拉取過(guò)程和遠(yuǎn)程代理配置過(guò)程
Docker鏡像拉取過(guò)程涉及客戶端、守護(hù)進(jìn)程、注冊(cè)表和網(wǎng)絡(luò)通信,客戶端發(fā)送請(qǐng)求,守護(hù)進(jìn)程處理并從注冊(cè)表下載鏡像層,配置包括Docker守護(hù)進(jìn)程的代理、TLS設(shè)置和防火墻規(guī)則,確保網(wǎng)絡(luò)策略和安全措施到位,以優(yōu)化鏡像拉取和保護(hù)傳輸過(guò)程2024-11-11
docker-compose如何定義一個(gè)橋接網(wǎng)絡(luò),并為該網(wǎng)絡(luò)配置一個(gè)IP地址池
在DockerCompose中定義橋接網(wǎng)絡(luò)并配置IP地址池,可以實(shí)現(xiàn)服務(wù)的自動(dòng)IP地址分配,通過(guò)定義網(wǎng)絡(luò)、指定子網(wǎng)范圍、設(shè)置網(wǎng)關(guān)和啟用自動(dòng)分配功能,可以輕松管理服務(wù)的網(wǎng)絡(luò)配置,確保IP地址在子網(wǎng)范圍內(nèi)且不與其他網(wǎng)絡(luò)沖突,以避免網(wǎng)絡(luò)沖突2025-01-01
詳解docker私有倉(cāng)庫(kù)搭建與使用實(shí)戰(zhàn)
這篇文章主要介紹了詳解docker私有倉(cāng)庫(kù)搭建與使用實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02

