Pod 无法挂载到 Docker 桌面本地测试环境中的 NFS pod

Pod can't mount to NFS pod on Docker Desktop local test environment

我的远程工作设置如下:

PersistentVolume 挂载到 gcePersistentDisk。 Pod“Lagg”对整个永久磁盘提出了要求。 “Lagg”是一个 google 容器 volume-nfs 映像,它充当 ReadWriteOnce 卷和 NFS ReadWriteMany 之间的中间人,我的所有其他 pods 都可以使用权。下面是 Lagg NFS 持久卷 YAML:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: lagg-volume
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    # kustomize does not add prefixes here, so they're placed ahead of time
    server: test-lagg.test-project.svc.cluster.local
    path: "/"

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: lagg-claim
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 5Gi

还有第二个 PersistentVolume 通过 NFS 安装到 pod,其他 pods 可以声明。其中之一 pods 是“数字”,您可以在下面看到音量定义部分:

spec:
  template:
    spec:
      containers:
      - name: digit
        volumeMounts:
          - name: lagg-connection
            mountPath: "/cache"
      volumes:
      - name: lagg-connection
        persistentVolumeClaim:
          claimName: lagg-claim

因为我没有 gcePersistentDisk 用于本地测试,所以我的这个集群的本地版本使用另一个名为“Lagg-local”的持久卷,它简单地取代了 gcePersistentDisk ,看起来像这样:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: lagg-local-volume
  labels:
    type: local
spec:
  storageClassName: manual
  persistentVolumeReclaimPolicy: Delete
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  local:
    path: /run/desktop/mnt/host/c/project/cache
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - docker-desktop
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: lagg-local-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

当我在本地尝试 运行 时,我只得到一个错误,它在 Digit pod 中,使用 describe,它说:

Events:
  Type     Reason       Age                From               Message
  ----     ------       ----               ----               -------
  Normal   Scheduled    47s                default-scheduler  Successfully assigned test-project/test-digit-cff6bd9c6-gz2sn to docker-desktop
  Warning  FailedMount  11s (x7 over 43s)  kubelet            MountVolume.SetUp failed for volume "test-lagg-volume" : mount failed: exit status 32
Mounting command: mount
Mounting arguments: -t nfs test-lagg.test-project.svc.cluster.local:/ /var/lib/kubelet/pods/80f686cf-47bb-478b-a581-c179794e2182/volumes/kubernetes.io~nfs/test-lagg-volume
Output: mount.nfs: Failed to resolve server test-lagg.test-project.svc.cluster.local: Name or service not known

据我所知,pods 根本无法联系 NFS 服务器或者可能无法解析 DNS。 test-lagg 存在并且是 运行ning,test-project 是 test-lagg(指向 lagg NFS pods 的服务)和 test-digit 所在的命名空间。所以我'我不太确定这里发生了什么。

我相信 NFS 服务器工作正常,因为在卷的根目录中创建了一个文件“index.html”,其中只包含“Hello from NFS!”

如果我使用 cpuguy83/nfs-server 图像而不是 google_containers/volume-nfs

,也会发生同样的错误

如果我定义 clusterIP 而不是 DNS 名称,则会出现不同的错误,说明它没有权限。

我也不认为与服务的连接存在问题,因为 运行ning nslookup on the digit pod returns this:

root@test-digit-7c6dc66659-q4trw:/var/www/static# nslookup test-lagg.test-project.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   test-lagg.test-project.svc.cluster.local
Address: 10.105.85.125

NFS pod 本身也正确安装了卷:

On GKE:
PS C:\Users\ral\Documents\Projects\Project\Kubernetes> kubectl exec next-lagg-69884bf49b-fn544 -- bash -c "findmnt /exports -o TARGET,SOURCE,FSTYPE"
TARGET   SOURCE   FSTYPE
/exports /dev/sdb ext4

On local:
PS C:\Users\ral\Documents\Projects\Project\Kubernetes> kubectl exec test-lagg-547cbb779-4qgbl -- bash -c "findmnt /exports -o TARGET,SOURCE,FSTYPE"
TARGET   SOURCE             FSTYPE
/exports C:\[/Project/cache] 9p

在非 GKE 集群上 google_containers/volume-nfs 的 DNS 解析问题是一个已知问题:

基本上,NFS 服务器不支持主机名,只支持 IP。

或者您可以使用 csi-driver-nfs