Kubernetes(k3s)進階學(xué)習(xí)(四) -- 持久化存儲

Pod 的生命周期是短暫的姜盈,會頻繁被銷毀和創(chuàng)建。由于沙盒機制,舊Pod 被銷毀后,會伴隨容器里的所有資源都被清空瓣窄。在服務(wù)運行過程奈附,或多或少有需要持久化存儲的資源(圖片、多媒體、文檔),我們都肯定不希望看到Pod沒了這些資源也跟著被銷毀。
另外同性質(zhì)的Pod捌归,資源之間應(yīng)該允許共享,而不是被當(dāng)獨作為服務(wù)來遠程訪問岭粤。

Volume使用

Volume的生命周期獨立于容器惜索,它是一個目錄,Volume會被mount到Pod剃浇,Pod中的所有容器都可以訪問這個Volume巾兆,和Docker Volume類似。
Volume支持的類型:emptyDir虎囚、hostPath角塑、AWS Elastic Block Store、NFS淘讥、Ceph等圃伶。

emptyDir(臨時存儲卷)

emptyDir屬于Pod內(nèi)的臨時掛載的目錄。 當(dāng)Volume 選擇類型為emptyDir時,它的特性只是一個臨時掛載的目錄窒朋,Pod刪除后搀罢,該目錄也會在node節(jié)點上被刪除;但是如果容器崩潰或者Kubenetes 重啟炼邀,該目錄仍然存在魄揉,通過Pod 關(guān)聯(lián)的容器均能訪問該目錄。

1)創(chuàng)建示例應(yīng)用
#本地終端拭宁,進入server節(jié)點容器的命令
multipass shell server

#進入容器后,先創(chuàng)建文件:volume-test.yml
sudo vi volume-test.yml

#volume-test.yml 的內(nèi)容

apiVersion: v1
kind: Pod
metadata:
  name: shared-pod
spec:
  containers:
  - image: busybox
    name: write-container
    volumeMounts:
    - mountPath: /write_directory   
      name: shared-volume
    args:
    - /bin/sh       
    - -c
    - echo "hello K3s" >/write_directory/test; sleep 120000

  - image: busybox
    name: read-container
    volumeMounts:
    - mountPath: /read_directory
      name: shared-volume
    args:
    - /bin/sh 
    - -c
    - cat /read_directory/test; sleep 120000

  volumes:
  - name: shared-volume
    emptyDir: {}

2)示例講解

\color{red}{注:}所有的示例均在Multipass內(nèi)執(zhí)行瓣俯。
上述代碼杰标,首先聲明一個叫shared-volume 的volume。同時為了方便下面對pod 的目錄共享的驗證彩匕,示例在Pod 內(nèi)創(chuàng)建了兩個容器腔剂,均通過volumeMounts 指向shared-volume 的shared_directory目錄。
容器:write-container 負(fù)責(zé)在shared_directory 目錄寫入test文件(內(nèi)容:hello K3s)驼仪,read-container 則在啟動后掸犬,讀取/shared_directory 的test 文件。

2)示例驗證
#先通過kubectl 引入volume-test.yml 文件
ubuntu@server:~/$ sudo kubectl apply -f volume-test.yml 
pod/shared-pod created

#驗證pod 是否成功創(chuàng)建
ubuntu@server:~/$ sudo kubectl get pod

NAME                                   READY   STATUS                   RESTARTS      AGE
shared-pod                             2/2     Running                  0             37s

#驗證 read-container 容器讀取結(jié)果
ubuntu@server:~/demo-volume$ sudo kubectl logs shared-pod read-container
#驗證成功
hello K3s

上述顯示容器read-container成功讀到了write-container容器寫入的數(shù)據(jù)绪爸,驗證了兩個容器共享emptyDir Volume,其效果相當(dāng)于執(zhí)行了docker run -v /write_directory 和/docker run -v /read_directory湾碎。

HostPath(節(jié)點存儲卷)

hostPath類型的存儲卷是指將工作節(jié)點上某個文件系統(tǒng)的目錄或文件掛載于Pod中的一種存儲卷,它獨立于Pod資源的生命周期奠货,因而具有持久性介褥。但由于這樣的特征增加了了Pod與工作節(jié)點的耦合,在實際的場景應(yīng)用中都不會選擇此項递惋。作為分布式的應(yīng)用部署柔滔,更應(yīng)該把持久化的目標(biāo)獨立于工作節(jié)點之外。
HostPath 與emptyDir 的使用方法相似萍虽,同時網(wǎng)上的資料也較多睛廊,這里就不再做示例演示。

PV & PVC

使用外部存儲作為資源持久化目標(biāo)是最理想方案杉编,如果kubenetes部署在阿里云超全、AWS、Azure等公有云上王财,可以直接使用云盤作為Volume卵迂。 同樣我們也可以創(chuàng)建NFS(網(wǎng)絡(luò)文件系統(tǒng)),使用PV把NFS引入到Pod去绒净。

①NFS for PV

先準(zhǔn)備NFS網(wǎng)絡(luò)盤见咒,NFS服務(wù)具體部署請參照:http://www.reibang.com/p/a5d5d9afa1eb

在此,筆者已經(jīng)準(zhǔn)備好NFS服務(wù)器:\color{red}{192.168.64.12}挂疆,可分享目錄路徑:\color{red}{/nfsdata/share}改览。

②部署示例應(yīng)用
#本地終端下翎,進入server節(jié)點容器的命令
multipass shell server

#進入容器后,先創(chuàng)建文件:nfs-pv.yml
sudo vi nfs-pv.yml

#nfs-pv.yml 的內(nèi)容

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 1Gi    #指定PV的容量為1GB
  accessModes:
    - ReadWriteOnce  #表示PV能為read-write模式mount到單個節(jié)點宝当,ReadOnlyMany表示只讀视事,mount到多個節(jié)點,ReadWriteMany表示讀寫可以mount到多節(jié)點
  persistentVolumeReclaimPolicy: Recycle  #PV的回收策略庆揩,清除PV中的數(shù)據(jù)俐东,Retain表示管理員手工回收
  storageClassName: nfs-storage    #指定PV的class為nfs-storage,相當(dāng)于為PV設(shè)置了一個分類订晌,PVC可以指定class申請相應(yīng)的PV
  nfs:
    path: /nfsdata/share    #指定PV在NFS服務(wù)器上對應(yīng)的目錄
    server: 192.168.64.12

引用PV虏辫,并且驗證。

#引入
ubuntu@server:~$ sudo kubectl apply -f nfs-pv.yml 
#輸出成功結(jié)果
persistentvolume/nfs-pv created

#驗證
ubuntu@server:~$ sudo kubectl get pv -o wide

#輸出結(jié)果
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE   VOLUMEMODE
nfs-pv   1Gi        RWO            Recycle          Available           nfs-storage                     36s   Filesystem

創(chuàng)建PVC


sudo vi nfs-pvc.yml

#nfs-pvc.yml 的內(nèi)容

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pv
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: nfs-storage      #與之前PV的storageClassName 一致

引用PVC锈拨,并且驗證砌庄。

#引入
ubuntu@server:~$ sudo kubectl apply -f nfs-pvc.yml 
#輸出成功結(jié)果
persistentvolumeclaim/nfs-pvc created

#驗證
ubuntu@server:~$ sudo kubectl get pvc -o wide

#輸出結(jié)果
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE   VOLUMEMODE
nfs-pv   Bound    nfs-pv   1Gi        RWO            nfs-storage    38s   Filesystem

那么,可以創(chuàng)建新的Pod 進行驗證了奕枢。

③在Pod 中使用PVC
sudo vi nfs-pod.yml

#nfs-pod.yml 的內(nèi)容

apiVersion: v1
kind: Pod
metadata:
  name: pv-pod
spec:
  containers:
    - name: pv-pod
      image: busybox
      args:
      - /bin/sh
      - -c
      - sleep 180000
      volumeMounts:
      - mountPath: "/pod_data"
        name: nfs-storage
  volumes:
    - name: nfs-storage
      persistentVolumeClaim:
        claimName: nfs-pv

最后測試驗證

#引入
ubuntu@server:~$ sudo kubectl apply -f nfs-pod.yml
#輸出結(jié)果
pod/pv-pod created

[root@k8s-node1 nfs-pv]# sudo kubectl get pod -o wide

#輸出結(jié)果
NAME                                   READY   STATUS                   RESTARTS      AGE     IP           NODE     NOMINATED NODE   READINESS GATES
pv-pod                                 0/1     Running                  0             34s     <none>       <none>   <none>           <none>


#類似docker exec 的執(zhí)行操作娄昆,直接進入pod 的sh
ubuntu@server:~$ sudo kubectl exec -it pv-pod /bin/sh

#在容器中,執(zhí)行如下命令
/ # cat /pod_data/text.txt

#輸出結(jié)果
Hello NFS缝彬!

#在部署NFS網(wǎng)絡(luò)文件系統(tǒng)一章
#地址:http://www.reibang.com/p/a5d5d9afa1eb
#筆者已在NFS服務(wù)器:192.168.64.12 的目錄/nfsdata/share創(chuàng)建了text.txt文件萌焰。

不需要使用PV時,可用刪除PVC回收PV

ubuntu@server:~$# kubectl delete pvc pv-pod 
persistentvolumeclaim "pv-pod" deleted

因PV的回收策略設(shè)置為Recycle跌造,所以數(shù)據(jù)會被清除杆怕,如想保存數(shù)據(jù),可以將策略設(shè)置為Retain壳贪。
本章結(jié)束陵珍!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市违施,隨后出現(xiàn)的幾起案子互纯,更是在濱河造成了極大的恐慌,老刑警劉巖磕蒲,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件留潦,死亡現(xiàn)場離奇詭異,居然都是意外死亡辣往,警方通過查閱死者的電腦和手機兔院,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來站削,“玉大人坊萝,你說我怎么就攤上這事。” “怎么了十偶?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵菩鲜,是天一觀的道長。 經(jīng)常有香客問我惦积,道長接校,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任狮崩,我火速辦了婚禮蛛勉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厉亏。我一直安慰自己董习,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布爱只。 她就那樣靜靜地躺著,像睡著了一般招刹。 火紅的嫁衣襯著肌膚如雪恬试。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天疯暑,我揣著相機與錄音训柴,去河邊找鬼。 笑死妇拯,一個胖子當(dāng)著我的面吹牛幻馁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播越锈,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仗嗦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甘凭?” 一聲冷哼從身側(cè)響起稀拐,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丹弱,沒想到半個月后德撬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡躲胳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年蜓洪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坯苹。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡隆檀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刚操,我是刑警寧澤闸翅,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站菊霜,受9級特大地震影響坚冀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鉴逞,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一记某、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧构捡,春花似錦液南、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喘帚,卻和暖如春畅姊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吹由。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工若未, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倾鲫。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓粗合,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乌昔。 傳聞我的和親對象是個殘疾皇子隙疚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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