前提
- Kubernetes集群
- NFS与Kubernetes中的worker节点网络能够互联
部署
NFS服务端
- 使用yum安装NFS安装包(centos)
# yum install nfs-utils -y
服务端配置
配置共享目录
创建共享目录
# mkdir /nfs/data -p
# chmod 755 /nfs/data
/nfs/data即为配置的共享目录
编写配置文件
# 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: 同步共享目录。
- no_root_squash: 可以使用 root 授权。
- no_all_squash: 可以使用普通用户授权。
:wq
保存设置之后,启动NFS服务
# systemctl start nfs
# systemctl enable nfs //设置为开机自启
可以检查一下本地的共享目录
$ showmount -e localhost
Export list for localhost:
/nfs/data 192.168.0.0/24
这样,服务端就配置好了。
nfs-client-provisioner
下载
# git clone https://github.com/kubernetes-incubator/external-storage.git
# cd external-storage/nfs-client
# ls
CHANGELOG.md cmd deploy docker Makefile OWNERS README.md
- cmd:nfs-client-provisioner的源代码,使用go语言编写,可以定制化自己的nfs-client-provisioner(作者定制化了一版,感兴趣的可以玩一下)
- deploy: 是k8s的部署文档,默认使用下面的yaml文件就可以完成部署工作
- docker: Dockerfile文件,主要是结合cmd中的源代码来制定自己的镜像
部署
# cd deploy/
# ls
bak deployment-arm.yaml objects test-claim.yaml
class.yaml deployment.yaml rbac.yaml test-pod.yaml
修改deployment文件并部署
- 修改deployment文件
需要修改的地方只有NFS服务器所在的IP地址(10.10.10.60),以及NFS服务器共享的路径(/ifs/kubernetes),两处都需要修改为你实际的NFS服务器和共享目录
[root@t32 deploy]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
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
授权
如果启用了RBAC,需要执行rbac.yaml文件来完成授权
# kubectl apply -f rbac.yaml
创建storageclass
# cat class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
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
是默认的storageclass - archiveOnDelete:
false
表示pv被删除时,在nfs下面对应的文件夹也会被删除,true
正相反
测试
创建pvc
# cat test-claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
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 AGE
test-claim Bound pvc-a391c304-c0e7-11ea-bf0a-525400135835 1Mi RWX managed-nfs-storage 44h
此时,nfs共享目录下面,会出现default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835文件夹,命名按照n a m e s p a c e−{namespace}-namespace−{pvcName}-${pvName}格式
创建pod
# cat test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
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 AGE
nfs-client-provisioner-6847759999-4wgbg 1/1 Running 0 44h
test-pod 0/1 Completed 0 44h
# ls default-test-claim-pvc-a391c304-c0e7-11ea-bf0a-525400135835
SUCCESS
说明部署正常,并且可以动态分配NFS的共享卷。
NFS客户端(使用HostPath方式部署)
安装nfs
# yum install nfs-utils -y
挂载
# mkdir /nfs/data
# mount -t nfs 192.168.4.32:/nfs/data /nfs/data
检查
# df -h |grep nfs
192.168.4.32:/nfs/data 22T 2.4G 22T 1% /nfs/data