2020-03-28 Kubernetes—volume (上)

說起存儲(chǔ)卷和docker的存儲(chǔ)卷有幾分相似的地方,數(shù)據(jù)不會(huì)跟隨Pod的停止或刪除而消失怀伦,從而實(shí)現(xiàn)數(shù)據(jù)的持久性柳琢,但是由于K8s的獨(dú)特坏瘩,K8s面對(duì)的是集群盅抚,如果要實(shí)現(xiàn)數(shù)據(jù)的持久性,Pod會(huì)分布到各個(gè)節(jié)點(diǎn)之上倔矾,所以引入了外部存儲(chǔ)卷妄均。

① · 常見的存儲(chǔ)卷類型有:

  • emptyDir :當(dāng)Pod生命周期結(jié)束后,存儲(chǔ)卷會(huì)被一并刪除哪自,這種通常會(huì)存放一些臨時(shí)數(shù)據(jù)丛晦。
  • hostPath:宿主機(jī)目錄映射
  • 本地的SAN(iSCSI,FC)、NAS(nfs,cifs,http)存儲(chǔ)
  • 分布式存儲(chǔ)(glusterfs提陶,rbd,cephfs)
  • 云存儲(chǔ)(EBS匹层,Azure Disk)
    種類繁多的存儲(chǔ)無疑會(huì)提高K8s的使用門檻隙笆,這意味著你不僅要懂K8s還要懂存儲(chǔ)的結(jié)構(gòu)、用法升筏、參數(shù)撑柔、使用場景等等等...
    所以K8s又引入了一個(gè)概念叫做PVC 全稱 persistentVolumeClaim -->PVC(存儲(chǔ)卷創(chuàng)建申請(qǐng))
    當(dāng)你需要一個(gè)存儲(chǔ)空間的時(shí)候,只要進(jìn)行對(duì)應(yīng)的申請(qǐng)即可您访,靈魂圖: ↓
image.png

在Pod 上定義一個(gè)PVC铅忿,但該P(yáng)VC只是一個(gè)申請(qǐng),他需要和PV進(jìn)行關(guān)聯(lián)灵汪,PV是屬于存儲(chǔ)設(shè)備上的一部分空間檀训,so申請(qǐng)之前我們應(yīng)該創(chuàng)建好對(duì)應(yīng)大小的pv等待使用柑潦,那么就造成了每次用戶需要存儲(chǔ)卷的時(shí)候都要想K8s的管理員申請(qǐng),等管理員建立好他才能進(jìn)行PVC的申請(qǐng)峻凫,這聽起來比較麻煩渗鬼,于是又有了另一個(gè)方案。

image.png

不要pv層荧琼,把所有存儲(chǔ)資源抽象成一個(gè)存儲(chǔ)類譬胎,當(dāng)用戶申請(qǐng)PVC到達(dá)存儲(chǔ)類的時(shí)候,會(huì)根據(jù)申請(qǐng)大小命锄,自動(dòng)創(chuàng)建出相應(yīng)的存儲(chǔ)空間堰乔,實(shí)現(xiàn)動(dòng)態(tài)供給。

emptydir類型示例:

emptydir具體操作步驟: ↓
① · 在Pod層定義volume,并指明關(guān)聯(lián)到哪個(gè)存儲(chǔ)設(shè)備
② · 在容器中層使用 volume mount 進(jìn)行掛載
emptydir:
是一個(gè)臨時(shí)的空目錄脐恩,在pod之上的每個(gè)容器都可以掛載到相同或不同的目錄上镐侯,并且共享里面的內(nèi)容,當(dāng)Pod因?yàn)槿魏卧虮粍h除時(shí)被盈,存儲(chǔ)卷會(huì)被一并刪除析孽,無法保留數(shù)據(jù)。但是容器崩潰的時(shí)候只怎,不會(huì)影響數(shù)據(jù)袜瞬,因?yàn)橐粋€(gè)容器崩潰不會(huì)導(dǎo)致Pod被刪除。
默認(rèn)情況下emptydir是一個(gè)普通磁盤提供的存儲(chǔ)空間身堡,但是也可以定義為memory邓尤,意為使用node的內(nèi)存來提供存儲(chǔ)功能,因?yàn)閮?nèi)存性能強(qiáng)大贴谎,但是要注意當(dāng)node重啟的時(shí)候汞扎,內(nèi)存內(nèi)的數(shù)據(jù)會(huì)丟失,emptydir的數(shù)據(jù)也會(huì)隨之消失擅这。
清單示例:

apiVersion: v1
kind: Pod
metadata: 
  name: Pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /data/
    command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']
  volumes:
  - name: html
    emptydir: {}
  

上述清單定義了一個(gè)類型為emptydir的存儲(chǔ)卷澈魄,并且創(chuàng)建了兩個(gè)容器共同掛載,由后端的busybox不停的向目錄中注入內(nèi)容仲翎,通過從前端訪問顯示內(nèi)容痹扇,實(shí)現(xiàn)兩個(gè)容器之間的存儲(chǔ)共享。

[root@k8s-master volumes]# kubectl apply -f pod-vol-demo.yaml 
pod/pod-vol-demo created 
[root@k8s-master volumes]# kubectl get pods
NAME                                 READY     STATUS    RESTARTS   AGE
pod-vol-demo                         2/2       Running   0          27s
[root@k8s-master volumes]# kubectl get pods -o wide
NAME                      READY     STATUS    RESTARTS   AGE       IP            NODE
......
pod-vol-demo              2/2       Running   0          16s       10.244.2.34   k8s-node02
......

[root@k8s-master volumes]# curl 10.244.2.34  #訪問驗(yàn)證
Tue Oct 9 03:56:53 UTC 2018
Tue Oct 9 03:56:55 UTC 2018
Tue Oct 9 03:56:57 UTC 2018
Tue Oct 9 03:56:59 UTC 2018
Tue Oct 9 03:57:01 UTC 2018
Tue Oct 9 03:57:03 UTC 2018
Tue Oct 9 03:57:05 UTC 2018
Tue Oct 9 03:57:07 UTC 2018
Tue Oct 9 03:57:09 UTC 2018
Tue Oct 9 03:57:11 UTC 2018
Tue Oct 9 03:57:13 UTC 2018
Tue Oct 9 03:57:15 UTC 2018

另外一種比較特殊類型的存儲(chǔ)類型叫做gitrepo溯香,就是利用github倉庫作為外部持久存儲(chǔ)鲫构,但是他的基礎(chǔ)仍然是emptydir來實(shí)現(xiàn)的,并且要確保node之上有Git工具玫坛,因?yàn)檫@是通過node 來驅(qū)動(dòng)的git结笨,具體實(shí)現(xiàn)方式就是通過sidecar容器將gitrepo clone到容器上,然后不停的往GitHub之上push數(shù)據(jù)來實(shí)現(xiàn)。

hostPath類型示例:

hostPath是將宿主機(jī)上的某個(gè)目錄與Pod中的容器建立關(guān)聯(lián)關(guān)系炕吸,數(shù)據(jù)不屬于container伐憾,所以當(dāng)Pod生命周期結(jié)束的時(shí)候,數(shù)據(jù)不會(huì)丟失算途。但是當(dāng)node節(jié)點(diǎn)發(fā)生故障的時(shí)候塞耕,數(shù)據(jù)也會(huì)丟失。

apiVersion: v1
kind: Pod
metadata:
  name: pod-hostPath
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMonts: 
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    hostPath:
      path: /data/pod/volume1
      type: DirectoryOrCreate

# type:
#DirectoryOrCreate  宿主機(jī)上不存在創(chuàng)建此目錄  
#Directory 必須存在掛載目錄  
#FileOrCreate 宿主機(jī)上不存在掛載文件就創(chuàng)建  
#File 必須存在文件  

在node節(jié)點(diǎn)上創(chuàng)建掛載目錄
[root@k8s-node01 ~]# mkdir -p /data/pod/volume1
[root@k8s-node01 ~]# vim /data/pod/volume1/index.html
node01.magedu.com
[root@k8s-node02 ~]# mkdir -p /data/pod/volume1
[root@k8s-node02 ~]# vim /data/pod/volume1/index.html
node02.magedu.com
[root@k8s-master volumes]# kubectl apply -f pod-hostpath-vol.yaml 
pod/pod-vol-hostpath created

(4)訪問測試
[root@k8s-master volumes]# kubectl get pods -o wide
NAME                                 READY     STATUS    RESTARTS   AGE       IP            NODE
......
pod-vol-hostpath                     1/1       Running   0          37s       10.244.2.35   k8s-node02
......
[root@k8s-master volumes]# curl 10.244.2.35
node02.magedu.com
[root@k8s-master volumes]# kubectl delete -f pod-hostpath-vol.yaml  #刪除pod嘴瓤,再重建扫外,驗(yàn)證是否依舊可以訪問原來的內(nèi)容
[root@k8s-master volumes]# kubectl apply -f pod-hostpath-vol.yaml 
pod/pod-vol-hostpath created
[root@k8s-master volumes]# curl  10.244.2.37 
node02.magedu.com

NFS類型示例:

NFS掛載是在其中一個(gè)node之上將共享的目錄發(fā)布出來,并且在各個(gè)node之上都安裝好nfs-utils工具廓脆,只要在創(chuàng)建Pod的時(shí)候指定要掛載的文件系統(tǒng)為nfs筛谚,和掛載點(diǎn)、權(quán)限即可自動(dòng)完成掛載操作停忿,并且能實(shí)現(xiàn)數(shù)據(jù)同步驾讲。
在創(chuàng)建Pod之前要做好nfs的配置

在stor01節(jié)點(diǎn)上安裝nfs,并配置nfs服務(wù)
[root@stor01 ~]# yum install -y nfs-utils                 ##  192.168.56.14
[root@stor01 ~]# mkdir /data/volumes -pv
[root@stor01 ~]# vim /etc/exports
/data/volumes 192.168.56.0/24(rw,no_root_squash)
[root@stor01 ~]# systemctl start nfs
[root@stor01 ~]# showmount -e
Export list for stor01:
/data/volumes 192.168.56.0/24
在node2上測試連接席赂,成功后即可創(chuàng)建Pod

[root@k8s-node02 ~]# yum install -y nfs-utils
[root@k8s-node02 ~]# mount -t nfs stor01:/data/volumes /mnt
[root@k8s-node02 ~]# mount
......
stor01:/data/volumes on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.56.13,local_lock=none,addr=192.168.56.14)
[root@k8s-node02 ~]# umount /mnt/

清單示例:

apiVersion: v1
kind: Pod
metadata: 
  name: Pod-nfs
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    nfs:
      path: /data/volumes  # 共享出來的目錄
      server: stor01   #要提前做好解析
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吮铭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颅停,更是在濱河造成了極大的恐慌谓晌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癞揉,死亡現(xiàn)場離奇詭異纸肉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喊熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門柏肪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芥牌,你說我怎么就攤上這事烦味。” “怎么了壁拉?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵拐叉,是天一觀的道長。 經(jīng)常有香客問我扇商,道長,這世上最難降的妖魔是什么宿礁? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任案铺,我火速辦了婚禮,結(jié)果婚禮上梆靖,老公的妹妹穿的比我還像新娘控汉。我一直安慰自己笔诵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布姑子。 她就那樣靜靜地躺著乎婿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪街佑。 梳的紋絲不亂的頭發(fā)上谢翎,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音沐旨,去河邊找鬼森逮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磁携,可吹牛的內(nèi)容都是我干的褒侧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼谊迄,長吁一口氣:“原來是場噩夢啊……” “哼闷供!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起统诺,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤歪脏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后篙议,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唾糯,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年鬼贱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了移怯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡这难,死狀恐怖舟误,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情姻乓,我是刑警寧澤嵌溢,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站蹋岩,受9級(jí)特大地震影響赖草,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剪个,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一秧骑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦乎折、人聲如沸绒疗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吓蘑。三九已至,卻和暖如春坟冲,著一層夾襖步出監(jiān)牢的瞬間磨镶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工樱衷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棋嘲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓矩桂,卻偏偏與公主長得像沸移,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侄榴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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