1. 前提
Kubernetes集群
NFS与Kubernetes中的worker节点网络能够互联
2. 部署
2.1 NFS服务端
使用yum安装NFS安装包(centos)
# yum install nfs-utils -y
2.2 服务端配置
2.2.1 配置共享目录
(1) 创建共享目录
# mkdir /nfs/data -p# chmod 755 /nfs/data
/nfs/data即为配置的共享目录
(2) 编写配置文件
# vi /etc/exports/nfs/data 192.168.0.0/24(rw,sync,no_root_squash,no_all_squash)
/nfs/data: 共享目录位置。
192.168.0.0/24
: 客户端 IP 范围,*
代表所有,即没有限制。rw: 权限设置,可读可写。
sync: 同步共享目录。
norootsquash: 可以使用 root 授权。
noallsquash: 可以使用普通用户授权。
:wq
保存设置之后,启动NFS服务
# systemctl start nfs# systemctl enable nfs //设置为开机自启
可以检查一下本地的共享目录
$ showmount -e localhostExport list for localhost:/nfs/data 192.168.0.0/24
这样,服务端就配置好了。
2.3 nfs-client-provisioner
2.3.1 下载
# git clone https://github.com/kubernetes-incubator/external-storage.git# cd external-storage/nfs-client# lsCHANGELOG.md cmd deploy docker Makefile OWNERS README.md
cmd:nfs-client-provisioner的源代码,使用go语言编写,可以定制化自己的nfs-client-provisioner(作者定制化了一版,感兴趣的可以玩一下)
deploy: 是k8s的部署文档,默认使用下面的yaml文件就可以完成部署工作
docker: Dockerfile文件,主要是结合cmd中的源代码来制定自己的镜像
2.3.2 部署
# cd deploy/# ls bak deployment-arm.yaml objects test-claim.yamlclass.yaml deployment.yaml rbac.yaml test-pod.yaml
(1)修改deployment文件并部署
修改deployment文件
需要修改的地方只有NFS服务器所在的IP地址(10.10.10.60),以及NFS服务器共享的路径(/ifs/kubernetes),两处都需要修改为你实际的NFS服务器和共享目录。
# cat deployment.yaml apiVersion: apps/v1kind: Deploymentmetadata: name: nfs-client-provisioner labels: app: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: defaultspec: replicas: 1 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: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: fuseim.pri/ifs - name: NFS_SERVER value: 192.168.4.32 - name: NFS_PATH value: /nfs/data volumes: - name: nfs-client-root nfs: server: 192.168.4.32 path: /nfs/data
部署deployment
# kubectl apply -f deployment.yaml
2.3.3 授权
如果启用了RBAC,需要执行rbac.yaml文件来完成授权
# kubectl apply -f rbac.yaml
2.3.4 创建storageclass
# cat class.yaml apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: managed-nfs-storage annotations: storageclass.kubernetes.io/is-default-class: "true"provisioner: fuseim.pri/ifs parameters: archiveOnDelete: "false"
provisioner: 此处可以不修改,或者修改provisioner的名字,需要与上面的deployment的
PROVISIONER_NAME
名字一致。annotations: 设置
managed-nfs-storage
是默认的storageclassarchiveOnDelete:
false
表示pv被删除时,在nfs下面对应的文件夹也会被删除,true
正相反
3. 测试
3.1 创建pvc
# cat test-claim.yaml kind: PersistentVolumeClaimapiVersion: v1metadata: name: test-claim #annotations: # volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec: storageClassName: managed-nfs-storage accessModes: - ReadWriteMany resources: requests: storage: 1Mi
可以使用annotations的方式表明storageclass
也可以通过storageClassName指定storageclass
# kubectl apply -f test-claim.yaml# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEtest-claim Bound pvc-a391c304-c0e7-11ea-bf0a-525400135835 1Mi RWX managed-nfs-storage 44h
此时,nfs共享目录下面,会出现default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835文件夹,命名按照${namespace}-${pvcName}-${pvName}格式。
3.2 创建pod
# cat 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
pod的执行结果,后在pv对应的文件夹下面生成 SUCCESS
文件
# kubectl apply -f test-pod.yaml# kubectl get pod NAME READY STATUS RESTARTS AGEnfs-client-provisioner-6847759999-4wgbg 1/1 Running 0 44htest-pod 0/1 Completed 0 44h# ls default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835SUCCESS
说明部署正常,并且可以动态分配NFS的共享卷。
4. NFS客户端(使用HostPath方式部署)
4.1 安装nfs
# yum install nfs-utils -y
4.2 挂载
# mkdir /nfs/data# mount -t nfs 192.168.4.32:/nfs/data /nfs/data
4.3 检查
# df -h |grep nfs 192.168.4.32:/nfs/data 22T 2.4G 22T 1% /nfs/data
喜欢本文的朋友们,欢迎长按下图关注公众号程序员基础课,收看更多精彩内容
给个[在看],是对程序员的最大支持!