【问题标题】:Kubernetes mount.nfs: access denied by server while mountingKubernetes mount.nfs:挂载时服务器拒绝访问
【发布时间】:2018-01-03 17:33:56
【问题描述】:

我有一个在外网中运行的 kubernetes 集群,并且在同一网络中的另一台机器上设置了 NFS 服务器。我可以通过运行 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 都使用以10.0.x.x 开头的ips 运行。集群上的所有节点和 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

【问题讨论】:

  • 嘿@Co​​lin 你能解决这个问题吗?
  • @AvikAggarwal 是的,我在下面接受的解决方案为我解决了它

标签: kubernetes nfs


【解决方案1】:

这可能是因为您的 pod/container 中使用的 uid 在 NFS 服务器上没有足够的权限。

您可以按照@Giorgio 的说明运行AsUser,或者尝试编辑命名空间的uid-range 注释并修复一个值(例如:666)。像这样在你的命名空间中的每个 pod 将使用 uid 666 运行。

不要忘记chown 666 正确地使用您的 NFS 目录。

【讨论】:

  • 修复 uid 的值有效,我不知道为什么它不适用于标准用户,我拥有的用户的实际 uid 一定很奇怪。
  • @ColinMaxfield:您能否解释一下如何固定 pod 和 NFS 共享上的 UID?
  • @n3o 我只是按照 Nicolas 的建议使用 runAsUser 设置为我选择的特定用户 ID,然后我更改了 NFS 目录的所有权以使用 chown 匹配相同的用户 ID。跨度>
【解决方案2】:

您必须将 securityContext 设置为 privileged: true。看看这个link

【讨论】:

  • 嗯,我尝试使用privileged: true 运行容器,但它的行为仍然相同。我也试过runAsUser: 65534(nfs的nobody用户),它显示了同样的错误。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    就我而言,我试图挂载错误的目录...

          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...

    【讨论】:

      【解决方案5】:

      另一种选择是将 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 边界上保留用户/组信息。我的理解是 NFSv4 没有这个问题,但我无法让 NFSv4 与配置器一起工作。

      【讨论】:

        猜你喜欢
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-08
        • 2023-03-12
        相关资源
        最近更新 更多