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 example with a cluster local service name only works on GKE but not for minikube/kubeadm #390
- Failed to resolve server nfs-server.default.svc.cluster.local: Name or service not known #418
基本上,NFS 服务器不支持主机名,只支持 IP。
或者您可以使用 csi-driver-nfs
我的远程工作设置如下:
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 example with a cluster local service name only works on GKE but not for minikube/kubeadm #390
- Failed to resolve server nfs-server.default.svc.cluster.local: Name or service not known #418
基本上,NFS 服务器不支持主机名,只支持 IP。
或者您可以使用 csi-driver-nfs