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.nfs
和 mount.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
k8s的pv和pvc(阿里雲伺服器nfs建立pv)
全棧工程師開發手冊 (作者:欒鵬) 簡介 PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的兩種API資源,用於抽象儲存細節。管理員關注於如何通過pv提供儲存功能而無需關注使用者如何使用,同樣的使用
?mysql使用pv和pvc實踐操作記錄
技術 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
容器編排系統K8s之PV、PVC、SC資源
前文我們聊到了k8s中給Pod新增儲存卷相關話題,回顧請參考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html;今天我們來聊一下持久儲存卷相關話題; volume的基礎使用,需要我們使用者手動來向不同型別儲存介面傳遞不同的引數,從而實現把外部儲存對
k8s之PV、PVC、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