簡(jiǎn)介
Pod 本身存在生命周期隘蝎,因此其內(nèi)部的容器及數(shù)據(jù)均無(wú)法持久存在爱致。對(duì)于 Stateful 的應(yīng)用(如數(shù)據(jù)庫(kù))以及日志文件等哥放,我們都需要持久化數(shù)據(jù)牍鞠,避免在應(yīng)用重啟后丟失數(shù)據(jù)咖摹。Docker 支持配置容器使用存儲(chǔ)卷將數(shù)據(jù)持久化到容器自身文件系統(tǒng)外的存儲(chǔ)空間之中。而 Kubernetes 提供了基于 Pod 的存儲(chǔ)卷功能难述,Kubernetes 給我們提供了很多相關(guān)的資源用于管理持久化的數(shù)據(jù)萤晴,最常用的就是 PersistentVolumes
和 PersistentVolumeClaims
,下面我們將詳細(xì)講講如何在 Kubernetes 集群中持久化數(shù)據(jù)龄广。以下也是以目前最新的 Kubernetes v.1.14.1 版本做介紹硫眯,下面大部分的內(nèi)容都是總結(jié)自官方文檔,若對(duì)基礎(chǔ)比較熟悉的可以跳過(guò)择同,直接進(jìn)入實(shí)操部分。
Kubernetes 中的持久化存儲(chǔ)設(shè)計(jì)
Kubernetes 中的存儲(chǔ)卷稱(chēng)為 Volume净宵,每個(gè) Pod 可以不掛載或者掛載多個(gè) Volumes敲才,這個(gè) Volume 就類(lèi)似于 Docker 的 Volume裹纳,但是它的概念更一般化,可以是宿主機(jī)的路徑紧武,或者是 NFS 等網(wǎng)絡(luò)文件系統(tǒng)剃氧,甚至是云服務(wù)商提供的存儲(chǔ)卷等,詳細(xì)可以參考官方文檔阻星。在 Pod 中配置 Volume 類(lèi)似下面這樣
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
一個(gè)是 volumes
配置項(xiàng)朋鞍,用于聲明這個(gè) Pod 定義了哪些 voluems,另一個(gè)是 volumeMounts
配置項(xiàng)妥箕,用于把定義的 Volume 掛載到具體的容器的一個(gè)路徑上滥酥,通過(guò) volume 的 name 字段相關(guān)聯(lián)。其他類(lèi)型的存儲(chǔ)卷配置也是一樣畦幢,不同的就是 volumes 的定義部分坎吻。
常見(jiàn)的存儲(chǔ)卷類(lèi)型
這里只介紹幾種常見(jiàn)的存儲(chǔ)卷類(lèi)型,詳細(xì)的列表和介紹可以參考官方文檔
emptyDir
和 hostPath
屬于節(jié)點(diǎn)級(jí)別的卷類(lèi)型宇葱,他們依賴(lài)于特定的節(jié)點(diǎn)瘦真。emptyDir
的生命周期與 Pod 一致,在 Pod 刪除后會(huì)一并刪除黍瞧,主要用于 Pod 內(nèi)部多容器之間共享數(shù)據(jù)诸尽,hostPath
就是將節(jié)點(diǎn)的目錄直接掛載到 Pod 上,但是如果 Pod 被調(diào)度到其他節(jié)點(diǎn)印颤,那么數(shù)據(jù)將不可用您机。而 nfs,cephfs膀哲,glusterfs 這些是常用的網(wǎng)絡(luò)文件系統(tǒng)往产,可以供多個(gè) Pod 同時(shí)鏈接。但是首先需要部署相應(yīng)的網(wǎng)絡(luò)文件系統(tǒng)某宪,而且相對(duì)的性能會(huì)比較差仿村,對(duì)于 IO 要求高的應(yīng)用不太適合。另外還有公有云服務(wù)商提供的存儲(chǔ)卷兴喂,如 AWS 的 ElasticBlockStore蔼囊,Azure 的 AzureDisk 等,可以使用基于公有云的存儲(chǔ)服務(wù)提供滿足需求的存儲(chǔ)卷類(lèi)型衣迷。
早期的 Kubernetes 將 Volume 整合在核心代碼之中畏鼓,這非常不便于功能的擴(kuò)展,后來(lái)在 1.9 版本就提出了使用 CSI(Container Storage Interface)作為統(tǒng)一的存儲(chǔ)卷接口(文檔)壶谒,1.14.1 版本處于 GA 階段云矫,詳細(xì)文檔可參考這里。這樣存儲(chǔ)卷也就類(lèi)似于 CNI 一樣汗菜,可以獨(dú)立于核心代碼让禀,便于插件化擴(kuò)展功能挑社。
存儲(chǔ)卷解藕
上面的方式可以快速創(chuàng)建存儲(chǔ)卷,但是這樣的用法有個(gè)問(wèn)題巡揍,一般來(lái)說(shuō)應(yīng)用的模版是由開(kāi)發(fā)人員編輯的痛阻,模版的編輯者必須知道存儲(chǔ)卷的詳細(xì)信息,但是不利于存儲(chǔ)卷的統(tǒng)一管理腮敌。這里 Kubernetes 就設(shè)計(jì)了一個(gè)解藕的方案阱当,即 PersistentVolumes
(PV) 和 PersistentVolumeClaims
(PVC),由存儲(chǔ)卷管理員(或者運(yùn)維部門(mén))負(fù)責(zé)管理所有的存儲(chǔ)卷糜工,定義 PersistentVolumes
弊添,這樣 volumes 就類(lèi)似于 node 一樣是集群的資源,而開(kāi)發(fā)人員只需要按需使用即可啤斗,聲明 PersistentVolumeClaims
表箭,無(wú)需關(guān)心各個(gè)存儲(chǔ)卷的細(xì)節(jié)。
例如钮莲,管理員可以按如下模版定義 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv
labels:
type: test
spec:
capacity:
storage: "5Gi"
accessModes:
- ReadWriteOnce
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /tmp
server: 172.17.0.2
使用 kubectl get pv
可以看到 PV 的狀態(tài)是 Available免钻。
然后開(kāi)發(fā)人員使用如下模版定義 PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-pvc
labels:
type: test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "5Gi"
selector:
matchLabels:
type: test
然后查看 PV 的狀態(tài)就是 Bound 了。
參數(shù)詳解
PV
1. capacity: 指定 PV 的容量崔拥,目前只支持 storage 指定空間大小
2. accessModes: 指定 PV 的訪問(wèn)模式极舔,有以下幾種,PVC 指定的模式必須與對(duì)應(yīng)的 PV 一致
a. ReadWriteOnce: 僅可被耽擱節(jié)點(diǎn)掛載讀寫(xiě)链瓦,簡(jiǎn)寫(xiě)為 RWO
b. ReadOnlyMany: 可被多個(gè)節(jié)點(diǎn)同時(shí)只讀掛載拆魏,簡(jiǎn)寫(xiě)為 ROX
c. ReadWriteMany: 可被多個(gè)節(jié)點(diǎn)同時(shí)讀寫(xiě)掛載,簡(jiǎn)寫(xiě)為 RWX
3. persistentVolumeReclaimPolicy: PV 空間釋放時(shí)的處理機(jī)制慈俯,有以下幾種
a. Retain: 保持不動(dòng)
b. Recycle: 回收空間渤刃,即刪除所有文件,僅部分類(lèi)型支持
c. Delete: 刪除存儲(chǔ)卷贴膘,僅部分云存儲(chǔ)支持
4. volumeMode: 卷類(lèi)型卖子,用作文件系統(tǒng)還是裸格式的塊設(shè)備,默認(rèn)文件系統(tǒng) Filesystem
5. storageClassName: PV 所屬的存儲(chǔ)類(lèi)名稱(chēng)刑峡,默認(rèn)為空洋闽,下面會(huì)講
6. mountOptions: 掛載選項(xiàng)列表
PVC
1. accessModes: PVC 的訪問(wèn)模式,必須與 PV 一致
2. resources: PVC 需要占用的資源最小值突梦,目前僅支持 storage 指定空間大小
3. seletor: 綁定 PV 的標(biāo)簽選擇器或條件表達(dá)式诫舅,類(lèi)似與 Pod 的 Node 選擇器
4. storageClassName: 所依賴(lài)的存儲(chǔ)類(lèi)名稱(chēng),下面會(huì)講
5. volumeMode: 卷類(lèi)型宫患,同 PV
6. volumeName: 用于直接指定要綁定的 PV 卷名
注意刊懈,PVC 是命名空間隔離的,如果使用了多命名空間,ROX/RWX 類(lèi)型的 claim 必須位于同一個(gè)命名空間俏讹。
存儲(chǔ)類(lèi)
上面的解藕方式能夠區(qū)分管理員和開(kāi)發(fā)人員的工作当宴,但是每次新建存儲(chǔ)卷都需要管理員預(yù)先創(chuàng)建 PV(麻煩)畜吊,或者由管理員一次創(chuàng)建大量 PV 供開(kāi)發(fā)人員使用(浪費(fèi))泽疆。對(duì)于管理人員來(lái)說(shuō)還是不太友好(不夠懶!)玲献,所以存儲(chǔ)類(lèi)(storage class)就應(yīng)運(yùn)而生了殉疼。
存儲(chǔ)類(lèi)是 Kubernetes 為管理 PV 創(chuàng)建的邏輯類(lèi)別,類(lèi)似于面向?qū)ο缶幊痰念?lèi)捌年,而 PV 就是具體存儲(chǔ)類(lèi)的實(shí)例瓢娜。有了存儲(chǔ)類(lèi)之后,管理員就可以預(yù)先定義許多不同類(lèi)型的存儲(chǔ)類(lèi)礼预,例如 ssd眠砾,fast,cold 等等托酸,而后由開(kāi)發(fā)人員發(fā)起 PVC 申請(qǐng)創(chuàng)建具體的 PV 使用褒颈,不需要管理員直接參與 PV 的創(chuàng)建了。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
定義如上的 storage class励堡,在需要時(shí)創(chuàng)建 AWS 的 EBS 作為存儲(chǔ)卷谷丸,然后開(kāi)發(fā)人員用 PVC 申請(qǐng)即可。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-claimspec:
accessModes:
- ReadWriteOnce
storageClassName: ebs-sc
resources:
requests:
storage: 4Gi
這樣就實(shí)現(xiàn)了存儲(chǔ)卷的動(dòng)態(tài)供給应结。
參數(shù)詳解
1. provisioner: 存儲(chǔ)卷供給方
2. reclaimPolicy: 存儲(chǔ)卷回收策略
a. Delete: 刪除刨疼,默認(rèn)
b. Retain: 保持不動(dòng),需要手動(dòng)刪除
3. parameters: 其他參數(shù)鹅龄,根據(jù)供給方不同而不同
4. mountOptions: 掛載選項(xiàng)列表
5. volumeBindingMode: 控制綁定的方式
a. Immediate: 當(dāng) PVC 創(chuàng)建時(shí)立即創(chuàng)建揩慕,默認(rèn)
b. WaitForFirstConsumer: 延遲到當(dāng) Pod 使用時(shí)創(chuàng)建
存儲(chǔ)卷生命周期
PV 的生命周期如下所示,PV 由供給(Provisioniong)創(chuàng)建扮休,管理員手動(dòng)創(chuàng)建的是靜態(tài)供給迎卤,由存儲(chǔ)類(lèi)生成的是動(dòng)態(tài)供給。當(dāng)有 PVC 申請(qǐng) PV 后肛炮,PVC 與 PV 綁定止吐,PV 和 PVC 都進(jìn)入 Bound 狀態(tài)。在 Pod 使用完成刪除了 PVC 之后侨糟,PV 進(jìn)入 Released 狀態(tài)碍扔,表明 PV 與 PVC 解綁了,但還未回收秕重〔煌回收 PV 后,根據(jù)設(shè)置刪除存儲(chǔ)卷或者手動(dòng)刪除。
幾個(gè)生命周期相關(guān)的配置項(xiàng)如下:
PV 的 persistentVolumeReclaimPolicy
控制 PV 的回收策略二拐,StorageClass 的 reclaimPolicy
控制生成的 PV 的回收策略服鹅,volumeBindingMode
控制生成的 PV 的綁定策略,詳見(jiàn)上面的參數(shù)詳解百新。
生產(chǎn)實(shí)操
Kubernetes 使用 AWS EBS 作為存儲(chǔ)
簡(jiǎn)介
如果在公有云上部署和運(yùn)行 Kubernetes 集群企软,那么使用公有云提供的存儲(chǔ)服務(wù)將是提高性能和可用性的最佳選擇。我們以 AWS 為例饭望,AWS 提供了 EBS 作為一般需求的塊存儲(chǔ)仗哨。EBS 提供了 SSD,高 IOPS SSD铅辞,HDD厌漂,冷數(shù)據(jù) HDD 等多種類(lèi)型可供選擇,同時(shí)也提供了方便快速的快照功能斟珊,底層數(shù)據(jù)加密等苇倡,可滿足日常的絕大部分使用場(chǎng)景。
前提
項(xiàng)目頁(yè)面介紹了需要使用 AWS EBS 的前提條件
Get yourself familiar with how to setup Kubernetes on AWS and have a working Kubernetes cluster:
Enable flag --allow-privileged=true for kubelet and kube-apiserver
Enable kube-apiserver feature gates --feature-gates=CSINodeInfo=true,CSIDriverRegistry=true,CSIBlockVolume=true,VolumeSnapshotDataSource=true
Enable kubelet feature gates --feature-gates=CSINodeInfo=true,CSIDriverRegistry=true,CSIBlockVolume=true
具體的操作如下:
二進(jìn)制方式安裝的話囤踩,在 kube-apiserver 的啟動(dòng)參數(shù)上增加--allow-privileged=true --feature-gates=CSINodeInfo=true,CSIDriverRegistry=true,CSIBlockVolume=true,VolumeSnapshotDataSource=true
旨椒。
如果使用 kubeadm 初始化,則修改初始化配置文件像下面這樣高职,詳細(xì)的安裝步驟可以參考這篇文章钩乍,主要是添加 api-server 的兩行配置
apiServer:
extraArgs:
authorization-mode: Node,RBAC
allow-privileged: "true" # add allow-privileged for api-server
feature-gates: "CSINodeInfo=true,CSIDriverRegistry=true,CSIBlockVolume=true,VolumeSnapshotDataSource=true" # enable feature-gates for api-server
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: ""
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.14.1
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
kubelet 的參數(shù)不用修改,1.14.1 版本的 kubelet 默認(rèn)已啟用怔锌。
安裝
配置權(quán)限
首先確保集群的每個(gè)實(shí)例有足夠的 IAM 權(quán)限來(lái)創(chuàng)建和刪除 EBS寥粹,最簡(jiǎn)單的辦法是給集群的每個(gè)實(shí)例賦予一個(gè) IAM Role,給這個(gè) IAM Role EC2 Full Access 的權(quán)限埃元,或者至少包含如下的權(quán)限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:AttachVolume",
"ec2:CreateSnapshot",
"ec2:CreateTags",
"ec2:CreateVolume",
"ec2:DeleteSnapshot",
"ec2:DeleteTags",
"ec2:DeleteVolume",
"ec2:DescribeInstances",
"ec2:DescribeSnapshots",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:DetachVolume"
],
"Resource": "*"
}
]
}
另外也可以用 AWS secret key 的方式寫(xiě)入每個(gè)機(jī)器的 profile 文件(參考文檔)或者放入集群的 Secret涝涤。
部署驅(qū)動(dòng)
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/master/deploy/kubernetes/manifest.yaml
查看驅(qū)動(dòng)是否運(yùn)行
kubectl get pods -n kube-system
會(huì)有類(lèi)似這樣的 Pod
ebs-csi-controller-0 6/6 Running 0 2d16h
ebs-csi-node-nfttl 3/3 Running 0 2d16h
使用
更多的使用示例可以參考官方文檔,這里詳細(xì)說(shuō)明下幾個(gè)常用的場(chǎng)景岛杀。
動(dòng)態(tài)分配
動(dòng)態(tài)分配是由管理員創(chuàng)建存儲(chǔ)類(lèi)模版阔拳,而用戶使用時(shí)只需要從對(duì)應(yīng)的存儲(chǔ)類(lèi)中創(chuàng)建申請(qǐng)即可,用戶不需要關(guān)心每個(gè)存儲(chǔ)類(lèi)的具體細(xì)節(jié)类嗤。
創(chuàng)建 storage class 模版storageclass.yaml
kind: StorageClassapiVersion: storage.k8s.io/v1
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
創(chuàng)建
kubectl apply -f storageclass.yaml
創(chuàng)建 PersistentVolumeClaim 存儲(chǔ)申請(qǐng)模版claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: ebs-sc
resources:
requests:
storage: 4Gi
創(chuàng)建
kubectl apply -f claim.yaml
查看 PersistentVolumeClaim 的狀態(tài)糊肠,顯示為 Pending,有容器掛載后即可使用遗锣。
kubectl get pvc
創(chuàng)建一個(gè)測(cè)試用的 Pod pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: ebs-claim
創(chuàng)建
kubectl apply -f pod.yaml
等待片刻货裹,查看 PersistentVolumeClaim 和 PersistentVolume,即可看到狀態(tài)顯示為Bound
精偿,且多了一塊新創(chuàng)建的 Volume弧圆。
查看 Volume 的詳細(xì)信息
kubectl describe pv
可看到類(lèi)似下面這樣的信息赋兵,描述了 EBS 的 volume ID,可以在 AWS 控制臺(tái)看到搔预。
Source:
Type: CSI (a Container Storage Interface (CSI) volume source)
Driver: ebs.csi.aws.com
VolumeHandle: vol-0e447f0fffaf978c9
ReadOnly: false
進(jìn)入剛才創(chuàng)建的 Pod
kubectl exec app -ti bash
可以使用df -h
命令看到掛載的磁盤(pán)在/data
目錄霹期,且里面已經(jīng)有內(nèi)容在輸出。
從快照創(chuàng)建盤(pán)
動(dòng)態(tài)分配是每次啟動(dòng) Pod 都會(huì)從設(shè)置的存儲(chǔ)類(lèi)中創(chuàng)建一個(gè)新的存儲(chǔ)卷拯田,而對(duì)于線上環(huán)境历造,我們往往需要的是持久化數(shù)據(jù),而不是每次都新建勿锅。所以一種更常見(jiàn)的使用場(chǎng)景是我們定時(shí)對(duì)數(shù)據(jù)拍攝快照帕膜,而創(chuàng)建 Pod 后掛載使用最新快照的存儲(chǔ)卷(數(shù)據(jù)更新相對(duì)不太頻繁的情況)。
創(chuàng)建一個(gè) snapshot class 資源snapshotclass.yaml
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshotClass
metadata:
name: csi-aws-vsc
snapshotter: ebs.csi.aws.com
創(chuàng)建
kubectl apply -f snapshotclass.yaml
像上面一樣創(chuàng)建一個(gè) Pod 并綁定一個(gè) EBS溢十,用于創(chuàng)建快照app.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: ebs-sc
resources:
requests:
storage: 4Gi
---
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: ebs-claim
創(chuàng)建
kubectl apply -f app.yaml
查看創(chuàng)建的 Volume,并查看容器生產(chǎn)文件的時(shí)間达吞,記一下這個(gè)時(shí)間张弛,用于等會(huì)從快照創(chuàng)建后檢查
kubectl describe pv
kubectl exec -it app cat /data/out.txt
然后從當(dāng)前的 Volume Claim 創(chuàng)建 snapshot snapshot.yaml
apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
name: ebs-volume-snapshot
spec:
snapshotClassName: csi-aws-vsc
source:
name: ebs-claim
kind: PersistentVolumeClaim
創(chuàng)建
kubectl apply -f snapshot.yaml
查看 snapshot 的創(chuàng)建狀態(tài),也可以在 AWS 控制臺(tái)上看到
kubectl describe volumesnapshot
等待狀態(tài)欄顯示的Ready To Use: true
酪劫,即表示快照創(chuàng)建成功吞鸭。
然后我們刪除 Pod 和 PersistentVolumeClaim,查看原先的 EBS 會(huì)被刪除覆糟,但是快照還在刻剥。然后我們創(chuàng)建新的 PersistentVolumeClaim,并從之前的快照中恢復(fù)數(shù)據(jù) restore-claim.yaml
滩字。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-snapshot-restored-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: ebs-sc
resources:
requests:
storage: 4Gi
dataSource:
name: ebs-volume-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
注意dataSource
這段造虏,創(chuàng)建
kubectl apply -f restore-claim.yaml
我們繼續(xù)使用這個(gè) PersistentVolumeClaim 創(chuàng)建新的 Pod restore-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: centos
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"]
volumeMounts:
- name: persistent-storage
mountPath: /data
volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: ebs-snapshot-restored-claim
待容器啟動(dòng)后,我們可以查看一下生成的輸出文件麦箍,是不是包含了之前的數(shù)據(jù)漓藕。
kubectl exec -it app cat /data/out.txt
這樣就可以讓 Pod 在失敗后自動(dòng)接上之前的數(shù)據(jù),但是這還是基于快照的頻率和數(shù)據(jù)更新的頻率挟裂。對(duì)于兩次快照之間的數(shù)據(jù)是沒(méi)發(fā)恢復(fù)的享钞,就需要采取其他的措施保留并恢復(fù)了,這里就不展開(kāi)了诀蓉。這種用法比較適用于數(shù)據(jù)不太頻繁更新或者實(shí)時(shí)性要求不高的場(chǎng)景栗竖。
更多的 EBS 參數(shù)
我們可以修改創(chuàng)建的 EBS 的一些參數(shù),詳細(xì)的參數(shù)解釋可以查看 AWS 的官方文檔渠啤。主要是文件格式狐肢,EBS 類(lèi)型,IOPS埃篓,加密处坪。
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ebs-sc
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
fsType: xfs
type: io1
iopsPerGB: "50"
encrypted: "true"
更復(fù)雜的場(chǎng)景
上面的用法主要適用于非頻繁更新的場(chǎng)景,如每天一更新的只讀數(shù)據(jù),這樣使用非常便于快速的橫向擴(kuò)展與成本控制同窘。但是如果是頻繁的寫(xiě)更新或者實(shí)時(shí)性要求較高的場(chǎng)景玄帕,如日志文件的收集,數(shù)據(jù)庫(kù)等想邦,建議的用法是使用各個(gè)應(yīng)用提供的高可用方案裤纹,而不是使用存儲(chǔ)卷來(lái)做高可用。例如丧没,日志文件可以用 flufluentd 或者 logstash 等收集到 Elasticsearch 中持久化鹰椒,長(zhǎng)期備份文件可以用 NFS 或者 GlusterFS 等網(wǎng)絡(luò)存儲(chǔ)。對(duì)于數(shù)據(jù)庫(kù)產(chǎn)品呕童,使用數(shù)據(jù)庫(kù)本身的集群復(fù)制漆际、主從方案,在性能和可用性上要遠(yuǎn)遠(yuǎn)好于定期備份存儲(chǔ)卷的方案夺饲,存儲(chǔ)卷的備份可以作為一種輔助手段奸汇。 這篇文章就不在深入,后面有機(jī)會(huì)聊聊往声。