K8s 存儲
什么是卷?為什么要用卷?
我們知道K8s是基于容器,對各個Pod進行管理的。Pod是由容器構(gòu)成的,我也知道,容器(如Docker)有個特點就是,容器刪除后,在容器中產(chǎn)生的數(shù)據(jù)也會隨之銷毀。K8s會監(jiān)控容器的運行狀態(tài),當有容器崩潰或停止時,K8s的Controller會刪除這些容器,并重新創(chuàng)建新的容器。如果容器被銷毀,此時容器狀態(tài)未保存, 因此在容器生命周期內(nèi)創(chuàng)建或修改的所有文件都將丟失。在崩潰期間,kubelet 會以干凈的狀態(tài)重新啟動容器。
另外一個需求就是:當多個容器在一個 Pod 中運行并且需要共享文件時, 就需要跨所有容器設(shè)置和訪問共享文件系統(tǒng)。
K8s卷分類
根據(jù)應(yīng)用場景不同,和需求不同,將卷分為不同的種類
-
臨時卷
-
持久卷
-
投射卷
卷的相關(guān)參數(shù)
-
卷類型
-
卷掛載位置
卷掛載位置
卷掛載在鏡像中的指定路徑下。 Pod 配置中的每個容器必須獨立指定各個卷的掛載位置。
注意:卷不能掛載到其他卷之上(不過存在一種使用 subPath 的相關(guān)機制),也不能與其他卷有硬鏈接。
K8s目前支持的卷類型
已啟用的卷類型
- awsElasticBlockStore (已棄用)
- azureDisk (已棄用)
- cinder (已棄用)
- gcePersistentDisk(已棄用)
- gcePersistentDisk(已棄用)
- gitRepo (已棄用)
- glusterfs(已移除)
- portworxVolume(已棄用)
- vsphereVolume(已棄用)
- flexVolume(已棄用)
可以使用的卷類型
- cephfs
- configMap
- downwardAPI
- emptyDir
- fc (光纖通道)
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- subPath
- 樹外(Out-of-Tree)卷插件
常用的數(shù)據(jù)卷(Volume)有:
- 本地:如,HostPath、EmptyDir;
- 網(wǎng)絡(luò):如,NFS、Ceph、GlusterFS;
- 公有云:如,AWS EBS;
- K8s資源:如,Configmap、Secret。
臨時卷
什么是臨時卷?
臨時卷的生命周期與 Pod 的生命周期相同,與 Pod 一起創(chuàng)建和刪除,當 Pod 不再存在時,Kubernetes 也會銷毀臨時卷。 所以停止和重新啟動 Pod 時,不會受持久卷在何處可用的限制。
應(yīng)用場景1:有些應(yīng)用程序需要額外的存儲,但并不關(guān)心數(shù)據(jù)在重啟后是否仍然可用。
示例:緩存服務(wù)經(jīng)常受限于內(nèi)存大小,而且可以將不常用的數(shù)據(jù)轉(zhuǎn)移到比內(nèi)存慢的存儲中,對總體性能的影響并不大。
應(yīng)用場景2:些應(yīng)用程序需要以文件形式注入的只讀數(shù)據(jù)
示例:比如配置數(shù)據(jù)或密鑰。
臨時卷類型
根據(jù)不同的用途,支持幾種不同類型的臨時卷
- EmptyDir: Pod 啟動時為空,存儲空間來自本地的 kubelet 根目錄(通常是根磁盤)或內(nèi)存
- 見投射卷:ConfigMap、 DownwardAPI、 Secret: 將不同類型的 Kubernetes 數(shù)據(jù)注入到 Pod 中
- CSI 臨時卷: 類似于前面的卷類型,但由專門支持此特性 的指定 CSI 驅(qū)動程序提供
- 通用臨時卷: 它可以由所有支持持久卷的存儲驅(qū)動程序提供
emptyDir
、configMap
、downwardAPI
、secret
是作為 本地臨時存儲 提供的。它們由各個節(jié)點上的 kubelet 管理。
"本地"意味著存儲介質(zhì)不能是網(wǎng)絡(luò)上的。
EmptyDir
EmptyDir是在當 Pod 分派到某個Node節(jié)點上時創(chuàng)建的,它的初始內(nèi)容為空,k8s自動分配一個目錄,而無需指定宿主機上對應(yīng)的目錄文件。當Pod銷毀時, EmptyDir中的數(shù)據(jù)也會被永久刪除。
無論Pod 中的容器掛載 emptyDir
卷的路徑是否相同,這些容器都可以讀寫 emptyDir
卷中相同的文件。
說明:容器崩潰并不會導(dǎo)致 Pod 被從節(jié)點上移除,因此容器崩潰期間 emptyDir
卷中的數(shù)據(jù)是安全的
emptyDir
的一些用途:
- 緩存空間,例如基于磁盤的歸并排序。
- 為耗時較長的計算任務(wù)提供檢查點,以便任務(wù)能方便地從崩潰前狀態(tài)恢復(fù)執(zhí)行。
- 在 Web 服務(wù)器容器服務(wù)數(shù)據(jù)時,保存內(nèi)容管理器容器獲取的文件。
設(shè)置卷掛載位置:
使用emptyDir.medium
字段用來控制 emptyDir
卷的存儲位置。
掛載位置可以是基于存儲介質(zhì)的,也可以是基于內(nèi)存的:
emptyDir
卷存儲在該節(jié)點所使用的介質(zhì)上; 此處的介質(zhì)可以是磁盤、SSD 或網(wǎng)絡(luò)存儲,這取決于你的環(huán)境
如果是掛載 tmpfs,將 emptyDir.medium
字段設(shè)置為 "Memory"
, 它與磁盤不同:tmpfs 在節(jié)點重啟時會被清除, 并且你所寫入的所有文件都會計入容?的內(nèi)存消耗,受容?內(nèi)存限制約束。
示例:
emptyDir 官方配置示例
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
sizeLimit: 500Mi
容器共享示例:
apiVersion: v1
kind: Pod
metadata:
name: volume-emptydir
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
volumeMounts: # 將logs-volume掛在到nginx容器中,對應(yīng)的目錄為 /var/log/nginx
- name: logs-volume
mountPath: /var/log/nginx
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","tail -f /logs/access.log"] # 初始命令,動態(tài)讀取指定文件中內(nèi)容
volumeMounts: # 將logs-volume 掛在到busybox容器中,對應(yīng)的目錄為 /logs
- name: logs-volume
mountPath: /logs
volumes: # 聲明volume, name為logs-volume,類型為emptyDir
- name: logs-volume
emptyDir: {}
創(chuàng)建Pod
[root@k8s-master01 ~]# kubectl create -f volume-emptydir.yaml
# 查看pod
[root@k8s-master01 ~]# kubectl get pods volume-emptydir -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE ......
volume-emptydir 2/2 Running 0 97s x.x.x.x node1 ......
# 通過podIp訪問nginx
[root@k8s-master01 ~]# curl <IP>
# 通過kubectl logs命令查看指定容器的標準輸出
[root@k8s-master01 ~]# kubectl logs -f volume-emptydir -n dev -c busybox
卷限制:
基于介質(zhì):通過為默認介質(zhì)指定大小限制,來限制 emptyDir
卷的存儲容量。
基于內(nèi)存:當啟用 SizeMemoryBackedVolumes
特性門控時, 你可以為基于內(nèi)存提供的卷指定大小。 如果未指定大小,則基于內(nèi)存的卷的大小為 Linux 主機上內(nèi)存的 50%。
為本地臨時性存儲設(shè)置請求和限制
以指定 ephemeral-storage
來管理本地臨時性存儲。 Pod 中的每個容器可以設(shè)置以下屬性:
spec.containers[].resources.limits.ephemeral-storage
spec.containers[].resources.requests.ephemeral-storage
表示存儲容量的 方式有2種
- 加后綴表達式(可加的后綴:E、P、T、G、M、k)
- 2 的冪級數(shù)表達式(Ei、Pi、Ti、Gi、Mi、Ki)
官方示例:
假如,Pod 包含兩個容器。每個容器請求 2 GiB 大小的本地臨時性存儲。 每個容器都設(shè)置了 4 GiB 作為其本地臨時性存儲的限制。 因此,整個 Pod 的本地臨時性存儲請求是 4 GiB,且其本地臨時性存儲的限制為 8 GiB。 該限制值中有 500Mi 可供 emptyDir
卷使用。
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: images.my-company.example/app:v4
resources:
requests:
ephemeral-storage: "2Gi"
limits:
ephemeral-storage: "4Gi"
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
- name: log-aggregator
image: images.my-company.example/log-aggregator:v6
resources:
requests:
ephemeral-storage: "2Gi" # 關(guān)鍵配置,注意單位
limits:
ephemeral-storage: "4Gi" # 關(guān)鍵配置,注意單位
volumeMounts:
- name: ephemeral
mountPath: "/tmp"
volumes: # 掛載的卷
- name: ephemeral
emptyDir:
sizeLimit: 500Mi
CSI 臨時卷
使用 CSI 臨時存儲的 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
通用臨時卷
特性狀態(tài): Kubernetes v1.23 [stable]
臨時存放Pod數(shù)據(jù)目錄,創(chuàng)建初始為空。
通用臨時卷與EmptyDir不同的功能特性:
-
存儲可以是本地的,也可以是網(wǎng)絡(luò)連接的。
-
卷可以有固定的大小,Pod 不能超量使用。
-
卷可能有一些初始數(shù)據(jù),這取決于驅(qū)動程序和參數(shù)。
-
支持典型的卷操作,前提是相關(guān)的驅(qū)動程序也支持該操作,包括 快照、 克隆、 調(diào)整大小和 存儲容量跟蹤)。
官方示例:
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
參閱:
k8s存儲:卷、持久卷、存儲類
k8s數(shù)據(jù)存儲詳解
存儲文章來源:http://www.zghlxwxcb.cn/news/detail-605249.html
K8S系列之存儲文章來源地址http://www.zghlxwxcb.cn/news/detail-605249.html
到了這里,關(guān)于K8s卷存儲詳解(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!