k8s掛載存儲模式---NFS

k8s存儲支持多種模式:本地存儲:hostPath/emptyDir骑祟,傳遞網(wǎng)絡(luò)存儲:iscsi/nfs锋叨,分布式網(wǎng)絡(luò)存儲:glusterfs/rbd/cephfs添瓷,以及云存儲等鹅髓;
k8s默認容器如果重建瑟押,則容器中文件將丟失陷寝,為了解決這些問題锅很,通常我們會將容器中需要持久化的文件存儲到其他可持久化存儲目錄中。

1.存儲到臨時目錄

  spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node2  #指定工作在節(jié)點2上
      containers:
      - name: nginx-web
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html  #容器目錄
          name: html
      volumes:
        - name: html
            emptyDir:  {}

這種模式數(shù)據(jù)存儲將隨著pod的創(chuàng)建與銷毀生命周期存在凤跑,數(shù)據(jù)將不持久化存儲粗蔚。

2.存儲到宿主機目錄

  spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node2  #指定工作在節(jié)點2上
      containers:
      - name: nginx-web
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html  #容器目錄
          name: html
      volumes:
      - name: html
        hostPath:  #類型為hostPath,即宿主機文件路徑
          path: /data/nginx/html   #宿主機目錄
          type:  DirectoryOrCreate

優(yōu)點:簡單易用饶火,無需額外支持
缺點:依賴宿主機磁盤容量鹏控,pod與宿主機存在強耦合致扯,不利于管理。當pod部署多個副本并分配到不同host時当辐,數(shù)據(jù)不共享抖僵;當pod漂移時,數(shù)據(jù)不同步缘揪;當node故障時耍群,數(shù)據(jù)易丟失;

3.存儲到NFS中

3.1安裝NFS

#master節(jié)點安裝nfs
[root@k8s-master nginx]# yum -y install nfs-utils
#創(chuàng)建nfs目錄
[root@k8s-master nginx]# mkdir -p /nfs/data/
#修改權(quán)限
[root@k8s-master nginx]# chmod -R 777 /nfs/data
#編輯export文件,這個文件就是nfs默認的配置文件
[root@k8s-master nginx]# vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)
#配置生效
[root@k8s-master nginx]# exportfs -r
#查看生效
[root@k8s-master nginx]# exportfs
/nfs/data       <world>
#啟動rpcbind找筝、nfs服務(wù)
[root@k8s-master nginx]# systemctl restart rpcbind && systemctl enable rpcbind
[root@k8s-master nginx]# systemctl restart nfs && systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
#查看 RPC 服務(wù)的注冊狀況
[root@k8s-master nginx]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper

#showmount測試
[root@k8s-master nginx]# showmount -e 192.168.0.66
 Export list for 192.168.0.66:
 /nfs/data *

3.2創(chuàng)建PV
創(chuàng)建前我們先在master節(jié)點 mkdir /nfs/data/nginx 創(chuàng)建出一個nginx子目錄供pv使用

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  namespace: default
  labels:
    pv: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:  
    server: 192.168.0.66
    path: "/nfs/data/nginx"   #NFS目錄蹈垢,需要該目錄在NFS上存在

然后執(zhí)行創(chuàng)建

[root@k8s-master nfs]# kubectl apply -f pv.yaml 
persistentvolume/nfs-pv created
[root@k8s-master nfs]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
nfs-pv   100Mi      RWX            Retain           Available                                   7s

PV 的訪問模式(accessModes)有三種:
ReadWriteOnce(RWO):是最基本的方式,可讀可寫袖裕,但只支持被單個 Pod 掛載曹抬。
ReadOnlyMany(ROX):可以以只讀的方式被多個 Pod 掛載。
ReadWriteMany(RWX):這種存儲可以以讀寫的方式被多個 Pod 共享急鳄。

PV 的回收策略(persistentVolumeReclaimPolicy谤民,即 PVC 釋放卷的時候 PV 該如何操作)也有三種:
Retain,不清理, 保留 Volume(需要手動清理)
Recycle疾宏,刪除數(shù)據(jù)张足,即 rm -rf /volume/*(只有 NFS 和 HostPath 支持)
Delete,刪除存儲資源坎藐,比如刪除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
PVC釋放卷是指用戶刪除一個PVC對象時为牍,那么與該PVC對象綁定的PV就會被釋放。

PersistentVolume有四種狀態(tài):
Available: 可用狀態(tài)
Bound: 綁定到PVC
Released: PVC被刪掉岩馍,但是尚未回收
Failed : 自動回收失敗
3.3創(chuàng)建PVC
vim pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Mi  #容量
  selector:
    matchLabels:
      pv: nfs-pv   #關(guān)聯(lián)pv 的label,key/value要一致

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

[root@k8s-master nfs]# kubectl apply -f pvc.yaml 
persistentvolumeclaim/nfs-pvc created
[root@k8s-master nfs]# kubectl get pvc
NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc   Bound    nfs-pv   100Mi      RWX 
[root@k8s-master nfs]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
nfs-pv   100Mi      RWX            Retain           Bound    default/nfs-pvc
此時pv狀態(tài)已經(jīng)從Available變成Bound狀態(tài)吵聪。

3.4 創(chuàng)建pod并使用pvc存儲資源
vim nginx.yaml #我們用nginx鏡像進行驗證,將html目錄映射到nfs目錄中

#deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-nginx
  namespace: default
spec:
  selector:
    matchLabels:
      app: nfs-nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nfs-nginx
    spec:
      containers:
      - name: nginx-web
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: html
      volumes:
      - name: html
        persistentVolumeClaim:
          claimName: nfs-pvc
---
#service
apiVersion: v1
kind: Service
metadata:
  name: nfs-nginx
  namespace: default
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 31681
  selector:
    app: nfs-nginx

創(chuàng)建pod容器

[root@k8s-master nfs]# kubectl apply -f nginx.yaml
[root@k8s-master nfs]# kubectl get pods  -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
nfs-nginx-7695b95db6-l74zx   1/1     Running   0          12s   10.244.2.93   k8s-node1   <none>           <none>
nfs-nginx-7695b95db6-qcqp8   1/1     Running   0          12s   10.244.1.22   k8s-node2   <none>           <none>

如果kubectl describe pods xxx 發(fā)現(xiàn)有如下報錯兼雄,則在節(jié)點服務(wù)器上安裝nfs-unitls

Output: Running scope as unit run-20005.scope.
mount: wrong fs type, bad option, bad superblock on 192.168.0.66:/nfs/data/nginx,
       missing codepage or helper program, or other error
各節(jié)點安裝并啟用nfs
yum install nfs-utils
systemctl start nfs & systemctl enable nfs
systemctl start rpcbind & systemctl enable rpcbind

3.5驗證
3.5.1直接放文件到NFS的/nfs/data/nginx目錄
我們在/nfs/data/nginx目錄創(chuàng)建了一個1.html文件

<html>
<body>Test01</body>
</html>

驗證1正常

3.5.2 在容器1的/usr/share/nginx/html目錄創(chuàng)建文件2.html

<html>
<body>Test02</body>
</html>

3.5.3 在容器2的/usr/share/nginx/html目錄創(chuàng)建文件3.html

<html>
<body>Test03</body>
</html>

分別測試訪問2.html和3.html


測試2 2.html驗證正常

測試3 3.html驗證正常

此外我們進入容器查看吟逝,目錄中文件是共享的:

root@nfs-nginx-7695b95db6-l74zx:/usr/share/nginx/html# ls
1.html  2.html  3.html

3.5.4 pod銷毀重建
kubectl delete -f nginx.yaml
kubectl apply -f nginx.yaml
再次訪問1.html/2.html/3.html,依舊可以訪問到赦肋,說明文件未丟失块攒。

root@nfs-nginx-7695b95db6-78wml:/usr/share/nginx/html# ls
1.html  2.html  3.html
#新創(chuàng)建的容器,依舊可以看到這些文件

4.結(jié)語

NFS掛載有靜態(tài)與動態(tài)兩種不同模式佃乘,動態(tài)掛載模式需要創(chuàng)建StorageClass囱井,使用過程相對復(fù)雜,本文采用的是靜態(tài)模式趣避。
另外對于k8s集群來講庞呕,NFS并不是最理想存儲模式,建議優(yōu)先采用分布式存儲方案,如cephfs存儲住练。

本文參考
https://www.cnblogs.com/sunsky303/p/11578206.html
http://www.reibang.com/p/65ed4bdf0e89

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末地啰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讲逛,更是在濱河造成了極大的恐慌亏吝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏混,死亡現(xiàn)場離奇詭異蔚鸥,居然都是意外死亡,警方通過查閱死者的電腦和手機许赃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門止喷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人混聊,你說我怎么就攤上這事弹谁。” “怎么了技羔?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卧抗。 經(jīng)常有香客問我藤滥,道長,這世上最難降的妖魔是什么社裆? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任拙绊,我火速辦了婚禮,結(jié)果婚禮上泳秀,老公的妹妹穿的比我還像新娘标沪。我一直安慰自己,他們只是感情好嗜傅,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布金句。 她就那樣靜靜地躺著,像睡著了一般吕嘀。 火紅的嫁衣襯著肌膚如雪违寞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天偶房,我揣著相機與錄音趁曼,去河邊找鬼。 笑死棕洋,一個胖子當著我的面吹牛挡闰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼摄悯,長吁一口氣:“原來是場噩夢啊……” “哼赞季!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起射众,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤碟摆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后叨橱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體典蜕,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年罗洗,在試婚紗的時候發(fā)現(xiàn)自己被綠了愉舔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡伙菜,死狀恐怖轩缤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贩绕,我是刑警寧澤火的,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站淑倾,受9級特大地震影響馏鹤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娇哆,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一湃累、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碍讨,春花似錦治力、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至覆获,卻和暖如春榜田,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锻梳。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工箭券, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疑枯。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓辩块,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子废亭,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345