【轉(zhuǎn)】kubernetes 磁盤告丢、PV、PVC以及MySQL部署

6.1.介紹卷

6.1.1.卷的類型

emptyDir-用于存儲臨時數(shù)據(jù)的簡單空目錄

hostPath-用于將目錄從工作節(jié)點(diǎn)的文件系統(tǒng)掛載到pod

nfs-掛載到pod中的NFS共享卷垒玲。

還有其他的如gitRepo陆馁、gcepersistenDisk

6.2.通過卷在容器間共享數(shù)據(jù)

6.2.1.使用emptyDir卷

卷的生命周期與pod的生命周期項(xiàng)關(guān)聯(lián),所以當(dāng)刪除pod時合愈,卷的內(nèi)容就會丟失叮贩。

使用empty示例代碼如下:

apiVersion: v1

kind: Pod

metadata:

name: fortune

spec:

containers:

- image: luksa/fortune

name: html-gener

volumeMounts:

- name: html

mountPath: /usr/share/nginx

readOnly: true

- image: nginx/aplin

name: web-service

volumeMounts:

- name: html

mountPath: /usr/share

readOnly: true

volumes:

- name: html                        //一個名為html的單獨(dú)emptyDir卷,掛載在上面的兩個容器中

emptyDir: {}

6.3.訪問工作節(jié)點(diǎn)文件系統(tǒng)上的文件

6.3.1.hostPath卷

hostPath是持久性存儲佛析,emptyDir卷的內(nèi)容隨著pod的刪除而刪除妇汗。

使用hostPath會發(fā)現(xiàn)當(dāng)刪除一個pod,并且下一個pod使用了指向主機(jī)上相同路徑的hostPath卷说莫,則新pod將會發(fā)現(xiàn)上一個pod留下的數(shù)據(jù)杨箭,但前提是必須將其調(diào)度到與第一個pod相同的節(jié)點(diǎn)上。

所以當(dāng)你使用hostPath時請務(wù)必考慮清楚储狭,當(dāng)重新起一個pod時候互婿,必須要保證pod的節(jié)點(diǎn)與之前相同捣郊。

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

6.4.使用持久化存儲

怎樣保證pod重新啟動后調(diào)度到任意一個節(jié)點(diǎn)都有相同的數(shù)據(jù)可用,這就需要做到持久化存儲慈参。

因此必須要將數(shù)據(jù)存儲在某種類型的網(wǎng)絡(luò)存儲(NAS)中呛牲。

各種支持的方式不盡相同,例如 GlusterFS 需要創(chuàng)建 Endpoint驮配,Ceph/NFS 之流就沒這么麻煩了娘扩。

6.4.1.使用NFS存儲

以NFS為例,yml代碼如下:

image

6.4.2.configmap和secert

secret和configmap可以理解為特殊的存儲卷壮锻,但是它們不是給Pod提供存儲功能的琐旁,而是提供了從集群外部向集群內(nèi)部的應(yīng)用注入配置信息的功能。ConfigMap扮演了K8S集群中配置中心的角色猜绣。ConfigMap定義了Pod的配置信息灰殴,可以以存儲卷的形式掛載至Pod中的應(yīng)用程序配置文件目錄,從configmap中讀取配置信息掰邢;也可以基于環(huán)境變量的形式牺陶,從ConfigMap中獲取變量注入到Pod容器中使用。但是ConfigMap是明文保存的辣之,如果用來保存數(shù)據(jù)庫賬號密碼這樣敏感信息掰伸,就非常不安全。一般這樣的敏感信息配置是通過secret來保存怀估。secret的功能和ConfigMap一樣碱工,不過secret是通過Base64的編碼機(jī)制保存配置信息。

從ConfigMap中獲取配置信息的方法有兩種:

  • 一種是利用環(huán)境變量將配置信息注入Pod容器中的方式奏夫,這種方式只在Pod創(chuàng)建的時候生效怕篷,這就意味著在ConfigMap中的修改配置信息后,更新的配置不能被已經(jīng)創(chuàng)建Pod容器所應(yīng)用酗昼。
  • 另一種是將ConfigMap做為存儲卷掛載至Pod容器內(nèi)廊谓,這樣在修改ConfigMap配置信息后,Pod容器中的配置也會隨之更新麻削,不過這個過程會有稍微的延遲蒸痹。

ConfigMap當(dāng)作存儲卷掛載至Pod中的用法:

apiVersion: v1

kind: Pod

metadata:

name: pod-configmap-vol-2

labels:

name: pod-configmap-vol-2

spec:

containers:

- name: myapp

image: ikubernetes/myapp:v1

volumeMounts:

- name: my-cm-www

mountPath: /etc/nginx/conf.d/ # 將名為my-www的configmap掛載至Pod容器的這個目錄下。

volumes:

- name: my-cm-www

configMap: # 存儲卷類型選configMap

secert的方法類似呛哟,只是secert對數(shù)據(jù)進(jìn)行了加密

6.5.從底層存儲技術(shù)解耦pod

6.5.1.介紹持久卷和持久卷聲明

當(dāng)集群用戶需要在其pod中使用持久化存儲時叠荠,他們首先創(chuàng)建持久化聲明(PVC)清單,指定所需要的最低容量要求扫责,和訪問模式榛鼎,然后用戶將持久卷聲明清單提交給kubernetes API服務(wù)器,kubernetes將找到可以匹配的持久卷并將其綁定到持久卷聲明。

持久卷聲明可以當(dāng)做pod中的一個卷來使用者娱,其他用戶不能使用相同的持久卷抡笼,除非先通過刪除持久卷聲明綁定來釋放。

6.5.2.創(chuàng)建持久卷

下面創(chuàng)建一個 PV mypv1黄鳍,配置文件pv1.yml 如下:

apiVersion: v1

kind: PersistentVolume

metadata:

name: yh_pv1

spec:

capacity:

storage: 1Gi ``//capacity 指定 PV 的容量為 1G

accessModes: ``//accessModes 指定訪問模式為 ReadWriteOnce

- ReadWriteOnce

persistentVolumeReclaimpolicy: Recycle ``//persistentVolumeReclaimPolicy 指定當(dāng) PV 的回收策略為 Recycle

storageClassName: nfs ``//storageClassName 指定 PV 的 class 為 nfs推姻。相當(dāng)于為 PV 設(shè)置了一個分類,PVC 可以指定 class 申請相應(yīng) class 的 PV框沟。

nfs:

path: /nfs/data ``//指定 PV 在 NFS 服務(wù)器上對應(yīng)的目錄

server: 10.10.0.11

1.accessModes 指定訪問模式為 ReadWriteOnce藏古,支持的訪問模式有:

ReadWriteOnce – PV 能以 read-write 模式 mount 到單個節(jié)點(diǎn)。
  ReadOnlyMany – PV 能以 read-only 模式 mount 到多個節(jié)點(diǎn)忍燥。
  ReadWriteMany – PV 能以 read-write 模式 mount 到多個節(jié)點(diǎn)拧晕。

2.persistentVolumeReclaimPolicy 指定當(dāng) PV 的回收策略為 Recycle,支持的策略有:
  Retain – 需要管理員手工回收灾前。
  Recycle – 清除 PV 中的數(shù)據(jù)防症,效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*孟辑。
  Delete – 刪除 Storage Provider 上的對應(yīng)存儲資源哎甲,例如 AWS EBS、GCE PD饲嗽、Azure Disk炭玫、OpenStack Cinder Volume 等。

創(chuàng)建 pv

# kubectl apply -f pv1.yml

persistentvolume/yh-pv1 created

查看pv:

# kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

yh-pv1 1Gi RWO Recycle Available nfs 17m

STATUSAvailable貌虾,表示 yh-pv1就緒吞加,可以被 PVC 申請。

6.5.3.通過持久卷聲明來獲取持久卷

接下來創(chuàng)建 PVC mypvc1尽狠,配置文件 pvc1.yml 如下:

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

name: yh-pvc

spec:

accessModes:

- ReadWriteOnce

resources:

requests:

storage: 1Gi

storageClassName: nfs

PVC 就很簡單了衔憨,只需要指定 PV 的容量,訪問模式和 class袄膏。

執(zhí)行命令創(chuàng)建 mypvc1

# kubectl apply -f pvc1.yml

persistentvolumeclaim/yh-pvc created

查看pvc

# kubectl get pvc

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

yh-pvc Bound yh-pv1 1Gi RWO nfs 64s

kubectl get pvckubectl get pv 的輸出可以看到 yh-pvc1 已經(jīng) Bound 到y(tǒng)h- pv1践图,申請成功。

# kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE

yh-pv1 1Gi RWO Recycle Bound ``default``/yh-pvc nfs 47m

6.5.4.在pod中使用持久卷聲明

上面已經(jīng)創(chuàng)建好了pv和pvc沉馆,pod中直接使用這個pvc即可

image

與使用普通 Volume 的格式類似码党,在 volumes 中通過 persistentVolumeClaim 指定使用 mypvc1 申請的 Volume。

通過命令創(chuàng)建mypod1

image
image

可見斥黑,在 Pod 中創(chuàng)建的文件 /mydata/hello 確實(shí)已經(jīng)保存到了 NFS 服務(wù)器目錄 /nfsdata中揖盘。

如果不再需要使用 PV,可用刪除 PVC 回收 PV锌奴。

6.5.5.回收持久卷

當(dāng) PV 不再需要時兽狭,可通過刪除 PVC 回收。

image

未刪除pvc之前 pv的狀態(tài)是Bound

image

image

刪除pvc之后pv的狀態(tài)變?yōu)锳vailable,椭符,此時解除綁定后則可以被新的 PVC 申請荔燎。

/nfsdata文件中的文件被刪除了

image
image

因?yàn)?PV 的回收策略設(shè)置為 Recycle,所以數(shù)據(jù)會被清除销钝,但這可能不是我們想要的結(jié)果有咨。如果我們希望保留數(shù)據(jù),可以將策略設(shè)置為 Retain蒸健。

image

通過 kubectl apply 更新 PV:

image

回收策略已經(jīng)變?yōu)?Retain座享,通過下面步驟驗(yàn)證其效果:

image

① 重新創(chuàng)建 mypvc1

② 在 mypv1 中創(chuàng)建文件 hello似忧。

mypv1 狀態(tài)變?yōu)?Released渣叛。

④ PV 中的數(shù)據(jù)被完整保留。

雖然 mypv1 中的數(shù)據(jù)得到了保留盯捌,但其 PV 狀態(tài)會一直處于 Released淳衙,不能被其他 PVC 申請。為了重新使用存儲資源饺著,可以刪除并重新創(chuàng)建 mypv1箫攀。刪除操作只是刪除了 PV 對象,存儲空間中的數(shù)據(jù)并不會被刪除幼衰。

image

新建的 mypv1 狀態(tài)為 Available靴跛,已經(jīng)可以被 PVC 申請。

PV 還支持 Delete 的回收策略渡嚣,會刪除 PV 在 Storage Provider 上對應(yīng)存儲空間梢睛。NFS 的 PV 不支持 Delete,支持 Delete 的 Provider 有 AWS EBS识椰、GCE PD绝葡、Azure Disk、OpenStack Cinder Volume 等腹鹉。

回到頂部

6.6.持久卷的動態(tài)配置

6.6.1.通過StorageClass資源定義可用存儲類型

前面的例子中藏畅,我們提前創(chuàng)建了 PV,然后通過 PVC 申請 PV 并在 Pod 中使用种蘸,這種方式叫做靜態(tài)供給(Static Provision)墓赴。

與之對應(yīng)的是動態(tài)供給(Dynamical Provision),即如果沒有滿足 PVC 條件的 PV航瞭,會動態(tài)創(chuàng)建 PV诫硕。相比靜態(tài)供給,動態(tài)供給有明顯的優(yōu)勢:不需要提前創(chuàng)建 PV刊侯,減少了管理員的工作量章办,效率高。

動態(tài)供給是通過 StorageClass 實(shí)現(xiàn)的,StorageClass 定義了如何創(chuàng)建 PV藕届,下面是兩個例子挪蹭。

StorageClass standard

image

StorageClass slow

image

這兩個 StorageClass 都會動態(tài)創(chuàng)建 AWS EBS,不同在于 standard 創(chuàng)建的是 gp2 類型的 EBS休偶,而 slow 創(chuàng)建的是 io1 類型的 EBS梁厉。不同類型的 EBS 支持的參數(shù)可參考 AWS 官方文檔。

StorageClass 支持 DeleteRetain 兩種 reclaimPolicy踏兜,默認(rèn)是 Delete词顾。

與之前一樣,PVC 在申請 PV 時碱妆,只需要指定 StorageClass 和容量以及訪問模式肉盹,比如:

image

除了 AWS EBS,Kubernetes 支持其他多種動態(tài)供給 PV 的 Provisioner疹尾,完整列表請參考 https://kubernetes.io/docs/concepts/storage/storage-classes/#provisioner

6.6.2.PV&&PVC在應(yīng)用在mysql的持久化存儲

下面演示如何為 MySQL 數(shù)據(jù)庫提供持久化存儲上忍,步驟為:

  1. 創(chuàng)建 PV 和 PVC。

  2. 部署 MySQL纳本。

  3. 向 MySQL 添加數(shù)據(jù)窍蓝。

  4. 模擬節(jié)點(diǎn)宕機(jī)故障,Kubernetes 將 MySQL 自動遷移到其他節(jié)點(diǎn)饮醇。

  5. 驗(yàn)證數(shù)據(jù)一致性它抱。

首先創(chuàng)建 PV 和 PVC秕豫,配置如下:

mysql-pv.yml

image

mysql-pvc.yml

image

創(chuàng)建 mysql-pvmysql-pvc

image

接下來部署 MySQL朴艰,配置文件如下:

image

PVC mysql-pvc Bound 的 PV mysql-pv 將被 mount 到 MySQL 的數(shù)據(jù)目錄 var/lib/mysql

image

MySQL 被部署到 k8s-node2混移,下面通過客戶端訪問 Service mysql

image

更新數(shù)據(jù)庫:

image

① 切換到數(shù)據(jù)庫 mysql祠墅。

② 創(chuàng)建數(shù)據(jù)庫表 my_id。

③ 插入一條數(shù)據(jù)歌径。

④ 確認(rèn)數(shù)據(jù)已經(jīng)寫入毁嗦。

關(guān)閉 k8s-node2,模擬節(jié)點(diǎn)宕機(jī)故障回铛。

image

驗(yàn)證數(shù)據(jù)的一致性:

由于node2節(jié)點(diǎn)已經(jīng)宕機(jī)狗准,node1節(jié)點(diǎn)接管了這個任務(wù)。

image

通過kubectl run 命令 進(jìn)入node1的這個pod里茵肃,查看數(shù)據(jù)是否依舊存在

image
image

MySQL 服務(wù)恢復(fù)腔长,數(shù)據(jù)也完好無損。

參考:

https://www.cnblogs.com/yaohong/p/11489164.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末验残,一起剝皮案震驚了整個濱河市捞附,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖鸟召,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胆绊,死亡現(xiàn)場離奇詭異,居然都是意外死亡欧募,警方通過查閱死者的電腦和手機(jī)压状,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跟继,“玉大人何缓,你說我怎么就攤上這事』顾ǎ” “怎么了碌廓?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剩盒。 經(jīng)常有香客問我谷婆,道長,這世上最難降的妖魔是什么辽聊? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任纪挎,我火速辦了婚禮,結(jié)果婚禮上跟匆,老公的妹妹穿的比我還像新娘异袄。我一直安慰自己,他們只是感情好玛臂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布烤蜕。 她就那樣靜靜地躺著,像睡著了一般迹冤。 火紅的嫁衣襯著肌膚如雪讽营。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天泡徙,我揣著相機(jī)與錄音橱鹏,去河邊找鬼。 笑死堪藐,一個胖子當(dāng)著我的面吹牛莉兰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播礁竞,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼糖荒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了苏章?” 一聲冷哼從身側(cè)響起寂嘉,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤奏瞬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后泉孩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼端,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年寓搬,在試婚紗的時候發(fā)現(xiàn)自己被綠了珍昨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡句喷,死狀恐怖镣典,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唾琼,我是刑警寧澤兄春,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站锡溯,受9級特大地震影響赶舆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祭饭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一芜茵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧倡蝙,春花似錦九串、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至析既,卻和暖如春躬贡,著一層夾襖步出監(jiān)牢的瞬間谆奥,已是汗流浹背眼坏。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酸些,地道東北人宰译。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像魄懂,于是被迫代替她去往敵國和親沿侈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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