Kubernetes 實(shí)操手冊(cè)-數(shù)據(jù)持久化

簡(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ù)萤晴,最常用的就是 PersistentVolumesPersistentVolumeClaims,下面我們將詳細(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ì)的列表和介紹可以參考官方文檔

emptyDirhostPath 屬于節(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)刪除。

image.png

幾個(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ì)聊聊往声。

參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末擂找,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子浩销,更是在濱河造成了極大的恐慌贯涎,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慢洋,死亡現(xiàn)場(chǎng)離奇詭異塘雳,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)且警,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)粉捻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人斑芜,你說(shuō)我怎么就攤上這事肩刃。” “怎么了杏头?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵盈包,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我醇王,道長(zhǎng)呢燥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任寓娩,我火速辦了婚禮叛氨,結(jié)果婚禮上呼渣,老公的妹妹穿的比我還像新娘。我一直安慰自己寞埠,他們只是感情好屁置,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著仁连,像睡著了一般蓝角。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饭冬,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天使鹅,我揣著相機(jī)與錄音,去河邊找鬼昌抠。 笑死患朱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扰魂。 我是一名探鬼主播麦乞,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼劝评!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起倦淀,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蒋畜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后撞叽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體姻成,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年愿棋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了科展。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡糠雨,死狀恐怖才睹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甘邀,我是刑警寧澤琅攘,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站松邪,受9級(jí)特大地震影響坞琴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逗抑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一剧辐、第九天 我趴在偏房一處隱蔽的房頂上張望寒亥。 院中可真熱鬧,春花似錦荧关、人聲如沸溉奕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腐宋。三九已至,卻和暖如春檀轨,著一層夾襖步出監(jiān)牢的瞬間胸竞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工参萄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卫枝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓讹挎,卻偏偏與公主長(zhǎng)得像校赤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筒溃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容