【问题标题】:Kubernetes - cannot have Windows path mounted on Azure File Share (Linux mounting works properly )Kubernetes - 无法在 Azure 文件共享上安装 Windows 路径(Linux 安装工作正常)
【发布时间】:2021-06-16 22:13:49
【问题描述】:

首先,我成功地在 Pod 上安装了我的 Linux 路径。 我使用了 azure 文件共享,并且挂载的文件夹出现在文件共享上。

    volumeMounts:
      - name: ads-filesharevolume
        mountPath: /opt/front/arena/host
  volumes:
  - name: ads-filesharevolume
    azureFile:
      secretName: fa-fileshare-secret
      shareName: faselectaksshare
      readOnly: false

现在在文件共享上,我添加了一个子文件夹“windows”用于挂载,在日志中它提到它已正确挂载但我没有挂载任何东西(文件夹和文件不会像 Linux 那样出现在挂载的共享上)

   args: [ "-license_file", "C:/Host/dat/license.dat",
           "-key_file", "C:/Host/dat/license.key"]
    volumeMounts:
      - name: ads-win-filesharevolume
        mountPath: "C:\\host"
  volumes:
  - name: ads-win-filesharevolume
    azureFile:
      secretName: fa-fileshare-secret
      shareName: faselectaksshare\windows
      readOnly: false

对于 mountPath,我尝试过:C:\\hostC:/host/c/host 同样对于 shareName,我最初尝试使用 faselectaksshare/windows,但它引发了异常。

在 Pod describe 中,我可以看到一切正常,但来自 C:/host 的预期文件夹没有出现在 Windows 子文件夹中的 Azure 文件共享路径中。对于所有其他情况,我也会收到类似的输出。

 Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-nx49r (ro)
      C:/host from ads-win-filesharevolume (rw)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  ads-win-filesharevolume:
    Type:        AzureFile (an Azure File Service mount on the host and bind mount to the pod)
    SecretName:  fa-fileshare-secret
    ShareName:   faselectaksshare\windows
    ReadOnly:    false

请帮忙!谢谢

更新: 我也用 subPath 尝试了这种方法,但我没有安装任何文件夹。此外,我在日志或描述 pod 命令中没有收到任何错误

volumeMounts:
  - name: ads-filesharevolume
    mountPath: /host
    subPath: windows
  volumes:
  - name: ads-filesharevolume
    azureFile:
      secretName: fa-fileshare-secret
      shareName: faselectaksshare
      readOnly: false

【问题讨论】:

  • 关于这个问题的任何更新?它解决了你的问题吗?如果它适合你,请接受它。
  • 你解决问题了吗?我没有看到任何更新。你还在里面工作吗?

标签: docker kubernetes azure-aks kubernetes-pod docker-volume


【解决方案1】:

Windows 和 Linux 容器同时运行:

安装在 Linux 上:

    volumeMounts:
    - name: azure
      mountPath: /mnt/azure
volumes:
  - name: azure
    azureFile:
        shareName: aksshare/linux
        secretName: azure-secret

安装在 Windows 上:

    volumeMounts:
    - name: azure
        mountPath: "C:\\fileshare"
volumes:
- name: azure
  azureFile:
  shareName: aksshare\windows
  secretName: azure-secret

并且文件共享的每个子文件夹中存在的文件不会影响其他文件。

【讨论】:

    【解决方案2】:

    kubelet 应该将 Azure 文件共享挂载到容器中

    它使用https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/mount-utils/mount_windows.gohttps://github.com/kubernetes/kubernetes/blob/master/pkg/volume/azure_file/azure_file.go

    它使用 SMB 映射,然后 mklink 将 Azure 文件共享挂载到容器中

    请在运行 Pod 的 Windows 节点中启动 kubelet,并且应该使用 --v 4 标志挂载 Azure 文件共享,以便在 kubelet 尝试将 Azure 文件共享挂载到容器。然后请在 kubelet 日志中提供消息。您应该会看到来自https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/mount-utils/mount_windows.go的以下消息

    klog.V(3).Infof("mounting source (%q), target (%q), with options (%q)", source, target, sanitizedOptionsForLogging)
    
    klog.V(4).Infof("mount options(%q) source:%q, target:%q, fstype:%q, begin to mount",
            sanitizedOptionsForLogging, source, target, fstype)
    
                klog.Warningf("SMB Mapping(%s) returned with error(%v), output(%s)", source, err, string(output))
    
    klog.V(2).Infof("SMB Mapping(%s) already exists while it's not valid, return error: %v, now begin to remove and remount", source, err)
    
    klog.V(2).Infof("SMB Mapping(%s) already exists and is still valid, skip error(%v)", source, err)
    
    klog.Errorf("mklink failed: %v, source(%q) target(%q) output: %q", err, mklinkSource, target, string(output))
    
    klog.V(2).Infof("mklink source(%q) on target(%q) successfully, output: %q", mklinkSource, target, string(output))
    

    【讨论】:

    • 抱歉,我不明白如何提供更多信息?我看到您提供了带有一些代码的链接...“请在运行 Pod 的 Windows 节点中启动 kubelet,并且应该使用 --v 4 标志安装 Azure 文件共享,因此我们可以在 kubelet 中看到调试消息当它尝试挂载时记录“您能否提供我在运行kubectl apply -f .yaml 以部署具有应该为其挂载的卷的容器后应该执行的详细步骤?谢谢
    • 您能否建议您如何将 Windows 节点添加到 Kubernetes 中?您是否使用 kubeadm kubernetes.io/docs/tasks/administer-cluster/kubeadm/… 将 Windows 节点添加到 Kubernetes ?如果是,那么根据github.com/kubernetes-sigs/sig-windows-tools/releases/latest/…,在 C:\var\log\kubelet 中创建 kubelet 日志文件并使用 --v 4 标志启动 kubelet,您需要转到 Windows 节点上的 services.msc,右键单击kubelet 服务和开放属性。继续...
    • 然后停止kubelet服务,在启动参数中添加--v 4,启动kubelet服务。这将在 C:\var\log\kubelet 中生成详细日志,然后您可以检查 kubelet 日志中的消息,因为 kubelet 是负责在 Windows 节点上挂载 Azure 文件共享的进程
    【解决方案3】:

    根据以下线程,wsl2 还不支持 hostPath 卷。

    话题来源:https://github.com/docker/for-win/issues/5325 看这条评论:https://github.com/docker/for-win/issues/5325#issuecomment-570683131

    尝试更改此行

     # For "C://host"
     mountPath: /run/desktop/mnt/host/c/host
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2010-11-07
      • 2018-06-10
      • 2012-06-27
      • 2022-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多