【问题标题】:Connecting to windows shared drive from kubernetes using go使用 go 从 kubernetes 连接到 windows 共享驱动器
【发布时间】:2019-11-19 07:00:52
【问题描述】:

我需要从 alpine linux 中托管的 GO API 连接到 Windows 远程服务器(共享驱动器)。我尝试使用 tcp、ssh 和 ftp,它们都不起作用。有什么建议或想法来解决这个问题?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 使用ip地址和端口的tcp连接
  • connection, err := net.Dial("tcp", fmt.Sprintf("%s:%d", Host, Port)) if err != nil { log.Fatal("Something went wrong with connection", err) } if connection == nil { log.Fatal("could not create connection") } defer connection.Close() log.Println("已连接到服务器")```

标签: go kubernetes


【解决方案1】:

在继续调试 GO 代码之前,需要在容器内做一些“非熟练劳动”,以确保满足先决条件:

  1. samba 客户端已安装并且守护程序正在运行;
  2. 目标名称被解析;
  3. 没有连接问题(路由、防火墙规则等);
  4. 有共享访问权限;
  5. 容器允许安装远程卷。

连接到容器:

$ docker ps 
$ docker exec -it container_id /bin/bash

Samba 守护进程正在运行:

$ smbd status
$ nmbd status

您在代码和命令行中使用正确的名称格式:

UNC notation =>  \\server_name\share_name
URL notation =>  smb://server_name/share_name

目标名称是可解析的

$ nslookup server_name.domain_name
$ nmblookup netbios_name 
$ ping server_name

Samba 共享可见

$ smbclient -L //server [-U user]       # list of shares

并且可访问(lsgetput 命令在此处提供预期输出)

$ smbclient //server/share
> ls 

尝试按照@cwadley 的建议挂载远程共享(Docker 容器中默认禁止挂载):

$ sudo mount -t cifs -o username=geeko,password=pass //server/share /mnt/smbshare

出于调查目的,您可以使用GitHub 提供的 Samba docker 容器,或者甚至在其中部署您的应用程序,因为它包含 Samba 客户端和有用的命令行工具:

$ sudo docker run -it -p 139:139 -p 445:445 -d dperson/samba

在 Docker 级别完成这项工作后,您可以轻松地在 Kubernetes 中重现它。

您可以在 Kubernetes 中运行的 Pod 中进行检查:

$ kubectl get deployments --show-labels
$ LABEL=label_value; kubectl get pods -l app=$LABEL -o custom-columns=POD:metadata.name,CONTAINER:spec.containers[*].name
$ kubectl exec pod_name -c container_name -- ping -c1 server_name

在 Docker 和 Kubernetes 的命令行中运行后,您的程序代码也应该可以运行了。

此外,关于 Samba 主题的 StackOverflow 上还有一个非常周到的讨论:
Mount SMB/CIFS share within a Docker container

【讨论】:

    【解决方案2】:

    Windows 共享使用 SMB 协议。有几个使用 SMB 的 Go 库,但我从未使用过它们,因此我无法保证它们的实用性。这是我用谷歌搜索的一个:

    https://github.com/stacktitan/smb

    其他选项是确保使用 cifs 将 Windows 共享安装在 Linux 主机文件系统上。然后你可以使用常规的 Go 文件实用程序:

    https://www.thomas-krenn.com/en/wiki/Mounting_a_Windows_Share_in_Linux

    或者,您可以在 Windows 机器上安装 Cygwin 之类的东西并运行 SSH 服务器。这将允许您使用 SCP:

    https://godoc.org/github.com/tmc/scp

    【讨论】:

    • 我尝试了 ssh 连接,但它抛出错误 ssh: handshake failed : EOF 。另外,我试过你提到的 smb 包。 smb 包有能力检查我们是否可以建立连接并能够登录。但是没有使用会话并将文件写入目标路径的功能。
    猜你喜欢
    • 2022-10-05
    • 2015-10-02
    • 2018-03-10
    • 2013-04-15
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2015-10-27
    相关资源
    最近更新 更多