新聞中心
臨時(shí)卷
本文檔描述 Kubernetes 中的 臨時(shí)卷(Ephemeral Volume)。 建議先了解卷,特別是 PersistentVolumeClaim 和 PersistentVolume。

有些應(yīng)用程序需要額外的存儲(chǔ),但并不關(guān)心數(shù)據(jù)在重啟后仍然可用。 例如,緩存服務(wù)經(jīng)常受限于內(nèi)存大小,將不常用的數(shù)據(jù)轉(zhuǎn)移到比內(nèi)存慢、但對(duì)總體性能的影響很小的存儲(chǔ)中。
另有些應(yīng)用程序需要以文件形式注入的只讀數(shù)據(jù),比如配置數(shù)據(jù)或密鑰。
臨時(shí)卷 就是為此類用例設(shè)計(jì)的。因?yàn)榫頃?huì)遵從 Pod 的生命周期,與 Pod 一起創(chuàng)建和刪除, 所以停止和重新啟動(dòng) Pod 時(shí),不會(huì)受持久卷在何處可用的限制。
臨時(shí)卷在 Pod 規(guī)范中以 內(nèi)聯(lián) 方式定義,這簡(jiǎn)化了應(yīng)用程序的部署和管理。
臨時(shí)卷的類型
Kubernetes 為了不同的目的,支持幾種不同類型的臨時(shí)卷:
- emptyDir: Pod 啟動(dòng)時(shí)為空,存儲(chǔ)空間來自本地的 kubelet 根目錄(通常是根磁盤)或內(nèi)存
- configMap、 downwardAPI、 secret: 將不同類型的 Kubernetes 數(shù)據(jù)注入到 Pod 中
- CSI 臨時(shí)卷: 類似于前面的卷類型,但由專門支持此特性 的指定 CSI 驅(qū)動(dòng)程序提供
- 通用臨時(shí)卷: 它可以由所有支持持久卷的存儲(chǔ)驅(qū)動(dòng)程序提供
?emptyDir?、?configMap?、?downwardAPI?、?secret ?是作為 本地臨時(shí)存儲(chǔ) 提供的。它們由各個(gè)節(jié)點(diǎn)上的 kubelet 管理。
CSI 臨時(shí)卷 必須 由第三方 CSI 存儲(chǔ)驅(qū)動(dòng)程序提供。
通用臨時(shí)卷 可以 由第三方 CSI 存儲(chǔ)驅(qū)動(dòng)程序提供,也可以由支持動(dòng)態(tài)配置的任何其他存儲(chǔ)驅(qū)動(dòng)程序提供。 一些專門為 CSI 臨時(shí)卷編寫的 CSI 驅(qū)動(dòng)程序,不支持動(dòng)態(tài)供應(yīng):因此這些驅(qū)動(dòng)程序不能用于通用臨時(shí)卷。
使用第三方驅(qū)動(dòng)程序的優(yōu)勢(shì)在于,它們可以提供 Kubernetes 本身不支持的功能, 例如,與 kubelet 管理的磁盤具有不同運(yùn)行特征的存儲(chǔ),或者用來注入不同的數(shù)據(jù)
CSI 臨時(shí)卷
FEATURE STATE: Kubernetes v1.16 [beta]
該特性需要啟用參數(shù) ?CSIInlineVolume ?特性門控(feature gate)。 該參數(shù)從 Kubernetes 1.16 開始默認(rèn)啟用。
只有一部分 CSI 驅(qū)動(dòng)程序支持 CSI 臨時(shí)卷。Kubernetes CSI 驅(qū)動(dòng)程序列表 顯示了支持臨時(shí)卷的驅(qū)動(dòng)程序。
從概念上講,CSI 臨時(shí)卷類似于 ?configMap?、?downwardAPI ?和 ?secret ?類型的卷: 其存儲(chǔ)在每個(gè)節(jié)點(diǎn)本地管理,并在將 Pod 調(diào)度到節(jié)點(diǎn)后與其他本地資源一起創(chuàng)建。 在這個(gè)階段,Kubernetes 沒有重新調(diào)度 Pods 的概念。卷創(chuàng)建不太可能失敗,否則 Pod 啟動(dòng)將會(huì)受阻。 特別是,這些卷 不 支持感知存儲(chǔ)容量的 Pod 調(diào)度。 它們目前也沒包括在 Pod 的存儲(chǔ)資源使用限制中,因?yàn)?nbsp;kubelet 只能對(duì)它自己管理的存儲(chǔ)強(qiáng)制執(zhí)行。
下面是使用 CSI 臨時(shí)存儲(chǔ)的 Pod 的示例清單:
kind: Pod
apiVersion: v1
metadata:
name: my-csi-app
spec:
containers:
- name: my-frontend
image: busybox:1.28
volumeMounts:
- mountPath: "/data"
name: my-csi-inline-vol
command: [ "sleep", "1000000" ]
volumes:
- name: my-csi-inline-vol
csi:
driver: inline.storage.kubernetes.io
volumeAttributes:
foo: bar?volumeAttributes ?決定驅(qū)動(dòng)程序準(zhǔn)備什么樣的卷。這些屬性特定于每個(gè)驅(qū)動(dòng)程序,且沒有實(shí)現(xiàn)標(biāo)準(zhǔn)化。 有關(guān)進(jìn)一步的說明,請(qǐng)參閱每個(gè) CSI 驅(qū)動(dòng)程序的文檔。
CSI 驅(qū)動(dòng)程序限制
FEATURE STATE: Kubernetes v1.21 [deprecated]
作為一個(gè)集群管理員,你可以使用 PodSecurityPolicy 來控制在 Pod 中可以使用哪些 CSI 驅(qū)動(dòng)程序, 具體則是通過 ?allowedCSIDrivers 字段? 指定。
PodSecurityPolicy 已棄用,并將在 Kubernetes v1.25 版本中移除。
CSI 臨時(shí)卷僅有 CSI 驅(qū)動(dòng)程序的一個(gè)子集支持。 Kubernetes CSI 驅(qū)動(dòng)列表顯示了哪些驅(qū)動(dòng)程序支持臨時(shí)卷。
通用臨時(shí)卷
FEATURE STATE: Kubernetes v1.23 [stable]
通用臨時(shí)卷類似于 ?emptyDir ?卷,因?yàn)樗鼮槊總€(gè) Pod 提供臨時(shí)數(shù)據(jù)存放目錄, 在最初制備完畢時(shí)一般為空。不過通用臨時(shí)卷也有一些額外的功能特性:
- 存儲(chǔ)可以是本地的,也可以是網(wǎng)絡(luò)連接的。
- 卷可以有固定的大小,pod不能超量使用。
- 卷可能有一些初始數(shù)據(jù),這取決于驅(qū)動(dòng)程序和參數(shù)。
- 當(dāng)驅(qū)動(dòng)程序支持,卷上的典型操作將被支持,包括 (快照、 克隆、 調(diào)整大小和 存儲(chǔ)容量跟蹤)。
示例:
kind: Pod
apiVersion: v1
metadata:
name: my-app
spec:
containers:
- name: my-frontend
image: busybox:1.28
volumeMounts:
- mountPath: "/scratch"
name: scratch-volume
command: [ "sleep", "1000000" ]
volumes:
- name: scratch-volume
ephemeral:
volumeClaimTemplate:
metadata:
labels:
type: my-frontend-volume
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "scratch-storage-class"
resources:
requests:
storage: 1Gi生命周期和 PersistentVolumeClaim
關(guān)鍵的設(shè)計(jì)思想是在 Pod 的卷來源中允許使用 卷申領(lǐng)的參數(shù)。 PersistentVolumeClaim 的標(biāo)簽、注解和整套字段集均被支持。 創(chuàng)建這樣一個(gè) Pod 后, 臨時(shí)卷控制器在 Pod 所屬的命名空間中創(chuàng)建一個(gè)實(shí)際的 PersistentVolumeClaim 對(duì)象, 并確保刪除 Pod 時(shí),同步刪除 PersistentVolumeClaim。
如上設(shè)置將觸發(fā)卷的綁定與/或準(zhǔn)備操作,相應(yīng)動(dòng)作或者在 StorageClass 使用即時(shí)卷綁定時(shí)立即執(zhí)行, 或者當(dāng) Pod 被暫時(shí)性調(diào)度到某節(jié)點(diǎn)時(shí)執(zhí)行 (?WaitForFirstConsumer ?卷綁定模式)。 對(duì)于常見的臨時(shí)卷,建議采用后者,這樣調(diào)度器就可以自由地為 Pod 選擇合適的節(jié)點(diǎn)。 對(duì)于即時(shí)綁定,調(diào)度器則必須選出一個(gè)節(jié)點(diǎn),使得在卷可用時(shí),能立即訪問該卷。
就資源所有權(quán)而言, 擁有通用臨時(shí)存儲(chǔ)的 Pod 是提供臨時(shí)存儲(chǔ) (ephemeral storage) 的 PersistentVolumeClaim 的所有者。 當(dāng) Pod 被刪除時(shí),Kubernetes 垃圾收集器會(huì)刪除 PVC, 然后 PVC 通常會(huì)觸發(fā)卷的刪除,因?yàn)榇鎯?chǔ)類的默認(rèn)回收策略是刪除卷。 你可以使用帶有 ?retain ?回收策略的 StorageClass 創(chuàng)建準(zhǔn)臨時(shí) (quasi-ephemeral) 本地存儲(chǔ): 該存儲(chǔ)比 Pod 壽命長(zhǎng),在這種情況下,你需要確保單獨(dú)進(jìn)行卷清理。
當(dāng)這些 PVC 存在時(shí),它們可以像其他 PVC 一樣使用。 特別是,它們可以被引用作為批量克隆或快照的數(shù)據(jù)源。 PVC對(duì)象還保持著卷的當(dāng)前狀態(tài)。
PersistentVolumeClaim 的命名
自動(dòng)創(chuàng)建的 PVCs 的命名是確定的:此名稱是 Pod 名稱和卷名稱的組合,中間由連字符(?-?)連接。 在上面的示例中,PVC 將命名為 ?my-app-scratch-volume? 。 這種確定性命名方式使得與 PVC 交互變得更容易,因?yàn)橐坏┲?nbsp;Pod 名稱和卷名,就不必搜索它。
這種確定性命名方式也引入了潛在的沖突, 比如在不同的 Pod 之間(名為 “Pod-a” 的 Pod 掛載名為 "scratch" 的卷, 和名為 "pod" 的 Pod 掛載名為 “a-scratch” 的卷,這兩者均會(huì)生成名為 "pod-a-scratch" 的PVC),或者在 Pod 和手工創(chuàng)建的 PVC 之間。
以下沖突會(huì)被檢測(cè)到:如果 PVC 是為 Pod 創(chuàng)建的,那么它只用于臨時(shí)卷。 此檢測(cè)基于所有權(quán)關(guān)系。現(xiàn)有的 PVC 不會(huì)被覆蓋或修改。 但這并不能解決沖突,因?yàn)槿绻麤]有正確的 PVC,Pod 就無法啟動(dòng)。
當(dāng)命名 Pods 和卷出現(xiàn)在同一個(gè)命名空間中時(shí),要小心,以防止發(fā)生此類沖突。
安全
啟用 GenericEphemeralVolume 特性會(huì)導(dǎo)致那些沒有 PVCs 創(chuàng)建權(quán)限的用戶, 在創(chuàng)建 Pods 時(shí),被允許間接的創(chuàng)建 PVCs。 集群管理員必須意識(shí)到這一點(diǎn)。 如果這不符合他們的安全模型,他們有如下選擇:
- 通過特性門控顯式禁用該特性。
- 使用一個(gè)準(zhǔn)入 Webhook 拒絕包含通用臨時(shí)卷的 Pods。
- 當(dāng) ?
volumes?列表不包含 ?ephemeral?卷類型時(shí),使用 Pod 安全策略。 (這一方式在 Kubernetes 1.21 版本已經(jīng)棄用)
為 PVC 卷所設(shè)置的逐名字空間的配額 仍然有效,因此即使允許用戶使用這種新機(jī)制,他們也不能使用它來規(guī)避其他策略。
標(biāo)題名稱:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes臨時(shí)卷
文章路徑:http://m.fisionsoft.com.cn/article/dhhpcij.html


咨詢
建站咨詢
