在Kubernetes群集上没有CGO的Golang DNS

时间:2016-10-03 08:10:54

标签: go docker dns kubernetes cgo

我在Golang中编写了一个api,并部署在Kubernetes集群中。 这意味着它在具有临时图像的docker容器内运行。 要编译成像刮刮/高山的光图像,我需要关闭cgo。 但是没有cgo,网络包不能很好地运行。我知道net package存在问题,因为它本身使用cgo。

我需要为此应用程序使用的所有服务都在另一个Kubernetes名称空间中,因此唯一的方法是使用DNS。我在这里的一个角落。

我使用类似的东西构建二进制文件

GOOS='linux' CGO_ENABLED=0 GODEBUG=netdns=go+1 go build -a -installsuffix cgo -ldflags -s -o ./dist/prod/api ./src/backend/api.go

这本身并不能解决问题,但正如来自团队的here所述Brad Fitzpatrick所述,它有一个黑客攻击。我最终让它像

一样工作
//Connect is a function that connects to MOngoDB
func Connect() (*mgo.Session, error) {
    var host string
    if os.Getenv("KUBERNETES") == "true" {
        cmd := exec.Command("ping", "-c", "1", viper.GetString("MONGO-HOST"))
        var out bytes.Buffer
        cmd.Stdout = &out
        _ = cmd.Run()
        match := regexp.MustCompile(`\(([^\)]+)\)`).FindStringSubmatch(out.String())
        host = match[1]
    } else {
        host = viper.GetString("MONGO-HOST")
    }

    inf := &mgo.DialInfo{
        Addrs:    []string{host + ":" + viper.GetString("MONGO-PORT")},
        Timeout:  5 * time.Second,
        Database: "admin",
        Username: viper.GetString("MONGO-USER"),
        Password: viper.GetString("MONGO-PASS"),
    }
    return mgo.DialWithInfo(inf)
}

它只是削减ping命令的输出并使用已解析的ip而不是主机名来避免dns的问题。但它增加了我的应用程序不应该处理的额外复杂性。我怎样才能做得更好?

0 个答案:

没有答案