kubernetes12(kubernetes的储存)
文章目錄
- kubernetes12(kubernetes的儲(chǔ)存)
- 一.引子
- 二.kubenetes的儲(chǔ)存分類及基本概念
- (一).kubernetes的儲(chǔ)存基本概念
- (二).kubernetes的儲(chǔ)存重要概念
- 三.基于以上四個(gè)概念的kubenetes儲(chǔ)存配置
- (一).volumes
- (二).PersistentVolume(PV和PVC結(jié)合比較)
- (三).StorageClass
- (四). PersistentVolumeClaim
- (五).關(guān)于 StatefulSet (管理有狀態(tài)服務(wù)的POD)
kubernetes12(kubernetes的儲(chǔ)存)
一.引子
任何系統(tǒng)或服務(wù)都離不開(kāi)的就是儲(chǔ)存,在當(dāng)前時(shí)代,數(shù)據(jù)丟失的影響是非常大的。911事件之中大量公司破產(chǎn)就是因?yàn)閿?shù)據(jù)丟失,公司直接清零。所以儲(chǔ)存是非常重要的。接下來(lái)筆者帶大家走進(jìn)kuberbetes的儲(chǔ)存世界。kubernetes說(shuō)到底還是進(jìn)行容器的管理,大家可以看看以前筆者寫的關(guān)于docker的儲(chǔ)存管理。
在此章節(jié)開(kāi)始之前,筆者帶大家復(fù)習(xí)一下知識(shí)點(diǎn)有狀態(tài)服務(wù)和無(wú)狀態(tài)服務(wù):無(wú)狀態(tài)應(yīng)用(Stateless Application)是指應(yīng)用不會(huì)在會(huì)話中保存下次會(huì)話所需要的客戶端數(shù)據(jù)。每一個(gè)會(huì)話都像首次執(zhí)行一樣,不會(huì)依賴之前的數(shù)據(jù)進(jìn)行響應(yīng)。有狀態(tài)的應(yīng)用(Stateful Application)是指應(yīng)用會(huì)在會(huì)話中保存客戶端的數(shù)據(jù),并在客戶端下一次的請(qǐng)求中來(lái)使用那些數(shù)據(jù)。
二.kubenetes的儲(chǔ)存分類及基本概念
(一).kubernetes的儲(chǔ)存基本概念
容器中的存儲(chǔ)都是臨時(shí)的,因此Pod重啟的時(shí)候,內(nèi)部的數(shù)據(jù)會(huì)發(fā)生丟失。實(shí)際應(yīng)用中,我們有些應(yīng)用是無(wú)狀態(tài),有些應(yīng)用則需要保持狀態(tài)數(shù)據(jù),確保Pod重啟之后能夠讀取到之前的狀態(tài)數(shù)據(jù),有些應(yīng)用則作為集群提供服務(wù)。這三種服務(wù)歸納為無(wú)狀態(tài)服務(wù)、有狀態(tài)服務(wù)以及有狀態(tài)的集群服務(wù),其中后面兩個(gè)存在數(shù)據(jù)保存與共享的需求,因此就要采用容器外的存儲(chǔ)方案。
(二).kubernetes的儲(chǔ)存重要概念
Kubernetes中存儲(chǔ)中有四個(gè)重要的概念:Volume、PersistentVolume (PV)、PersistentVolumeClaim(PVC)、StorageClass。掌握了這四個(gè)概念,就掌握了Kubernetes中存儲(chǔ)系統(tǒng)的核心。
- Volumes:最基礎(chǔ)的存儲(chǔ)抽象,其支持多種類型,包括本地存儲(chǔ)、NFS、FC以及眾多的云存儲(chǔ),我們也可以編寫自己的存儲(chǔ)插件來(lái)支持特定的存儲(chǔ)系統(tǒng)。Volume可以被Pod直接使用,也可以被PV使用。普通的Volume和Pod之間是一種靜態(tài)的綁定關(guān)系,在定義Pod的同時(shí),通過(guò)volume屬性來(lái)定義存儲(chǔ)的類型,通過(guò)volumeMount來(lái)定義容器內(nèi)的掛載點(diǎn)。
- PersistentVolume:與普通的Volume不同,PV是Kubernetes中的一個(gè)資源對(duì)象,創(chuàng)建一個(gè)PV相當(dāng)于創(chuàng)建了一個(gè)存儲(chǔ)資源對(duì)象,這個(gè)資源的使用要通過(guò)PVC來(lái)請(qǐng)求。
- StorageClass:StorageClass為管理員提供了一種描述他們提供的存儲(chǔ)的“類”的方法。 不同的類可能映射到服務(wù)質(zhì)量級(jí)別,或備份策略,或者由群集管理員確定的任意策略。
- PersistentVolumeClaim:PVC是用戶對(duì)存儲(chǔ)資源PV的請(qǐng)求,根據(jù)PVC中指定的條件Kubernetes動(dòng)態(tài)的尋找系統(tǒng)中的PV資源并進(jìn)行綁定。目前PVC與PV匹配可以通過(guò)StorageClassName、matchLabels或者matchExpressions三種方式。
大家可以通過(guò)以下圖示了解四者之間的關(guān)系:
三.基于以上四個(gè)概念的kubenetes儲(chǔ)存配置
(一).volumes
1.volumes的概念
容器磁盤上的文件的生命周期是短暫的,這就使得在容器中運(yùn)行重要應(yīng)用時(shí)會(huì)出現(xiàn)一些問(wèn)題。首先,當(dāng)容器崩潰時(shí),kubelet 會(huì)重啟它,但是容器中的文件將丟失——容器以干凈的狀態(tài)(鏡像最初的狀態(tài))重新啟動(dòng)。其次,在 Pod 中同時(shí)運(yùn)行多個(gè)容器時(shí),這些容器之間通常需要共享文件。Kubernetes 中的 Volume 抽象就很好的解決了這些問(wèn)題背后的實(shí)現(xiàn)方式可以有很多種。
Kubernetes 中的卷有明確的壽命 —— 與封裝它的 Pod 相同。所f以,卷的生命比 Pod 中的所有容器都長(zhǎng),當(dāng)這個(gè)容器重啟時(shí)數(shù)據(jù)仍然得以保存。當(dāng)然,當(dāng) Pod 不再存在時(shí),卷也將不復(fù)存在。也許更重要的是,Kubernetes 支持多種類型的卷,Pod 可以同時(shí)使用任意數(shù)量的卷
2.Volumes支持卷的類型:
- awsElasticBlockStoreazureDiskazureFilecephfscsidownwardAPIemptyDir`
- fcflockergcePersistentDiskgitRepoglusterfshostPathiscsilocalnfs`
- persistentVolumeClaimprojectedportworxVolumequobyterbdscaleIOsecret`
- storageos vsphereVolume
3.volumes支持的一些典型卷的配置
(1).emptyDir
emptyDir在Pod被分配到Node上之后創(chuàng)建,并且在Pod運(yùn)行期間一直存在。初始的時(shí)候?yàn)橐粋€(gè)空文件夾,當(dāng)Pod從Node中移除時(shí),emptyDir將被永久刪除。Container的意外退出并不會(huì)導(dǎo)致emptyDir被刪除。emptyDir適用于一些臨時(shí)存放數(shù)據(jù)的場(chǎng)景。默認(rèn)情況下,emptyDir存儲(chǔ)在Node支持的介質(zhì)上,不管是磁盤、SSD還是網(wǎng)絡(luò)存儲(chǔ),也可以設(shè)置為Memory。
emptyDir` 的用法有:
- 暫存空間,例如用于基于磁盤的合并排序
- 用作長(zhǎng)時(shí)間計(jì)算崩潰恢復(fù)時(shí)的檢查點(diǎn)
- Web服務(wù)器容器提供數(shù)據(jù)時(shí),保存內(nèi)容管理器容器提取的文件
簡(jiǎn)單實(shí)例
apiVersion: v1 kind: Pod metadata:name: test-pd spec:containers:- image: k8s.gcr.io/test-webservername: test-containervolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}(2).hostPath
卷將主機(jī)節(jié)點(diǎn)的文件系統(tǒng)中的文件或目錄掛載到集群中。
hostPath的用途如下:
- 運(yùn)行需要訪問(wèn) Docker 內(nèi)部的容器;使用 /var/lib/docker的 hostPath
- 在容器中運(yùn)行 cAdvisor;使用 /dev/cgroups 的 hostPath
- 允許 pod 指定給定的 hostPath 是否應(yīng)該在 pod 運(yùn)行之前存在,是否應(yīng)該創(chuàng)建,以及它應(yīng)該以什么形式存在
實(shí)例
apiVersion: v1 kind: Pod metadata:name: test-pd spec:containers:- image: k8s.gcr.io/test-webservername: test-containervolumeMounts:- mountPath: /test-pdname: test-volumevolumes:- name: test-volumehostPath:# directory location on hostpath: /data# this field is optionaltype: Directory(二).PersistentVolume(PV和PVC結(jié)合比較)
1.PV與PVC的結(jié)合比較
- Persistent Volumes 提供了一個(gè)抽象層,向用戶屏蔽了具體的存儲(chǔ)實(shí)現(xiàn)形式。
- PersistentVolume
PV:集群管理員提供的一塊存儲(chǔ),是Volumes的插件,類似于Pod,但是具有獨(dú)立于Pod的生命周期。具體存儲(chǔ)可以是NFS、云服務(wù)商提供的存儲(chǔ)服務(wù)。 - PersistentVolumeClaim PVC:PVC是用戶的存儲(chǔ)請(qǐng)求,PVC消耗PV資源。是用戶存儲(chǔ)的請(qǐng)求。它與 Pod相似。Pod 消耗節(jié)點(diǎn)資源,PVC 消耗 PV 資源。Pod 可以請(qǐng)求特定級(jí)別的資源(CPU和內(nèi)存)。聲明可以請(qǐng)求特定的大小和訪問(wèn)模式(例如,可以以讀/寫一次或 只讀多次模式掛載)
2.PV與PVC相互作用的生命周期
PV和PVC之間的相互作用遵循這個(gè)生命周期:Provisioning ——-> Binding
——–>Using——>Releasing——>Recycling
(1).PV的提供方式(Provisioning)
- 靜態(tài)供給(static):集群管理員創(chuàng)建多個(gè)PV。 它們攜帶可供集群用戶使用的真實(shí)存儲(chǔ)的詳細(xì)信息。 它們存在于KubernetesAPI中,可用于消費(fèi)。
- 動(dòng)態(tài)供給:管理員創(chuàng)建的靜態(tài) PV 都不匹配用戶的 PersistentVolumeClaim 時(shí),集群可能會(huì)嘗試動(dòng)態(tài)地為 PVC創(chuàng)建卷。此配置基于 StorageClasses:PVC 必須請(qǐng)求 [存儲(chǔ)類],并且管理員必須創(chuàng)建并配置該類才能進(jìn)行動(dòng)態(tài)創(chuàng)建。聲明該類為 “” 可以有效地禁用其動(dòng)態(tài)配置 要啟用基于存儲(chǔ)級(jí)別的動(dòng)態(tài)存儲(chǔ)配置,集群管理員需要啟用 API server 上的DefaultStorageClass[準(zhǔn)入控制器] 。例如,通過(guò)確保 DefaultStorageClass 位于 API server組件的 --admission-control標(biāo)志,使用逗號(hào)分隔的有序值列表中,可以完成此操作
(2).綁定(Binding)
- 在動(dòng)態(tài)配置的情況下,用戶創(chuàng)建或已經(jīng)創(chuàng)建了具有特定數(shù)量的存儲(chǔ)請(qǐng)求和特定訪問(wèn)模式的PersistentVolumeClaim。主機(jī)中的控制回路監(jiān)視新的PVC,找到匹配的PV(如果可能),并將它們綁定在一起。如果為新的PVC動(dòng)態(tài)配置PV,則循環(huán)將始終將該P(yáng)V綁定到PVC。 否則,用戶總是至少得到他們要求的內(nèi)容,但是卷可能超出了要求。一旦綁定,PersistentVolumeClaim綁定是排他的,不管他們?nèi)绾谓壎ā?/li>
- 如果匹配的卷不存在,PVC將保持無(wú)限期。 隨著匹配卷變得可用,PVC將被綁定。 例如,提供許多50GiPV的集群將不匹配要求100Gi的PVC。 當(dāng)集群中添加100Gi PV時(shí),可以綁定PVC。
(3).使用(Using)
- Pod使用PVC作為卷。 集群檢查聲明以找到綁定的卷并掛載該卷的卷。
對(duì)于支持多種訪問(wèn)模式的卷,用戶在將其聲明用作pod中的卷時(shí)指定所需的模式。 - 一旦用戶有聲明并且該聲明被綁定,綁定的PV屬于用戶,只要他們需要它。
用戶通過(guò)在其Pod的卷塊中包含persistentVolumeClaim來(lái)安排Pods并訪問(wèn)其聲明的PV。 - 在用對(duì)象保護(hù):PVC 保護(hù)的目的是確保由 pod 正在使用的 PVC 不會(huì)從系統(tǒng)中移除,因?yàn)槿绻灰瞥脑捒赡軙?huì)導(dǎo)致數(shù)據(jù)丟失。對(duì)于正在使用的PV提供了保護(hù)機(jī)制,正在使用的PV如果被用戶刪除,PV的刪除會(huì)推遲到用戶對(duì)PV的使用結(jié)束。
(4).釋放(Releasing)
- 當(dāng)用戶完成卷時(shí),他們可以從允許資源回收的API中刪除PVC對(duì)象。 當(dāng)聲明被刪除時(shí),卷被認(rèn)為是“釋放的”,但是它還不能用于另一個(gè)聲明。以前的用戶的數(shù)據(jù)仍然保留在必須根據(jù)政策處理的卷上.
(5).回收及回收策略(Recycling)
- Retain(保留)—— 手動(dòng)回收,保留現(xiàn)場(chǎng),Kubernetes等待用戶手工處理數(shù)據(jù)。
- Reclaim (重用)—— 這個(gè)策略已經(jīng)不推薦使用了,應(yīng)該使用 Dynamic Provisioning 代替。
- Recycle(回收)——基本擦除(rm -rf /thevolume/*)
- Delete(刪除)——關(guān)聯(lián)的存儲(chǔ)資產(chǎn)(例如 AWS EBS、GCE PD、Azure Disk 和 OpenStack Cinder 卷)將被刪除
- 擴(kuò)容——主要是對(duì)于一些云存儲(chǔ)類型,例如gcePersistentDisk、Azure Disk提供了擴(kuò)容特性,在1.11版本還處于測(cè)試階段。
當(dāng)前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持刪除策略
3.Persistent Volumes 的一些屬性和狀態(tài)
(1).PV屬性
- Capacity:一般情況PV擁有固定的容量
- Volume Mode:在1.9版本中是alpha特性,允許設(shè)置 filesystem 使用文件系統(tǒng)(默認(rèn)),設(shè)置 raw 使用裸設(shè)備。
- Access Modes:當(dāng)請(qǐng)求具有特定訪問(wèn)模式的存儲(chǔ)時(shí),聲明使用與卷相同的約定
- Class:可以設(shè)置成StorageClass的名稱。具有Class屬性的PV只能綁定到還有相同CLASS名稱的PVC上。沒(méi)有CLASS的PV只能綁定到?jīng)]有CLASS的PVC上。
(2).PV狀態(tài)
- Available:未被任何PVC使用
- Bound:綁定到了PVC上
- Released:PVC被刪掉,資源未被使用
- Failed:自動(dòng)回收失敗
(三).StorageClass
每個(gè)StorageClass包含字段provisioninger和參數(shù),當(dāng)屬于類的PersistentVolume需要?jiǎng)討B(tài)配置時(shí)使用。
StorageClass對(duì)象的名稱很重要,用戶可以如何請(qǐng)求特定的類。 管理員在首次創(chuàng)建StorageClass對(duì)象時(shí)設(shè)置類的名稱和其他參數(shù),并且在創(chuàng)建對(duì)象后無(wú)法更新對(duì)象。
管理員可以僅為不要求任何特定類綁定的PVC指定默認(rèn)的StorageClass:有關(guān)詳細(xì)信息,請(qǐng)參閱PersistentVolumeClaim部分。
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata:name: standard provisioner: kubernetes.io/aws-ebs parameters:type: gp2(四). PersistentVolumeClaim
是用戶存儲(chǔ)的請(qǐng)求。它與 Pod 相似。Pod 消耗節(jié)點(diǎn)資源,PVC 消耗 PV 資源。Pod 可以請(qǐng)求特定級(jí)別的資源(CPU 和內(nèi)存)。聲明可以請(qǐng)求特定的大小和訪問(wèn)模式(例如,可以以讀/寫一次或 只讀多次模式掛載)
創(chuàng)建服務(wù)并使用PVC
apiVersion: v1 kind: Service metadata:name: nginxlabels:app: nginx spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata:name: web spec:selector:matchLabels:app: nginxserviceName: "nginx"replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: k8s.gcr.io/nginx-slim:0.8ports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "nfs"resources:requests:storage: 1Gi(五).關(guān)于 StatefulSet (管理有狀態(tài)服務(wù)的POD)
1.statefulset對(duì)pod的基礎(chǔ)管理
- 匹配 Pod name ( 網(wǎng)絡(luò)標(biāo)識(shí) ) 的模式為:(statefulset名稱)-(序號(hào)),比如上面的示例:web-0,web-1,web-2
- StatefulSet 為每個(gè) Pod 副本創(chuàng)建了一個(gè) DNS 域名,這個(gè)域名的格式為: (podname).(headless server name),也就意味著服務(wù)間是通過(guò)Pod域名來(lái)通信而非 Pod IP,因?yàn)楫?dāng)Pod所在Node發(fā)生故障時(shí), Pod 會(huì)被飄移到其它 Node 上,Pod IP 會(huì)發(fā)生變化,但是 Pod 域名不會(huì)有變化
- StatefulSet 使用 Headless 服務(wù)來(lái)控制 Pod 的域名,這個(gè)域名的 FQDN 為:(service name).(namespace).svc.cluster.local,其中,“cluster.local” 指的是集群的域名
- 根據(jù) volumeClaimTemplates,為每個(gè) Pod 創(chuàng)建一個(gè) pvc,pvc 的命名規(guī)則匹配模式:(volumeClaimTemplates.name)-(pod_name),比如上面的 volumeMounts.name=www, Pod name=web-[0-2],因此創(chuàng)建出來(lái)的 PVC 是 www-web-0、www-web-1、www-web-2**
- 刪除 Pod 不會(huì)刪除其 pvc,手動(dòng)刪除 pvc 將自動(dòng)釋放 pv
2.Statefulset的啟停順序:
- 有序部署:部署StatefulSet時(shí),如果有多個(gè)Pod副本,它們會(huì)被順序地創(chuàng)建(從0到N-1)并且,在下一個(gè)Pod運(yùn)行之前所有之前的Pod必須都是Running和Ready狀態(tài)。
- 有序刪除:當(dāng)Pod被刪除時(shí),它們被終止的順序是從N-1到0。
- 有序擴(kuò)展:當(dāng)對(duì)Pod執(zhí)行擴(kuò)展操作時(shí),與部署一樣,它前面的Pod必須都處于Running和Ready狀態(tài)。
3.StatefulSet使用場(chǎng)景:
- 穩(wěn)定的持久化存儲(chǔ),即Pod重新調(diào)度后還是能訪問(wèn)到相同的持久化數(shù)據(jù),基于 PVC 來(lái)實(shí)現(xiàn)。
- 穩(wěn)定的網(wǎng)絡(luò)標(biāo)識(shí)符,即 Pod 重新調(diào)度后其 PodName 和 HostName 不變。
- 有序部署,有序擴(kuò)展,基于 init containers 來(lái)實(shí)現(xiàn)。
- 有序收縮。
kubernetes修行不易,不積硅步無(wú)以至千里。
參考文章:
https://kubernetes.io/docs/concepts/storage/volumes/
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
https://kubernetes.io/docs/concepts/storage/storage-classes/
https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/
https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
總結(jié)
以上是生活随笔為你收集整理的kubernetes12(kubernetes的储存)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: empire-CVE-2018-1946
- 下一篇: 西门子PCS7常见报警及故障说明