1. 程式人生 > >K8S NFS PV/PVC 使用實踐

K8S NFS PV/PVC 使用實踐

nfs 作為 k8s 的網路儲存驅動,可以滿足持久儲存業務的需求,支援多節點讀也寫。
下面採用 k8s pv與pvc來配套使用nfs資源。
建立pv,並建立與之關聯的pvc,如下:

-[[email protected] pvtest]$ kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM                       STORAGECLASS   REASON    AGE
nfs-pv          100Mi      RWX            Retain           Bound     chenqiang-pv-test/nfs-pvc                            12
m nfs-server-pv 100Gi RWX Retain Bound default/nfs-server-pvc 2h -[[email protected] pvtest]$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs-server-pvc Bound nfs-server-pv 100
Gi RWX 2h -[[email protected] pvtest]$ kubectl -n chenqiang-pv-test get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs-pvc Bound nfs-pv 100Mi RWX 12m -[[email protected] pvtest]$ kubectl -n chenqiang-pv-test get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs-pv 100
Mi RWX Retain Bound chenqiang-pv-test/nfs-pvc 12m nfs-server-pv 100Gi RWX Retain Bound default/nfs-server-pvc 2h

注意:pv是沒有namespace的概念,也就沒有租戶的概念,但 pvc 有租戶的概念,當需要在某個 namespace 下使用 pvc 時,需要指定該 pvc 所屬 namespace。這個我們可以通過上面的演示看出。

建立名字為 nfs-pv 的 pv,假設 yaml 命名為 nfs-pv.yaml 如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  namespace: chenqiang-pv-test
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  nfs:
    # FIXME: use the right IP
    server: 10.130.44.20
    path: "/test/mysql-nfs01"

建立名字為 nfs-pvc 的 pvc, 假設 yaml 命名為 nfs-pvc.yaml 如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
  namespace: chenqiang-pv-test
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 90Mi

建立使用pod

      containers:
      - name: nginx-hello
        image: docker-registry.saicstack.com/chenqiang/nginx-hello:v2.0
        ports:
        - containerPort: 80
        securityContext:
          privileged: true
        volumeMounts:
        # name must match the volume name below
        - name: nfs
          mountPath: "/chenqiang/pv-test"
      volumes:
      - name: nfs
        persistentVolumeClaim:
          claimName: nfs-pvc

看下 pod 是否起來:

-[[email protected] pvtest]$ kubectl -n chenqiang-pv-test get po
NAME                                      READY     STATUS              RESTARTS   AGE
nginx-hello-deployment-6f9f4d7bcc-86kb5   1/1       Running             0          1h

如果在建立 pod 的時,沒有先建立 pvc,那麼為出現如下的 event log:

Events:
  Type     Reason                 Age               From                  Message
  ----     ------                 ----              ----                  -------
  Warning  FailedMount            58m (x4 over 1h)  kubelet, 10.130.33.8  Unable to mount volumes for pod "nginx-hello-deployment-6f9f4d7bcc-86kb5_chenqiang-pv-test(7b18c376-7382-11e8-9a03-74eacb756039)": timeout expired waiting for volumes to attach/mount for pod "chenqiang-pv-test"/"nginx-hello-deployment-6f9f4d7bcc-86kb5". list of unattached/unmounted volumes=[nfs]

當 pvc 建立好後,繼續檢視log如下:

Events:
  Type     Reason                 Age               From                  Message
  ----     ------                 ----              ----                  -------
  Warning  FailedMount            58m (x4 over 1h)  kubelet, 10.130.33.8  Unable to mount volumes for pod "nginx-hello-deployment-6f9f4d7bcc-86kb5_chenqiang-pv-test(7b18c376-7382-11e8-9a03-74eacb756039)": timeout expired waiting for volumes to attach/mount for pod "chenqiang-pv-test"/"nginx-hello-deployment-6f9f4d7bcc-86kb5". list of unattached/unmounted volumes=[nfs]
  Normal   SuccessfulMountVolume  58m               kubelet, 10.130.33.8  MountVolume.SetUp succeeded for volume "nfs-pv"
  Normal   Pulled                 58m               kubelet, 10.130.33.8  Container image "docker-registry.saicstack.com/chenqiang/nginx-hello:v2.0" already present on machine
  Normal   Created                58m               kubelet, 10.130.33.8  Created container
  Normal   Started                58m               kubelet, 10.130.33.8  Started container

當希望建立 2 個 pod 的時候,會發現有一個啟動不了。

-[[email protected] pvtest]$ kubectl -n chenqiang-pv-test get po -o wide
NAME                                      READY     STATUS              RESTARTS   AGE       IP               NODE
nginx-hello-deployment-6f9f4d7bcc-86kb5   1/1       Running             0          1h        172.12.180.144   10.130.33.8
nginx-hello-deployment-6f9f4d7bcc-lbt2n   0/1       ContainerCreating   0          1h        <none>           10.130.33.13

檢視該 pod event log:

Events:
  Type     Reason       Age                From                   Message
  ----     ------       ----               ----                   -------
  Warning  FailedMount  6m (x25 over 1h)   kubelet, 10.130.33.13  Unable to mount volumes for pod "nginx-hello-deployment-6f9f4d7bcc-lbt2n_chenqiang-pv-test(7b0fcbd3-7382-11e8-80b5-74eacb7559f1)": timeout expired waiting for volumes to attach/mount for pod "chenqiang-pv-test"/"nginx-hello-deployment-6f9f4d7bcc-lbt2n". list of unattached/unmounted volumes=[nfs]
  Warning  FailedMount  12s (x39 over 1h)  kubelet, 10.130.33.13  (combined from similar events): MountVolume.SetUp failed for volume "nfs-pv" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/7b0fcbd3-7382-11e8-80b5-74eacb7559f1/volumes/kubernetes.io~nfs/nfs-pv --scope -- mount -t nfs 10.130.44.20:/test/mysql-nfs01 /var/lib/kubelet/pods/7b0fcbd3-7382-11e8-80b5-74eacb7559f1/volumes/kubernetes.io~nfs/nfs-pv
Output: Running scope as unit run-11918.scope.
mount: wrong fs type, bad option, bad superblock on 10.130.44.20:/test/mysql-nfs01,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)

       In some cases useful info is found in syslog - try
       dmesg | tail or so.

根據錯誤提示,檢視/sbin/mount.<type>檔案,果然發現沒有/sbin/mount.nfs的檔案,安裝 nfs-utils 即可

解決辦法:

apt-get install nfs-common

或者

yum install nfs-utils

安裝之後,/sbin/ 下面多了幾個 mount 檔案,比如 mount.nfsmount.nfs4等:

[[email protected]]# cat /sbin/mo
modinfo     modprobe    mount.ceph  mount.nfs   mount.nfs4  mountstats 

再次 kubectl get po 試下,發現起來了:

-[[email protected] pvtest]$ kubectl -n chenqiang-pv-test get po -o wide
NAME                                      READY     STATUS    RESTARTS   AGE       IP               NODE
nginx-hello-deployment-6f9f4d7bcc-86kb5   1/1       Running   0          1h        172.12.180.144   10.130.33.8
nginx-hello-deployment-6f9f4d7bcc-lbt2n   1/1       Running   0          1h        172.12.232.103   10.130.33.13

接下來測試一下如何同時寫:
分別進入這兩個pod,並分別執行如下程式。

在 pod nginx-hello-deployment-6f9f4d7bcc-86kb5 中執行:

sh-4.1# for i in `seq 1 1000`; do echo $i >> a.test; done

在 pod nginx-hello-deployment-6f9f4d7bcc-lbt2n 中執行:

sh-4.1# for i in `seq 1000 10000`; do echo $i >> a.test; done

經過一段的同時寫後,擷取部分結果如下:

995
855
997
998
999
1000
1001
1002
1003
1004
1005

我們發現,兩個pod在同時開始寫的時候,是有一個先後順序的,比如第一個是從 1寫到999,等第一個寫完了,第二個再從 1000 寫到 9999 這是加了檔案鎖的緣故。
如果不加任何延時,由於寫的太快,中途可能會丟失資料,需要加些延時處理,比如:
另測試一組再次驗證:

pod 1 中執行:

for i in `seq 1 1000`; do echo $i >> a.test; sleep 1; done

pod 2 中執行:

for i in `seq 20001 21000`; do echo $i >> a.test; sleep 1; done

先敲下 pod2 中的命令,然後立馬敲下 pod1 中的命令,發現會錯開寫,部分結果如下:

20001
20002
20003
1
20004
2
20005
3
20006
4
20007
5
20008
6
20009
7
20010
8
20011
9
20012
10

相關推薦

K8S NFS PV/PVC 使用實踐

nfs 作為 k8s 的網路儲存驅動,可以滿足持久儲存業務的需求,支援多節點讀也寫。 下面採用 k8s pv與pvc來配套使用nfs資源。 建立pv,並建立與之關聯的pvc,如下: -[[email protected] pvtest]$ k

k8spvpvc(阿里雲伺服器nfs建立pv

全棧工程師開發手冊 (作者:欒鵬) 簡介 PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的兩種API資源,用於抽象儲存細節。管理員關注於如何通過pv提供儲存功能而無需關注使用者如何使用,同樣的使用

?mysql使用pvpvc實踐操作記錄

技術 volume 數據表 containe ins disco connected ber Oz 創建nfs存儲目錄[root@kubernetes1 ~]# mkdir /data/k8s/mysqlpv1創建pv[root@kubernetes1 ~]# cat my

k8s-17-k8s PV-PVC

1.NFS-PV-PVC  192.168.56.12上面跑著 [[email protected] pv]# cat pv.yaml  apiVersion: v1 kind: PersistentVolume metad

Kubernetes(k8s)中文文件 名詞解釋:PV/PVC/StorageClass_Kubernetes中文社群

介紹 PersistentVolume(PV)是叢集中已由管理員配置的一段網路儲存。 叢集中的資源就像一個節點是一個叢集資源。 PV是諸如卷之類的卷外掛,但是具有獨立於使用PV的任何單個pod的生命週期。 該API物件捕獲儲存的實現細節,即NFS,iSCSI或雲提供商特定的儲存系統。 Persist

容器編排系統K8sPVPVC、SC資源

  前文我們聊到了k8s中給Pod新增儲存卷相關話題,回顧請參考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html;今天我們來聊一下持久儲存卷相關話題;   volume的基礎使用,需要我們使用者手動來向不同型別儲存介面傳遞不同的引數,從而實現把外部儲存對

k8sPVPVC、StorageClass詳解

導讀 上一篇寫了共享儲存的概述以及一個簡單的案例演示。這一篇就寫一下PV和PVC。 PV是對底層網路共享儲存的抽象,將共享儲存定義為一種“資源”,比如Node也是容器應用可以消費的資源。PV由管理員建立和配置,與共享儲存的具體實現直接相關。 PVC則是使用者對儲存資源的一個“申請”,就像Pod消費Node資源

NFS服務部署實踐過程

NFS服務部署實踐過程NFS服務端部署流程:第一個裏程:檢查服務軟件是否安裝rpm -qa|egrep “nfs-utils|rpcbind” 第二個裏程:進行軟件服務安裝 yum install -y nfs-utils rpcbind 補充說明:nfs-utils 和 rpcbind兩個軟件大禮包 rp

部署k8s ssl集群實踐1:基礎環境準備

基礎 you code hub 錯誤 systemctl 第一個 base 感謝 參考文檔:https://github.com/opsnull/follow-me-install-kubernetes-cluster感謝作者的無私分享。集群環境已搭建成功跑起來。文章是部署

部署k8s ssl集群實踐4:部署etcd集群

搭建 error 運行 gets nofile 指定 not chown names 參考文檔:https://github.com/opsnull/follow-me-install-kubernetes-cluster感謝作者的無私分享。集群環境已搭建成功跑起來。文章是

部署k8s ssl集群實踐3:部署kubectl命令工具行

true red err k8s algo right tps ks.cfg port 參考文檔:https://github.com/opsnull/follow-me-install-kubernetes-cluster感謝作者的無私分享。集群環境已搭建成功跑起來。文章

部署k8s ssl集群實踐2:cfssl配置根證書和秘鑰

com oca init sta names cloud 1.3 name 需要 參考文檔:https://github.com/opsnull/follow-me-install-kubernetes-cluster感謝作者的無私分享。集群環境已搭建成功跑起來。文章是部署

部署k8s ssl集群實踐6:配置高可用kube-apiserver組件ha+keepalived

ops oba alived service 文章 system 兩個 ace 什麽 參考文檔:https://github.com/opsnull/follow-me-install-kubernetes-cluster感謝作者的無私分享。集群環境已搭建成功跑起來。文章是

部署k8s ssl集群實踐10:work節點基礎環境

master ESS rap 系統 sts 基礎 ann emctl pset 1.部署說明:三master節點同時也做work節點,另外新加一個work節點,總共4個work節點。部署了兩套環境,前面master節點部署的是一套環境的記錄。部署work節點用的是另一套環境

部署k8s ssl集群實踐11:work節點配置flanneld

edt vendor ets manager signal k8s service glob conf 前面三節點flanneld已經部署好,只需要在新加節點部署flanneld即可 把flanneld執行文件copy到新加節點 [root@k8s-node3 ~]# sc

部署k8s ssl集群實踐12:work節點配置docker

cti ive con 14. ins type mtu sys oba 部署docker 舊的三節點docker已經安裝好只需要安裝新節點的docker但是所有節點都需要修改docker配置文件 安裝參考前面的基礎篇裏的安裝方法 所有work節點都需要修改以下參數需要修改

部署k8s ssl集群實踐14:work節點部署kube-proxy

ner des csr limit 修改 流量 log config文件 tco 二進制文件前面已經下載分發好。 6.1創建kube-proxy證書 創建證書簽名請求 [root@k8s-master1 kube-proxy]# cat kube-proxy-csr.jso

部署k8s ssl集群實踐15:驗證集群狀態

ext tcp cluster color com blog service def ... 集群狀態 [root@k8s-master1 ~]# kubectl get nodes NAME? ? ? ? ? STATUS? ? ROLES? ?? AGE? ? ?? V

部署k8s ssl集群實踐13:work節點配置kubelet

erb working 創建目錄 情況 1.8 enable lis 磁盤 serialize 部署 kubelet 組件 這個是全新部署,四個節點都要部署 kublet 運行在每個 worker 節點上,接收 kube-apiserver 發送的請求,管理 Pod 容器,

Building Microservice NO.1 深圳:Cloud Native架構下的K8S和微服務實踐_Kubernetes中文社群

發展變革,容器化的興起,帶來應用開發部署的變革,也帶來應用設計架構和運維部署變化; 敏捷為王,造就Cloud Native技術及文化大勢已成,雲原生不僅是技術,在技術之上更是一種團隊技術文化; 疾如雷電,持續交付、DevOps、微服務,成為企業在軟體成果對抗當中勝出的有力武器; 突出重圍,K