k8s-存儲卷

一,簡介

我們知道默認情況下容器的數(shù)據(jù)都是非持久化的瓦堵,在容器消亡以后數(shù)據(jù)也跟著丟失借帘,所以 Docker 提供了 Volume 機制以便將數(shù)據(jù)持久化存儲。類似的济蝉,Kubernetes 提供了更強大的 Volume 機制和豐富的插件杰刽,解決了容器數(shù)據(jù)持久化和容器間共享數(shù)據(jù)的問題菠发。
與 Docker 不同,Kubernetes Volume 的生命周期與 Pod 綁定容器掛掉后 Kubelet 再次重啟容器時贺嫂,Volume 的數(shù)據(jù)依然還在而 Pod 刪除時滓鸠,Volume 才會清理。數(shù)據(jù)是否丟失取決于具體的 Volume 類型第喳,比如 emptyDir 的數(shù)據(jù)會丟失糜俗,而 PV 的數(shù)據(jù)則不會丟

1,volume類型

目前kubernetes支持一下volume類型:


image.png

注意曲饱,這些 volume 并非全部都是持久化的悠抹,比如 emptyDir、secret渔工、gitRepo 等锌钮,這些 volume 會隨著 Pod 的消亡而消失桥温。

二引矩,示例

1,emptyDir
概念:

emptyDir是最基礎(chǔ)的Volume類型侵浸,用于存儲臨時數(shù)據(jù)的簡單空目錄旺韭。如果Pod設(shè)置了emptyDir類型Volume,Pod被分配到Node上時候掏觉,會創(chuàng)建emptyDir区端,只要Pod運行在Node上,emptyDir都會存在(容器掛掉不會導致emptyDir丟失數(shù)據(jù))澳腹,但是如果Pod從Node上被刪除(Pod被刪除织盼,或者Pod發(fā)生遷移),emptyDir也會被刪除酱塔,并且永久丟失沥邻。

面將用emptyDir卷實現(xiàn)在同一pod中兩個容器之間的文件共享


image.png
[root@k8s-master volumes]# cat pod-volume.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-volume
  namespace: default
  labels:
    app: myapp
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: {}

查看pod

[root@k8s-master volumes]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pod-volume                      2/2     Running   0          2m13s   10.244.1.74   k8s-node1   <none>           <none>
#使用curl 命令查看我們重定向到網(wǎng)頁文件的內(nèi)容
[root@k8s-master volumes]# curl 10.244.1.74
Thu Mar 18 08:26:58 UTC 2021
Thu Mar 18 08:27:00 UTC 2021
Thu Mar 18 08:27:02 UTC 2021
Thu Mar 18 08:27:04 UTC 2021

2,hostPath
概念:

hostPath允許掛載Node上的文件系統(tǒng)到Pod里面去羊娃。如果Pod需要使用Node上的文件唐全,可以使用hostPath。在同一個節(jié)點上運行并在其hostPath卷中使用相同路徑的pod可以看到相同的文件蕊玷。


image.png

hostPath指定的type:


image.png
#在node 上創(chuàng)建存儲目錄
mkdir -p /data/volume 
echo "hello" >/data/volume/index.html
[root@k8s-master volumes]# cat pod-volume-hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-hostpath
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80 
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    hostPath:
      path: /data/volume
      type: DirectoryOrCreate
#創(chuàng)建pod
kubectl apply -f pod-volume-hostpath.yaml

[root@k8s-master volumes]# kubectl get pods  -o wide
NAME                            READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
pod-volume-hostpath             1/1     Running   0          10s    10.244.1.75   k8s-node1   <none>           <none>
#訪問網(wǎng)頁文件
[root@k8s-master volumes]# curl 10.244.1.75
hello
#hostpath類型刪除pod后重新創(chuàng)建pod被調(diào)度到該node節(jié)點上數(shù)據(jù)依然不會變邮利,如果node節(jié)點宕了則存儲卷也會刪除,數(shù)據(jù)會消失垃帅,

3延届,NFS
概念:

NFS是Network File System的縮寫,即網(wǎng)絡(luò)文件系統(tǒng)贸诚。Kubernetes中通過簡單地配置就可以掛載NFS到Pod中祷愉,而NFS中的數(shù)據(jù)是可以永久保存的窗宦,同時NFS支持同時寫操作。
?emptyDir可以提供不同容器間的文件共享二鳄,但不能存儲赴涵;hostPath可以為不同容器提供文件的共享并可以存儲,但受制于節(jié)點限制订讼,不能跨節(jié)點共享髓窜;這時需要網(wǎng)絡(luò)存儲 (NAS),即既可以方便存儲容器又可以從任何集群節(jié)點訪問欺殿,本文以NFS為例做測試

首先準備一臺機器同一局域網(wǎng)的機器做為nfs-server(關(guān)閉firewalld.service和selinux)
安裝nfs軟件

[root@docker-ce ~]# yum install -y nfs-utils

創(chuàng)建共享目錄:

mkdir -p /data/volumes
[root@docker-ce ~]# cat /etc/exports
/data/volumes 10.0.0.0/24(rw,no_root_squash)

在node節(jié)點上安裝nfs-utils

[root@k8s-node2 ~]# yum install -y nfs-utils

創(chuàng)建NFS的pods

[root@k8s-master volumes]# cat volume-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-nfs
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    nfs:
      path: /data/volumes
      server: 10.0.0.100
創(chuàng)建pod
[root@k8s-master volumekubectl apply -f volume-nfs.yaml 
[root@k8s-master volumes]# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE    IP            NODE        NOMINATED NODE   READINESS GATES
pod-nfs                         1/1     Running   0          9s     10.244.1.77   k8s-node1   <none>           <none>

去存儲節(jié)點創(chuàng)建文件:

[root@docker volumes]# cat /data/volumes/index.html 
<h1>NFS docker</h1
#然后去訪問pod的文件
[root@k8s-master volumes]# curl 10.244.1.77
<h1>NFS docker</h1
#刪掉pod后在重建pod后數(shù)據(jù)依然在但是如果nfs宕了數(shù)據(jù)依然會丟失寄纵。
4,pv && pvc
概念:

PersistentVolume (持久卷脖苏, 簡稱 PV)和Persistent VolumeClaim(持久卷聲明程拭,簡稱 PVC)使得K8s集群具備了存儲的邏輯抽象能力,使得在配置Pod的邏輯里可以忽略對實際后臺存儲技術(shù)的配置棍潘,而把這項配置的工作交給PV的配置者恃鞋,即集群的管理者。存儲的PV和PVC的這種關(guān)系亦歉,跟計算的Node和Pod的關(guān)系是非常類似的恤浪;PV和Node是資源的提供者,根據(jù)集群的基礎(chǔ)設(shè)施變化而變化肴楷,由K8s集群管理員配置水由;而PVC和Pod是資源的使用者,根據(jù)業(yè)務(wù)服務(wù)的需求變化而變化赛蔫,由K8s集群的使用者即服務(wù)的管理員來配置砂客。
當集群用戶需要在其pod中使用持久化存儲時,他們首先創(chuàng)建PVC清單呵恢,指定所需要的最低容量要求和訪問模式鞠值,然后用戶將待久卷聲明清單提交給Kubernetes API服務(wù)器,Kubernetes將找到可匹配的PV并將其綁定到PVC瑰剃。PVC可以當作pod中的一個卷來使用齿诉,其他用戶不能使用相同的PV,除非先通過刪除PVC綁定來釋放晌姚。

image.png
1粤剧,創(chuàng)建pv

準備環(huán)境
在nfs存儲機器上創(chuàng)建目錄

[root@docker ~]# mkdir /data/volumes/v{1..5}

[root@docker ~]# cat /etc/exports
/data/volumes/v1 10.0.0.0/24(rw,no_root_squash)
/data/volumes/v2 10.0.0.0/24(rw,no_root_squash)
/data/volumes/v3 10.0.0.0/24(rw,no_root_squash)
/data/volumes/v4 10.0.0.0/24(rw,no_root_squash)
/data/volumes/v5 10.0.0.0/24(rw,no_root_squash)

顯示正常導出:
[root@docker ~]# exportfs -avr
exporting 10.0.0.0/24:/data/volumes/v5
exporting 10.0.0.0/24:/data/volumes/v4
exporting 10.0.0.0/24:/data/volumes/v3
exporting 10.0.0.0/24:/data/volumes/v2
exporting 10.0.0.0/24:/data/volumes/v1
#
[root@docker ~]# showmount -e
Export list for docker:
/data/volumes/v5 10.0.0.0/24
/data/volumes/v4 10.0.0.0/24
/data/volumes/v3 10.0.0.0/24
/data/volumes/v2 10.0.0.0/24
/data/volumes/v1 10.0.0.0/24

定義一個nfs的pv

定義pv不能定義在namespace中,應(yīng)為pv是屬于集群級別的資源挥唠,同樣創(chuàng)建namespace是也不能指定名稱空間抵恋,這兩都是屬于集群級別的資源

#創(chuàng)建了5個pv
[root@k8s-master volumes]# cat pv-deom.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  nfs:
    path: /data/volumes/v1
    server: 10.0.0.100
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
spec:
  capacity:
    storage: 8Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  nfs:
    path: /data/volumes/v2
    server: 10.0.0.100
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  nfs:
    path: /data/volumes/v3
    server: 10.0.0.100
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
spec:
  capacity:
    storage: 15Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  nfs:
    path: /data/volumes/v4
    server: 10.0.0.100
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
spec:
  capacity:
    storage: 20Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  nfs:
    path: /data/volumes/v5
    server: 10.0.0.100

查看pv

[root@k8s-master volumes]# kubectl get pv 
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   5Gi        RWO,RWX        Retain           Available                                   89s
pv002   8Gi        RWO,RWX        Retain           Available                                   89s
pv003   10Gi       RWO,RWX        Retain           Available                                   89s
pv004   15Gi       RWO,RWX        Retain           Available                                   89s
pv005   20Gi       RWO,RWX        Retain           Available                                   89s

創(chuàng)建pvc
[root@k8s-master volumes]# cat pvc-demo.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
  namespace: default
spec:
  accessModes: 
  - ReadWriteMany
  resources:
    requests:
      storage: 8Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: pvc-pod
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html/
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: mypvc
#創(chuàng)建pvc
[root@k8s-master volumes]# kubectl apply -f pvc-demo.yaml 
#查看pvc
[root@k8s-master volumes]# kubectl get pvc
NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc   Bound    pv002    8Gi        RWO,RWX                       18s
[root@k8s-master volumes]# kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
pv001   5Gi        RWO,RWX        Retain           Available                                           74m
pv002   8Gi        RWO,RWX        Retain           Bound       default/mypvc                           74m
pv003   10Gi       RWO,RWX        Retain           Available                                           74m
pv004   15Gi       RWO,RWX        Retain           Available                                           74m
pv005   20Gi       RWO,RWX        Retain           Available                                           74m

spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
#access modes 使用參考:
https://v1-19.docs.kubernetes.io/docs/concepts/storage/persistent-volumes/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宝磨,隨后出現(xiàn)的幾起案子弧关,更是在濱河造成了極大的恐慌盅安,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世囊,死亡現(xiàn)場離奇詭異别瞭,居然都是意外死亡,警方通過查閱死者的電腦和手機株憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門蝙寨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗤瞎,你說我怎么就攤上這事墙歪。” “怎么了贝奇?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵虹菲,是天一觀的道長。 經(jīng)常有香客問我掉瞳,道長毕源,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任菠赚,我火速辦了婚禮脑豹,結(jié)果婚禮上郑藏,老公的妹妹穿的比我還像新娘衡查。我一直安慰自己,他們只是感情好必盖,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布拌牲。 她就那樣靜靜地躺著,像睡著了一般歌粥。 火紅的嫁衣襯著肌膚如雪塌忽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天失驶,我揣著相機與錄音土居,去河邊找鬼。 笑死嬉探,一個胖子當著我的面吹牛擦耀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涩堤,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼眷蜓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胎围?” 一聲冷哼從身側(cè)響起吁系,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤德召,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后汽纤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體上岗,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年蕴坪,在試婚紗的時候發(fā)現(xiàn)自己被綠了液茎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辞嗡,死狀恐怖捆等,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续室,我是刑警寧澤栋烤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挺狰,受9級特大地震影響明郭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丰泊,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一薯定、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞳购,春花似錦话侄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盏浇,卻和暖如春变丧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绢掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工痒蓬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滴劲。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓攻晒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哑芹。 傳聞我的和親對象是個殘疾皇子炎辨,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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