我有一个kubernetes群集,它正在外部网络中运行,并在同一网络中的另一台计算机上设置了一个NFS服务器。我可以通过ssh连接到群集中的任何节点,并通过运行sudo mount -t nfs 10.17.10.190:/export/test /mnt
从服务器挂载,但每当我的测试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
上运行,所有Pod运行的ip以10.0.x.x
开头。群集上的所有节点和NFS服务器运行Ubuntu。NFS服务器在10.17.10.190
上运行,/etc/exports
为:
/export 10.17.10.185/255.0.0.0(rw,sync,no_subtree_check)
我设置了一个持久卷和持久卷声明,它们都成功创建,显示了运行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
6条答案
按热度按时间ukxgm1gy1#
这可能是因为pod/container中使用的uid在NFS服务器上没有足够的权限。
您可以像@Giorgio提到的那样运行AsUser,或者尝试编辑名称空间的uid范围注解并修复一个值(例如:像这样,命名空间中的每个pod都将使用uid 666运行。
不要忘记正确地
chown 666
您的NFS目录。wkftcu5l2#
您必须将安全上下文设置为特权:true。请查看此链接
9rbhqvlz3#
Kubernetes群集准备NFS文件夹预配的完整解决方案是应用以下内容:
vmjh9lq94#
在我的情况下,我试图挂载错误的目录...
我在服务器的/etc/exports中没有
/tmp
...xytpbqjk5#
另一种选择是将uid/gid信息添加到nfs容器本身。您可以通过创建一个脚本将条目添加到
/etc/passwd
,然后启动预配程序来完成此操作:这允许使用NFSv 3(nfs-provisioner使用的是NFSv 3)在NFS边界上保留用户/组信息。我的理解是NFSv 4没有这个问题,但我一直无法让NFSv 4与provisioner一起工作。
ao218c7q6#
在我的例子中,这是我挂载NFS的方式。工作的配置如下:
请注意,这是不安全的,您可能需要调整它使其安全,同时仍然使其工作!