k8s掛載存儲模式---NFS

k8s存儲支持多種模式:本地存儲:hostPath/emptyDir,傳遞網絡存儲:iscsi/nfs,分布式網絡存儲:glusterfs/rbd/cephfs,以及云存儲等;
k8s默認容器如果重建,則容器中文件將丟失,為了解決這些問題,通常我們會將容器中需要持久化的文件存儲到其他可持久化存儲目錄中。

1.存儲到臨時目錄

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

這種模式數據存儲將隨著pod的創建與銷毀生命周期存在,數據將不持久化存儲。

2.存儲到宿主機目錄

  spec:
      nodeSelector:
        kubernetes.io/hostname: k8s-node2  #指定工作在節點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

優點:簡單易用,無需額外支持
缺點:依賴宿主機磁盤容量,pod與宿主機存在強耦合,不利于管理。當pod部署多個副本并分配到不同host時,數據不共享;當pod漂移時,數據不同步;當node故障時,數據易丟失;

3.存儲到NFS中

3.1安裝NFS

#master節點安裝nfs
[root@k8s-master nginx]# yum -y install nfs-utils
#創建nfs目錄
[root@k8s-master nginx]# mkdir -p /nfs/data/
#修改權限
[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服務
[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 服務的注冊狀況
[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創建PV
創建前我們先在master節點 mkdir /nfs/data/nginx 創建出一個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上存在

然后執行創建

[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,刪除數據,即 rm -rf /volume/*(只有 NFS 和 HostPath 支持)
Delete,刪除存儲資源,比如刪除 AWS EBS 卷(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
PVC釋放卷是指用戶刪除一個PVC對象時,那么與該PVC對象綁定的PV就會被釋放。

PersistentVolume有四種狀態:
Available: 可用狀態
Bound: 綁定到PVC
Released: PVC被刪掉,但是尚未回收
Failed : 自動回收失敗
3.3創建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   #關聯pv 的label,key/value要一致

執行創建命令

[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狀態已經從Available變成Bound狀態。

3.4 創建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

創建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 發現有如下報錯,則在節點服務器上安裝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
各節點安裝并啟用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目錄創建了一個1.html文件

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

驗證1正常

3.5.2 在容器1的/usr/share/nginx/html目錄創建文件2.html

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

3.5.3 在容器2的/usr/share/nginx/html目錄創建文件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
#新創建的容器,依舊可以看到這些文件

4.結語

NFS掛載有靜態與動態兩種不同模式,動態掛載模式需要創建StorageClass,使用過程相對復雜,本文采用的是靜態模式。
另外對于k8s集群來講,NFS并不是最理想存儲模式,建議優先采用分布式存儲方案,如cephfs存儲。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370