nfs服务器_Kubernetes集群下部署NFS持久存储
NFS是網(wǎng)絡(luò)文件系統(tǒng)Network File System的縮寫(xiě),NFS服務(wù)器可以讓PC將網(wǎng)絡(luò)中的NFS服務(wù)器共享的目錄掛載到本地的文件系統(tǒng)中,而在本地的系統(tǒng)中來(lái)看,那個(gè)遠(yuǎn)程主機(jī)的目錄就好像是自己的一個(gè)磁盤(pán)分區(qū)一樣。
kubernetes使用NFS共享存儲(chǔ)有兩種方式:
1.手動(dòng)方式靜態(tài)創(chuàng)建所需要的PV和PVC。
2.通過(guò)創(chuàng)建PVC動(dòng)態(tài)地創(chuàng)建對(duì)應(yīng)PV,無(wú)需手動(dòng)創(chuàng)建PV。
下面對(duì)這兩種方式進(jìn)行配置并進(jìn)行演示。
一、搭建NFS服務(wù)器
k8s集群準(zhǔn)備,以這篇文章為例:https://www.toutiao.com/i6768745162030973447/?group_id=6768745162030973447
這里演示在master節(jié)點(diǎn)上部署NFS服務(wù)器。服務(wù)器操作系統(tǒng):Centos7.5.
#master節(jié)點(diǎn)安裝nfsyum -y install nfs-utils#創(chuàng)建nfs目錄mkdir /data#修改權(quán)限chmod??-R 777 /data#編輯export文件vim /etc/exports/data *(rw,no_root_squash,sync)#配置生效exportfs -r#查看生效exportfs#啟動(dòng)rpcbind、nfs服務(wù)systemctl restart rpcbind && systemctl enable rpcbindsystemctl restart nfs && systemctl enable nfs#所有node節(jié)點(diǎn)安裝客戶端?(很重要)yum -y install nfs-utils?systemctl start nfs && systemctl enable nfs?#查看?RPC?服務(wù)的注冊(cè)狀況rpcinfo -p localhost#showmount測(cè)試showmount -e 10.211.55.4二、靜態(tài)申請(qǐng)PV卷
添加pv卷對(duì)應(yīng)目錄,這里創(chuàng)建1個(gè)pv卷,則添加1個(gè)pv卷的目錄作為掛載點(diǎn)。
#創(chuàng)建pv卷對(duì)應(yīng)的目錄mkdir -p /data/pv01#配置exportrsvim /etc/exports/data *(rw,no_root_squash,sync)/data/pv01 *(rw,no_root_squash,sync)#配置生效exportfs -r#重啟rpcbind、nfs服務(wù)systemctl restart rpcbind && systemctl restart nfs創(chuàng)建PV
下面創(chuàng)建1個(gè)名為pv01的PV卷,配置文件 nfspv01.yaml 如下:
apiVersion: v1kind: PersistentVolumemetadata:??name: nfspv01??labels:????pv: nfspv01spec:??capacity:????storage: 1Gi??accessModes:????- ReadWriteOnce??persistentVolumeReclaimPolicy: Recycle??storageClassName: nfs??nfs:????path: /data/pv01????server: 10.211.55.4?配置說(shuō)明:
① capacity 指定 PV 的容量為 1G。
② accessModes 指定訪問(wèn)模式為 ReadWriteOnce,支持的訪問(wèn)模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到單個(gè)節(jié)點(diǎn)。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多個(gè)節(jié)點(diǎn)。
ReadWriteMany – PV 能以 read-write 模式 mount 到多個(gè)節(jié)點(diǎn)。
③ persistentVolumeReclaimPolicy 指定當(dāng) PV 的回收策略為 Recycle,支持的策略有:
Retain – 需要管理員手工回收。
Recycle – 清除 PV 中的數(shù)據(jù),效果相當(dāng)于執(zhí)行 rm -rf /thevolume/*。
Delete – 刪除 Storage Provider 上的對(duì)應(yīng)存儲(chǔ)資源,例如 AWS EBS、GCE PD、Azure
Disk、OpenStack Cinder Volume 等。
④ storageClassName 指定 PV 的 class 為 nfs。相當(dāng)于為 PV 設(shè)置了一個(gè)分類,PVC 可以指定 class 申請(qǐng)相應(yīng) class 的PV。
⑤ 指定 PV 在 NFS 服務(wù)器上對(duì)應(yīng)的目錄
創(chuàng)建PV命令:kubectl create -f nfspv01.yaml
創(chuàng)建成功后查看PV:kubectl get pv
創(chuàng)建PVC
接下來(lái)創(chuàng)建一個(gè)名為pvc01的PVC,配置文件 nfspvc01.yaml 如下:
apiVersion: v1kind: PersistentVolumeClaimmetadata:??name: nfspvc01spec:??accessModes:????- ReadWriteOnce??resources:????requests:??????storage: 1Gi??storageClassName: nfs??selector:????matchLabels:??????pv: nfspv01創(chuàng)建PVC命令: kubectl create -f nfspvc01.yaml
創(chuàng)建成功后查看PVC:kubectl get pvc
創(chuàng)建測(cè)試POD
Pod 配置文件 nfspodtest.yaml 如下:
kind: PodapiVersion: v1metadat:??name: nfspodtestspec:??containers:????- name: nfspodtest??????image: nginx??????volumeMounts:??????- mountPath: "/var/www/html"????????name: nfsvolumetest??volumes:????- name: nfsvolumetest??????persistentVolumeClaim:????????claimName: nfspvc01創(chuàng)建POD命令:kubectl create -f nfspodtest.yaml
查看POD命令:kubectl get pod
驗(yàn)證 PV
進(jìn)入容器目錄創(chuàng)建文件:kubectl exec nfspodtest touch /var/www/html/test.html
查看NFS服務(wù)器真實(shí)目錄: ll /data/pv01
進(jìn)入pod查看掛載情況
kubectl exec -it nfspodtest /bin/bash
root@nfs-pod001:/# df -h
刪除pv
刪除pod,pv和pvc不會(huì)被刪除,nfs存儲(chǔ)的數(shù)據(jù)不會(huì)被刪除。
刪除POD命令: kubectl delete pod nfspodtest
刪除pvc,pv將被釋放,處于 Available 可用狀態(tài),并且nfs存儲(chǔ)中的數(shù)據(jù)被刪除。
刪除PVC命令: kubectl delete pvc nfspvc01
刪除pv
刪除PV命令: kubectl delete pv nfspv01
動(dòng)態(tài)申請(qǐng)PV卷
External NFS驅(qū)動(dòng)的工作原理
K8S的外部NFS驅(qū)動(dòng),可以按照其工作方式(是作為NFS server還是NFS client)分為兩類:
1.nfs-client:
也就是我們接下來(lái)演示的這一類,它通過(guò)K8S的內(nèi)置的NFS驅(qū)動(dòng)掛載遠(yuǎn)端的NFS服務(wù)器到本地目錄;然后將自身作為storage provider,關(guān)聯(lián)storage class。當(dāng)用戶創(chuàng)建對(duì)應(yīng)的PVC來(lái)申請(qǐng)PV時(shí),該provider就將PVC的要求與自身的屬性比較,一旦滿足就在本地掛載好的NFS目錄中創(chuàng)建PV所屬的子目錄,為Pod提供動(dòng)態(tài)的存儲(chǔ)服務(wù)。
2.nfs:
與nfs-client不同,該驅(qū)動(dòng)并不使用k8s的NFS驅(qū)動(dòng)來(lái)掛載遠(yuǎn)端的NFS到本地再分配,而是直接將本地文件映射到容器內(nèi)部,然后在容器內(nèi)使用ganesha.nfsd來(lái)對(duì)外提供NFS服務(wù);在每次創(chuàng)建PV的時(shí)候,直接在本地的NFS根目錄中創(chuàng)建對(duì)應(yīng)文件夾,并export出該子目錄。
利用NFS動(dòng)態(tài)提供Kubernetes后端存儲(chǔ)卷
本文將介紹使用nfs-client-provisioner這個(gè)應(yīng)用,利用NFS Server給Kubernetes作為持久存儲(chǔ)的后端,并且動(dòng)態(tài)提供PV。前提條件是有已經(jīng)安裝好的NFS服務(wù)器,并且NFS服務(wù)器與Kubernetes的Slave節(jié)點(diǎn)都能網(wǎng)絡(luò)連通。將nfs-client驅(qū)動(dòng)做一個(gè)deployment部署到K8S集群中,然后對(duì)外提供存儲(chǔ)服務(wù)。nfs-client-provisioner 是一個(gè)Kubernetes的簡(jiǎn)易NFS的外部provisioner,本身不提供NFS,需要現(xiàn)有的NFS服務(wù)器提供存儲(chǔ)
部署nfs-client-provisioner
首先克隆倉(cāng)庫(kù)獲取yaml文件
git clone https://github.com/kubernetes-incubator/external-storage.git
cp -R external-storage/nfs-client/deploy/ $HOME
cd deploy
配置授權(quán)
如果集群?jiǎn)⒂昧薘BAC,則必須執(zhí)行如下命令授權(quán)provisioner,rbac.yaml文件內(nèi)容:
apiVersion: v1kind: ServiceAccountmetadata:?name: nfs-client-provisioner??# replace with namespace where provisioner is deployed??namespace: default---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:??name: nfs-client-provisioner-runnerrules:??- apiGroups: [""]????resources: ["persistentvolumes"]????verbs: ["get", "list", "watch", "create", "delete"]??- apiGroups: [""]????resources: ["persistentvolumeclaims"]????verbs: ["get", "list", "watch", "update"]??- apiGroups: ["storage.k8s.io"]????resources: ["storageclasses"]????verbs: ["get", "list", "watch"]??- apiGroups: [""]????resources: ["events"]????verbs: ["create", "update", "patch"]---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:??name: run-nfs-client-provisionersubjects:??- kind: ServiceAccount????name: nfs-client-provisioner????# replace with namespace where provisioner is deployed????namespace: defaultroleRef:??kind: ClusterRole??name: nfs-client-provisioner-runner??apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:??name: leader-locking-nfs-client-provisioner????# replace with namespace where provisioner is deployed??namespace: defaultrules:??- apiGroups: [""]????resources: ["endpoints"]????verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:??name: leader-locking-nfs-client-provisionersubjects:??- kind: ServiceAccount????name: nfs-client-provisioner????# replace with namespace where provisioner is deployed????namespace: defaultroleRef:??kind: Role??name: leader-locking-nfs-client-provisioner??apiGroup: rbac.authorization.k8s.io命令: kubectl create -f rbac.yaml
修改deployment.yaml文件
這里修改的參數(shù)包括NFS服務(wù)器所在的IP地址(10.211.55.4),以及NFS服務(wù)器共享的路徑(/data),兩處都需要修改為你實(shí)際的NFS服務(wù)器和共享目錄。
apiVersion: apps/v1kind: Deploymentmetadata:??name: nfs-client-provisioner??labels:????app: nfs-client-provisioner??# replace with namespace where provisioner is deployed??namespace: defaultspec:??replicas: 1??selector:????matchLabels:??????app: nfs-client-provisioner??strategy:????type: Recreate??selector:????matchLabels:??????app: nfs-client-provisioner??template:????metadata:??????labels:????????app: nfs-client-provisioner????spec:??????serviceAccountName: nfs-client-provisioner??????containers:????????- name: nfs-client-provisioner??????????image:?willdockerhub/nfs-client-provisioner:latest??????????volumeMounts:????????????- name: nfs-client-root??????????????mountPath: /persistentvolumes??????????env:????????????- name: PROVISIONER_NAME??????????????value: fuseim.pri/ifs????????????- name: NFS_SERVER??????????????value: 10.211.55.4????????????- name: NFS_PATH??????????????value: /data??????volumes:????????- name: nfs-client-root??????????nfs:????????????server: 10.211.55.4????????????path: /data執(zhí)行命令:kubectl create-f deployment.yaml
查看POD:kubectl get pod
創(chuàng)建StorageClass
class.yaml 文件內(nèi)容: kubectl create -f class.yaml
apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:??name: managed-nfs-storageprovisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'parameters:??archiveOnDelete: "false"查看創(chuàng)建的storageclass: kubectl get sc
創(chuàng)建測(cè)試PVC
test-claim.yaml文件內(nèi)容:
kind: PersistentVolumeClaimapiVersion: v1metadata:??name: test-claim??annotations:????volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:??accessModes:????- ReadWriteMany??resources:????requests:??????storage: 1Mi命令:kubectl create -f test-claim.yaml
查看PVC,自動(dòng)創(chuàng)建的PV,它們的綁定關(guān)系:
查看NFS服務(wù)器實(shí)際目錄, 我們進(jìn)入到NFS的export目錄,可以看到對(duì)應(yīng)該volume name的目錄已經(jīng)創(chuàng)建出來(lái)了。其中volume的名字是namespace,PVC name以及uuid的組合:
創(chuàng)建測(cè)試Pod
test-pod.yaml 文件內(nèi)容:
kind: PodapiVersion: v1metadata:??name: test-podspec:??containers:??- name: test-pod????image: gcr.io/google_containers/busybox:1.24????command:??????- "/bin/sh"????args:??????- "-c"??????- "touch /mnt/SUCCESS && exit 0 || exit 1"????volumeMounts:??????- name: nfs-pvc????????mountPath: "/mnt"??restartPolicy: "Never"??volumes:????- name: nfs-pvc??????persistentVolumeClaim:????????claimName: test-claim命令:kubectl create -f test-pod.yaml
查看POD,實(shí)際目錄有無(wú)產(chǎn)生文件:
清理測(cè)試環(huán)境
刪除測(cè)試POD:kubectl delete -f test-pod.yaml
刪除測(cè)試PVC: kubectl delete -f test-claim.yaml
發(fā)現(xiàn)在NFS服務(wù)器上的共享目錄下查看NFS的PV卷已經(jīng)被刪除:
總結(jié)
以上是生活随笔為你收集整理的nfs服务器_Kubernetes集群下部署NFS持久存储的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: a股历史30年的大盘价_2020年7月3
- 下一篇: 免密登录关闭_微信最新提醒:这个设置再不