K8s集群中 NFS访问配置注意点
Kubernetes cluster中,配置NFS时常常遇到目录无权限,或者无法申请pv的情况,下面记录原因及解决方案:
以下所有都是使用
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
对应4.0.2的版本,镜像为:
registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:4.0.2
1. 目录无权限
常见,解决方法
chmod 777 {your nfs directory}
2. 目录有权限,但无法访问pv
单机较少见,集群中常见,原因为hosts设置不对
解决方案
1. 检查hosts文件
1.1.1.1 {your_nfs_server_host}
这里的nfs_server_host需要与nfs-provisioner安装时指定的nfs_server一致
2. 检查nfs server的配置
1. /etc/exports
这里记录了一系列可以访问共享文件夹的host,需要把要访问文件的host一并写在这里,举例
/home/nfs 1.1.1.1(rw,sync,no_root_squash)
/home/nfs .....
2. /etc/hosts.allow & /etc/hosts.deny
这里限制了哪些机器可以访问nfs服务器(注意,还没有到特定目录)。检索路径为,
- 判断是否在allow中,如果在,允许
- 判断是否在deny中,如果在,拒绝
- 如果都不存在,允许
因此通常方式为,在hosts.allow中,记入需要的host,在hosts.deny中,拒绝全部 举例 hosts.allow
mountd:1.1.1.1
mountd:2.2.2.2
hosts.deny
mountd:all
满足网络要求,路径权限,nfs provisioner即可正常创建pv
特殊
根据常识一般一个集群只有一个nfs-provisioner,但实际上是可以有多个的,只不过不同的provisioner,需要设置不同的storageclass,参考下列shell
helm install "$storage_cls-nfs-provisioner" nfs-subdir-external-provisioner --set nfs.server="$nfs_server" \
--set nfs.path="$nfs_path" \
--set storageClass.name="$storage_cls" \
--set storageClass.provisionerName="$provisioner_name"
这样可以无限安装下去,达到存储扩容的目的,需要注意的是,对应pvc部分也要做修改,比如当创建新的pvc时,storageclassName可以递增等。
另外,默认的registry.k8s.io镜像一般国内无法下载,可以把registry.k8s.io/sig-storage替换为registry.cn-hangzhou.aliyuncs.com/google_containers尝试