nfs服务器_Kubernetes集群下部署NFS持久存储
NFS是網絡文件系統Network File System的縮寫,NFS服務器可以讓PC將網絡中的NFS服務器共享的目錄掛載到本地的文件系統中,而在本地的系統中來看,那個遠程主機的目錄就好像是自己的一個磁盤分區一樣。
kubernetes使用NFS共享存儲有兩種方式:
1.手動方式靜態創建所需要的PV和PVC。
2.通過創建PVC動態地創建對應PV,無需手動創建PV。
下面對這兩種方式進行配置并進行演示。
一、搭建NFS服務器
k8s集群準備,以這篇文章為例:https://www.toutiao.com/i6768745162030973447/?group_id=6768745162030973447
這里演示在master節點上部署NFS服務器。服務器操作系統:Centos7.5.
#master節點安裝nfsyum -y install nfs-utils#創建nfs目錄mkdir /data#修改權限chmod??-R 777 /data#編輯export文件vim /etc/exports/data *(rw,no_root_squash,sync)#配置生效exportfs -r#查看生效exportfs#啟動rpcbind、nfs服務systemctl restart rpcbind && systemctl enable rpcbindsystemctl restart nfs && systemctl enable nfs#所有node節點安裝客戶端?(很重要)yum -y install nfs-utils?systemctl start nfs && systemctl enable nfs?#查看?RPC?服務的注冊狀況rpcinfo -p localhost#showmount測試showmount -e 10.211.55.4二、靜態申請PV卷
添加pv卷對應目錄,這里創建1個pv卷,則添加1個pv卷的目錄作為掛載點。
#創建pv卷對應的目錄mkdir -p /data/pv01#配置exportrsvim /etc/exports/data *(rw,no_root_squash,sync)/data/pv01 *(rw,no_root_squash,sync)#配置生效exportfs -r#重啟rpcbind、nfs服務systemctl restart rpcbind && systemctl restart nfs創建PV
下面創建1個名為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?配置說明:
① capacity 指定 PV 的容量為 1G。
② accessModes 指定訪問模式為 ReadWriteOnce,支持的訪問模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到單個節點。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多個節點。
ReadWriteMany – PV 能以 read-write 模式 mount 到多個節點。
③ persistentVolumeReclaimPolicy 指定當 PV 的回收策略為 Recycle,支持的策略有:
Retain – 需要管理員手工回收。
Recycle – 清除 PV 中的數據,效果相當于執行 rm -rf /thevolume/*。
Delete – 刪除 Storage Provider 上的對應存儲資源,例如 AWS EBS、GCE PD、Azure
Disk、OpenStack Cinder Volume 等。
④ storageClassName 指定 PV 的 class 為 nfs。相當于為 PV 設置了一個分類,PVC 可以指定 class 申請相應 class 的PV。
⑤ 指定 PV 在 NFS 服務器上對應的目錄
創建PV命令:kubectl create -f nfspv01.yaml
創建成功后查看PV:kubectl get pv
創建PVC
接下來創建一個名為pvc01的PVC,配置文件 nfspvc01.yaml 如下:
apiVersion: v1kind: PersistentVolumeClaimmetadata:??name: nfspvc01spec:??accessModes:????- ReadWriteOnce??resources:????requests:??????storage: 1Gi??storageClassName: nfs??selector:????matchLabels:??????pv: nfspv01創建PVC命令: kubectl create -f nfspvc01.yaml
創建成功后查看PVC:kubectl get pvc
創建測試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創建POD命令:kubectl create -f nfspodtest.yaml
查看POD命令:kubectl get pod
驗證 PV
進入容器目錄創建文件:kubectl exec nfspodtest touch /var/www/html/test.html
查看NFS服務器真實目錄: ll /data/pv01
進入pod查看掛載情況
kubectl exec -it nfspodtest /bin/bash
root@nfs-pod001:/# df -h
刪除pv
刪除pod,pv和pvc不會被刪除,nfs存儲的數據不會被刪除。
刪除POD命令: kubectl delete pod nfspodtest
刪除pvc,pv將被釋放,處于 Available 可用狀態,并且nfs存儲中的數據被刪除。
刪除PVC命令: kubectl delete pvc nfspvc01
刪除pv
刪除PV命令: kubectl delete pv nfspv01
動態申請PV卷
External NFS驅動的工作原理
K8S的外部NFS驅動,可以按照其工作方式(是作為NFS server還是NFS client)分為兩類:
1.nfs-client:
也就是我們接下來演示的這一類,它通過K8S的內置的NFS驅動掛載遠端的NFS服務器到本地目錄;然后將自身作為storage provider,關聯storage class。當用戶創建對應的PVC來申請PV時,該provider就將PVC的要求與自身的屬性比較,一旦滿足就在本地掛載好的NFS目錄中創建PV所屬的子目錄,為Pod提供動態的存儲服務。
2.nfs:
與nfs-client不同,該驅動并不使用k8s的NFS驅動來掛載遠端的NFS到本地再分配,而是直接將本地文件映射到容器內部,然后在容器內使用ganesha.nfsd來對外提供NFS服務;在每次創建PV的時候,直接在本地的NFS根目錄中創建對應文件夾,并export出該子目錄。
利用NFS動態提供Kubernetes后端存儲卷
本文將介紹使用nfs-client-provisioner這個應用,利用NFS Server給Kubernetes作為持久存儲的后端,并且動態提供PV。前提條件是有已經安裝好的NFS服務器,并且NFS服務器與Kubernetes的Slave節點都能網絡連通。將nfs-client驅動做一個deployment部署到K8S集群中,然后對外提供存儲服務。nfs-client-provisioner 是一個Kubernetes的簡易NFS的外部provisioner,本身不提供NFS,需要現有的NFS服務器提供存儲
部署nfs-client-provisioner
首先克隆倉庫獲取yaml文件
git clone https://github.com/kubernetes-incubator/external-storage.git
cp -R external-storage/nfs-client/deploy/ $HOME
cd deploy
配置授權
如果集群啟用了RBAC,則必須執行如下命令授權provisioner,rbac.yaml文件內容:
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文件
這里修改的參數包括NFS服務器所在的IP地址(10.211.55.4),以及NFS服務器共享的路徑(/data),兩處都需要修改為你實際的NFS服務器和共享目錄。
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執行命令:kubectl create-f deployment.yaml
查看POD:kubectl get pod
創建StorageClass
class.yaml 文件內容: 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"查看創建的storageclass: kubectl get sc
創建測試PVC
test-claim.yaml文件內容:
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,自動創建的PV,它們的綁定關系:
查看NFS服務器實際目錄, 我們進入到NFS的export目錄,可以看到對應該volume name的目錄已經創建出來了。其中volume的名字是namespace,PVC name以及uuid的組合:
創建測試Pod
test-pod.yaml 文件內容:
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,實際目錄有無產生文件:
清理測試環境
刪除測試POD:kubectl delete -f test-pod.yaml
刪除測試PVC: kubectl delete -f test-claim.yaml
發現在NFS服務器上的共享目錄下查看NFS的PV卷已經被刪除:
總結
以上是生活随笔為你收集整理的nfs服务器_Kubernetes集群下部署NFS持久存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a股历史30年的大盘价_2020年7月3
- 下一篇: 免密登录关闭_微信最新提醒:这个设置再不