Kubernetes mount.nfs:挂载时服务器拒绝访问

Col*_*eld 7 nfs kubernetes

我有一个在外网运行的 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
Run Code Online (Sandbox Code Playgroud)

有谁知道我如何解决这个问题并使它可以从外部 NFS 服务器挂载?

集群的节点正在运行,10.17.10.185 - 10.17.10.189并且所有 pod 都使用以 .ips 开头的 ips 运行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)
Run Code Online (Sandbox Code Playgroud)

我设置了一个持久卷和持久卷声明,它们都成功创建,显示了运行的输出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
Run Code Online (Sandbox Code Playgroud)

它们是这样创建的:

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
Run Code Online (Sandbox Code Playgroud)

我的测试吊舱正在使用此配置:

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
Run Code Online (Sandbox Code Playgroud)

Nic*_*ter 4

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

您可以按照 @Giorgio 提到的 runAsUser 或尝试编辑命名空间的 uid-range 注释并修复一个值(例如:666)。像这样,命名空间中的每个 pod 都将以 uid 666 运行。

不要忘记chown 666正确设置您的 NFS 目录。