Kubernetes mount.nfs:安装时服务器拒绝访问
Kubernetes mount.nfs: access denied by server while mounting
我有一个 kubernetes 集群 运行 在网络中,并且在同一网络中的另一台机器上设置了 NFS 服务器。我能够通过 运行ning sudo mount -t nfs 10.17.10.190:/export/test /mnt
ssh 到集群中的任何节点并从服务器挂载,但是每当我的测试 pod 尝试使用指向该服务器的 nfs 持久卷时,它就会失败此消息:
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
19s 19s 1 default-scheduler Normal Scheduled Successfully assigned nfs-web-58z83 to wal-vm-newt02
19s 3s 6 kubelet, wal-vm-newt02 Warning
FailedMount MountVolume.SetUp failed for volume "kubernetes.io/nfs/bad55e9c-7303-11e7-9c2f-005056b40350-test-nfs" (spec.Name: "test-nfs") pod "bad55e9c-7303-11e7-9c2f-005056b40350" (UID: "bad55e9c-7303-11e7-9c2f-005056b40350") with: mount failed: exit status 32
Mounting command: mount
Mounting arguments: 10.17.10.190:/exports/test /var/lib/kubelet/pods/bad55e9c-7303-11e7-9c2f-005056b40350/volumes/kubernetes.io~nfs/test-nfs nfs []
Output: mount.nfs: access denied by server while mounting 10.17.10.190:/exports/test
有谁知道我该如何解决这个问题,以便我可以从外部 NFS 服务器挂载?
群集的节点 运行 正在 10.17.10.185 - 10.17.10.189
上,并且所有 pods 运行 的 ip 都以 10.0.x.x
开头。集群和 NFS 服务器上的所有节点都是 运行ning Ubuntu。 NFS 服务器 运行 正在 10.17.10.190
上 /etc/exports
:
/export 10.17.10.185/255.0.0.0(rw,sync,no_subtree_check)
我设置了持久卷和持久卷声明,它们都成功创建并显示了 运行ning kubectl get pv,pvc
:
的输出
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE
pv/test-nfs 1Mi RWX Retain Bound staging/test-nfs 15m
NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE
pvc/test-nfs Bound test-nfs 1Mi RWX 15m
它们是这样创建的:
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-nfs
spec:
capacity:
storage: 1Mi
accessModes:
- ReadWriteMany
nfs:
# FIXME: use the right IP
server: 10.17.10.190
path: "/exports/test"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
我的测试 pod 使用此配置:
apiVersion: v1
kind: ReplicationController
metadata:
name: nfs-web
spec:
replicas: 1
selector:
role: web-frontend
template:
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
volumeMounts:
# name must match the volume name below
- name: test-nfs
mountPath: "/usr/share/nginx/html"
volumes:
- name: test-nfs
persistentVolumeClaim:
claimName: test-nfs
您必须将 securityContext 设置为 privileged: true。看看这个link
可能是因为您pod/container中使用的uid在NFS服务器上没有足够的权限。
您可以 运行AsUser 如@Giorgio 所述,或尝试编辑命名空间的 uid 范围注释并修复一个值(例如:666)。像这样你命名空间中的每个 pod
将 运行 与 uid 666。
不要忘记 chown 666
正确设置您的 NFS 目录。
在我的例子中,我试图挂载错误的目录...
volumes:
- name: nfs-data
nfs:
# https://github.com/kubernetes/minikube/issues/3417
# server is not resolved using kube dns (so can't resolve to a service name - hence we need the IP)
server: 10.100.155.82
path: /tmp
我在服务器的/etc/exports中没有/tmp
...
kubernetes 集群准备 NFS 文件夹配置的完整解决方案是应用以下内容:
# set folder permission
sudo chmod 666 /your/folder/ # maybe 777
# append new line on exports file to allow network access to folder
sudo bash -c "echo '/your/folder/ <network ip/range>(rw,sync,no_root_squash,subtree_check)' >> /etc/exports"
# set folder export
sudo exportfs -ra
另一种选择是将 uid/gid 信息添加到 nfs 容器本身。您可以通过创建一个脚本来将条目添加到 /etc/passwd
然后启动供应器来做到这一点:
groupadd -g 102 postfix
adduser -u 101 -g 102 -M postfix
groupadd -g 5000 vmail
adduser -u 5000 -g 5000 -M vmail
adduser -u 33 -g 33 -M www-data
groupadd -g 8983 solr
adduser -u 8983 -g 8983 -M solr
...
/nfs-server-provisioner -provisioner=cluster.local/nfs-provisioner-nfs-server-provisioner
这允许使用 NFSv3(nfs-provisioner 使用的)在 NFS 边界上保留 user/group 信息。我的理解是 NFSv4 没有这个问题,但我一直无法让 NFSv4 与供应商一起工作。
我有一个 kubernetes 集群 运行 在网络中,并且在同一网络中的另一台机器上设置了 NFS 服务器。我能够通过 运行ning sudo mount -t nfs 10.17.10.190:/export/test /mnt
ssh 到集群中的任何节点并从服务器挂载,但是每当我的测试 pod 尝试使用指向该服务器的 nfs 持久卷时,它就会失败此消息:
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
19s 19s 1 default-scheduler Normal Scheduled Successfully assigned nfs-web-58z83 to wal-vm-newt02
19s 3s 6 kubelet, wal-vm-newt02 Warning
FailedMount MountVolume.SetUp failed for volume "kubernetes.io/nfs/bad55e9c-7303-11e7-9c2f-005056b40350-test-nfs" (spec.Name: "test-nfs") pod "bad55e9c-7303-11e7-9c2f-005056b40350" (UID: "bad55e9c-7303-11e7-9c2f-005056b40350") with: mount failed: exit status 32
Mounting command: mount
Mounting arguments: 10.17.10.190:/exports/test /var/lib/kubelet/pods/bad55e9c-7303-11e7-9c2f-005056b40350/volumes/kubernetes.io~nfs/test-nfs nfs []
Output: mount.nfs: access denied by server while mounting 10.17.10.190:/exports/test
有谁知道我该如何解决这个问题,以便我可以从外部 NFS 服务器挂载?
群集的节点 运行 正在 10.17.10.185 - 10.17.10.189
上,并且所有 pods 运行 的 ip 都以 10.0.x.x
开头。集群和 NFS 服务器上的所有节点都是 运行ning Ubuntu。 NFS 服务器 运行 正在 10.17.10.190
上 /etc/exports
:
/export 10.17.10.185/255.0.0.0(rw,sync,no_subtree_check)
我设置了持久卷和持久卷声明,它们都成功创建并显示了 运行ning kubectl get pv,pvc
:
NAME CAPACITY ACCESSMODES RECLAIMPOLICY STATUS CLAIM STORAGECLASS REASON AGE
pv/test-nfs 1Mi RWX Retain Bound staging/test-nfs 15m
NAME STATUS VOLUME CAPACITY ACCESSMODES STORAGECLASS AGE
pvc/test-nfs Bound test-nfs 1Mi RWX 15m
它们是这样创建的:
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-nfs
spec:
capacity:
storage: 1Mi
accessModes:
- ReadWriteMany
nfs:
# FIXME: use the right IP
server: 10.17.10.190
path: "/exports/test"
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
我的测试 pod 使用此配置:
apiVersion: v1
kind: ReplicationController
metadata:
name: nfs-web
spec:
replicas: 1
selector:
role: web-frontend
template:
metadata:
labels:
role: web-frontend
spec:
containers:
- name: web
image: nginx
ports:
- name: web
containerPort: 80
volumeMounts:
# name must match the volume name below
- name: test-nfs
mountPath: "/usr/share/nginx/html"
volumes:
- name: test-nfs
persistentVolumeClaim:
claimName: test-nfs
您必须将 securityContext 设置为 privileged: true。看看这个link
可能是因为您pod/container中使用的uid在NFS服务器上没有足够的权限。
您可以 运行AsUser 如@Giorgio 所述,或尝试编辑命名空间的 uid 范围注释并修复一个值(例如:666)。像这样你命名空间中的每个 pod 将 运行 与 uid 666。
不要忘记 chown 666
正确设置您的 NFS 目录。
在我的例子中,我试图挂载错误的目录...
volumes:
- name: nfs-data
nfs:
# https://github.com/kubernetes/minikube/issues/3417
# server is not resolved using kube dns (so can't resolve to a service name - hence we need the IP)
server: 10.100.155.82
path: /tmp
我在服务器的/etc/exports中没有/tmp
...
kubernetes 集群准备 NFS 文件夹配置的完整解决方案是应用以下内容:
# set folder permission
sudo chmod 666 /your/folder/ # maybe 777
# append new line on exports file to allow network access to folder
sudo bash -c "echo '/your/folder/ <network ip/range>(rw,sync,no_root_squash,subtree_check)' >> /etc/exports"
# set folder export
sudo exportfs -ra
另一种选择是将 uid/gid 信息添加到 nfs 容器本身。您可以通过创建一个脚本来将条目添加到 /etc/passwd
然后启动供应器来做到这一点:
groupadd -g 102 postfix
adduser -u 101 -g 102 -M postfix
groupadd -g 5000 vmail
adduser -u 5000 -g 5000 -M vmail
adduser -u 33 -g 33 -M www-data
groupadd -g 8983 solr
adduser -u 8983 -g 8983 -M solr
...
/nfs-server-provisioner -provisioner=cluster.local/nfs-provisioner-nfs-server-provisioner
这允许使用 NFSv3(nfs-provisioner 使用的)在 NFS 边界上保留 user/group 信息。我的理解是 NFSv4 没有这个问题,但我一直无法让 NFSv4 与供应商一起工作。