【问题标题】:Kubernetes, cannot mount NFS share via DNSKubernetes,无法通过 DNS 挂载 NFS 共享
【发布时间】:2018-08-22 19:12:28
【问题描述】:

我正在尝试通过 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 

nfs.service.domin 的 nslookup 在我的容器中运行良好。这是通过 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:如果我在工作/主节点 10.10.1.11 nfs.service.domain 的 /etc/hosts 文件中添加一个条目,那么我在 server: nfs.service.domain 上方的配置就可以工作。这显然不是一个理想的解决方法...

【问题讨论】:

  • 我过去也遇到过同样的问题。问题是 K8s 的团队他们没有实现这部分 take a look at this discussion。我不知道他们到目前为止是否发布了这个功能。
  • 感谢@GiorgioCerruti 的链接,如果我修改节点的/etc/hosts(我在上面编辑),我设法让它工作,我没有意识到解决服务所需的节点名称以安装卷。

标签: docker kubernetes rpc nfs persistent-volumes


【解决方案1】:

尽量不使用“cluster.local”,只使用nfs服务名。

【讨论】:

    【解决方案2】:

    我正在使用完整的服务名称,它对我来说很好用。像这样:

    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

    谢谢。

    【讨论】:

      【解决方案3】:

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

      1. 更新每个 kubernetes 节点的 /etc/hosts 以解析 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

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-18
        • 2020-12-07
        • 2022-07-14
        • 2018-11-14
        • 2021-12-22
        相关资源
        最近更新 更多