Kubernetes,无法通过 DNS 挂载 NFS 共享

Kubernetes, cannot mount NFS share via DNS

我正在尝试通过 DNS 查找在我的容器中挂载一个 NFS 共享(在 k8s 集群之外),我的配置如下

apiVersion: v1
kind: Pod
metadata:
  name: service-a
spec:
  containers:
  - name: service-a
    image: dockerregistry:5000/centOSservice-a
    command: ["/bin/bash"]
    args: ["/etc/init.d/jboss","start"]
    volumeMounts:
      - name: service-a-vol
        mountPath: /myservice/por/data
  volumes:
    - name: service-a-vol
      nfs:
        server: nfs.service.domain
        path: "/myservice/data"
  restartPolicy: OnFailure 

nslookup of nfs.service.domin 在我的容器中工作正常。这是通过 StubDomain 实现的。但是,在创建容器时,它无法解析 nfs 服务器。错误:

Warning  FailedMount  <invalid>  kubelet, worker-node-1  MountVolume.SetUp failed for volume "service-a-vol" : mount failed: exit status 32
Mounting command: systemd-run
Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/44aabfb8-2767-11e8-bcf9-fa163ece9426/volumes/kubernetes.io~nfs/service-a-vol --scope -- mount -t nfs nfs.service.domain:/myservice/data /var/lib/kubelet/pods/44aabfb8-2767-11e8-bcf9-fa163ece9426/volumes/kubernetes.io~nfs/service-a-vol
Output: Running scope as unit run-27293.scope.
mount.nfs: Failed to resolve server nfs.service.domain: Name or service not known
mount.nfs: Operation already in progress

如果我将 server: nfs.service.domain 修改为 server: 10.10.1.11 这很好用!所以总结一下

  1. 服务的 DNS 解析工作正常
  2. 通过 DNS 解析挂载不
  3. 通过特定 IP 地址挂载有效
  4. 我已经尝试 Headless Service 而不是 StubDomain,但存在同样的问题

非常感谢任何帮助

更新 1:如果我在 worker/master 个节点 10.10.1.11 nfs.service.domain 的 /etc/hosts 文件中添加一个条目,那么我上面的配置 server: nfs.service.domain 有效。这显然不是理想的解决方法...

正如@Giorgio Cerruti 所指出的以及在 this github ticket 中引用的那样,这目前是不可能的,因为节点需要能够解析 DNS 条目并且它不解析 kube-dns .两种可能的解决方案是:

  1. 更新 /etc/hosts 每个 kubernetes 节点以解析 NFS 端点(按照上面的更新)。这是一个原始的解决方案。
  2. 适用于此 NFS 服务和同一域(如 NFS)中的任何其他远程服务的更强大的修复是将远程 DNS 服务器添加到 kubernetes 节点 resolv.conf

    someolddomain.org service.domain xx.xxx.xx nameserver 10.10.0.12 nameserver 192.168.20.22 nameserver 8.8.4.4

我使用的是完整服务名称,它对我来说工作正常。像这样:

apiVersion: v1
kind: Pod
metadata:
  name: alpine
  labels:
    app: alpine
spec:
  containers:
    - name: alpine
      image: "alpine:latest"
      imagePullPolicy: "Always"
      command: [ "tail", "-f", "/dev/null" ]
      resources:
        limits:
          cpu: 100m
          memory: 100Mi
      volumeMounts:
        - mountPath: /nfs
          name: nfs-vol
  volumes:
    - name: nfs-vol
      nfs:
        path: /exports
        server: nfs-server-svc.nfs-test.svc.cluster.local

在此之前,我只尝试使用“简单”服务名称,但它不起作用。

我正在开发 GKE,版本为“v1.20.10-gke.1600”。

您可以查看更多详情here

谢谢。

尝试不使用“cluster.local”,只使用 nfs 服务名称。

尝试使用完整的服务名称,如下所示“[service-name].[service-namespace].svc.cluster.local”.